免费注册 查看新帖 |

Chinaunix

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

[NetBSD] 两篇移植NetBSD的文章 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-08 21:23 |只看该作者 |倒序浏览

论坛徽章:
0
2 [报告]
发表于 2008-03-09 00:28 |只看该作者
第二篇我收藏了

论坛徽章:
0
3 [报告]
发表于 2008-03-10 18:39 |只看该作者

本人英语奇烂,建议看原文,原文讲的要清楚一些。

http://gicl.cs.drexel.edu/people ... porting_netbsd.html
移植NetBSD到一个ARM SOC
本文描述了移植NetBSD到一个新的基于ARM的SOC的经历。所用的是基于ARM9的Agere Vx115移动电话数字传输芯片,Vx115 VEP开发板使用该芯片。这里列出的信息是为了提供移植NetBSD到新的基于ARM的平台的信息。
移植规模
在移植NetBSD时,有几种可能的规模,这依赖于已经存在于内核的对于硬件的支持程度。
处理器体系结构级移植
这意味着要修改NetBSD内核来运行在一个新的处理器体系类型(像MIPS,PowerPC,ARM,等。尽管这些类型已经被支持)。这是需要很大的工作量,需要对NetBSD内核和处理器体系结构理解很深。
SoC级移植
这意味着移植NetBSD到一个新的SoC,它使用的处理器核心已经被NetBSD内核所支持,但是(SoC)提供了一些特殊的芯片外围设备。这意味着要定义一些用于互联SoC上设备的总线结构,还有外设的驱动程序。
板级移植
这意味着要开发代码以允许NetBSD运行于使用芯片(或SoC)的某个特定的平台(开发板),而芯片(或SoC)已被NetBSD内核支持。这需要写合适的平台启动代码,同时支持板上的片外设备。还需要一个相应的带有应用程序和库的根文件系统。
这个文档描述了下面两件事。Vx115 SoC所基于的ARM9处理器核心已经被NetBSD支持(尽管确切的芯片,ARM926EJ-S,并没有被NetBSD内核直接支持而需要小量的修改),所以处理器体系规模的移植是不需要的,但是SoC提供了特定的片上设备,并提供了带有各种待支持的硬件组件的开发板。
止步点
移植的着眼点是使NetBSD运行于这个平台上,一个只有控制台和串口shell的最小化的支持。只有这些片上和片外设备必需支持的操作被满足;SoC提供了许多别的需要驱动的外设来构成接近于完全的板级支持包。
这样一个“基本”移植只要解决相对较少的问题,描述如下:
构建NetBSD系统组件
自动组态设定系统
内核配置
总线操作
系统时钟
串口驱动和控制台
支持的最大设备数
支持ARM926EJ-S变体
资料和结论
每一部分专注于创建各种配置,源码和头文件,这些内容在随后的章节里讨论。
相关知识和参考资料
作为开源系统的标准做法,对于现有的移植,很多需要的功能可以从相应的文件里找到。这个项目充分利用了可用的源代码(在此要感谢所有的原创作者)。实际上,由于其他人的工作和他们公开共享其成果,NetBSD和其他的开源系统很适合新的平台。
在NetBSD的主页上有很多关于构建和使用NetBSD的有用信息。 NetBSD指南包含了构建的有趣的信息,特别是关于构建和交叉编译的部分。
可贵的是由LXR项目提供的基于Web的源代码交叉参考工具Linux交叉参考已经被应用到NetBSD源代码(还有别的系统上)上,这项工作是Robert Watson做的。

-------------------
构建
我的大部分开发工作是在x86的Linux系统下,并且希望能在这个环境下交叉编译NetBSD系统。幸运的是,NetBSD提供了一个很好的支持交叉编译器和交叉编译平台的开发系统。
构建的过程包括构建的过程包括如下几步:
构建工具链
编译内核
编译应用程序和库
构建根文件系统
NetBSD自带了一个很有用的脚本,build.sh,使上面这一切变的很简单。
构建工具链
可以通过build.sh来完成构建工具链的工作:在顶层源码目录只需要运行
./build.sh -u -m evbarm tools
参数:
-u:在构建之前不运行”make clean”;这保证了更改之后任何东西都不会重新编译 (即不升级)
-m evbarm: 机器体系类型;这里是ARM评估板
tools:只构建工具链而不是整个系统
在Fedora Core 5上构建工具链的过程中,我发现了一个问题,Fedora本地工具链(用来构建NetBSD工具链)太新了(gcc 4.1)。NetBSD 工具链构建的是gcc 3版的工具。幸运的是,Fedora提供了gcc 3.2的包,可以如下安装
yum install compat-gcc-3.2
工具链的构建过程变为
export HOST_CC=gcc32
export HOST_CXX=g++32
./build.sh -u -m evbarm tools
来确保基于gcc 3的工具可以被用来构建所用的工具链。注意一旦NetBSD工具链建成后,这些工具(和export语句)就不需要了,它们只是为了“初始化”工具链。还要注意的是最近的NetBSD发行版构建过程开始使用gcc 4,所以这一步不是必需的。
编译内核
编译NetBSD内核也是使用build.sh来完成的:在源码顶层目录下运行如下命令
./build.sh -u -m evbarm kernel=VX115_VEP
参数:
-u:在构建之前不运行”make clean”;这保证了更改之后任何东西都不会重新编译(即不升级)
-m evbarm:机器体系类型;这里是ARM评估板
kernel=VX115_VEP:使用内核配置文件;这里是针对VX115_VEP板子的。配置文件在sys/arch/evbarm/conf。
这个命令执行一系列操作:
1) 创建一个构建目录sys/arch/evbarm/compile/obj/VX115_VEP
2)运行nbconfig”配置”VX115_VEP所需的配置文件以产生自动组态设定框架所必需的源文件。这个配置命令做了很多事情;它产生了自动系统组态设定框架所用的源文件,特别是系统和设备的配置文件。具体细节在系统组态设定部分
3)在源码目录下运行”make depend”命令为源码产生依赖关系
4)运行”make”来编译内核和驱动
当这个命令完成后,会在sys/arch/evbarm/compile/obj/VX115_VEP目录下产生内核目标文件,其包含了ELF格式的内核,并可能产生不同格式的输出,这依赖于配置。
     netbsd:ELF目标文件
     netbsd.bin:netbsd被转换成直接的二进制以直接加载进内存
     netbsd.bin.srec:netbsd.bin被转换成S-record格式用于加载进flash
     netbsd.gdb:带调试符号的ELF格式(供调试使用)
  构建应用程序库和应用程序
     由于NetBSD发行套件包括了所有的应用程序库和程序,build.sh脚本也可以产生它们,只需要z在源码顶层目录运行:
      ./build.sh -u -m evbarm
这将会创建obj/destdir.evbarm包含了所有的应用程序文件。
  构建根文件系统
        默认会为NetBSD创建一个用于桌面的文件系统,但对于嵌入式系统来说太大了。我制作的仅仅是包含必需的库和应用程序的最小化的基本系统,在被叫做rootfs_ramdisk的目录下有个控制台。(实际上,这并不是最小的,但是足够小到满足ramdisk,所以我并不对其进一步剪裁)
     rootfs_ramdisk
         bin
           cat chmod cp date df echo ed expr hostname kill ln ls mkdir mv ps pwd rm rmdir sh sleep stty sync test
         dev
             如下所讨论的,包括自动产生的设备
         etc
             mkttys passwd.conf rc.conf rc.lkm rc.shutdown ttys group motd rc rc.local rc.subr
         lib
            libcrypt.so libcrypt.so.0 libcrypt.so.0.2 libc.so libc.so.12 libc.so.12.128.2 libedit.so libedit.so.2 libedit.so.2.9 libevent.so libevent.so.0 libevent.so.0.2 libkvm.so libkvm.so.5 libkvm.so.5.2 libm.so libm.so.0 libm.so.0.2 libtermcap.so libtermcap.so.0 libtermcap.so.0.5 libtermlib.so libtermlib.so.0 libtermlib.so.0.5 libutil.so libutil.so.7 libutil.so.7.6 libz.so libz.so.0 libz.so.0.4
          libexec
              ld.elf.so
          sbin
               dmesg fsck fsck_ffs init init.shell ldconfig mknod modload modunload mount mount_ffs mount_filecore mount_kernfs mount_mfs mount_null mount_overlay mount_procfs mount_ufs nologin rndctl savecore sysctl ttyflags umount
usr
libexec
getty

在用于构建的主系统文件系统里,这是个包含文件的目录(我的Linux系统使用ext3文件系统)。有必要创建一个单个的文件来包含NetBSD文件系统映像-这由当前主系统所包含的目标集,但是打包它们可以形成NetBSD的文件系统。nbmakefs这个工具完成,它是工具链的一部分。
nbmakefs -s 5000k rootfs_ramdisk.img rootfs_ramdisk

这将创建5000kB的文件系统-最终的映像有5000kB(大约4.9M)。这个值同时也会在内核配置中用到,以为ramdisk映像保留这么多的空间。
把ramdisk映像加入内核
通过使用mdsetimage这个工具,上面所创建的ramdisk会被加入内核:
arm--netbsdelf-mdsetimage -v -s netbsd rootfs_ramdisk.img
这里netbsd是内核创建过程中产生的内核映像。
进一步的包装
对于这里所用的评估板,板子的启动引导器使用s-record格式的可引导文件,所以有必要使用objcopy工具从内核+ramdisk映像产生可引导srec。另外,内核被加载在系统flash的0x20400000地址处,
但是它被配置成执行在0x24300000处,而这要求在产生s-record过程中使用—change-addresses参数。
这是和具体平台相关的,同样的步骤可能并不适用于别的平台。
arm--netbsdelf-objcopy -S -O binary netbsd netbsd.bin
   arm--netbsdelf-objcopy --input-target=binary --output-target=srec --change-addresses=0x20400000 -v netbsd.bin netbsd.bin.srec

待续。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP