免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12135 | 回复: 13
打印 上一主题 下一主题

[NetBSD] 制作嵌入式芯片s3c2410板卡的NetBSD启动镜像 [复制链接]

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-30 00:33 |只看该作者 |倒序浏览
Composed by gvim from chinaunix, keep its integrality when copied. 3Q

最近事很多,抽时间在arm9的s3c2410a上跑了一把NetBSD3.0。参考了网上一些资料,尤其是一个韩国的网站(看不懂啊,蝌蚪文),我把过程详细记录下来,以滋同好。

整个过程十分简单!我认为原因在于NetBSD是一个完整的OS。
下面是过程的详细描述(由于NetBSD本身优秀的生成框架,所以步骤不多,我能做的只有把说明说详细些,说罗嗦些,呵~)

制作的host环境,随便,既:可以是NetBSD自己,也可以是FreeBSD,Linux都可以,方法都一样。

目标运行环境s3c2410芯片的开发版(我试验了两块,但并不保证所有板子都可以无修改的运行)

1
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下也有一份

2
交叉编译器
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

3
编译内核(一些详细的说明过一会说明,这里仅仅是步骤)
由于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就是我们的内核

4
制作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。

5
把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行内核代码,有兴趣咱们再另外说
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) 欢迎补充

[ 本帖最后由 gvim 于 2006-7-31 16:03 编辑 ]

3m.rar

508 Bytes, 下载次数: 177

3m ramdisk的文件列表

24m.rar

5 KB, 下载次数: 161

我用的24m,带普通开发环境

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
2 [报告]
发表于 2006-07-30 01:58 |只看该作者
这是我的完整启动信息。
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 3.99.21 (SMDK2410_INSTALL) #33: Sun Jul 30 00:26:12 UTC 2006
        root@vi:/usr/src.netbsd/sys/arch/evbarm/compile/SMDK2410_INSTALL
total memory = 65536 KB
avail memory = 34776 KB
mainbus0 (root)
cpu0 at mainbus0: ARM920T rev 0 (ARM9TDMI core)
cpu0: DC enabled IC enabled WB enabled EABT
cpu0: 16KB/32B 64-way Instruction cache
cpu0: 16KB/32B 64-way write-back-locking-A Data cache
ssio0 at mainbus0: fclk 200 MHz hclk 100 MHz pclk 50 MHz
ohci0 at ssio0 intr 26
ohci0: OHCI version 1.0
usb0 at ohci0: USB revision 1.0
uhub0 at usb0
uhub0: Samsung OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
sscom0 at ssio0 unit 0: UART0 addr=50000000
sscom0: console (major=104)
sscom1 at ssio0 unit 1: UART1 addr=50004000
ssextio0 at ssio0
cs0 at ssextio0 addr 0x18000000 intr 9
cs0: CS8900 rev. K, address 00:0a:b1:00:01:ff, media UTP
lcd0 at ssio0
wsdisplay0 at lcd0 kbdmux 1
wsmux1: connecting to wsdisplay0
ssspi1 at ssio0 unit 1
sskbd0 at ssspi1 intr 1
wskbd0 at sskbd0 mux 1
wskbd0: connecting to wsdisplay0
clock: hz=100 stathz = 64 PCLK=50000000 prescaler=2 tc=24414
md0: internal 24576 KB image area
boot device: <unknown>
root on md0a dumps on md0b
root file system type: ffs
Checking for botched superblock upgrades: done.
Starting file system checks:
/dev/rmd0a: file system is clean; not checking
Setting tty flags.
Setting sysctl variables:
Starting network.
Hostname: manber
IPv6 mode: host
Configuring network interfaces:.
sleep: not found
sleep: not found
Building databases...
Mounting all filesystems...
Clearing /tmp.
Creating a.out runtime link editor directory cache.
Checking quotas: done.
Setting securelevel: kern.securelevel: 0 -> 1
swapctl: not found
Starting virecover.
Starting local daemons:.
Updating motd.
Sun Jul 30 00:28:48 GMT 2006
#


我不会做多用户系统,因此没有login提示。
下面是两个截图,分别是vi,和cc编译

[ 本帖最后由 gvim 于 2006-7-30 02:19 编辑 ]

compiler.JPG (67.65 KB, 下载次数: 131)

compiler.JPG

vi1.JPG (34.89 KB, 下载次数: 122)

vi1.JPG

论坛徽章:
0
3 [报告]
发表于 2006-07-30 09:17 |只看该作者
在NetBSD的主页上看到:(http://www.netbsd.org/contrib/projects.html#realtime

Real time support (top)

Support realtime signals and process scheduling according to POSIX standards.

Contact(s): [tech-kern]

Estimated time: 4 month[1]

不知道这是不是所谓的软实时性。希望NetBSD做得更好。

另:据说Framebuffer的驱动进了NetBSD-current,我一直没关注CURRENT,不GVIM兄的内核显然是-CURRENT的,不知道见过没有?
NetBSD 3.99.21 (SMDK2410_INSTALL) #33: Sun Jul 30 00:26:12 UTC 2006
        root@vi:/usr/src.netbsd/sys/arch/evbarm/compile/SMDK2410_INSTALL

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
4 [报告]
发表于 2006-07-30 14:36 |只看该作者
实时性还没开始做呢。
去年我和NetBSD的人联系过,我想做这部分。后来,呵,不了了之。

FrameBuffer有hacker倒是做出来了,录像我也看过,很是不错。不过刚才查了查没找到官方的表示。
另外,http://www.netbsd.org/contrib/projects.html#ledapi ,这里说LCD/LED没有一个通用API。

论坛徽章:
0
5 [报告]
发表于 2006-07-31 08:37 |只看该作者
使用FreeBSD的可行性如何?

论坛徽章:
0
6 [报告]
发表于 2006-07-31 10:43 |只看该作者
原帖由 雨丝风片 于 2006-7-31 08:37 发表
使用FreeBSD的可行性如何?

ARM9 上面的倒是听说过,不过估计是 FFS 了......

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
7 [报告]
发表于 2006-07-31 16:19 |只看该作者
只要有mmu的处理器原则上都可以。
FreeBSD的arm port /usr/src/sys/arm/* 有一部分是直接来自NetBSD,可以看文件里面的版权声明。
目前FreeBSD的arm体系只有xscale 和sa11x0两个平台。
要把NetBSD的port原封不动的移植过来,应该比自己写代码支持新平台容易。
不过没有build.sh,应该没有NetBSD方便吧

论坛徽章:
0
8 [报告]
发表于 2006-07-31 17:46 |只看该作者
原帖由 gvim 于 2006-7-30 14:36 发表
FrameBuffer有hacker倒是做出来了,录像我也看过,很是不错。不过刚才查了查没找到官方的表示。


邮件列表里面有个 HOWTO:

http://mail-index.netbsd.org/current-users/2006/02/18/0018.html

我试过,比较慢,应该是这个 vesafb 驱动还不成熟。

论坛徽章:
0
9 [报告]
发表于 2007-04-24 23:45 |只看该作者

你的shell环境怎么设的?

照你的步骤,用gmake那个命令编译linux kernel2-4的和uclinux,均提示需要bash,我的是FreeBSD环境,用的是bash,在/.profile中已经加入那个/usr/src/tooldir.Free....i386/bin这个目录的了,但是在menuconfig时还是照样出错.如下,你的shell是怎样弄的?为啥你的用tcsh都行?
编linux kernel出错
gmake: arm--netbsdelf-gcc锛氬懡浠ゆ湭鎵惧埌
arm--netbsdelf-ld: not found
rm -f include/asm-arm/arch include/asm-arm/proc
(cd include/asm-arm; ln -sf arch- arch; ln -sf proc- proc)
rm -f include/asm
( cd include ; ln -sf asm-arm asm)
gmake -C scripts/lxdialog all
gmake[1]: Entering directory `/usr/wang/linux/scripts/lxdialog'
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE  -DCURSES_LOC="<ncurses.h>" -c -o checklist.o checklist.c
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE  -DCURSES_LOC="<ncurses.h>" -c -o menubox.o menubox.c
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE  -DCURSES_LOC="<ncurses.h>" -c -o textbox.o textbox.c
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE  -DCURSES_LOC="<ncurses.h>" -c -o yesno.o yesno.c
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE  -DCURSES_LOC="<ncurses.h>" -c -o inputbox.o inputbox.c
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE  -DCURSES_LOC="<ncurses.h>" -c -o util.o util.c
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE  -DCURSES_LOC="<ncurses.h>" -c -o lxdialog.o lxdialog.c
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE  -DCURSES_LOC="<ncurses.h>" -c -o msgbox.o msgbox.c
gcc -o lxdialog checklist.o menubox.o textbox.o yesno.o inputbox.o util.o lxdialog.o msgbox.o -lncurses
gmake[1]: Leaving directory `/usr/wang/linux/scripts/lxdialog'
sh scripts/Menuconfig arch/arm/config.in
Menuconfig requires bash
gmake: *** [menuconfig] 閿欒? 1
[root@arm9 /usr/wang/linux]# exit
exit

Script done on Tue Apr 24 23:25:19 2007
编uclinux出错
config/mkconfig > config.in
gmake -C /usr/wang/uClinux-dist/config/scripts/lxdialog all
gmake[1]: Entering directory `/usr/wang/uClinux-dist/config/scripts/lxdialog'
gmake[1]: Leaving directory `/usr/wang/uClinux-dist/config/scripts/lxdialog'
Menuconfig requires bash
gmake: *** [menuconfig] 閿欒? 1
[root@arm9 /usr/wang/uClinux-dist]# gmake CROSS_COMPILE=arm--netbsdelf- menuconfig

[root@arm9 /usr/wang/uClinux-dist]# exit    gammake cmenuconfig
config/mkconfig > config.in
gmake -C /usr/wang/uClinux-dist/config/scripts/lxdialog all
gmake[1]: Entering directory `/usr/wang/uClinux-dist/config/scripts/lxdialog'
gmake[1]: Leaving directory `/usr/wang/uClinux-dist/config/scripts/lxdialog'
Menuconfig requires bash
gmake: *** [menuconfig]  错误? 1
[root@arm9 /usr/wang/uClinux-dist]# exit
exit

Script done on Tue Apr 24 23:11:58 2007
那些乱码的文字原来都是中文来的.

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
10 [报告]
发表于 2007-04-26 08:41 |只看该作者
arm--netbsdelf-ld: not found
看样子是环境变量没有配置好。Linux系统默认的是使用bash,所以我没有在意这些。我有时间再帮你看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP