kernel之编译体验
总览
本文使用 linux-2.6.22.6 内核, 使用jz2440开发板.
解压缩和打补丁
# ubuntu shell |
生成配置文件 “.config”
整个嵌入式linux系统的配置, 其根源就是这么一个 “.config” 文件.
然后编译时, 会通过makefile变量和C语言的宏定义来实现模块的使能, 禁止或生成为.ko模块.
生成”.config”
生成.config配置文件有三种方法:
- 直接使用
make menuconfig进行配置- 配置项太多了, 基本不会直接用这种方式
- 基于默认配置自行修改
- 确保
pwd路径在kernel源码路径下:./linux-2.6.22.6/ find -name "*defconfig", 查找默认配置文件- 可以找到, 最相关的配置文件为
./arch/arm/configs/s3c2410_defconfig make s3c2410_defconfig, 加载这个默认配置.- 注意最后一句 “configuration written to .config”, 因此最终生成的就是一个
.config文件 make menuconfig根据需求, 部分修改配置.config文件.- 如果遇到错误提示
fatal error: curses.h:. 安装sudo apt-get install libncurses5-dev libncursesw5-dev
- 确保
- 使用厂家提供的配置文件
- jz2440 提供的配置文件名为
config_ok cp config_ok .config直接改名为.config文件即可.make menuconfig, 一样可以再自己定制配置.
- jz2440 提供的配置文件名为
修改”.config”
执行 make menuconfig 后, 有个简单的用户界面. 关键操作如下:
上下左右键进行移动,Enter键进入子菜单.- 按两边
ESC返回上一级, 或退出界面. 蓝色高亮字母为快捷键, 按了直接跳到那一行Y表示需要加载这个模块N表示不要加载这个模块M表示将此模块生成.ko文件, 可动态加载.?显示当前行的帮助信息, 帮助页按上下或jk进行翻页/搜索关键字
分析配置过程
从 “.config” 文件出发, 分析查看该文件如何影响 Makefile 文件以及C语言的宏定义.
“.config” 文件
使用 vim .config 查看该文件, 可知其基本格式为 CONFIG_XXX=
# CONFIG_XXX is not set此项被配置为N, 不编译CONFIG_XXX=y此项被配置为Y, 直接编译进内核CONFIG_XXX=m此项被配置为M, 编译为.ko文件, 供动态加载CONFIG_LOCALVERSION=""此项为字符串, 也可能是数值
我们以 CONFIG_DM9000 为例, 进行搜索. 忽略一些其他的配置文件, 关键的文件有如下几个:
include/linux/autoconf.h:129: #define CONFIG_DM9000 1- 这是个C语言的头文件, 很明显是给C语言代码调用的.
- 该文件由Makefile调用
./scripts/kconfig/内的脚本自动生成. - 对于
ym的配置项, 宏定义为1 - 对于
n的配置项, 不进行宏定义
include/config/auto.conf:128: CONFIG_DM9000=y- 这个文件是给 Makefile 调用的, 里面的值全部被认为是Makefile变量.
- 该文件由Makefile调用
./scripts/kconfig/内的脚本自动生成. - 对于
ym以及其它值的配置项, 照抄一遍.config里的内容 - 对于
n的配置项, 无定义!
drivers/net/Makefile:197: obj-$(CONFIG_DM9000) += dm9dev9000c.o- 子目录下的 Makefile 会被顶层的 Makefile 包含
- 由
auto.conf文件可知$(CONFIG_DM9000)=y - 所以此句等同于
obj-y += dm9dev9000c.o - 同理, 被设置成
m的变量就会有obj-m += xxx.o - 如果配置项被设为
n, 则变量为空, 替换后为obj- += xxx.o, 会被直接忽略 - Makefile 最后就通过
obj-y或obj-m来识别配置, 编译模块.
.config:588: CONFIG_DM9000=y./.config配置文件. 一切配置的源头文件.
编译和烧录内核
编译内核
cp config_ok .config # 加载厂家默认配置 |
使用 nfs 烧录
如果配置好网路, 建议使用 nfs 进行烧录
# 开发板 uboot |
使用 dnw 烧录
确保链接了开发板的串口和usb口, 并把usb口关联到Ubuntu上.
# 开发板 uboot |
原创于 DRA&PHO