制作嵌入式芯片s3c2410板卡的NetBSD启动镜像
最近事很多,抽时间在arm9的s3c2410a上跑了一把NetBSD3.0。参考了网上一些资料,尤其是一个韩国的网站(看不懂啊,蝌蚪文),我把过程详细记录下来,以滋同好。整个过程十分简单!我认为原因在于NetBSD是一个完整的OS。
下面是过程的详细描述(由于NetBSD本身优秀的生成框架,所以步骤不多,我能做的只有把说明说详细些,说罗嗦些,呵~)
制作的host环境,随便,既:可以是NetBSD自己,也可以是FreeBSD,Linux都可以,方法都一样。
目标运行环境s3c2410芯片的开发版(我试验了两块,但并不保证所有板子都可以无修改的运行)
引用:在ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-3.0.1/source/sets/下载netbsd的源代码,包括src.tgz,syssrc.tgz,gnusrc.tgz,share.tgz
%foreachfile(*.tgz)
?
tar-xzf$file-C/
?end
#解压缩所有元码文件到/usr/src目录
src.tgz是/usr/bin,/usr/sbin,/bin,/sbin下工具,/lib/libexec库文件等等的源代码
syssrc.tgz是NetBSD系统的内核源代码
gnusrc.tgz是gnu社区的软件的源代码,包括gcc编译器,gdb调试器,binutils等等工具,以及这些Gnu工具所需要的库
share.tgz包含了makefile所需要的编译控制文件,在/usr/share/mk下也有一份
引用:交叉编译器
cd/usr/src
mkdir../obj
./build.sh-mevbarmtools
交叉编译arm交叉编译器(见补充:1),-m选项是告诉build.sh我们需要的是arm的编译器。
这步之后在/usr/src下生成一个tooldir.xx文件夹。
我是在FreeBSD6.1下编译的,所以该文件夹名为tooldir.FreeBSD-6.1-RELEASE-i386。
在ZenwalkLinux下的名字是tooldir.Linux-2.6.16-unknow-i386
默认生成的是4.1.2,如果需要使用3.3.3的编译器,可以在/etc/mk.conf(可能需要手动建立)中添加HAVE_GCC=3
在~/.cshrc中setpath最后添加:/usr/src/tooldir.FreeBSD-6.1-RELEASE-i386/bin,这样,一个完整的交叉编译环境就已经搭建好了。不要忘了tcsh需要rehash
引用:编译内核(一些详细的说明过一会说明,这里仅仅是步骤)
由于NetBSD已经移植了三星s3c2410芯片的smdk2410开发版的代码,所以我们的过程就十分简单。
cd/usr/src
visys/arch/evbarm/conf/SMDK2410
#我自己的并没有怎么调整,只是打开了一些调试开关。注意一定要保留optionsCOMPAT_30选项(如果有的话)
./build.sh-mevbarm-ukernel=SMDK2410_INSTALL
#注意这里是_INSTALL
这样,在/usr/obj/sys/arch/evbarm/compile/SMDK2410_INSTALL目录下的netbsd就是我们的内核
制作ramdisk
该步十分简单,但是十分繁琐。
十分偷懒的一个方法了,呵呵。(如果你有兴趣知道麻烦的制作方法,欢迎与我联系探讨)
引用:在ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-3.0.1/evbarm/binary/sets/下载base.tgz和etc.tgz两个包,如果你需要编译工具也可以下载comp.tgz别人已经帮我们编译完了,我们麻烦的自己编译干什么:)
(接下来假设这些包已经放在我们的home里面)
cd~
tar-zxf*.tgz到~/sets目录(目录名任意)
在~/sets里删除不需要的东西(附件里我贴出一份我自己的文件列表,包括vi编辑器,gcc编译器和最基本的头文件)
cd~
nbmakefs-s3m-tffsimage~/sets
#-s(ize)3m;-t(ype)ffs。从sets目录生成一个3m的名为image的文件。首先需要保证sets下的文件总共小于等于3m(用du察看)。制作大文件后面再说。
这样,我们也做好了一份ramdisk。
引用:把ramdisk和内核拼到一起
cd~
cp/usr/src/sys/arch/evbarm/compi..../netbsd.
#把你在第三步编译的内核考到home里,便于我们操作
arm--netbsdelf-mdsetimage-svnetbsdimage
#把第四步制作的image拷贝到内核里面(见补充:2)
arm--netbsdelf-objcopy-S-Obinarynetbsdnetbsd.bin#去掉一些不必要的信息,生成一个可以直接执行的二进制镜像
ok,至此,我们的工作全部完成。把netbsd.bindownload到你的板子上试试。
补充:1关于交叉编译器。
这个编译器是一个完整的交叉编译环境。把执行目录放到path里面就可以直接使用。比如,在FreeBSD6.1下面编译Linux2.6.16的内核,只需要:
gmakeARCH=armCROSS_COMPILE=arm--netbsdelf-menuconfig
gmakeARCH=armCROSS_COMPILE=arm--netbsdelf-
....
既可(我可以在FreeBSD6.1和ZenwalkLinux2.6.16编译出Linux内核,但是在编译boot的时候出现问题,但是问题与编译环境无关)
-m参数所支持的平台,全部可以在build.sh脚本里的getarch()函数里找到。
不过它的make使用的是bmake,正确的方法是用nbmake-evbarm:
如:
引用:cd/usr/src/sys/arch/evbarm/conf
nbconfigSMDK2410_INSTALL
cd../compile/SMDK2410_INSTALL
nbmake-evbarmdepend
nbmake-evbarm
这样和第3步一样,也是编译交叉内核。nbmake-evbarm是一个wapper文件,可以用vim等编辑器在/usr/src/tooldir.xxx/bin下面察看。
而编译Gnu的一些软件时需要使用gmake,如上面的Linux内核编译。
如果新入门的朋友对于制作交叉编译器觉得很麻烦,或是出现恼火的问题,不妨用NetBSD的代码和build.sh来做。除了arm--netbsdelf-和arm--linux-名字不同外,其余方面在我所使用的地方还没见到不同。
补充:2关于ramdisk的~/sets目录的制作
这个东西要深入的讲的话涉及的东西也不少,我这里就不打算写的太麻烦。
引用:1)其实就是用ldd看动态库,但是这玩意比较麻烦,因为i386host上不能执行arm的ldd。(附件里面给出我自己的文件列表)
我的方法比较笨,把我需要的命令,不管能不能运行,先做成一个image运行,然后在arm自己的运行环境里用ldd一个一个找。如果你有好方法请告诉我。
反正我用的命令不多,所以笨点也无所谓了,嘿嘿
引用:2)ramdisk的大小是严格要求的,在conf/INSTALL文件(该文件由SMDK2410_INSTALL包含进去)中有一句MEMORY_DISK_ROOT_SIZE=6150,它是以512字节的快形式给出,具体的换算是6150*512/1024=6150/2=3075k稍微大于3m(所以我们在第4步的nbmakefs的时候-s参数给的是3m),这里内核本身预留的空间至少要大于后等于nbmakefs产生的ramdisk大小。
所以,如果预留的空间比ramdisk大,可以在arm--netbsdelf-mdsetimage的时候使用-s参数,使内核中的记录MEMORY_DISK_ROOT_SIZE的常量得到修改。
另外,在保留了MEMORY_DISK_ROOT_SIZE的时候,我们可以看到内核的大小。
ls-lh/usr/src/...../SMDK2410_INSTAll/netbsd
我的大小是5.8M,其中ramdisk占3m,内核本身占2.8m。gzip-9压缩后内核总大小是2.2m
这是没有精简的内核,我无聊的时候做过一个最精简内核,大概500k左右。
这个ramdisk只有3m,如果要制作更大的ramdisk,放更多的东西进去,需要修改2行内核代码,有兴趣咱们再另外说:em06:
引用:3)可能需要根据你的需要修改~/sets/etc下的文件内容
总结:
用NetBSD做开发的优势:
1)搭建交叉编译环境异常轻松,不仅仅在NetBSD下,甚至Linux,FreeBSD下都可以。Linux下的交叉环境,对新入门朋友来说,自己搭建的话困难重重
2)制作镜像十分轻松。又过接触的应该知道:一般来说,Linux的内核,ramdisk,文件系统这些东西都是分开的,放在Flash的不同区块里。新入门的朋友可能有很大一部分会阻碍在这个地方。而NetBSD的内核和ramdisk是结合在一起的。(当然,你也可以分开做,存放在Flash的不同区块。具体方法请在google上找)。你也可以认为它就是一个内核,其中自包含了所有运行需要的东西,你只要照顾好bootloader即可。
3)支持的计算机体系多,同一体系的不同平台多,平台越多越易于用户移植
4)每个体系自带bootloader,都在sys/arch/xxx/stand下,对于研究相关boot(loader)的朋友来说,是个绝好的例子。这个东西可以独立编译,除了gzip的解压缩过程之外,代码只分布在3-5个简短的文件中。
5)NetBSD内核是独立的,与bootloader无关,不需要接收bootloader来的任何参数。相比较,Linux的初始条件会受到bootloader的影响,如某些寄存器。简单说来,bootloader只需要将内核拷贝到预期地址distination,然后执行一个直接跳转jmp*distination即可
6)欢迎补充
劣势:
1)没有NandFlash文件系统,如Yaffs等
2)某些驱动或设施没有Linux多,比如LCD的FrameBuffer
3)没有实时性,相比Linux提供的软实时性来讲,现阶段NetBSD没有提供实时性
4)欢迎补充