linux源码 编译后linux内核编译教程文件在哪

linux&源码编译内核
内核下载地址:
http://www.kernel.org/
编译内核分为
1 生成 .config 配置文件
2 检查依赖性
3 编译内核,编译模块
4&安装内核,安装模块
5&设置boot
1 生成 .config 配置文件
make defconfig&
使用默认配置
make allnoconfig
之选取必须的配置
make menuconfig
图形配置模式(自定义)
cp /usr/src/kernel/xxxxxx/.conf
make menuconfig--&
Load an Alternate Configuration
选择.config--&
Save an Alternate Configuration File
xxxxxx 系统当前内核,使用原系统配置。
(推荐这个,不容易出错,以下步骤也用的这个)
2 检查依赖性:
[root@host125 linux-2.6.18.8]# make
&scripts/kconfig/conf
scripts/kconfig/conf -s
arch/i386/Kconfig
*** Warning: make dep is unnecessary
我这里提示 不是必须的步骤 不知道为什么。
<font COLOR="#&编译内核
我这里有warning,不过还可以继续。。
make modules
[root@host125 linux-2.6.18.8]# make
include/linux/version.h
include/linux/utsrelease.h
& Building modules,
就这么几行。
安装模块:
modules_install
安装内核:
之后还需要配置grub.conf
vi /boot/grub/grub.conf
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18.8)
& & root (hd0,0)
& & kernel /boot/vmlinuz-2.6.18.8
ro root=LABEL=/ rhgb quiet
& & initrd
/boot/initrd-2.6.18.8.img
OK 重新启动。&
如果失败,在选择内核启动界面,选择之前的内核启动。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转) - h13 - 博客园
linux是如何组成的?答:linux是由用户空间和内核空间组成的为什么要划分用户空间和内核空间?答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的安全性,比如X86可以有4种模式RING0~RING3& RING0特权模式给LINUX内核空间RING3给用户空间linux内核是如何组成的?答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers) 设备驱动linux 内核源代码linux内核源代码是如何组成或目录结构?答:&& arc目录&&& 存放一些与CPU体系结构相关的代码& 其中第个CPU子目录以分解boot,mm,kerner等子目录block目录&&& 部分块设备驱动代码crypto目录&&& 加密、压缩、CRC校验算法documentation&&& 内核文档drivers&&& &&& 设备驱动fs&&& &&& 存放各种文件系统的实现代码include&&& &&& 内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中init&&& &&& 内核初始化代码ipc&&& &&& 进程间通信的实现代码kernel&&& &&& Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化)lib&&& &&& 库文件代码mm&&& &&& 与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录&&& net&&& &&& 各种网络协议的实现代码,注意而不是驱动samples &&& 内核编程的范例scripts&&& &&& 配置内核的脚本security&&& SElinux的模块sound&&& &&& 音频设备的驱动程序usr&&& &&& cpip命令实现程序virt&&& &&& 内核虚拟机内核配置与编译一、清除make clean&&& 删除编译文件但保留配置文件make mrproper&&& 删除所有编译文件和配置文件make distclean&&& 删除编译文件、配置文件包括backup备份和patch补丁& 二、内核配置方式make config&&& 基于文本模式的交互式配置make menuconfig&&& 基于文本模式的菜单配置make oldconfig&&& 使用已有的配置文件(.config),但配置时会询问新增的配置选项make xconfig&&& 图形化配置三、make menuconfig一些说明或技巧在括号中按&y&表示编译进内核,按&m&编译为模块,按&n&不选择,也可以按空格键进行选择注意:内核编译时,编译进内核的&y&,和编译成模块的&m&是分步编译的四、快速配置相应体系结构的内核配置我们可以&&& 到arch/$cpu/configs目录下copy相应的处理器型号的配置文件到内核源目录下替换.config文件五、编译内核1.&&&&&&&&&&&&&&&&&&&&&&&&&&&&make zImage&& 注:zImage只能编译小于512k的内核make bzImage同样我们也可以编译时获取编译信息,可使用make zImage V=1make bzImage V=1编译好的内核位于&&& arch/$cpu/boot/目录下&&&&&&&&&&&&&&&&&&&&&&&&&&&&以上是编译内核make menuconfig时先&m&选项的编译& 接下来到编译&y&模块,也就是编译模块2.make modules&&& 编译内核模块make modules_install&&& 安装内核模块 ------&这个选项作用是将编译好的内核模块从内核源代码目录copy至/lib/modules下六、制作init ramdiskmkinitrd initrd-$version $version/****& mkinitrd initrd-$(可改)version $version(不可改,因为这version是寻找/lib/modules/下相应的目录来制作)& ****/七、内核安装复制内核到相关目录下再作grub引导也就可以了1.cp arch/$cpu/boot/bzImage /boot/vmlinux-$version2.cp $initrd /boot/3.修改引导器/etc/grub.conf(lio.conf)正确引导即可#incldue &linux/init.h&#include &linux/module.h&static int hello_init(void){printk(KERN_WARNING"Hello,world!\n");return 0;}static void hello_exit(void){printk(KERN_INFO"Good,world!\n");}module_init(hello_init);module_exit(hello_exit);___________hello,world!范例___________________一、必需模块函数1.加载函数&&& module_init(hello_init);&&& 通过module_init宏来指定2.卸载函数&&& module_exit(hello_exit);&&& 通过module_exit宏来指定编译模块多使用makefile二、可选模块函数1.MODULE_LICENSE("*******"); &&& 许可证申明2.MODULE_AUTHOR("********");&&& 作者申明3.MODELE_DESCRIPTION("***");&&& 模块描述4.MODULE_VERSION("V1.0");&&& 模块版本5.MODULE_ALIAS("*********");&&& 模块别名三、模块参数通过宏module_param指定模块参数,模块参数用于在加载模块时传递参数模块module_param(neme,type,perm);name是模块参数名称type是参数类型& type常见值:boot、int、charp(字符串型)perm是参数访问权限 perm常见值:S_IRUGO、S_IWUSRS_IRUGO:任何用户都对sys/module中出现的参数具有读权限S_IWUSR:允许root用户修改/sys/module中出现的参数/*****&&&&&&范例&&&&&&&&*******/int a = 3;char *module_param(a,int,S_IRUGO);module_param(st,charp,S_IRUGO);/*********&&&&结束&&&&&&**********//**********----makefile范例----*************/ifneq&&& ($(KERNELRELFASE),)obj-m&&& :=&&& hello.o&&& //这里m值多用 obj-(CONFIG_**)代替elseKDIR&&& :=&&& /lib/modules/$version/buildall:make -C $(KDIR) M=$(PWD) modulesclean:rm -f *.ko *.o *.mod.o *.mod.c *.symyersendif/*****这里可以扩展多文件makefile 多个obj-m***********end***************//******模块参数*****/#include &linux/init.h&#include &linux/module.h&MODULE_LICENSE("GPL");static char *name = "Junroc Jinx";static int age = 30;module_param(arg,int,S_IRUGO);module_param(name,charp,S_IRUGO);static int hello init(void){printk(KERN_EMERG"Name:%s\n",name);printk(KERN_EMERG"Age:%d\n",age);return 0;}static void hello_exit(void){printk(KERN_INFA"Module Exit\n");}moduleJ_init(hello_init);module_exit(hello_exit);/****************/----------------------------------------------------------------------------/proc/kallsyms 文档记录了内核中所有导出的符号的名字与地址什么是导出?答:导出就是把模块依赖的符号导进内核,以便供给其它模块调用为什么导出?答:不导出依赖关系就解决不了,导入就失败符号导出使用说明:EXPORT_SYMBOL(符号名)EXPORT_SYMBOL_GPL(符号名)其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块模块版本不匹配问题的解决:1、使用 modprobe --force-modversion&&& 强行插入2、确保编译内核模块时,所依赖的内核代码版本等同于当前正在运行的内核&& uname -r----------------------------------------------------------------------printk内核打印:printk允许根据严重程度,通过附加不同的&优先级&来对消息分类在&linux/kernel.h&定义了8种记录级别。按照优先级递减分别是:KERN_EMERG&&& "&0&"&&& 用于紧急消息,常常崩溃前的消息KERN_ALERT&&& "&1&"&&& 需要立刻行动的消息KERN_CRIT&&& "&2&"&&& 严重情况KERN_ERR&&& "&3&"&&& 错误情况KERN_WARNING&&& "&4&"&&& 有问题的警告KERN_NOTICE&&& "&5&"&&& 正常情况,但是仍然值得注意KERN_INFO&&& "&6&"&&& 信息型消息KERN_DEBUG&&& "&7&"&&& 用于调试消息没有指定优先级的printk默认使用DEFAULT_MESSAGE_LOGLEVEL优先级&&& 它是一个在kernel/printk.c中定义的整数控制优先级的配置:/proc/sys/kernel/printk(可以查看或修改)/*******符号symbol各模块依赖范例*****/--------/********hello.c*********/----#include &linux/module.h&#include &linux/init.h&MODULE_LICENSE("GPL");MODULE_AUTHOR("Junroc Jinx");MODULE_DESCRIPTION("hello,world module! ");MODULE_ALIAS("A simple modle test");extern int add_integar(int a,int b);extern int sub_integar(int a,int b);static int __init hello_init(){int res = add_integar(1,2);return 0;}static void __exit hello_exit(){int res = sub_integar(2,1);}module_init(hello_init);module_exit(hello_exit);/******hello.c****end**********//********start*****calculate.c******/#include &linux/init.h&#include &linux/module.h&MODULE_LICENSE("GPL");int add_integar(int a,int b){return a+b;}int sub_integar(int a,int b){return a-b;}static int __init sym_init(){return 0;}static void __exit sym_exit(){}module_init(sym_init);module_exit(sym_exit);//EXPORT_SYMBOL(add_integar);//EXPORT_SYMBOL(sub_integar);/***********end*****calculte.c****/您现在的位置: &
如何下载并编译Android 4.0内核源码Goldfish(图文)
如何下载并编译Android 4.0内核源码Goldfish(图文)
  关于如何下载Android 4.0源码,请查看另一篇文章(同样是图文教程):
  如何编译Android 4.0源码请看:
  下面进入正题:
  第一步:下载goldfish源码
  在Android源码根目录下新建kernel文件夹
$mkdir&kernel&&
$cd&kernel&&下载源码:
$git&clone&;&&
  下载完毕如下图:
  此时在kernel目录下会生成一个goldfish文件夹。进入此目录:
$cd&goldfish&&此目录下有一个隐藏的目录.git,通过
$ls&-al&&可看到此目录:
  查看所有分支:
git&&branch&-a&&如下图:
  check out:
$git&checkout&remotes/origin/Android-goldfish-2.6.29&&
  此时你会看到goldfish目录下会出现很多文件:
  这个时候goldfish源码就已经下下来了,接下来的事情就是编译了.  第二步:编译goldfish
  导出交叉编译工具目录到$PATH环境变量中去.
export&PATH=$PATH:~/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin&&我们将使用上述这个目录下的交叉编译器arm-eabi-gcc
  然后在glodfish目录下用gedit打开Makefile文件,找到这两行文字:
  &# ARCH?= (SUBARCH)
  #&CROSS_COMPILE?=修改为:ARCH ?= arm
  CROSS_COMPILE & & ?= arm-eabi-
$gedit&Makefile&&
  注意:ARTH ?=arm,的arm后边不要有空格,不然就会出现如下类似错误:Make:...../kernel/goldfish/arch/arm: Is a directory.& Stop.害我白白浪费了几个小时.关闭gedit,接下来就开始make了,执行如下指令:
$&make&goldfish_armv7_defconfig&&
  注:用$make goldfish_defconfig这样配置也可以编译通过,模拟器也可以启动,但是Android的开机画机就显示不了,$adb shell也死活连不上,原因就是这个goldfish_defconfig这个配置文件问题.提示:$make goldfish_armv7_defconfig指令的意思是将目录WORKING_DIRECTORY/kernel/goldfish/arch/arm/configs/下的goldfish_armv7_defconfig文件内的Kconfig配置内容复制到WORKING_DIRECTORY/kernel/goldfish/目录下nfig文件中nfig文件是一个隐藏目录,保存着各个目录下Kconfig文件的配置.最终结果如下图所示:
这样就表示编译成功了.
$&ls&arch/arm/boot/&&可以看到zImage文件.
第三步:在模拟器中启动编译好的内核
$&export&PATH=$PATH:~/WORKING_DIRECTORY/out/host/linux-x86/bin&&
$&export&Android_PRODUCT_OUT=~/WORKING_DIRECTORY/out/target/product/generic&&
$&emulator&-kernel&~/WORKING_DIRECTORY/kernel/goldfish/arch/arm/boot/zImage&&&&&模拟器启动界面:
  进入模拟器从设置里看版本信息:
  从上图可以看出当前Android版本是4.0.1,内核版本是2.6.29,说明成功了.
  同样也可以通过adb shell来查看内核版本信息,如下图:
$adb&shell&&
#cd&proc&&
#cat&version&&
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-1、先编写一个简单的hello模块,hello.c 源码如下:
1 #ifndef __KERNEL__
define __KERNEL__
4 #ifndef MODULE
define MODULE
8 // 下面的是主要的内容
9 #include &linux/kernel.h&
10 #include &linux/module.h&
11 #include &linux/init.h&
13 MODULE_LICENSE("GPL");
15 static int year=2012;
17 int hello_init()
printk(KERN_WARNING "Hello kernel, it's %d!\n",year);
24 void hello_exit()
printk("Bye, kernel!\n");
29 // 下面两个为关键的模块函数
30 module_init(hello_init);
31 module_exit(hello_exit);
如果上面的代码看起来不太熟悉,那么需要查看以下相关的书籍,比如《Linux设备驱动程序,第三版》,也就是大名鼎鼎的LDD;
2、老式驱动模块编译方法:
直接写出make规则到makefile文件中,引用内核体系的头文件路径,举例如下:
1 # The path of kernel source code
2 INCLUDEDIR = /media/GoldenResources/linux/linux-2.6.30/include
4 # Compiler
5 CC = gcc
7 # Options
8 CFLAGS = -D__KERNEL__ -DMODULE -O -Wall -I$(INCLUDEDIR)
10 # Target
11 OBJS = hello.o
13 all: $(OBJS)
15 $(OBJS): hello.c
$(CC) $(CFLAGS) -c $&
18 install:
insmod $(OBJS)
21 uninstall:
rmmod hello
24 .PHONY: clean
这里有我是用的一个linux内核源代码路径:/media/GoldenResources/linux/linux-2.6.30/include ,注意设置到正确的源码路径。
尝试这编译:
gcc -D__KERNEL__ -DMODULE -O -Wall -I/media/GoldenResources/linux/linux-2.6.30/include -c hello.c
In file included from /media/GoldenResources/linux/linux-2.6.30/include/linux/kernel.h:11:0,
from hello.c:8:
/media/GoldenResources/linux/linux-2.6.30/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory
compilation terminated.
make: *** [hello.o] Error 1
出现错误:&include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory , 网上查阅相关资料后,找到不错的说明:
主要意思是这种编译方法不能很好的解决相关的依赖体系,主要是源于历史原因,linux内核升级很快,越来越复杂,所以建议使用kbuild体系来自动完成;故下面采用了可行的kbuild体系来完成。
3、使用kbuild进行模块编译:
基本方法可以参考:&
核心思想是,通过-C指明系统上的内核体系路径,通过M=指明模块源文件路径,然后自己构造一个makefile文件,从而实现编译过程。
3.1 构建适用于kbuild方法的makefile:
obj-m := hello.o
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
开始make:
make -C /lib/modules/3.5.0-17-generic/build M=/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic'
scripts/Makefile.build:44: /media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/Makefile: No such file or directory
make[2]: *** No rule to make target `/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/Makefile'.
make[1]: *** [_module_/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
make: *** [all] Error 2
自动使用了当前运行中的内核,构建对应的模块,但是提示找不到Makefile,而该目录下的文件为makefile,所以尝试修改名字:
$mv makefile
特别注意,要使用Makefile才行!不能时makefile;
修改后,编译成功:
make -C /lib/modules/3.5.0-17-generic/build M=/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic'
Building modules, stage 2.
MODPOST 1 modules
# 说明成功编译了一个模块
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
3.2 加载和删除内核模块:
$sudo insmod ./hello.ko #加载
$sudo rmmod hello
并没有看到源代码中的输出信息,查看系统相应日志即可:
$tail /var/log/kern.log
# 注意ubuntu下的日志路径
Oct 23 22:22:22 qunengrong-Studio-1450 kernel: [] Hello kernel, it's 2012!
Oct 23 22:22:37 qunengrong-Studio-1450 kernel: [] Bye, kernel!
至此,我们已经可以成功编译和加载内核模块了;
4、额外成就,要注意模块与内核版本的匹配:
假设我直接使用另一个内核体系进行构建,比如3.5.0-15-generic,但是当前系统运行的为3.5.0-17-generic的内核,则加载时报错,如下:
$make -C /lib/modules/3.5.0-15-generic/build M=`pwd` modules
make: Entering directory `/usr/src/linux-headers-3.5.0-15-generic'
/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.o
/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.c:16:5: warning: function declaration isn&t a prototype
/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.c:23:6: warning: function declaration isn&t a prototype
Building modules, stage 2.
MODPOST 1 modules
/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.mod.o
/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.ko
make: Leaving directory `/usr/src/linux-headers-3.5.0-15-generic'
$sudo insmod ./hello.ko
# 版本不一致报错
insmod: error inserting './hello.ko': -1 Invalid module format
由此可见,使用自动构建带来的方便,将该通用Makefile分享如下:
obj-m := name.o
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
阅读(...) 评论()
我思故我在、身在尘嚣中、思飞九天外 ...

我要回帖

更多关于 嵌入式linux内核编译 的文章

 

随机推荐