分享
 
 
 

制作嵌入式芯片s3c2410板卡的NetBSD启动镜像

王朝other·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

最近事很多,抽时间在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)欢迎补充

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有