我正在研究Linux initrd机制。我学会了以下代码:
bool __init initrd_load(void)
{
if (mount_initrd) {
create_dev("/dev/ram", Root_RAM0);
/*
* Load the initrd data into /dev/ram0. Execute it as initrd
* unless /dev/ram0 is supposed to be our actual root device,
* in that case the ram disk is just set up here, and gets
* mounted in the normal path.
*/
if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) {
init_unlink("/initrd.image");
handle_initrd();
return true;
}
}
init_unlink("/initrd.image");
return false;
}
int __init rd_load_image(char *from)
{
// ...
out_file = filp_open("/dev/ram", O_RDWR, 0);
in_file = filp_open(from, O_RDONLY, 0);
// ...
for (i = 0; i < nblocks; i++) {
// ...
kernel_read(in_file, buf, BLOCK_SIZE, &in_pos);
kernel_write(out_file, buf, BLOCK_SIZE, &out_pos);
// ...
}
// ...
}
现在我知道了从设备"读取的ramdisk内容/initrd.image";到设备"/dev/ram";设备(RAM模拟磁盘?(。
以下是我的问题:
- 设备的file_operations的实现在哪里/dev/ram";以及"/initrd.image">
- 设备"怎么样/dev/ram";以后使用?我没有在其他地方找到"/dev/ram";使用
- 根据上述逻辑,文件内容首先从"读取"开始/initrd.image";,并且写入到"0"/dev/ram";。这意味着有2个内存副本。我想知道是否可以排除其中一个内存副本以提高启动性能
提前感谢您的回复!
-
/dev/ram在brd.c中有一个block_device_operations结构https://elixir.bootlin.com/linux/v5.4.210/source/drivers/block/brd.c#L327而initrd.image依赖于包含它的文件系统。
-
/dev/ram由从
rd_image_start
开始的内存块组成 -
您如何知道/dev/ram区域是否是可接受的DMA目标?你是如何解压的?