博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
制作嵌入式芯片s3c2410板卡的NetBSD启动镜像(转)
阅读量:2495 次
发布时间:2019-05-11

本文共 4907 字,大约阅读时间需要 16 分钟。

制作嵌入式芯片s3c2410板卡的NetBSD启动镜像(转)[@more@]

  最近事很多,抽时间在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

  % foreach file (*.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 -mevbarm tools

  交叉编译arm交叉编译器(见补充:1),-m选项是告诉build.sh我们需要的是arm的编译器。

  这步之后在/usr/src下生成一个tooldir.xx文件夹。

  我是在FreeBSD6.1下编译的,所以该文件夹名为tooldir.FreeBSD-6.1-RELEASE-i386。

  在Zenwalk Linux下的名字是tooldir.Linux-2.6.16-unknow-i386 

  默认生成的是4.1.2,如果需要使用3.3.3的编译器,可以在/etc/mk.conf(可能需要手动建立)中添加HAVE_GCC=3

  在~/.cshrc中set path最后添加:/usr/src/tooldir.FreeBSD-6.1-RELEASE-i386/bin,这样,一个完整的交叉编译环境就已经搭建好了。不要忘了tcsh需要rehash

  引用:编译内核(一些详细的说明过一会说明,这里仅仅是步骤)

  由于NetBSD已经移植了三星s3c2410芯片的smdk2410开发版的代码,所以我们的过程就十分简单。

  cd /usr/src

  vi sys/arch/evbarm/conf/SMDK2410 

  #我自己的并没有怎么调整,只是打开了一些调试开关。注意一定要保留options COMPAT_30选项(如果有的话)

  ./build.sh -mevbarm -u kernel=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 -s 3m -t ffs image ~/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 -sv netbsd image  #把第四步制作的image拷贝到内核里面(见补充:2)

  arm--netbsdelf-objcopy -S -O binary netbsd netbsd.bin #去掉一些不必要的信息,生成一个可以直接执行的二进制镜像

  ok,至此,我们的工作全部完成。把netbsd.bin download到你的板子上试试。

  补充:1 关于交叉编译器。

  这个编译器是一个完整的交叉编译环境。把执行目录放到path里面就可以直接使用。比如,在FreeBSD6.1下面编译Linux2.6.16的内核,只需要:

  gmake ARCH=arm CROSS_COMPILE=arm--netbsdelf- menuconfig

  gmake ARCH=arm CROSS_COMPILE=arm--netbsdelf-

  ....

  既可(我可以在FreeBSD6.1和Zenwalk Linux2.6.16编译出Linux内核,但是在编译boot的时候出现问题,但是问题与编译环境无关)

  -m参数所支持的平台,全部可以在build.sh脚本里的getarch()函数里找到。

  不过它的make使用的是bmake,正确的方法是用nbmake-evbarm:

  如:

  引用:cd /usr/src/sys/arch/evbarm/conf

  nbconfig SMDK2410_INSTALL

  cd ../compile/SMDK2410_INSTALL

  nbmake-evbarm depend

  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看动态库,但是这玩意比较麻烦,因为i386 host上不能执行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) 没有Nand Flash文件系统,如Yaffs等

  2) 某些驱动或设施没有Linux多,比如LCD 的 FrameBuffer

  3) 没有实时性,相比Linux提供的软实时性来讲,现阶段NetBSD没有提供实时性

  4) 欢迎补充

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-944327/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10748419/viewspace-944327/

你可能感兴趣的文章
Scala入门系列(十一):模式匹配
查看>>
Sql Server 生成数据透视表 (行列转换等经典SQL语句)
查看>>
理解sizeof()
查看>>
Vue学习笔记之vue-cli脚手架安装和webpack-simple模板项目生成
查看>>
SqlServer 扩展属性
查看>>
优先队列
查看>>
一些程序和工具
查看>>
java8 运算语法集
查看>>
IDEA关于重命名
查看>>
Es6 中let var和 const 了解
查看>>
巧用队列之”Voting“
查看>>
Oracle数据类型number(m,n)
查看>>
C#多线程学习(一) 多线程的相关概念
查看>>
JS构造函数、原型对象、隐含参数this
查看>>
注册用户
查看>>
TZC Intercommunication System
查看>>
HDU 4571 SPFA+DP
查看>>
centos 创建以日期为名的文件夹
查看>>
Java Timer触发定时器
查看>>
Page Object设计模式
查看>>