Kernel编译说明

Kernel编译说明

  • 搭建编译环境
    1. 安装虚拟机
      1. 下载Vmware Workstation并安装
      2. 新建linux虚拟机,选择不带操作系统
    2. 安装系统
      1. 下载linux系统镜像文件
      2. 开始在新建的linux虚拟机下安装操作系统

注意选择安装类型 “工作站”,会自动安装一些编译工具和开发环境,如果选择其他,则在需要使用某些系统链接库的时候再安装相应工具软件即可。

    1. 安装共享或samba服务,以能够将windows文件导入虚拟机

安装共享:

        1. 选择install Vmware tools

        1. 双击安装

        1. 安装配置

以上完了之后,可以在 cd /mnt/  目录下看到文件夹 hgfs,此为共享目录窗口。

下一步 选择要共享的windows目录:

选择生效后,在虚拟机的/mnt/hgfs下即可看到添加的共享目录

现在就可以在windows下和虚拟机下对共享目录进行操作了,两边的增删改均可同步。

安装samba服务

     略过。

    1. 安装编译环境
      1. 下载如下编译工具

工具包

安装方法

说明

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等

      1. 将以上编译工具安装至虚拟机
      2. 添加环境变量:(必须,如果不添加,编译无法进行)

vi /etc/profile;

增加搜索目录 /usr/local/arm/3.4.1/bin

方法:在pathmunge /usr/local/sbin后添加一行pathmunge /usr/local/arm/3.4.1/bin即可

      1. 使环境变量立即生效:.  /etc/profilesource /etc/profile

检查环境变量是否生效,可使用 echo $PATH查看,也可直接在命令行输入arm- tab键是否能找到编译命令

  • 编译2.4内核
    1. 下载2.4内核源代码mis2410-kernel-release.tar.gz
    2. 在虚拟机下执行解压 tar xjvf mis2410-kernel-release.tar.gz 到自定目录
    3. 解压后文件夹名称为 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. 如完全按照上述步骤,不会遇到提示错误,在验证过程中,遇到了以下编译错误的情况:

错误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内核
    1. 下载2.6内核源代码linux-2.6.26-realease.tar.bz
    2. 在虚拟机下解压(若在共享文件夹下直接解压,会出现一些软链接的错误)
    3. 编译步骤和上面的2.4一致,还是注意.config的备份还原就好了
    4. 遇到如下错误:

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
    1. 对于嵌入式系统来讲,bootloader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
    2. ARM处理器的芯片商很多,所以每种芯片的开发板都有自己的Bootloader。结果ARM bootloader也变得多种多样。最早有为ARM720处理器的开发板的固件,又有了armboot,StrongARM平台的blob,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader。
    3. 我们使用的是S3C24**的vivi,下载vivi-stelcom-release.tar.bz,并解压至虚拟机中
    4. 同样需要备份 .config
    5. 清除:make distclean
    6. 还原:cp  ../.config  ./
    7. 编译配置:make menuconfig
    8. 编译:make

PS:编译vivi时,不备份.config不会报错,但可能影响我们自定义的配置项,所以还是需要备份还原config文件,待完全解析并会自行设置.config后,可随意。

  • 编译new-sim300
    1. 该模块为无线模块sim-com300的控制程序
    2. 下载并解压缩new-sim300
    3. 更改makefile中的CFLAGS,使之包含stelcom这个头文件夹,内核的include里面有这个文件夹,例如:

CFLAGS=-I/mnt/hit/kernel/mis2410-kernel/include -Wall -O2,注意需要添加O2选项优化编译,否则会出现链接错误。

PS:最新版本的new-sim300需要包含最新的stel_msg-20090817.h才可以。

  • 编译pppd
    1. 该模块为网络拨号模块
    2. 下载并解压缩ppp-2.4.4.tar.bz2
    3. 可以不用更改makefile,直接make clean;make
    4. 我有遇到以下错误:

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>即可解除

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值