这几天参考国嵌的实验手册和网上的资料完成了u-boot定制、内核定制、ramdisk根文件系统的制作,并成功。趁热打铁,总结一下。本文引用了很多网络上的文章,就不一一注明了。感谢各大侠的帮助,如有雷同,望见谅。

开发环境:红帽企业版5

交叉编译工具链:arm-linux-gcc4.3.2

嵌入式Linux内核版本:友善之臂的mini2440开发板光盘自带的内核linux-2.6.32.2

开发板:mini2440-64MNand Flash

Bootloader:u-boot-1.20

具体步骤如下:

1.U-BOOT定制

因为内容较多,改天再总结一篇吧,在这先不多说

2.解压内核源码树

具体步骤参照友善之臂mini2440开发板用户手册,具体不详述了。

3.修改内核配置选项

make menuconfig,打开配置菜单,修改两个配置项,分别是:

a):General setup-->选择 Initial RAM filesystem and RAM disk...... 项

b):DeviceDrivers-->Block devices-->选择 RAM block devicesupport 项

修改(4920)Default RAM disk size kbytes选项为(8192)Default RAM disk size kbytes

特别要注意的一点是,ramdisk是一种内存虚拟磁盘技术,实质上并不是一种文件系统,它使用的文件系统时ext2文件系统。所以一定要在make menuconfig的时候进入File systems菜单,选上<*>Second extended fs support。以提供内核对ext2文件系统的支持。

然后保存配置退出。

这样就为内核添加好了ramdisk启动功能和ramdisk的驱动支持了。
4.修改内核启动参数

方法有二:

a):修改.config的第310行,修改"CONFIG_CMDLINE"的定义

修改为CONFIG_CMDLINE="initrd=0x32000000,0x200000root=/dev/ram rw console=ttySAC0 mem=64M" 保存。

意思为从ramdisk启动,ramdisk压缩文件起始地址在内存地址0x32000000处,文件大小为0x200000。

此参数也可以在makemenuconfig ARCH=arm时进入Boot options菜单,然后在Default kernel command string里修改。效果是一样的。

b):或者不修改.config的的第310行CMDLINE定义,而是用u-boot的bootargs环境变量来传递启动参数。

同样也是修改该环境变量为bootargs=initrd=0x31000000,0x200000root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M

并saveenv保存u-boot环境变量

以上a),b)的效果是一样的。(注:我只试了a,b未试)
5.编译内核

注意:好像友善之臂把内核源码目录里的uImage目标给注释了,直接makeuImage会提示没有uImage的目标。zImage 是ARMLinux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文 件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。另外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。

在这里,我直接把u-boot根目录下/tools中的mkimage工具拷贝到主机的/usr/bin目录下,就可以直接在内核根目录下执行

#make uImageARCH=arm CROSS_COMPILE=arm-linux-

等待一会,内核编译完成。

6.制作ramdisk根文件系统(实际上是建立根文件系统)

该过程是制作ramdisk根文件系统的核心步骤,方法如下:

a)创建根文件系统目录:

#cd转入到你的工作目录。

#mkdir rootfs

#cd rootfs

#mkdir bin dev etclib proc sbin sys usr mnt tmp var

#mkdir usr/binusr/lib usr/sbin lib/modules
b)创建最基本的设备文件:

#cd dev

#mknod -m 666console c 5 1

#mknod -m 666 nullc 1 3

#cd ..
c)安装/etc配置文件:

我是用的国嵌提供的etc配置文件,未作修改,直接解压到根文件系统里。

操作如下:

#tar etc.tar.gz -C/xxx/rootwhj

xxx表示你要制作的根目录所在路径。
d)编译内核模块:

进入Linux内核源码根目录

#make modulesARCH=arm CROSS_COMPILE=arm-linux-
e)安装内核模块:

#makemodules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootwhj//嵌入式中的内核模块都要在文件系统中

xxx表示你要制作的rootfs所在的目录。
f)配置busybox

进入busybox目录执行#make menuconfig

进入BusyboxSettings -> build Options ->选中"Build busyboxas a static binary“,即静态链接,免去拷贝大量的库文件。

InstallationOptions -> 选中"Don't use /usr",以免busybox不慎被安装到宿主机系统的相应目录下,破坏宿主机系统。

BusyboxInstallation Prefix (/xxx/rootwhj),修改该选项表明编译后的busybox将安装到该位置。
g)编译、安装busybox

#make ARCH=arm CROSS_COMPILE=arm-linux-

几分钟编译完成后

#make install

安装到BusyboxInstallation Prefix (/xxx/rootwhj)设定的目录里。当前为我要制作的根文件系统目录(/xxx/rootwhj)。

//完成根文件系统的创建

h)制作ramdisk根文件系统镜像

方法如下:

http://genext2fs.sourceforge.net/下载可以简单方便的制作ramdisk文件系统的工具genext2fs,这样就不用像网上大多数说的那样繁琐的制作ramdisk映像了,当前最新版本为genext2fs-1.4.1.tar.gz 。

编译生成该工具genext2fs,并将其放入宿主机的/sbin/目录下以方便使用。

跳转到要制作的rootfs的上一级目录

#genext2fs -b 8192-d rootfs ramdisk

-b是指制作的ramdisk大小为8MB

-d是指要制作成ramdisk的根文件系统目录

最后的ramdisk是制作出来的ramdisk的名字,当然可以改名了。

#gzip -9 -f ramdisk

将该ramdisk以最优方式压缩为ramdisk.gz

从ramdisk根文件系统启动Linux成功的更多相关文章

  1. 从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux

    下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述 ...

  2. 从ramdisk根文件系统启动Linux 二

    今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下.其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fedo ...

  3. 使用nfs作为根文件系统启动,(3)

    通过设置u-boot的bootargs来更改开机自动进入nfs远端服务器,不需要mount指令,实现虚拟机编译程序后直接通过u-boot烧写程序 1  使用nfs作为根文件系统启动 1.1    pr ...

  4. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  5. uboot、内核、根文件系统启动流程

    [1]Uboot的启动流程  Uboot的启动分为两个阶段.  第一阶段:设置异常向量表,设置ARM核为svc模式,关cache和关mmu,  关看门狗,初始化时钟,串口,内存,初始化栈空间,清bss ...

  6. linux文件系统启动流程、启动脚本

    linux文件系统启动流程.启动脚本 下面是一张Linux启动流程图: 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1. /sbin/init 2. /etc/ ...

  7. Linux文件系统启动过程及login的实现

    1. busybox简介 busybox是一个集成了一百多个最常用linux命令和工具的软件,它将许多常用的LINUX命令和工具结合到了一个单独的可执行程序中.虽然与相应的GNU工具比较起来,busy ...

  8. 使用mkbootfs制作ramdisk根文件系统

    span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...

  9. Ramdisk根文件系统映像的修改与创建

    本文简述Ramdisk根文件系统映像的修改以及创建,并附相关脚本以实现自动化配置,而根文件系统的制作过程请网上自行搜索.相关过程尽可能以图的方式展示出来,重在说明操作的过程,仅供参考. Ramdisk ...

随机推荐

  1. 【IOS】利用ASIHTTPRequest 实现一个简单的登陆验证

    http://blog.csdn.net/toss156/article/details/7638529

  2. 【NHibernate】配置- sql打印

    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <pr ...

  3. 南京邮电大学CTF隐写术部分Writeup

    女神 听说这是女神的私房照,里面藏着flag哦 http://115.28.150.176/misc1.jpg 这个链接居然打不开,摔!万念俱灰!主办方可否给力点! P.S.为了方便日后学习,暂时列下 ...

  4. Asp.Net MVC结合ExtJs gridPanel 分页和高度自适应

    Ext.onReady(function () { gridPanel(); var panel = Ext.getCmp('gridPanel'); window.onresize = functi ...

  5. eclipse 书签

    虽然eclipse有back to和forward两个功能帮助我们阅读代码,但有时候代码一层一层看下去后,会忘了自己最初的起点. 因此想到了eclipse的书签bookmark功能. 首先,添加书签. ...

  6. Java连接redis的使用示例

    在多线程下使用Jedis 在不同的线程中使用相同的Jedis实例会发生奇怪的错误.但是创建太多的实现也不好因为这意味着会建立很多sokcet连接,也会导致奇怪的错误发生.单一Jedis实例不是线程安全 ...

  7. asp.net单点登录(SSO)解决方案

    前些天一位朋友要我帮忙做一单点登录,其实这个概念早已耳熟能详,但实际应用很少,难得最近轻闲,于是决定通过本文来详细描述一个SSO解决方案,希望对大家有所帮助.SSO的解决方案很多,但搜索结果令人大失所 ...

  8. 团体程序设计天梯赛-练习集L2-007. 家庭房产

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  9. 团体程序设计天梯赛-练习集L1-011. A-B

    L1-011. A-B 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你计算A-B.不过麻烦的是,A和B都是字符串 — ...

  10. [itint5]跳马问题加强版

    http://www.itint5.com/oj/#12 首先由跳马问题一,就是普通的日字型跳法,那么在无限棋盘上,任何点都是可达的.证法是先推出可以由(0,0)到(0,1),那么由对称型等可知任何点 ...