本文共 10409 字,大约阅读时间需要 34 分钟。
cpio-initrd: cpio格式的rootfs
void __init mnt_init(void)
int __init init_rootfs(void)
err = bdi_init(&ramfs_backing_dev_info);
static void __init init_mount_tree(void)
mnt = do_kern_mount("rootfs", 0, "rootfs", NULL);
panic("Can't create rootfs");
panic("Can't allocate initial namespace");
list_add(&mnt->mnt_list, &ns->list);
static int __init kernel_init(void * unused)
if (!ramdisk_execute_command)
ramdisk_execute_command = "/init";
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
ramdisk_execute_command = NULL;
* Ok, we have completed the initial bootup, and
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
static void __init do_basic_setup(void)
static int __init populate_rootfs(void)
#ifdef CONFIG_BLK_DEV_RAM
printk(KERN_INFO "checking if image is initramfs...");
err = unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start, 1);
printk(" it is/n");
unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start, 0);
printk("it isn't (%s); looks like an initrd/n", err);
fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
sys_write(fd, (char *)initrd_start,
initrd_end - initrd_start);
printk(KERN_INFO "Unpacking initramfs...");
err = unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start, 0);
static int __init kernel_init(void * unused)
* check if there is an early userspace init. If yes, let it do all
ramdisk_execute_command = "/init";
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
ramdisk_execute_command = NULL;
* Ok, we have completed the initial bootup, and
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
static int noinline init_post(void)
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console./n");
printk(KERN_WARNING "Failed to execute %s/n",
* The Bourne shell can be used instead of init if we are
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults.../n", execute_command);
void __init prepare_namespace(void)
printk(KERN_INFO "Waiting %dsec before mounting root device.../n",
/* wait for the known devices to complete their probing */
root_device_name = saved_root_name;
if (!strncmp(root_device_name, "mtd", 3)) {
mount_block_root(root_device_name, root_mountflags);
ROOT_DEV = name_to_dev_t(root_device_name);
if (strncmp(root_device_name, "/dev/", 5) == 0)
root_device_name += 5;
/* wait for any asynchronous scanning to complete */
if ((ROOT_DEV == 0) && root_wait) {
printk(KERN_INFO "Waiting for root device %s.../n",
while (driver_probe_done() != 0 ||
(ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
if (is_floppy && rd_doload && rd_load_disk(0))
sys_mount(".", "/", NULL, MS_MOVE, NULL);
int __init initrd_load(void)
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
if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) {
static void __init handle_initrd(void)
real_root_dev = new_encode_dev(ROOT_DEV);
/* mount initrd on rootfs' /root */
mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY);
root_fd = sys_open("/", 0, 0);
old_fd = sys_open("/old", 0, 0);
/* move initrd over / and chdir/chroot in initrd root */
sys_mount(".", "/", NULL, MS_MOVE, NULL);
* In case that a resume from disk is carried out by linuxrc or one of
* its children, we need to tell the freezer not to wait for us.
pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
while (pid != sys_wait4(-1, NULL, 0, NULL))
current->flags &= ~PF_FREEZER_SKIP;
sys_mount("/", ".", NULL, MS_MOVE, NULL);
/* switch root and cwd back to / of rootfs */
if (new_decode_dev(real_root_dev) == Root_RAM0) {
printk(KERN_NOTICE "Trying to move old root to /initrd ... ");
error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL);
int fd = sys_open("/dev/root.old", O_RDWR, 0);
printk("/initrd does not exist. Ignored./n");
printk(KERN_NOTICE "Unmounting old root/n");
sys_umount("/old", MNT_DETACH);
printk(KERN_NOTICE "Trying to free ramdisk memory ... ");
error = sys_ioctl(fd, BLKFLSBUF, 0);
printk(!error ? "okay/n" : "failed/n");