ramdisk与 initrd、initramfs的关系

uefi 之 ramdisk ramdisk一般指虚拟内存盘。虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术;EDK中支持ramdisk协议的`gEfiRamDiskProtocolGuid`,bootManage,httpboot使用; 阅读详情

1、ramdisk、initrd是什么?

ramdisk是一种基于内存的虚拟文件系统,通常用于放置内核的中间数据。
而initrd全称为"boot loader initialized RAM disk",也就是由启动加载器所初始化的RamDisk设备,它的作用是完善内核的模块机制,让内核的初始化流程更具弹性;内核以及initrd,都由bootloader在机子启动后被加载至内存的指定位置,主要功能为按需加载模块以及按需改变根文件系统。更详细的内容,请参阅initrd的man手册,里面阐述了内核开发者对initrd制订的功能标准。命令:man initrd

2、/dev/ram0 这个设备是哪来的?

答: 拷贝initrd内容到/dev/ram0 上时文件系统已经被加载,只是没有设置根文件系统,内核的初始化流程还没有进入用户层而已,我们当然不能知道是否有这个设备,但的确是存在的。
      所谓文件系统,就是VFS,而根文件系统是其中的一个属性项而已;而每个设备本身是内核数据区里的一个数据结构,经过VFS的映射,才被用户层视为一个文件。所以,内核要创建继而访问一个设备,是可以直接传递"/dev/ram"这样的参数给create_dev函数来实现的。
       至于设置根文件系统,只是C语言里对一个数据结构的成员赋值而已。而所谓目录项,也是内核数据区里的一个数据结构。要创建/dev/ram0,只需赋值根文件系统的值,创建dev目录项,并且创建这个ram设备即可。
      要区分内核层以及用户层的区别,可以用一个很简单的逻辑来解释,试想一个,你在用户层删除了/dev里的ram0,那是不是内核就没有了这个设备了呢?再想,如果你删除了你正在使用的硬盘的设备节点/dev/hda,那么是不是内核就不能操作硬盘了呢?答案是很明显的,没有了设备节点,只意味着用户不能操作该设备,并不代表内核不能访问该设备。在最新的设备管理体系中,设备管理的操作逻辑是放在用户层的,那就是udev,默认的规则中没有/dev/eth0设备节点,但你可以照样上网。

3、在 grub 中使用到的 initrd ,是用来做什么的?如何做到?

答:GRUB中只是简单地把initrd拷贝在内存中指定的位置而已,没有对它做进一步的操作,只是将initrd的大小放在内核setup.S的头部数据区域,由内核来初始化这段内存区域。

请看内核初始化代码init中的initramfs.c代码片断:

代码:

#ifdef CONFIG_BLK_DEV_INITRD
if (initrd_start) {
int fd;
printk(KERN_INFO "checking if image is initramfs...");
                /*这里的initrd_start和initrd_end就是GRUB放置initrd的内存区域的范围*/
err = unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start, 1);
if (!err) {
printk(" it is ");
unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start, 0);
free_initrd_mem(initrd_start, initrd_end);
return;
}

printk("it isn't (%s); looks like an initrd ", err);
fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 700);
if (fd >= 0) {
sys_write(fd, (char *)initrd_start,
initrd_end - initrd_start);
sys_close(fd);
free_initrd_mem(initrd_start, initrd_end);
}

}

#endif

GRUB不参与Linux内核的初始化!它是与内核独立的。

记住,GRUB与Linux内核交互的方式遵循一种协议,目前的协议版本为2.02;GRUB通过"setup head"区域与内核交换数据。
      假设内核映像为kernel.img,那么这个img文件里就包含着三截代码段(在编译内核的最后阶段生成),第一段是bootsect.S,就是旧的内核内置启动器,它的地位已经被GRUB替代,所以被丢弃不用;第二段是setup.S,由GRUB负责将其放置到物理地址0x90200上,它的头部就是前面提及的所谓head区,GRUB会把需要告诉内核的信息例如initrd的物理起始地址以及大小,放在这个head区;第三段就是真正的压缩内核映像,视乎其体积类型,如果是大内核,就将这段内核映像放至0x100000。
      那么,在初始化页表的时候,内核会搬动head区的数据到合适的位置,里面的数据就会被内核初始化所利用,所以内核就得知了initrd的所有信息。
      也就是说,setup.S 前面一段是用来在grub和内核之间传递参数的,如果在grub 中设置了 initrd的话,grub会读出该文件的地址以及文件的大小,然后将其写入setup.S的head区的特定地方,待内核启动时使用.grub引导结束后,应该跳转至setup.S执行.

这样的initrd.img文件是由grub载入内存,然后再将内存中的initrd信息告诉内核,让内核进行初始化。

内核文件头部是这样一个数据结构:

/* For the Linux/i386 boot protocol version 2.03. */
struct linux_kernel_header
{
char code1[0x0020];
unsigned short cl_magic; /* Magic number 0xA33F */
unsigned short cl_offset; /* The offset of command line */
char code2[0x01F1 - 0x0020 - 2 - 2];
unsigned char setup_sects; /* The size of the setup in sectors */
unsigned short root_flags; /* If the root is mounted readonly */
unsigned short syssize; /* obsolete */
unsigned short swap_dev; /* obsolete */
unsigned short ram_size; /* obsolete */
unsigned short vid_mode; /* Video mode control */
unsigned short root_dev; /* Default root device number */
unsigned short boot_flag; /* 0xAA55 magic number */
unsigned short jump; /* Jump instruction */
unsigned long header; /* Magic signature "HdrS" */
unsigned short version; /* Boot protocol version supported */
unsigned long realmode_swtch; /* Boot loader hook */
unsigned long start_sys; /* Points to kernel version string */
unsigned char type_of_loader; /* Boot loader identifier */
unsigned char loadflags; /* Boot protocol option flags */
unsigned short setup_move_size; /* Move to high memory size */
unsigned long code32_start; /* Boot loader hook */
unsigned long ramdisk_image; /* initrd load address */
unsigned long ramdisk_size; /* initrd size */
unsigned long bootsect_kludge; /* obsolete */
unsigned short heap_end_ptr; /* Free memory after setup end */
unsigned short pad1; /* Unused */
char *cmd_line_ptr; /* Points to the kernel command line */
unsigned long initrd_addr_max; /* The highest address of initrd */
} __attribute__ ((packed));

grub 首先把vmlinuxz装载入内存,然后把initrd装载入内存,并initrd的装载地址
填入vmlinuxz的头部相应位置

4、grub能知道该把intrd.img这个文件放在内存的什么地方才安全吗?

答:Linux为它的启动制订了一个标准协议,GRUB或者LILO要启动Linux,就必须遵循这个协议。该协议放在内核源码目录的"Documentation/i386/boot.txt"。
      根据这个协议,initrd的位置尽可能地放在内存的高地址,这个高地址的值取决于机器的架构,但为了达到最大的兼容性,一般放在16MB靠后的地方,因为16MB是i286能识别的最大内存。另外,不同的bootloader,对initrd的加载地址可能有点差异,但只要不覆盖内核以及内核初始化可能要用的数据区即可。

5、struct linux_kernel_header在哪个文件中定义的阿?

答:grub-0.97源码 /stage2/share.h文件中
      linux 内核 linux-2.6.18/Documentation/i386/boot.txt 也说明了头部结构
The header looks like:

Offset Proto Name Meaning
/Size

01F1/1 ALL(1 setup_sects The size of the setup in sectors
01F2/2 ALL root_flags If set, the root is mounted readonly
01F4/4 2.04+(2 syssize The size of the 32-bit code in 16-byte paras
01F8/2 ALL ram_size DO NOT USE - for bootsect.S use only
01FA/2 ALL vid_mode Video mode control
01FC/2 ALL root_dev Default root device number
01FE/2 ALL boot_flag 0xAA55 magic number
0200/2 2.00+ jump Jump instruction
0202/4 2.00+ header Magic signature "HdrS"
0206/2 2.00+ version Boot protocol version supported
0208/4 2.00+ realmode_swtch Boot loader hook (see below)
020C/2 2.00+ start_sys The load-low segment (0x1000) (obsolete)
020E/2 2.00+ kernel_version Pointer to kernel version string
0210/1 2.00+ type_of_loader Boot loader identifier
0211/1 2.00+ loadflags Boot protocol option flags
0212/2 2.00+ setup_move_size Move to high memory size (used with hooks)
0214/4 2.00+ code32_start Boot loader hook (see below)
0218/4 2.00+ ramdisk_image initrd load address (set by boot loader)
021C/4 2.00+ ramdisk_size initrd size (set by boot loader)
0220/4 2.00+ bootsect_kludge DO NOT USE - for bootsect.S use only
0224/2 2.01+ heap_end_ptr Free memory after setup end
0226/2 N/A pad1 Unused
0228/4 2.02+ cmd_line_ptr 32-bit pointer to the kernel command line
022C/4 2.03+ initrd_addr_max Highest legal initrd address


在文件arch/i386/boot/bootsect.S可以看到这个结构的影子

.org 497
setup_sects: .byte SETUPSECTS
root_flags: .word ROOT_RDONLY
syssize: .word SYSSIZE
swap_dev: .word SWAP_DEV
ram_size: .word RAMDISK
vid_mode: .word SVGA_MODE
root_dev: .word ROOT_DEV
boot_flag: .word 0xAA55

4.1uboot对设备树的支持——传递dtb给内核 本节讲述怎么把设备树(dtb)传给内核。uboot只要,然后在时,把这块内存的传给内核(通过寄存器)。 阅读详情

相关推荐

initrd 和 initramfs 原理浅析

通过阅读本文,希望读者能了解 initrd 和 initramfs 是什么,解决了什么问题和 initrd/initramfs 的工作原理。本文不想具体到代码的角度,不会具体地介绍任何数据格式,API 规范等。所以虽然本文不能对读者开发代码起到直接的参考作用,但希望能帮读者从更高的角度理解现有技术的设计思路,希望能绕过复杂的实现细节和晦涩的人为抽象直击本质。

Vallelonga的博客 1252

ramdisk内存虚拟硬盘 软件评测

ramdisk 软件评测内存虚拟成硬盘使用

刚学习博客 7567

ramdisk、ramfs、tmpfs、initramfs和rootfs内存文件系统概念

如果在cpio文档解压缩后的rootfs中没有init程序(init文件),内核执行旧的代码,定位并且安装root分区,执行/sbin/init程序。ram disk的使用需要从这个假的块设备到page cache之间拷贝内存,生成和销毁dentry,而且需要文件系统的驱动格式化和解释上面的数据,所以ram disk的机制不再使用。initramfs执行的init程序不返回内核(如果/init需要向内核传递控制权,可以再次安装在/目录下一个新的root设备并且启动一个新的init程序)。

tecoes的博客 1158

Linux文件系统——ramdisk根文件系统制作

ram disk介绍   ram disk顾名思义,内存磁盘。我们平常接触的一些存储介质,如:nor flash、nand flash、emmc、ufs、以及机械硬盘固态硬盘等,都是用来存储数据的,同理内存也是可以当成磁盘来存储数据的,唯一不同的就是ram是掉电不保存的,而前面提到的那些存储介质掉电都是保存数据的。   我们都知道,在linux中,上面介绍的flash这些存储介质,都是需要有对应的...

深海 1万+

Linux中的RAMDISK和INITRD

Ramdisk简介   先简单介绍一下ramdisk,Ramdisk是虚拟于RAM中的盘(Disk)。对于用户来说,能把RAM disk和通常的硬盘分区(如/dev/hda1)同等对待来使用,例如: redice # mkfs.ext2 /dev/ram0 mke2fs 1.38 (30-Jun-2005) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 2048 inodes, 8192 blocks 409 blocks (4.99%) reserved

UG/NX二次开发Siemens官方NXOPEN实例解析—1.3 BlockStyler/ExtrudewithPreview

随着工业智能化的不断发展,UG二次开发的需求越来越多,也吸引了大批的二开从业人员,本人作为一名资深IT从业者(10年+)也毅然加入二次开发大军。然而,和流行IT行业(互联网、金融、医疗等)相比,工业智能化的门槛显得更高一点,专业的工业软件,相对封闭的开发理念和更小的开发圈子,让刚进入二开的从业者有点举步维艰。边学边整理,希望通过这系列文章的整理能给二开的生态增添一叶绿。

MarcoPro的博客 1633

ramdisk 和 ramfs 文件系统 (initrd 和 initramfs )

ramdisk和ramfs 文件系统

openCpu 1762

PCB设计教程【入门篇】——PCB设计基础-PCB构成与组成

本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理。

2501_91732643的博客 7651

从ramdisk根文件系统启动Linux成功使用initramfs启动

转载地址:http://blog.chinaunix.net/uid-27134408-id-5059535.html initramfs概述 initramfs与initrd类似,也是初始化好了且存在于ram中的,可以压缩也可以不压缩。但是目前initramfs只支持cpio包格式,它会被populate_rootfs->unpack_to_rootfs(&__initramfs...

kunkliu的博客 2589

PIN限幅二极管在接收机中的应用

本文介绍了接收机保护限幅器的工作原理及应用,重点阐述了PIN二极管在雷达收发机中的关键作用。文章指出,限幅器能有效保护接收机灵敏元件免受大功率信号损害,主要通过反射而非耗散功率来实现保护功能。文章详细分析了PIN二极管的层结构特性及其阻抗变化机制,解释了多级限幅器的设计原理(包括清理级和粗限幅器的配合使用),并介绍了通过添加检波二极管降低阈值水平的方法。最后指出,实际应用中限幅器通常采用3级或更少的设计。

weixin_49761275的博客 2374

用友U8 API 二次开发:WebService封装7个核心DLL引用与U8Login登录避坑

本文详细介绍了用友U8 API二次开发中的WebService封装与U8Login登录优化实践。通过7个核心DLL的正确引用、U8Login登录机制的深度解析及IIS环境下的特殊处理方案,为开发者提供了一套高可用性的通用解决方案,助力企业实现ERP系统的高效集成与数字化转型。

weixin_42524171的博客 505

Linux文件系统之根文件系统rootfs

1.rootfs是需要Linux系统启动初期能够识别的,因此最好的方案是使用ram filesystem;2.包含基本的目录结构和启动程序;3.Linux设备的rootfs一般作为过渡使用,Android不仅用作启动,还作为文件系统的顶层框架;4.Linux和Android上的rootfs一般为initrd和initramfs (有ramfs和tmpfs),它们都是ram filesystem;5.ramdisk依赖VFS?所有文件系统都需依赖VFS。

STCNXPARM的博客 429

解密UFS Explorer:Drobo BeyondRAID数据恢复实战指南

本文详细介绍了使用UFS Explorer Professional Recovery软件中的Drobo BeyondRAID助手进行数据恢复的完整实战流程。当Drobo设备因BeyondRAID配置信息丢失而无法访问时,该工具能安全、只读地扫描硬盘,虚拟重建存储池,帮助用户找回宝贵数据。指南涵盖了从前期准备、硬盘选择、配置扫描到数据安全导出的每一步关键操作与常见问题解决方案。

weixin_29219539的博客 270

initrd和initramfs的区别

Linux内核在初始化之后会执行init进程,而init进程会挂载我们的根文件系统,但由于init程序也是在根文件系统上的,所以这就有了悖论。Linux采用两步走的方法来解决这个问题。Linux2.6版以前的方法是:除了内核vmlinuz之外还有一个独立的initrd.img映像文件,其实它就是一个文件系统映像,linux内核在初始化后会mount initrd.img作为一...

weixin_34007879的博客 173

20、微电网系统的系统框架、建模与控制架构解析

本文详细解析了微电网系统的系统框架、建模方法以及控制架构。文章首先介绍了在系统的系统(SoS)框架下,微电网如何通过微控制器(MC)和微电网中央控制器(MGCC)协调运行,并支持并网与孤岛模式下的高效能量管理。随后,针对微电网的关键组件,包括微涡轮机、光伏太阳能电池和风力涡轮机,提供了详细的数学建模分析。最后,探讨了微电网的控制架构设计,涵盖分层控制和共识控制策略,以实现系统的高效、稳定运行,满足日益增长的能源需求与市场要求。

elastic6hunter的博客 206

GD32F470移植LWIP协议,PHY芯片DP83848I

也就是说前24位是有规定的,其中48位MAC中的前几位也是有着对应的含义的。2、旧版LWIP(如1.4.1)存在DHCP状态机卡死问题,建议升级至2.1.3+。

m0_61973119的博客 1591

linux 内核启动Initramfs与initrd 及其挂载

linux 内核启动Initramfs与initrd 及其挂载

kwdecsdn的博客 5326

【DRAM存储器六十七】DDR5介绍--训练相关之write leveling

详述DDR5 write leveling细节

highman110的博客 288

Initrd Ramdisk VS initramfs/cpio ramdisk

lake@lake-Latitude-5491:~$ file ramdisk.img ramdisk.img: u-boot legacy uImage, ramdisk, Linux/ARM, RAMDisk Image (gzip), 2585838 bytes, Sun Jan 17 02:21:28 2016, Load Address: 0x00000000, Entry ...

hushui的专栏 351

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ramdisk/ramfs/tmpfs/initrd/initramfs/rootfs/cpio

一 RAMDISK VS INITRD    先简单介绍一下ramdisk,Ramdisk是虚拟于RAM中的盘(Disk)。对于用户来说,可以把RAM disk与通常的硬盘分区(如/dev/hda1)同等对待来使用    # mkfs.ext2 /dev/ram0    # mount /dev/ram0    # mkdir /mnt/rd    # mount /dev/ram0 /

千重浪Linux技术工作室 1426

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

initramfs/initrd

initramfs概述 initramfs与initrd类似,也是初始化好了且存在于ram中的,可以压缩也可以不压缩。但是目前initramfs只支持cpio包格式,它会被populate_rootfs->unpack_to_rootfs(&__initramfs_start, &__initramfs_end - &__initramfs_start, 0)函数(解压缩、)解析、安装。 initramfs与initrd区别 (1) Linux内核只认cpio格式的initra

M120674的专栏 1023

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux的INITRAMFS 与 INITRD

1. INITRAMFS 和 INITRD(INITRAMDISK) 是什么? RAMFS 和 RAMDISK 都是内存文件系统,他们有着小巧快速的特点。INIT前缀表示其包含有效“init”可执行文件,可以作为启动的root文件系统。INITRAMDISK出现较早,在使用nor flash和2.4kernel盛行的时期很流行。RAMFS出现也很早,但INITRAMFS是2.6版本kerne...

mndscc的博客 715

Linux 文件系统挂载 INITRAMFS 与 INITRD

转载自http://m.blog.chinaunix.net/uid-25888519-id-3078218.html Linux INITRAMFS 与 INITRD 2117阅读 2评论2012-02-21 racer321 分类:LINUX 参考资料: kernel/Documentation/filesystems/ramfs-rootfs-initramfs.txt Kernel/Doc...

zajuemang0525的博客 1280
上一篇: vim写程序常用技巧
下一篇: initrd与initramfs的区别
findstr
博客等级 码龄19年 63粉丝 43原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值