编译uClinux

编译uClinux

    按下面步骤对uClinux源码包进行编译:

    make dep ……………………建立依赖关系

    make clean……………………清除旧的编译结果

    make lib_only………………编译库

    make user_only………………编译用户程序

    make romfs……………………产生romfs

    make image……………………产生映象文件

    make………………………………编译内核

 (替换romsf中的文件,需要 make image,make)

按常规编译完成后应该生成image.bin    linux    linux.data    linux.text romfs.img 5个文件,不过我只有linux/boot.rom(=romfs.img),今天上网查了查它们的定义。

 

romfs.img :这个文件是通过tools/romfs-inst.sh脚本,生成romfs目录及其下面的文 件,然后通过genromfs程序打包成一个文件romfs.imgromfs.img既可以放在Flash中,也可以放在RAM中,但需要在编译内核 时在driver/block/blkmem.c里指定地址,以便内核找到。

linux.text :编译后的内核中text段,一般放在Flash中,只读。

linux.data :编译后的内核中datainit段,一般放在SDRAM中,读写。

image.rom :通常image.rom的文件大小要比image.ram小很多,这是因为image.rom 一个压缩过的内核,前面加上一个小的解压程序负责把内核解压后搬到指定位置。这个文件可以直接烧进Flash中,当然也可以在RAM中运行。这个文件实际 上就是通常Linux生成的zImage文件。

image.ram :这个内核没有压缩过,而且必须在RAM里运行。所以需要通过板子上的Bootloader将它下 载到指定位置后开始执行。相对image.rom而言,从RAM里启动内核,则代码段和数据段都在RAM里面。这个文件是编译生成的ELF格式的 Linux内核,通过arm-elf-objcopy工具生成的二进制映像文件。可以这样形象的说:image.rom = gunzipprogram + gzipped(image.ram)

boot.rom :其实就是uClinux编译完成后的文件images/romfs.img,可以看一下它就是一个连接。

image.bin:上面三个文件顺序连接而生成的,image.bin = linux.text + linux.data + romfs.img

 

make lib_only 
编译uClibc。以后我们编译用户程序的时候需要这个运行库,在运行这步时,采用uC-libc出错,但发现有些人却用的是这个,没问题,不知为何。
make user_only 
编译用户的应用程序,包括初始化进程init,和用户交互的bash,以及集成了很多程序的busybox(这样对一个嵌入式系统来说可以减少存放的空 间,因为不同的程序共用了一套C 运行库),还有一些服务,如boa(一个在嵌入式领域用的很多的Web 服务器)和telnetdtelnet 服务器,我们可以通过网络来登录我们的uClinux 而不一定使用串口)。
make romfs(容易出错,见UC移植) 
在用户程序编译结束后,因为我们用到的是romfs(一种轻量的、只读的文件系统)作为uClinux 的根文件系统,所以首先需要把上一步编译的很多应用程序以uClinux 所需要的目录格式存放起来。原来的程序是分散在user 目录下,现在例如可执行文件需要放到bin目录、配置文件放在etc 目录下..这些事就是make romfs 所做的。它会在uClinux 的目录下生成一个romfs 目录并且把user 目录下的文件、以及vendors 目录下特定系统所需要的文件(我们的vendors 目录是vendors/ARMlator/ARMulator组织起来,以便下面生成romfs 的单个镜像所用。
make image(容易出错) 
它的作用有2 个,一个是生成romfs 的镜像文件,另一个是生成Linux 的镜像。因为原来的Linux 编译出来是elf 格式的,不能直接用于下载或者编译(不过那个文件也是需要的,因为如果你需要,那个elf 格式的内核文件里面可以包含调试的信息)。因此在这个时候由于还没有编译过Linux,因此在执行这一步的时候会报错。但是没有关系,因为我们在这里需要 的仅仅是romfs 的镜像,以便在下面编译Linxu 内核的时候使用。
make linux

(可能会出现error:cannot open romfs.o,其实这个文件已经有了,在linux-2.4.x/romfs/下,copyuC下就可以了) 
有了romfs 的镜像我们就可以编译Linux 了。因为我们的romfs 是嵌入到linux 内核中去了,所以在编译Linux 内核的时候就要一个romfs.o 文件。这个文件是由上面的make image生成的。
make image

(可能images/下只有一个boot.rom,我就是,其实这个文件就是romfs.img啦,链接一下,ln -s boot.rom romfs.img 
这里再一次make image 就是为了得到uClinux 的可执行文件的镜像了。执行了这一步之后,就会在images 目录下找到3 个文件:image.ramimage.romromfs.img。其中,image.ramimage.rom 就是我们需要的镜像文件。这个在下面使用uClinux”会提到。为了方便起见,在uClinux-dist 目录下有两个文件:build_first.sh build_final.sh 先执行build_first.sh 再执行build_final.sh 就可以得到所需的镜像文件。之所以没有把两个合并,是因为第一次使用make image 会出错。

3.使用uClinux

     上面我们提到了两个文件:image.ram image.rom。其中,image.ram 是直接下载到RAM 执行的文件。如果你还处于调试阶段,那么就没有必要把文件烧写到FLASH 里面。这个时候我们可以使用image.ram

 

原文地址:https://www.cnblogs.com/ahuo/p/2646586.html