Kernel编译说明
- 搭建编译环境
- 安装虚拟机
- 下载Vmware Workstation并安装
- 新建linux虚拟机,选择不带操作系统
- 安装系统
- 下载linux系统镜像文件
- 开始在新建的linux虚拟机下安装操作系统
- 安装虚拟机
注意选择安装类型 “工作站”,会自动安装一些编译工具和开发环境,如果选择其他,则在需要使用某些系统链接库的时候再安装相应工具软件即可。
-
- 安装共享或samba服务,以能够将windows文件导入虚拟机
安装共享:
-
-
-
- 选择install Vmware tools
-
-
-
-
-
- 双击安装
-
-
-
-
-
- 安装配置
-
-
以上完了之后,可以在 cd /mnt/ 目录下看到文件夹 hgfs,此为共享目录窗口。
下一步 选择要共享的windows目录:
选择生效后,在虚拟机的/mnt/hgfs下即可看到添加的共享目录
现在就可以在windows下和虚拟机下对共享目录进行操作了,两边的增删改均可同步。
安装samba服务
略过。
-
- 安装编译环境
- 下载如下编译工具
- 安装编译环境
工具包 | 安装方法 | 说明 |
arm-gtk.tar.bz2 | tar xjvf arm-gtk.tar.bz2 -C /usr | 界面库(app用到) |
arm-mg-gcc3.4.1.tar.bz2 | tar xjvf arm-mg-gcc3.4.1.tar.bz2 -C /usr | Minugui(app用到) |
armv41-opt.tar.gz | tar xzvf armv41-opt.tar.gz -C / | 编译kernel |
cross-2.95.3.tar.bz2 | tar xjvf cross-2.95.3.tar.bz2 -C /usr/local/arm | 编译vivi |
arm-linux-gcc-3.4.1.tar.bz2 | tar jxvf arm-linux-gcc-3.4.1.tar.bz2 -C / | 编译driver、app等 |
-
-
- 将以上编译工具安装至虚拟机
- 添加环境变量:(必须,如果不添加,编译无法进行)
-
vi /etc/profile;
增加搜索目录 /usr/local/arm/3.4.1/bin
方法:在pathmunge /usr/local/sbin后添加一行pathmunge /usr/local/arm/3.4.1/bin即可
-
-
- 使环境变量立即生效:. /etc/profile 或source /etc/profile
-
检查环境变量是否生效,可使用 echo $PATH查看,也可直接在命令行输入arm- 按tab键是否能找到编译命令
- 编译2.4内核
- 下载2.4内核源代码mis2410-kernel-release.tar.gz
- 在虚拟机下执行解压 tar xjvf mis2410-kernel-release.tar.gz 到自定目录
- 解压后文件夹名称为 mis2410-kernel
[root@liumy mis2410-kernel]#cd mis2410-kernel
[root@liumy mis2410-kernel]# ls -a
[root@liumy mis2410-kernel]# cp .config ../ #备份配置文件.config,用来还原配置
[root@liumy mis2410-kernel]# ls ../ -a
[root@liumy mis2410-kernel]# make distclean #清除,以使编译有效
[root@liumy mis2410-kernel]# cp ../.config ./ #还原配置,不还原就会出现找不到头文件的错误
[root@liumy mis2410-kernel]# make menuconfig #编译系统配置
[root@liumy mis2410-kernel]# make dep; #编译依赖关系
[root@liumy mis2410-kernel]# make zImage #编译内核文件
[root@liumy mis2410-kernel]# ls arch/arm/boot/zImage #查看编译结果
[root@liumy mis2410-kernel]#
-
- 如完全按照上述步骤,不会遇到提示错误,在验证过程中,遇到了以下编译错误的情况:
错误1
fno-common -fno-common -pipe -mapcs-32 -march=armv4 -mshort-load-bytes -msoft-float
-DKBUILD_BASENAME=setup_res -c -o setup-res.o setup-res.c
setup-res.c: In function `pci_assign_resource':
setup-res.c:107: `PCIBIOS_MIN_IO' undeclared (first use in this function)
setup-res.c:107: (Each undeclared identifier is reported only once
setup-res.c:107: for each function it appears in.)
setup-res.c:107: `PCIBIOS_MIN_MEM' undeclared (first use in this function)
setup-res.c:104: warning: `min' might be used uninitialized in this function
make[3]: *** [setup-res.o] Error 1
make[3]: Leaving directory `/mnt/HIT/mis2410-kernel/drivers/pci'
make[2]: *** [first_rule] Error 2
make[2]: Leaving directory `/mnt/HIT/mis2410-kernel/drivers/pci'
make[1]: *** [_subdir_pci] Error 2
make[1]: Leaving directory `/mnt/HIT/mis2410-kernel/drivers'
错误2
setup.c:560: `WTDAT' undeclared (first use in this function)
setup.c:560: (Each undeclared identifier is reported only once
setup.c:560: for each function it appears in.)
setup.c:561: `WTCNT' undeclared (first use in this function)
setup.c:562: `WTCON' undeclared (first use in this function)
错误3:
make[3]: Entering directory `/mnt/HIT/mis2410-kernel/drivers/mtd/nand'
make all_targets
make[4]: Entering directory `/mnt/HIT/mis2410-kernel/drivers/mtd/nand'
/opt/host/armv4l/bin/armv4l-unknown-linux-gcc -D__KERNEL__
-I/mnt/HIT/mis2410-kernel/include -Wall -Wstrict-prototypes -Wno-trigraphs -Os –mapcs
-fno-strict-aliasing -fno-common -fno-common -pipe -mapcs-32 -march=armv4 -mtune=arm9tdmi
-mshort-load-bytes -msoft-float -DKBUILD_BASENAME=smc -DEXPORT_SYMTAB -c smc.c
smc.c: In function `nand_command':
smc.c:61: structure has no member named `write_cmd'
smc.c:65: structure has no member named `write_cmd'
smc.c:66: structure has no member named `write_cmd'
smc.c: In function `nand_read':
smc.c:187: structure has no member named `wait_for_ready'
smc.c:192: structure has no member named `read_data'
smc.c:198: structure has no member named `read_data'
smc.c: In function `smc_read_ecc_512':
……
smc.c:1350: warning: implicit declaration of function `GET_DI_NUM'
smc.c:1304: warning: `nand_maf_id' might be used uninitialized in this function
smc.c:1304: warning: `nand_dev_id' might be used uninitialized in this function
make[4]: *** [smc.o] Error 1
以上错误均为配置文件.config出错,在执行清除后未还原.config,如果执行了make distclean则会删除当前目录下的.config,如果直接编译make menuconfig,则会生成默认的.config,会有一些头文件找不到,所以在执行make menuconfig前应该把备份的.config拷贝回来。
- 编译2.6内核
- 下载2.6内核源代码linux-2.6.26-realease.tar.bz
- 在虚拟机下解压(若在共享文件夹下直接解压,会出现一些软链接的错误)
- 编译步骤和上面的2.4一致,还是注意.config的备份还原就好了
- 遇到如下错误:
drivers/char/s3c2410-proc.c:27:32: asm/arch/regs-gpio.h: No such file or directory
该问题经验证也是由.config配置不当引起,从头编译一次
PS:在内核的编译过程中,makefile会自动创建依赖关系,而大多数编译错误均为找不到头文件,找不到宏定义之类。依赖关系中比较常见的一个就是在linux-2.6.~~/include这个文件夹中,有一个从asm链接到asm-arm的软链接,在不同系统中,asm链接到不同的asm-***,如在正确步骤下还是出错,可尝试删掉该链接ulink asm,并重新创建ln –s asm-arm asm
- 编译启动程序bootloader
- 对于嵌入式系统来讲,bootloader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
- ARM处理器的芯片商很多,所以每种芯片的开发板都有自己的Bootloader。结果ARM bootloader也变得多种多样。最早有为ARM720处理器的开发板的固件,又有了armboot,StrongARM平台的blob,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader。
- 我们使用的是S3C24**的vivi,下载vivi-stelcom-release.tar.bz,并解压至虚拟机中
- 同样需要备份 .config
- 清除:make distclean
- 还原:cp ../.config ./
- 编译配置:make menuconfig
- 编译:make
PS:编译vivi时,不备份.config不会报错,但可能影响我们自定义的配置项,所以还是需要备份还原config文件,待完全解析并会自行设置.config后,可随意。
- 编译new-sim300
- 该模块为无线模块sim-com300的控制程序
- 下载并解压缩new-sim300
- 更改makefile中的CFLAGS,使之包含stelcom这个头文件夹,内核的include里面有这个文件夹,例如:
CFLAGS=-I/mnt/hit/kernel/mis2410-kernel/include -Wall -O2,注意需要添加O2选项优化编译,否则会出现链接错误。
PS:最新版本的new-sim300需要包含最新的stel_msg-20090817.h才可以。
- 编译pppd
- 该模块为网络拨号模块
- 下载并解压缩ppp-2.4.4.tar.bz2
- 可以不用更改makefile,直接make clean;make
- 我有遇到以下错误:
make[2]: Entering directory `/mnt/hit/public/ppp-2.4.4/pppd/plugins/rp-pppoe'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/mnt/hit/public/ppp-2.4.4/pppd/plugins/rp-pppoe'
make[2]: Entering directory `/mnt/hit/public/ppp-2.4.4/pppd/plugins/pppoatm'
arm-linux-gcc -O2 -g -I../.. -I../../../include -fPIC -I. -c -o pppoatm.o pppoatm.c
In file included from ./atm.h:11,
from pppoatm.c:23:
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/atm.h:235: error: variable or field `__user' declared void
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/atm.h:235: error: parse error before '*' token
make[2]: *** [pppoatm.o] Error 1
make[2]: Leaving directory `/mnt/hit/public/ppp-2.4.4/pppd/plugins/pppoatm'
make[2]: Entering directory `/mnt/hit/public/ppp-2.4.4/pppd/plugins/radius'
因为__user是在arm-linux/sys-include/linux/compiler.h中定义的
通过修改arm-linux/sys-include/linux/atm.h文件,添加#Include<linux/compiler.h>即可解除