************************ 华丽的分割--X86 ***********************
第一步:清除原有配置的中间文件 make distclean(其他类似命令就不说了 )
第二步:内核的配置,首先谈谈要用到的词语:
make menuconfig(其他的配置方式就不说了)
makefile
Kconfig
Kconfig 是每一个子目录里面都有的文件 当执行 make menuconfig的时候,我们修改每一项为Y或者M 其实都是在修改每一级的Kconfig 。
修改完后保存 会生成一个.config文件 这个文件记录了我们需要编译的模块
顺便说下Kconfig的工作原理 当然 是很肤浅的一点理解 :makefile应该是 obj-CONFIG_XXXXX = yourcode.o 这么写的, 这个CONFIG_XXXXX就是用Kconfig配置成y或者m的,。如果你在Makefile里面写成这样:obj-y = yourcode.o 那么不管你Kconfig如何配置 那么肯定都是会编译进内核的
第三步:编译
我们执行make bzimage编译命令 会在arch/X86/boot下生成bzimage
Makefile会读.config文件的内容 决定什么模块要编译 什么模块不要编译 并一级级递归下去
这样编译就完了 不过还少说了一个名词:Kbuild 说道Kbuild就得细细说是Makefile了
2.6版本的Makefile分为5部分:
Makefile 顶层Makefile
.config 内核配置文件
arch/$(ARCH)/Makefile &nbs常见的Makefile 他的名字应该叫做Makefile 当然 也可能会叫做Kbuild 如果两个同时出现的话 会执行Kbuild 不过有点特殊的是 在源码根目录下面 Kbuild和Makefile是同时存在的 但这并不代表Makefile是没作用的 我是这么理解的 Kbuild就是一个脚本 make的时候会调用他 他和前面说的 Kbuild Makefile应该不是一回事
第四步:编译内核模块
make modules 编译配置为M的模块
我就有疑问了 为什么要先配置为M 然后再make modules 直接配置为Y不是就OK了?
仔细想了半天 还是不解 厚着脸在群里问了一下 一位大哥说 啥?你自己好好看看书吧 于是我知道了我这个问题肯定很低级 于是我突然间想明白了
先举一个例子 在pc上写一个helloworld的内核模块 写个makefile编译 然后insmod lsmod 发现这个模块就被加载到内核了 如果你有10个 20个模块呢 这样一个一个就太麻烦了 所以在配置的时候 把这些需要动态装载的模块配置为M 然后总体编译 也就是make modules 然后你想加载那个模块 你就insmod哪个就OK了
第五步:安装内核模块
make modules_install 把编译好的内核模块从源码处拷贝到lib/modules下 这个目录下存放着所有内核模块(驱动)文件 就是ko文件 例如:我电脑上cd/lib/modules/2.6.32-21-generic/kernel/drivers/usb/atm 里面就有一些ko文件
第六步:制作init ramdisk 制作根文件系统
makinitrd initrd-2.6.29 2.6.29 /lib/modules下的版本号
第七步:拷贝bzimage到系统根目录boot下 并改名为vmlinuz-版本号
拷贝initrd到根boot下
修改etc/grub.conf 或者 /etc/lilo.config 这是根据系统采用哪种引导方式
第七步也是最后一步 有必要说说这个boot目录
他里面有这三个核心文件 System.map、vmlinuz、initrd-2.4.7-10.img
vmlinuz是可引导的、压缩的内核镜像。
initrd-2.4.7-10.img 根文件系统
System.map 内核符号表的一部分 完整的内核符号表是 /proc/ksyms System.map 这两个文件
linux在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。 内核符号表就是把这两个东西对应起来的一张表 System.map就是这张表不可缺少的一部分 这么理解就行了 虽然不专业
***************** 华丽的分割--arm *******************************
第一步:清除 和x86一样
第二步:配置
make menuconfig ARCH=arm
第三步:编译
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
ARCH CROSS_COMPILE 都是Makefile传递给Kbuild的参数 可以像上面那样写 也可以直接在Makefile里面改ARCH的值 这样make menuconfig的时候就不用添加后面的参数了
第四步:制作根文件系统
具体还没研究
第五步:编译内核模块 make modules ARCH=arm CROSS_COMPILE=arm-linux- 和X86一样
第六步:安装内核模块 make modules_install INSTALL_MOD_PATH=/???/roots 拷贝模块到根文件系统
接下来还要busybooks 还要制作ramdisk 过几天再说吧 现在不想看了!!!!!!!
文章评论(0条评论)
登录后参与讨论