最近在嘗試對手頭的開發板進行移植,此處記錄initramfs掛載的基本流程,記錄一下,以備後查。分析時是基於linux3.4.2html
start_kernel->node
vfs_caches_init(num_physpages);linux
mnt_init(unsigned long mempages)post
init_rootfsurl
register_filesystem(&rootfs_fs_type)spa
init_mount_tree.net
do_kern_mountrest
mount_fshtm
type->mountblog
set_fs_pwd
set_fs_root
1. 在vfs_caches_init中會完成VFS的構建,並將rootfs掛載到VFS上,VFS與rootfs有一種水乳交融的關係,rootfs爲VFS提供了根目錄,而rootfs又做爲第一個文件系統掛載到VFS;
2. do_kern_mount 會分配vfsmnt, vfsmnt是對掛載點的描述,它鏈接了掛載點和待掛載文件系統;
3. type->mount調用的就是rootfs的mount也就是rootfs_mount,rootfs_mount中會建立superblock, 並經過ramfs_fill_super建立出根inode和根dentry,最後完成rootfs掛載,實際上就是將建立的
vfsmnt的掛載點mnt_mountpoint指向新建立的根dentry,掛載的根目錄mnt_root也爲根dentry。注意實際的文件系統掛載時二者未必同樣。
4.set_fs_pwd設置進程的當前路徑,set_fs_root設置進程的根路徑爲根目錄
通過如上幾個步驟就完成了VFS根目錄的建立,搭建起VFS的雛形
start_kernel->
vfs_caches_init(num_physpages);
rest_init->
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND)
kernel_init
do_basic_setup
do_initcalls
populate_rootfs
unpack_to_rootfs
1.populate_rootfs經過調用unpack_to_rootfs 會將initramfs的cpio鏡像釋放到上一節建立的rootfs中
2.cpio的格式能夠參考inux文件系統初始化過程(3)---加載initrd(上)
3.釋放過程是經過在rootfs中建立目錄,普通文件,連接文件,掛載sysfs, proc等文件系統,使得VFS變成枝繁葉茂的大樹
釋放過程可參考linux文件系統初始化過程(4)---加載initrd(中)
https://www.ibm.com/developerworks/cn/linux/l-k26initrd/
https://www.ibm.com/developerworks/cn/linux/l-vfs/
https://blog.csdn.net/nancygreen/article/details/5027039
https://blog.csdn.net/ooonebook/article/details/52624481
https://blog.csdn.net/scotthuang1989/article/details/43603233 Linux Filesystem: 關於vfsmount的理解
https://blog.csdn.net/yiyeguzhou100/article/details/78426292 initramfs的加載過程(從uboot到kernel)
https://blog.csdn.net/ooonebook/article/details/52624481 [rootfs] InitRamdisk & InitRamfs 介紹和使用
http://www.cnblogs.com/wuchanming/p/3769736.html linux文件系統初始化過程(3)---加載initrd(上)