大约3、4年前曾帮助ma兄弟去编译linux内核,期望让他帮Dr. Xu把一块x86架构的SBC(Single Board Comptuer)跑起来----然而,其时很忙,且该项活动没得到管理层的指示,就没有进行下去,记得内核是已经能跑起来了的,就是rootfs还没有定制好。
时至今日,linux已经从2.4进化到了2.6,这个进化据称对嵌入式定制尤其是实时性方面有了很强的支持,而我最近由于项目的关系,也得到一片PowerPC架构的COM(Computer On Module),更直观的是,供应商提供了一个完整的manual和一个已经可以work的内核image,且已经load到flash里了。虽然项目不会用linux,这仍然勾起了我的兴趣----做了这么多年,没有一个实际的机会来自己过把Linux嵌入式的瘾,实在妄为Firmware Design Engineer呀。
序幕太长,其实过程很简单。
首先,该COM提供了一个关键的东西----NetBootloader,这就免去很多繁琐的前期工作。谁都知道,调通bootloader就等于搞定了半个embedded system,更别说这个bootloader已经是成熟的了。简单讲,它支持从tftp load linux image。不过这一步我还没实践----因为kernel image还没编译好呢----哈,扯了。顺便再扯一句:bootloader在PowerPC上,就相当于x86的bios + grub或lilo启动引导程序了。
但现有的硬件里已经burn进去了一个image,开机启动就可以了----慢着,rootfs不在!哈,显然,供应商提供了一个tar.bz2文件,其中包含了已经定制好的ppc架构的rootfs(含etc配置、lib库及bin应用程序等),而且前几天趁着他们工程师在的时候,一起搞了一把nfs rootfs的配置,已经能work起来了(rootfs=nfs root=nfsserverip:/nfs/export/path)----强吧,linux能这么简单搞定无盘工作站,还是嵌入式的
显然,我要做的第一件事情是把rootfs灌到CF卡里,操作相当简单了。
step1. 把cf卡用读卡器挂到一台linux工作站上,用 fdisk -l 找到USB挂上去的硬盘分区(如/dev/sda),然后用fdisk /dev/sda进行分区,再用 mkfs.ext2 /dev/sda1 进行格式化,文件系统就做好了。
step2. 把/dev/sda1 mount到本地文件系统,再把rootfs那个tar.bz2包原版解压到/dev/sda1里,搞定。
接着,就是设置一下netbootloader,让它把cf卡看做root就好了,在我的系统里,cf卡是/dev/hda1,因此,只需要在启动行中设置 root=/dev/hda1 即可(跟lilo或者grub一样的~)
于是linux就跑起来了。
下一步呢,第一要自己来编译内核,目前万事具备,就差操作了,步骤如下:
0. 设置开发环境,当然你要有交叉编译工具gcc/g++(开发工作站是个x86的机器,目标呢是PowerPC),还要设置一些环境变量----免得去手工改Makefile以及编译时输入一堆参数了,比如ARCH=ppc;
1. 为目标系统(也就是我的PowerPC COM了)找到一个内核的缺省配置,在arch/ppc/configs目录里有一大把,拷贝到根目录改名为.config;
2. make menuconfig,增删一些自己感兴趣或不感兴趣的特性;
3. make ....,哈,这些等我搞定再说了
4. 当然就是把编译好的image load到目标机上咯
再下一步,计划编译些应用程序和库,这个貌似比较简单
最后,打算想办法自己搞个bootloader
先易后难,最近就干这些了。
ps. 吃饱了没事,统计了一把linux 2.6.21源码规模,发现支持25种架构和众多硬件外设的linux kerne文件数竟然已经达到了22000之多,而仅c/h源文件代码行数超过了700万(70% NBNC,注释仅约20%)。实在吓人。
chris078426 于 2008-10-06 14:40:51发表:
自己也在这个方面有兴趣,正在不断的努力中,现在没有开发什么新的项目,一支在看linux的东西,觉得东西太多了,要长时间的坚持呀,/。