当前位置:操作系统 > Unix/Linux >>

制作嵌入式芯片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)欢迎补充
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,