嵌入式linux 更换内核,嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译...

嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译本文选择linux 2.6.35.7版本kernel进行实践。

一、linux kernel源码目录分析Kbuild,Kernel Build,管理内核编译的文件Makefile,kernel工程的Makefile。arch,体系架构,arch目录下的子目录存放的是不同种类的架构block,块设备,一般是存储设备,存放的块设备管理的相关代码crypto,加密相关,存放加密算法实现代码Documentation,说明文档drivers,设备驱动模块,存放各种设备类型驱动模块firmware,固件fs,文件系统,子目录存放各种文件系统include,头文件,子目录存放通用的各种模块的头文件init,kernel启动时初始化的代码ipc,进程间通信机制的代码kernel,kernel本身的代码lib,通用的库函数mm,内存管理net,网络协议栈,子目录存放各种网络协议scripts,辅助对kernel进行配置编译的脚本security,kernel安全机制相关的代码sound,音频相关的代码tools,工具相关usr,kernel启动相关virt,虚拟机相关

二、kernel的配置体系Linux kernel的配置体系由三部分构成,分别是:Makefile:分布在Linux内核源代码根目录及各层目录中,定义Linuxkernel的编译规则,依据.config中定义的CONFIG_xxxx=xxxxx确定xxx以何种方式编译进kernel。Kconfig:配置选项的文件,各个子目录下的Kconfig定义了子目录的功能模块的配置选项。配置工具:配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于Ncurses图形界面以及基于Xwindows图形界面的用户配置界面,各自对应于make config、make menuconfig和make xconfig)。通过对配置工具选项进行配置后生成配置文件.config,.config文件决定Kconfig中的配置项是否编译进入kernel。

1、工程Makefile的修改ARCH?= armCROSS_COMPILE?= arm-linux-

2、配置文件.config文件的生成A、默认配置文件的加载:make xxx_defconfig:HOSTCC  scripts/basic/fixdepHOSTCC  scripts/basic/docprocHOSTCC  scripts/basic/hashHOSTCC  scripts/kconfig/conf.oHOSTCC  scripts/kconfig/kxgettext.oSHIPPED scripts/kconfig/zconf.tab.cSHIPPED scripts/kconfig/lex.zconf.cSHIPPED scripts/kconfig/zconf.hash.cHOSTCC  scripts/kconfig/zconf.tab.oHOSTLD  scripts/kconfig/confarcharmconfigs目录下的相应开发板的xxxx_defconfig文件

3、配置工具的使用A、配置工具的使用方式make config(基于文本的最为传统的配置界面,不推荐使用)make menuconfig (基于文本菜单的配置界面,需要安装ncurse)make xconfig (基于QT的图形配置界面,要求QT被安装)make gconfig (基于GTK+的图形配置界面,要求GTK+被安装)make oldconfig (以现有的.config文件为基础来更新当前配置)make silentoldconfig (与oldconfig相同,但不输出任何信息)make randconfig (创建新的配置文件,其中包括所有配置选项的随机答案)make defconfig (创建新的配置文件,其中包括所有配置选项的默认答案)make allmodconfig (创建新的配置文件,尽可能地将选项配置成默认模块)make allyesconfig (创建新的配置文件,将所有选项配置成yes)make allnoconfig (创建新的配置文件,将所有选项配置成no,即最小化的配置)以上makexxconfig使用方式中make menuconfig最为常用,使用说明如下:make menuconfig:scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,执行make     menuconfig命令出时:HOSTCC  scripts/kconfig/lxdialog/checklist.oHOSTCC  scripts/kconfig/lxdialog/inputbox.oHOSTCC  scripts/kconfig/lxdialog/menubox.oHOSTCC  scripts/kconfig/lxdialog/textbox.oHOSTCC  scripts/kconfig/lxdialog/util.oHOSTCC  scripts/kconfig/lxdialog/yesno.oHOSTCC  scripts/kconfig/mconf.oHOSTLD  scripts/kconfig/mconfscripts/kconfig/mconf  arch/arm/Kconfigmconf表示是menuconfig的解析程序,mconf解析处理arch/arm/Kconfig文件,最终mconf会把用户的选择保存到Linux源码树顶层目录的.config文件中。xxconfig文件实际是开发板厂商移植的kernel的推荐配置,实际开发中可以根据开发板厂商提供的kernel的xxconfig结合产品需求进行剪裁配置,得到需要的kernel配置,即通过make menuconfig进行配置裁剪。archarmKconfig用于生成整个配置界面选项(Kconfig是整个linux配置机制的核心),是配置界面的主菜单界面,经过设置、修改的选项的选择结果保存在根目录下的.config文件中。退出时,menuconfig会检查是否修改了配置选项,如果修改了配置选项会提示保存,否则会直接退出。保存时会将修改过的配置选项写入.config文件中。B、Kconfig文件配置项的格式menu/endmenu:可以将一部分配置选项分类为一个目录menu,menu与endmenu是一组指令,必须同时使用。menu和endmenu中包含的部分就是子目录中的配置项。menuconfig:menuconfig是可以配置的目录menu,即可以修改menu选中或排除config:config是构建Kconfig的基本单元,config的类型有5种,分别是bool(y/n),tristate(y/m/n),string(字符串),hex(十六进 制),integer(整数)。tristate三种选项配置bool两种选项配置depends on/requires依赖于的配置项,如果依赖的配置选项没有选中,则当前选项也无法选中---help---help信息select反向依赖配置选项,如果当前选项选中,则也会自动选中select后的选项。default选项默认值,可以有多个,但只有第一个定义的值有效range:范围,用于hex和integer,range A B表示当前值不小于A,不大于Bcomment:注释choice/endchoice:多选一source:将子目录的Kconfig引入到当前位置C、Kconfig文件添加功能选项实例menuconfig:menuconfig NETDEVICESdefault y if UMLdepends on NETbool "Network device support"---help---You can say N here if you don't intend to connect your Linux box toany other computer at all.3f288ee285423cc6e29fa526842ca321.png

menuconfig NETDEVICES表明菜单目录是可以修改配置的,并且菜单录有子目录,菜单选项在.config文件的选项为CONFIG_NETDEVICES,bool"Network device support"表明菜单目录的提示符是"Network device support"。depends on NET表名菜单目录依赖于NET选项。菜单目录的子目录选项需要放在以下定义的范围内:if NETDEVICES......子目录菜单选项endif # NETDEVICESmenu:if WIMAXmenu "WiMAX Wireless Broadband devices"source "drivers/net/wimax/i2400m/Kconfig"endmenuendifmenu "WiMAX Wireless Broadband devices”表明菜单目录不具备修改属性,但具有子目录菜单,菜单提示符为"WiMAX Wireless Broadband devices”。子菜单的Kconfig来源source "drivers/net/wimax/i2400m/Kconfig"。ifWIMAX表明菜单依赖于WIMAX选项。3f288ee285423cc6e29fa526842ca321.png

D、make menuconfig使用按Enter键进入子目录按Y键选中当前选项按N键排除当前选项按M键将当前模块进行模块化编译按ESC ESC将退出当前选项返回上一层目录按?将显示当前选项的help信息方向箭头可以将光标向上下左右移动[*]:选中[ ]:排除< >:可以模块化编译:模块化编译make menuconfig对目录树下Kconfig文件选项配置后选项的结果保存在.config文件中,文件内容如下:CONFIG_ARM=yCONFIG_HAVE_PWM=yCONFIG_SYS_SUPPORTS_APM_EMULATION=yCONFIG_GENERIC_GPIO=yCONFIG_GENERIC_TIME=yCONFIG_ARCH_USES_GETTIMEOFFSET=y.config文件中的选项的值将与目录树下Makefile文件结合,确保配置选中的功能模块选项会被编译,未被选中的不会被编译,以及功能模块是被编译进内核还是编译成模块.ko文件。三、配置项添加实例给内核增加一个功能,并且通过make menuconfig控制其生成过程,流程如下:A、修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项;B、执行make menuconfig选择编译进内核或者不编译进内核,或者编译为模块,.config文件和autoconf.h文件会自动生成C、修改对应目录下的Makefile文件完成编译选项的添加D、编译内核make -j4在drivers

et目录下添加TFTP的功能模块,流程如下:1、修改drivers

et目录下的Kconfig文件,在网络设备支持代码块NETDEVICES内部添加TFTP的配置选项:config TFTPtristate "TFTP support"depends on NET_CLS_ACT---help---This is an TFTP.2、执行make menuconfig,将TFTP功能编译为模块3f288ee285423cc6e29fa526842ca321.png查看.config文件可知,CONFIG_TFTP定义在网络设备支持选项CONFIG_NETDEVICES后,以模块编译。CONFIG_NETDEVICES=yCONFIG_TFTP=m3、修改drivers

et目录下Makefile文件添加编译目标obj-$(CONFIG_TFTP) +=tftp.o4、编译kernelmake -j4

四、kernel编译Kernel的配置编译过程如下:make xxx_defconfig//生成.config文件make memuconfig//修改配置选项make -j2//编译本文出自 “生命不息,奋斗不止” 博客,转载请与作者联系!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值