loading linux img2a,嵌入式Linux中initrd的应用--浅析ramdisk、ramfs、initrd和initramfs

看到这样的一句话很让我费解,因为似乎我理解为这样做能够提高一点嵌入式linux启动速度,我对此是非常地感兴趣

自此,就开始了我的解惑之旅

首先需要知道的是ramdisk和ramfs

http://www.linuxfordevices.com/c/a/Linux-For-Devices-Articles/Introducing-initramfs-a-new-model-for-initial-RAM-disks/

或者内核源码/Documentation/filesystems/ramfs-rootfs-initramfs.txt

从上述文章,大致可以了解到

ramdisk是一种基于ram的块设备,ramfs是一种基于ram的文件系统,开发ramfs的目的是因为ramdisk浪费了太多的内存cache页,ramfs是基于tmpfs的一个实例

顺理成章,initrd是init ramdisk的缩写,initramfs是init ramfs的缩写

名称里加了init前缀,代表它们具有了引导内核启动的功能

ramfs比ramdisk更加高效,自然initramfs也更加优秀,是2.6内核新加入的推荐使用的机制,虽然可能pc中grub使用的内核cmd

line参数是

kernel /vmlinuz-2.6.25-14.fc9.i686 ro

root=UUID=11d7ac51-2b45-489e-8a48-8d2a28e2c04e rhgb quiet

initrd /initrd-2.6.25-14.fc9.i686.img

,实际上使用的是initramfs,可以靠文件格式来区分。initrd是gziped的,initramfs是cpio的

剩下的部分就只说initrd了

首先是initrd的作用:内核镜像要尽可能小,所以不应该静态包含进太多驱动模块。但是Linux内核启动最后一步,创建init内核线程,需要执行的init程序或者脚本并不在内核镜像中,而在根文件系统中。根文件系统可能在硬盘、磁盘阵列、nfs、flash上,同时根文件系统的格式也是五花八门。此时,实在不想包含这么多驱动到镜像的话,可以使用initrd作为一个过渡。

initrd本身的内容就是一个精简的根文件系统,包含必备的目录和程序,甚至也有一个init脚本或程序linuxrc

一切的一切,因为linux的高可定制性,一切随你便。在pc上通常是后者

以pc上的为例,首先拷贝一个initrd-2.6.25-14.fc9.i686.img,防止破坏了它开不了机

然后将其备份改名为gz,解压缩

[root@localhost boot]# mkdir /tmp/initrd

[root@localhost boot]# cp initrd-2.6.25-14.fc9.i686.img

/tmp/initrd/

[root@localhost boot]# cd /tmp/initrd/

[root@localhost initrd]# mv initrd-2.6.25-14.fc9.i686.img

initrd-2.6.25-14.fc9.i686.gz

[root@localhost initrd]# gunzip initrd-2.6.25-14.fc9.i686.gz

[root@localhost initrd]# ls

initrd-2.6.25-14.fc9.i686

[root@localhost initrd]# file initrd-2.6.25-14.fc9.i686

initrd-2.6.25-14.fc9.i686: ASCII cpio archive

(SVR4 with no CRC)

继续解压缩,查看其根目录下的init脚本,其重要的地方都用加粗了

#!/bin/nash

mount -t proc /proc /proc

setquiet

echo Mounting proc filesystem

echo Mounting sysfs filesystem

mount -t sysfs /sys /sys

echo Creating /dev

mount -o mode=0755 -t tmpfs /dev /dev

mkdir /dev/pts

mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts

mkdir /dev/shm

mkdir /dev/mapper

echo Creating initial device nodes

mknod /dev/null c 1 3

mknod /dev/zero c 1 5

mknod /dev/systty c 4 0

mknod /dev/tty c 5 0

mknod /dev/console c 5 1

mknod /dev/ptmx c 5 2

mknod /dev/tty0 c 4 0

mknod /dev/tty1 c 4 1

mknod /dev/tty2 c 4 2

mknod /dev/tty3 c 4 3

mknod /dev/tty4 c 4 4

mknod /dev/tty5 c 4 5

mknod /dev/tty6 c 4 6

mknod /dev/tty7 c 4 7

mknod /dev/tty8 c 4 8

mknod /dev/tty9 c 4 9

mknod /dev/tty10 c 4 10

mknod /dev/tty11 c 4 11

mknod /dev/tty12 c 4 12

mknod /dev/ttyS0 c 4 64

mknod /dev/ttyS1 c 4 65

mknod /dev/ttyS2 c 4 66

mknod /dev/ttyS3 c 4 67

echo Setting up hotplug.

hotplug

echo Creating block device nodes.

mkblkdevs

echo "Loading ehci-hcd module"

modprobe -q ehci-hcd

echo "Loading ohci-hcd module"

modprobe -q ohci-hcd

echo "Loading uhci-hcd module"

modprobe -q uhci-hcd

mount -t usbfs /proc/bus/usb /proc/bus/usb

echo "Loading ext3 module"

modprobe -q ext3

echo "Loading scsi_mod module"

modprobe -q scsi_mod

echo "Loading sd_mod module"

modprobe -q sd_mod

echo "Loading libata module"

modprobe -q libata

echo "Loading ata_generic module"

modprobe -q ata_generic

echo "Loading pata_acpi module"

modprobe -q pata_acpi

echo Waiting for driver initialization.

stabilized --hash --interval 250 /proc/scsi/scsi

echo "Loading ata_piix module"

modprobe -q ata_piix

echo Waiting for driver initialization.

stabilized --hash --interval 250 /proc/scsi/scsi

echo "Loading dm-mod module"

modprobe -q dm-mod

echo "Loading dm-mirror module"

modprobe -q dm-mirror

echo "Loading dm-zero module"

modprobe -q dm-zero

echo "Loading dm-snapshot module"

modprobe -q dm-snapshot

echo Making device-mapper control node

mkdmnod

modprobe scsi_wait_scan

rmmod scsi_wait_scan

mkblkdevs

echo Scanning logical volumes

lvm vgscan --ignorelockingfailure

echo Activating logical volumes

lvm vgchange -ay --ignorelockingfailure VolGroup00

resume /dev/VolGroup00/LogVol01

echo Creating root device.

mkrootdev -t ext3 -o defaults,ro

/dev/VolGroup00/LogVol00

echo Mounting root filesystem.

mount /sysroot

echo Setting up other filesystems.

setuproot

loadpolicy

echo Switching to new root and running init.

switchroot

echo Booting has failed.

sleep -1

首先,这里使用的是nash,不是bash、csh等常见shell。nash是专门为了init设计的,因为体积小。

pc机上的initrd不过只是一个过渡,所以在加载完了硬盘、ext3等驱动后,就迫不及待地要重新设置根文件系统了

首先mkrootdev指定最终的根目录,参数跟grub的内核启动参数一致。接着mount

/sysroot将最终的根目录先挂在到/sysroot

,setuproot开始将initrd中的/proc /dev /sys 中的资料转移到

/sysroot ,

switchroot会开始转换/sysroot

为最终的根文件系统,完成后顺便将initrd之前在ram中的一切清空。

(如果有/initrd 目录的话就会把initrd挂载到该目录下)

好了,扯了半天,终于能解释最开始的疑惑了

initrd,或者initramfs,无论在pc还是嵌入式,都是可以选择的,分3种情况

1 完全不要initrd

2 initrd作为最终的根文件系统

3 initrd作为过渡,由initrd的init来加载最终的根文件系统

(本文作者deep_pro http://hi.baidu.com/deep_pro/ 转载请注明出处)

情况1,比如嵌入式linux静态包含了nand flash驱动和jffs2驱动,指定内核启动参数

root=/dev/mtdblock2 rootfs=jffs2 rw console=ttySAC0,115200

init=/linuxrc

(使用busybox作为根文件系统)

情况2,将根文件系统做成ramdisk镜像,使用ubbot下载到0x30800000,内核启动参数

root=/dev/ram rw init=/linuxrc

initrd=0x30800000,8M console=ttySAC0,115200

注意,一旦使用了ramdisk作为内核命令行参数root的参数,root=/dev/ram那么就直接把

initrd当做最终的根文件系统

情况3,pc常见,嵌入式linux也可见这样的启动参数

console=ttySAC0,115200 root=nfs nfsroot=192.168.1.9:/source/rootfs

initrd=0x10800000,0x14af47

也属于情况3

对于arm平台,如果bootloader不支持装入initrd的话,可以使用bootpImage,这种复合镜像会把内核和initrd直接连接到一起。

现在看来,initrd作为最终的根文件系统,将花费时间将initrd从flash读入ram,同时对文件系统的读写不会写入falsh

完全不要initrd,根文件系统一直存在于flash,如果根文件系统可写,也将写入flash

至于性能上的比较,还是经验不足啊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android短信动态权限设置,Android动态权限申请

从HBuilderX1.9.4及以上版本开始,Android平台默认targetSdkVersion从21(Android5.0)调整为23(Android6.0)。Android动态权限申请机制Android6.0(API23)及以后,系统对权限的管理更加严格,放弃了以往manifest中注册所需权限,用户只要…

android 获取对话框对象,Android 基本Dialog和自定义Dialog

Android 基本Dialog和自定义DialogDialog类是对话框的基类,但你应该避免直接实例化Dialog ,可以使用子类1.AlertDialog 此对话框可以显示标题,最多三个按钮,可选择列表或自定义布局View.2.DatePickerDialog或TimePickerDialog 此对话框带有允…

android inset 标签,android – 有几个WindowInsets?

WindowInsets描述了一组窗口内容的插图.换句话说,WindowInsets有一个可用的应用程序区域(并有其他信息,如isRound).可用区域不包括StatusBar和NavigationBar的Rect.如果您只想知道StatusBar和NavigationBar的高度,请查看this.你可以得到如下的WindowInsets.以下示例使用WindowI…

android root截图软件下载,截屏软件(无需ROOT)

ScreenshotIt是一款功能简单而专一的小软体,利用它你能够非常方便的对你的Android手机进行捉图操作,并将截取的萤幕快照储存为图片。软体功能:-裁剪你的萤幕截图;-萤幕截图状态栏按键;-可以利用重力感应来截图(摇晃手机…

android toolbar源码解析,深入理解Android 5.0中的Toolbar

环境说明:Android Studio 2.0V7包版本:com.android.support:appcompat-v7:23.4.0compileSdkVersion 23buildToolsVersion "24.0.0"Toolbar 引入使用XML布局中加入:android:id"id/toolbar"android:layout_width"matc…

android 9图片报错,Android2.1加载9Patch图片运行后报错

今天遇到一个很无语的问题,竟然是9Patch图片上多加了光晕效果。因为需要自定义Button,所以请用了9Patch图片,而且图片上面还有一点光晕效果,同样也被拉伸了,在2.2的系统上面正常能跑,2.1上面就出问题&#…

鸿蒙系统发布IT直播,华为开源平台上线:鸿蒙系统、方舟编译器在列

华为近日官方宣布,方舟编译器将于8月31日正式开源。这一颠覆式的技术堪称安卓系统性能革命,将带来巨大的性能提升,官方称操作流畅度提升可高达60%。8月31日凌晨,华为开源平台网站(HUAWEI OpenSource)就迫不及待地悄然上…

html网页之间怎么切换效果,HTML教程:网页页面切换的各种效果-♚付涛纪实阁♚...

其中,n表示的就是下面的数,n取不同的值,对应有不同的效果:0、box in 1、box out 2、circle in 3、circle out 4、wipe up 5、wipe down 6、wipe right 7、wipe left 8、vertical blinds 9、horizontal blinds 10、checkerboard across 11、ch…

火车头采集html文档没内容,火车头采集器:编辑任务中常见问题

1.标题前面大量空白,应该如何采集?答:程序里有html过滤选项,你可以选中过滤这些空白字符,如果有些空白字符不在html过虑里,你可以在过滤选项里添加那些字符。2.同一个页面,很多相同内容,怎么分做为多条记录…

金字塔图表 html,Highcharts 柱形图(柱状图及条形图)之 金字塔图 演示

JS 代码:var categories [0-4, 5-9, 10-14, 15-19,20-24, 25-29, 30-34, 35-39, 40-44,45-49, 50-54, 55-59, 60-64, 65-69,70-74, 75-79, 80-84, 85-89, 90-94,95-99, 100 ];var chart Highcharts.chart(container, {chart: {type: bar},title: {text: 2015 年德…

angular html页面嵌套,使用AngularJS来实现HTML页面嵌套的方法

html不支持嵌入在html页面中的html页面。实现这一功能通过使用以下方式:使用ajax - 让一台服务器来调用获取相应的html页面,并将其设置在html控件的innerhtml。使用服务器端包含 - jsp,php等web端服务器技术可以在包括动态页面中的html页面。…

jquery属于html框架吗,jquery是前端框架吗?

jquery是前端框架吗?jquery不是前端框架,它是一个JavaScript库。框架与库之间最本质区别在于控制权:you call libs, frameworks call you(控制反转)库:库是一个封装好的特定的集合,提供给开发者使用,而且是…

html ajax 菊花,Ajax加载菊花loding效果

Ajax 异步请求的时候,一般都会利用一个动态的 gif小图片来制作一个Ajax Loading ,以便增加用户体验。这里我们使用Spin.js ,该 js 脚本压缩后5k,可以不用任何图片,任何外部的CSS样式,就可以创建一个Ajax Lo…

ios html gif 显示,显示gif时出现巨大的内存使用Swift iOS

我正在制作一个应用程序,它在UIImageView中显示gif,并从parse中加载gif。我偶然发现的问题是每当我加载一个Gif时,它会使用大约20 MB的内存,并且当我执行一个segue时,这个内存不会被分配。我从UIImageView中删除图像本…

非一体式台式计算机,一体台式机推荐及介绍【详解】

随着科技的不断发展电脑已经走进了家家户户,几乎每一个家庭都有一台甚至是两台电脑,人们对于电脑的需求越来越高,对于电脑的要求也就越来越大。不仅仅是在性能方面外观设计也很重要。随着人们对于更轻更薄的追求,电脑渐渐的开始走…

窄带物联网应用于工业计算机,工业物联网嵌入式边缘计算机的制作方法

本实用新型涉及工业物联网领域,具体地说是一种工业物联网嵌入式边缘计算机。技术背景加速发展物联网已成国际社会的战略共识,多国纷纷都在加快研发物联网技术,物联网已经升级到了国家级战略目标。传统制造业企业由于工厂中设备型号不一致、新…

计算机网络模拟器 mac,网易mumu模拟器mac版使用常见问题解决办法_3DM手游

不少Mac设备的用户,在使用网易MuMu模拟器时,都会遇到些许问题。关于大家在使用网易MuMu模拟器Mac版时经常会出现的问题,下面小编也为大家带来了一个FAQ。网易MuMu常见问题解答:1、Mac版安装环境操作系统:mac os 10.11.…

如何让cloudflare缓存html,CloudFlareCDN页面规则缓存设置教程

wordpress博客使用CloudFlare的CDN来加速网站(页面规则缓存设置教程)此篇文章只讲wordpress站点使用CloudFlare CDN的页面规则教程。CloudFlare的CDN有一个很好的特点就是可以整站缓存下来,但是整站缓存时我们是无法登陆后台的,新写的文章也无法预览。所…

855计算机应用基础,2017年曲阜师范大学信息技术与传播学院855计算机应用基础考研导师圈点必考题汇编...

一、选择题1. 有以下程序:程序运行后的输出结果是( )。A.1256B.5634C.5612D.3456【答案】B【解析】第一次funl 传递参数5, 6,输出5, 6, 第二次调用fun2,fun2的作用是将全局变量a 变为3, b 变为4, 故输出3, 4。2. 有以下…

计算机课中排序选什么,《计算机应用基础课件》1.6 排序复习课程.ppt

《计算机应用基础课件》1.6 排序复习课程.ppt第 1 章  数据结构 ;插入排序的基本思想:;1.直接插入排序: 思路:认可第1个记录已排好序,然后将第2个到第n个记录依次插入到前面已排好序的记录组成的文件中。 具体过程(第i个记录Ri插入到前面i-1…