|
一、Linux kernel的配置
嵌入式系统是以应用为中心、软硬件可裁剪的计算机系统.而Linux系统之所以能被应用到嵌入式系统中的重要原因,是因为它具有可裁剪性.下面就来阐述如何对Linux系统进行裁剪、配置和定制.
嵌入式系统是以应用为中心、软硬件可裁剪的计算机系统.而Linux系统之所以能被应用到嵌入式系统中的重要原因,是因为它具有可裁剪性.下面就来阐述如何对Linux系统进行裁剪、配置和定制.
(1)清除临时文件、中间文件和配置文件
1、make clean :remove most generated files but keep the config
该命令可删除编译过程中产生的文件(如.o文件),但会保存配置文件.
2、make mrproper :remove all generated files + config files
该命令可删除编译过程中产生的文件(如.o文件)和配置文件.
3、make distclean :mrproper + remove editor backup and patch files
该命令可删除编译过程中产生的文件(如.o文件)、配置文件、补丁包等.
Attention!!!
执行上述3条命令时,一定要在kernel源代码的根目录下执行.
(2)在配置kernel前,用户需要确定目标系统的软硬件配置情况,如CPU的类型、网卡型号,所需支持的网络协议等.
1、make clean :remove most generated files but keep the config
该命令可删除编译过程中产生的文件(如.o文件),但会保存配置文件.
2、make mrproper :remove all generated files + config files
该命令可删除编译过程中产生的文件(如.o文件)和配置文件.
3、make distclean :mrproper + remove editor backup and patch files
该命令可删除编译过程中产生的文件(如.o文件)、配置文件、补丁包等.
Attention!!!
执行上述3条命令时,一定要在kernel源代码的根目录下执行.
(2)在配置kernel前,用户需要确定目标系统的软硬件配置情况,如CPU的类型、网卡型号,所需支持的网络协议等.
(3)配置linux kernel
可采用下面4种命令来配置.
1、make config :基于文本模式的交互式配置(一问一答)
2、make menuconfig:基于文件模式的菜单型配置(推荐)
3、make oldconfig :使用已有的配置文件(.config),但会询问新增的配置选项.
4、make xconfig :图形化的配置(需安装图形化系统)
Attention!!!
1、make config与make oldconfig的相同之处在于两者都是基于文本模式的交互式配置,不同之处在于前者对kernel的每一个配置都会向用户进行询问,而后者不会对配置kernel的每个选项都向用户进行询问,它有一些默认配置.
2、无论使用哪种配置命令,当配置完成后,在linux kernel源代码的根目录下会产生一个".config"隐藏文件,该文件记录了用户对kernel每个选项的配置结果.
CONFIG_X86=y
CONFIG_ARCH_DEFCONFIG=y
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CMOS_UPDATE=y
(4)命令make menuconfig的配置方法
1、使用方向键在各选项间移动
2、使用Enter键进入下一层选单.每个选项上的高亮字母是键盘快捷方式,使用它可以快速的到达想要设置的选项单.
3、在括号中按"y"将这个项目编译进内核中,按"m"编译为模块,按"n"为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按"h"将显示这个选项的帮助信息,按"Esc"键将返回到上层选单.
Attention!!!
1、使用该命令配置kernel时,哪怕用户什么都不选择,也会在源代码根目录下产生一个".config"隐藏文件,只是该配置文件选择的是默认值.
2、用户对kernel中的配置选项有三种选择,分别是"*"、"m"、" ".现举例说明这三种选择对最终生成的".config"配置文件的影响.
例如:有4个配置选项,分别是1.c、2.c、3.c、4.c,则:
编译过程 编译结果
(*)1.c ------------> 1.o
(*)2.c ------------> 2.o
(m)3.c ------------> 3.o
( )4.c
从上面可以看出,无论是选择为"*",还是选择为"m",在编译结束后都会生成".o"文件.区别在于当某个选项被选择为"*"时,它会和kernel源码中所有被选择为"*"的选项,一起经过链接最终生成uImage内核文件,而选项被选择为"m"时,生成".o"文件后便结束了,它是一个内核模块.
(5)kernel源码中各配置选项的含义
1、make config :基于文本模式的交互式配置(一问一答)
2、make menuconfig:基于文件模式的菜单型配置(推荐)
3、make oldconfig :使用已有的配置文件(.config),但会询问新增的配置选项.
4、make xconfig :图形化的配置(需安装图形化系统)
Attention!!!
1、make config与make oldconfig的相同之处在于两者都是基于文本模式的交互式配置,不同之处在于前者对kernel的每一个配置都会向用户进行询问,而后者不会对配置kernel的每个选项都向用户进行询问,它有一些默认配置.
2、无论使用哪种配置命令,当配置完成后,在linux kernel源代码的根目录下会产生一个".config"隐藏文件,该文件记录了用户对kernel每个选项的配置结果.
CONFIG_X86=y
CONFIG_ARCH_DEFCONFIG=y
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CMOS_UPDATE=y
(4)命令make menuconfig的配置方法
1、使用方向键在各选项间移动
2、使用Enter键进入下一层选单.每个选项上的高亮字母是键盘快捷方式,使用它可以快速的到达想要设置的选项单.
3、在括号中按"y"将这个项目编译进内核中,按"m"编译为模块,按"n"为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按"h"将显示这个选项的帮助信息,按"Esc"键将返回到上层选单.
Attention!!!
1、使用该命令配置kernel时,哪怕用户什么都不选择,也会在源代码根目录下产生一个".config"隐藏文件,只是该配置文件选择的是默认值.
2、用户对kernel中的配置选项有三种选择,分别是"*"、"m"、" ".现举例说明这三种选择对最终生成的".config"配置文件的影响.
例如:有4个配置选项,分别是1.c、2.c、3.c、4.c,则:
编译过程 编译结果
(*)1.c ------------> 1.o
(*)2.c ------------> 2.o
(m)3.c ------------> 3.o
( )4.c
从上面可以看出,无论是选择为"*",还是选择为"m",在编译结束后都会生成".o"文件.区别在于当某个选项被选择为"*"时,它会和kernel源码中所有被选择为"*"的选项,一起经过链接最终生成uImage内核文件,而选项被选择为"m"时,生成".o"文件后便结束了,它是一个内核模块.
(5)kernel源码中各配置选项的含义
从上图可以看出,kernel源码中各配置选项主要分为16种(在博客上可下载"内核配置参考.rar",该文档详细介绍了各配置选项的功能,感谢国嵌).
1、代码成熟度选项(code maturity level options)
Prompt for development and/or incomplete code/drivers
显示尚在开发中或尚未完成的代码与驱动,除非你是测试人员或开发者,否则请勿选择.
2、常规设置(general setup)
上图中第1个选项.这种类型的配置选项非常多,用户需要根据需要进行选择.比如,在常规设置内可以选择是否显示内核版本,是否支持IPC,是否支持网络协议等.
3、可加载模块支持(loadable module support)
上图中第2个选项.一般来说,需要将Linux kernel选择为支持可加载模块.
4、块设备层(block layer)
上图中第3个选项.用户可根据需要来选择支持哪些块设备.
5、CPU类型及特性(processor type and features)
上图中第4个选项.用户可根据开发板CPU来设置这些选项.
6、电源管理选项(power management options)
上图中第5个选项.该选项主要负责管理电源.
7、总线选项(bus options)
上图中第6个选项.该选项主要负责管理系统总线.比如,当用户的系统中没有PCI总线,可以将PCI总线选项去掉,使其不参加编译.
8、可执行文件格式(executable file formats)
上图中第7个选项.该选项主要负责系统中可执行文件的格式.比如,用户是否需要系统支持ELF格式等.注意,ELF是开放平台下最常见的二进制文件格式,支持动态链接,支持不同的硬件平台,除非用户知道自己在做什么,否则必选.
9、网络(networking)
上图中第8个选项.该选项主要负责系统所支持的网络协议.注意,该选项不是为了选择网卡.
10、设备驱动程序(device drivers)
上图中第9个选项.该选项主要负责系统所支持的硬件设备驱动.linux kernel在该选项内又将设备驱动程序细分为混杂设备、字符设备、GPIO设备、USB设备等.
11、文件系统(file systems)
上图中第10个选项.该选项主要负责系统所支持的文件系统.
12、分析支持(instrumentation support)
上图中第11个选项.该选项主要负责对内核行为进行分析.
13、内核hack选项(kernel hacking)
上图中第12个选项.该选项主要负责记录系统错误信息.
14、安全选项(security options)
上图中第13个选项.该选项主要负责系统的安全性.
15、加密选项(cryptographic options)
上图中第14个选项.该选项主要负责系统的加密工作.
16、库子程序(library routlines)
上图中第15个选项.注意,仅有哪些不包含在内核源码中的第三方内核模块才可能需要,可以全不选,内核中若有其它部分依赖它,会自动选上.
Attention!!!
通过上面的分析可以看出,linux kernel的配置选项非常繁杂,即使是开发人员也无法弄清所有选项的真实含义,为此,在实际开发中,通常会读入一个外部配置文件,然后根据自己的需要对该配置文件进行修改.这里,Linux显示出了非常人性化的特点,在linux kernel源码的arch/arm/configs目录下有许多配置文件.比如,若用户开发板的CPU是s3c2410,则可以该目录下的配置文件"s3c2410_defconfig"作为参考,然后根据自己的需要对该配置文件进行修改.
[root@localhost linux-2.6.29]# cd arch/arm/configs
/*将该配置文件复制到源码根目录下,并覆盖隐藏文件".config"*/
[root@localhost configs]# cp s3c2410_defconfig ../../../.config
cp : overwrite ../../../.configs? y
[root@localhost linux-2.6.29]# make menuconfig ARCH=arm
这样,当用户对linux kernel再次配置时,就会看到某些选项被默认选择.比如,CPU类型被默认选择为s3c2410.此时,用户再根据自己的需要对该配置菜单进行修改.
[root@localhost configs]# cp s3c2410_defconfig ../../../.config
cp : overwrite ../../../.configs? y
[root@localhost linux-2.6.29]# make menuconfig ARCH=arm
这样,当用户对linux kernel再次配置时,就会看到某些选项被默认选择.比如,CPU类型被默认选择为s3c2410.此时,用户再根据自己的需要对该配置菜单进行修改.
二、Linux kernel的编译
当用户通过上述方法对Linux kernel配置完成后,就可以对其进行编译.
(1)在x86平台上对Linux kernel进行编译
编译结果供x86平台使用,常使用下面两条命令.在x86平台的区别在于"make zImage"只能用于小于512k的内核.如果使用"make zImage"编译了大于512k的Linuxkernel,则编译会报错.
1、make zImage
2、make bzImage
Attention!!!
1、如需获取详细的编译信息,可使用:
make zImage V=1
make bzImage V=1
2、编译好的内核位于源码根目录下的arch/<cpu>/boot目录下.
3、在虚拟机上运行的Linux kernel也需要配置文件,该配置文件是/boot目录下的config-2.6.18-53.el5文件.用户可对该配置文件进行修改.
[root@localhost linux-2.6.29]# cp /boot/config-2.6.18-53.el5 ./.config /*将虚拟机上Linux kernel的配置文件复制为源码根目录下的.config*/
[root@localhost linux-2.6.29]# make menuconfig
对配置文件修改完成后
[root@localhost linux-2.6.29]# make bzImage /*编译,生成可执行文件*/
(2)内核模块的编译与安装
1、内核模块是在make menuconfig时设置为"m"的选项,编译命令是"make modules".
Attention!!!
1、make bzImage只会编译设置为"*"的选项.
2、make modules只会编译设置为"m"的选项.
2、内核模块的安装是将编译好的内核模块复制到源码根目录下的lib目录内.安装命令是"make modules_install".若Linux内核版本为2.6.29,CPU为x86,则内核模块被复制到:
[root@localhost linux-2.6.29]# ls /lib/modules/2.6.29/kernel/arch/x86/kernel
(4)制作init ramdisk
命令格式: mkinitrd initrd-$version $version
例 如: mkinitrd initrd-2.6.29 2.6.29
Attention!!!
1、$version可以通过查询/lib/modules下的目录得到.
2、第二个2.6.29表示Linux kernel版本,要求在源码根目录linux-2.6.29/lib/modules下必须有目录2.6.29
3、制作完成后,在源码根目录下会生成目录initrd-2.6.29
当用户通过上述方法对Linux kernel配置完成后,就可以对其进行编译.
(1)在x86平台上对Linux kernel进行编译
编译结果供x86平台使用,常使用下面两条命令.在x86平台的区别在于"make zImage"只能用于小于512k的内核.如果使用"make zImage"编译了大于512k的Linuxkernel,则编译会报错.
1、make zImage
2、make bzImage
Attention!!!
1、如需获取详细的编译信息,可使用:
make zImage V=1
make bzImage V=1
2、编译好的内核位于源码根目录下的arch/<cpu>/boot目录下.
3、在虚拟机上运行的Linux kernel也需要配置文件,该配置文件是/boot目录下的config-2.6.18-53.el5文件.用户可对该配置文件进行修改.
[root@localhost linux-2.6.29]# cp /boot/config-2.6.18-53.el5 ./.config /*将虚拟机上Linux kernel的配置文件复制为源码根目录下的.config*/
[root@localhost linux-2.6.29]# make menuconfig
对配置文件修改完成后
[root@localhost linux-2.6.29]# make bzImage /*编译,生成可执行文件*/
(2)内核模块的编译与安装
1、内核模块是在make menuconfig时设置为"m"的选项,编译命令是"make modules".
Attention!!!
1、make bzImage只会编译设置为"*"的选项.
2、make modules只会编译设置为"m"的选项.
2、内核模块的安装是将编译好的内核模块复制到源码根目录下的lib目录内.安装命令是"make modules_install".若Linux内核版本为2.6.29,CPU为x86,则内核模块被复制到:
[root@localhost linux-2.6.29]# ls /lib/modules/2.6.29/kernel/arch/x86/kernel
(4)制作init ramdisk
命令格式: mkinitrd initrd-$version $version
例 如: mkinitrd initrd-2.6.29 2.6.29
Attention!!!
1、$version可以通过查询/lib/modules下的目录得到.
2、第二个2.6.29表示Linux kernel版本,要求在源码根目录linux-2.6.29/lib/modules下必须有目录2.6.29
3、制作完成后,在源码根目录下会生成目录initrd-2.6.29
三、自制x86平台下的Linux系统
(1)从Linux官网(www.kernel.org)下载Linux kernel源码包(linux-2.6.31.tar.bz2)并解压.
[root@localhost lishuai]# tar xjvf linux-2.6.31.tar.bz2
(2)不做任何修改,重新编译Linux-2.6.31内核,这样就生成了配置文件".config".
[root@localhost lishuai]# make menuconfig
[root@localhost lishuai]# ls -a
(3)为了制作基于x86平台的Linux系统,这里可以使用虚拟机上原有的Linux kernel配置文件.
[root@localhost lishuai]# cp /boot/config-2.4.20-8 ./.config
cp : overwrite ../../../.configs? y
(4)根据用户需求,修改配置文件(config-2.4.20-8),再执行配置命令.
[root@localhost linux-2.6.31]# make menuconfig
(5)对Linux kernel重新编译,生成可执行文件,该文件放在目录linux-2.6.31/arch/x86/boot下,文件名为bzImage
[root@localhost linux-2.6.31]# make bzImage
(6)重新编译内核模块.
[root@localhost linux-2.6.31]# make modules
(7)安装内核模块,并在目录/lib/modules下查看是否生成了内核模块目录2.6.31
[root@localhost linux-2.6.31]# make modules_install
[root@localhost modules]# ls
(8)制作ramdisk,并查看源码根目录下是否生成了目录initrd-2.6.31
[root@localhost linux-2.6.31]# mkinitrd initrd-2.6.31 2.6.31
[root@localhost linux-2.6.31]# ls
(9)将Linux kernel可执行文件bzImage复制到目录/boot/vmlinux-2.6.31下
[root@localhost /]# mkdir vmlinux-2.6.31
[root@localhost linux-2.6.31]# cp arch/x86/boot/bzImage /boot/vmlinux-2.6.31
(10)将(源码根目录下的)ramdisk文件复制到/boot目录下
[root@localhost linux-2.6.31]# cp initrd-2.6.31 /boot
(11)修改/etc/grub.conf或/etc/lilo.conf,该文件中包含了Linux启动时的提示信息,如下所示:
title Red Hat Enterprise Linux Server (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=/dev/VolGroup00/LogVol00 rhgb
initrd /initrd-2.4.20-8.img
修改为:
title mylinux
root (hd0,0)
kernel /bzImage-2.6.31 ro root=/dev/VolGroup00/LogVol00 rhgb
initrd /initrd-2.6.31.img
这样,在你的Linux虚拟机上就会增加了一个自己制作的系统.
(1)从Linux官网(www.kernel.org)下载Linux kernel源码包(linux-2.6.31.tar.bz2)并解压.
[root@localhost lishuai]# tar xjvf linux-2.6.31.tar.bz2
(2)不做任何修改,重新编译Linux-2.6.31内核,这样就生成了配置文件".config".
[root@localhost lishuai]# make menuconfig
[root@localhost lishuai]# ls -a
(3)为了制作基于x86平台的Linux系统,这里可以使用虚拟机上原有的Linux kernel配置文件.
[root@localhost lishuai]# cp /boot/config-2.4.20-8 ./.config
cp : overwrite ../../../.configs? y
(4)根据用户需求,修改配置文件(config-2.4.20-8),再执行配置命令.
[root@localhost linux-2.6.31]# make menuconfig
(5)对Linux kernel重新编译,生成可执行文件,该文件放在目录linux-2.6.31/arch/x86/boot下,文件名为bzImage
[root@localhost linux-2.6.31]# make bzImage
(6)重新编译内核模块.
[root@localhost linux-2.6.31]# make modules
(7)安装内核模块,并在目录/lib/modules下查看是否生成了内核模块目录2.6.31
[root@localhost linux-2.6.31]# make modules_install
[root@localhost modules]# ls
(8)制作ramdisk,并查看源码根目录下是否生成了目录initrd-2.6.31
[root@localhost linux-2.6.31]# mkinitrd initrd-2.6.31 2.6.31
[root@localhost linux-2.6.31]# ls
(9)将Linux kernel可执行文件bzImage复制到目录/boot/vmlinux-2.6.31下
[root@localhost /]# mkdir vmlinux-2.6.31
[root@localhost linux-2.6.31]# cp arch/x86/boot/bzImage /boot/vmlinux-2.6.31
(10)将(源码根目录下的)ramdisk文件复制到/boot目录下
[root@localhost linux-2.6.31]# cp initrd-2.6.31 /boot
(11)修改/etc/grub.conf或/etc/lilo.conf,该文件中包含了Linux启动时的提示信息,如下所示:
title Red Hat Enterprise Linux Server (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=/dev/VolGroup00/LogVol00 rhgb
initrd /initrd-2.4.20-8.img
修改为:
title mylinux
root (hd0,0)
kernel /bzImage-2.6.31 ro root=/dev/VolGroup00/LogVol00 rhgb
initrd /initrd-2.6.31.img
这样,在你的Linux虚拟机上就会增加了一个自己制作的系统.