没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
25页
本篇文章以S3C6410公版的Linux BSP和U-Boot来进行分析,文中所有提及的名词和数据都是以该环境为例,所有的代码流程也是以该环境为例来进行分析。哈哈。如果有不正确或者不完善的地方,欢迎前来拍砖留言或者发邮件到guopeixin@126.com进行讨论,先行谢过。 简单的来说,根文件系统包括虚拟根文件系统和真实根文件系统。在Kernel启动的初始阶段,首先去创建虚拟的根文件系统,接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系统,也即真实的文件系统。
资源推荐
资源详情
资源评论
根文件系统的挂载过程分析
分类:Linux Driver2010-10-24 17:5725459 人阅读评论(17)收藏举报
command linux null thread delay
代码分析
目录(?) [+]
前言:
本篇文章以
S3C6410
公版的
Linux BSP
和
U-Boot
来进行分析,文中所有提及的名词和数
据都是以该环境为例,所有的代码流程也是以该环境为例来进行分析。哈哈。如果有不正
确或者不完善的地方,欢迎前来拍砖留言或者发邮件到
guopeixin@126.com
进行讨论,先
行谢过。
简单的来说,根文件系统包括虚拟根文件系统和真实根文件系统。在 Kernel 启动的初始阶
段,首先去创建虚拟的根文件系统,接下来再去调用 do_mount 来加载真正的文件系统,
并将根文件系统切换到真正的文件系统,也即真实的文件系统。
一.什么是根文件系统
在传统的 Windows 机器上目录结构中,可能会包括 C:或者 D:盘,而他们一般就称之为
特定逻辑磁盘的根目录。从文件系统的层面来说,每一个分区都包含了一个根目录区,也
即系统中存在多个根目录。
但是,在 Linux 系统中,目录结构与 Windows 上有较大的不同。系统中只有一个根目录,
路径是“/”,而其它的分区只是挂载在根目录中的一个文件夹,如“/proc”和“system”等,这
里的“/”就是 Linux 中的根目录。
对应根目录也就存在一个根目录文件系统的概念,我们可以将某一个分区挂载为根目录文
件系统,如 6410 公版中就将 mtdblk2 挂载为根目录文件系统。程序中可以通过 U-Boot 给
Kernel 指定参数或者编译选项来指定,如目前的开发板中就通过如下的编译选项来制定根
目录文件系统:
!""#
$%&$$&%'&"%()!
简单的来说,根目录文件系统就是一种目录结构,包括了 Linux 启动的时候所必须的一些
目录结构和重要文件。
根文件系统有两种,一种是虚拟根文件系统,另外一种是真实的根文件系统。一般情况下,
会首先在虚拟的根文件系统中做一部分工作,然后切换到真实的根文件系统下面。
笼统的来说,虚拟的根文件系统包括三种类型,即 Initramfs、cpio-initrd 和 image-initrd。
二.相关重要概念
1. Initrd
Initrd 是在 Linux 中普遍采用的一种技术,就是由 Bootloader 加载的内存盘。在系统启动的
过程中,首先会执行 Initrd 中的“某一个文件”来完成驱动模块加载的任务,第二阶段才会
执行真正的根文件系统中的/sbin/init。这里提到的第一阶段是为第二阶段服务的,主要是
用来加载根文件系统以及根文件系统存储介质的驱动程序。
资料中提到,存在多种类型的 Initrd,实际应用中包括无 Initrd、Linux Kernel 和 Initrd 打包、
Linux Kernel 和 Initrd 分离以及 RAMDisk Initrd。
目前,手中项目采用的就是第四种策略。在系统启动的时候,U-Boot 会将 Linux Kernel 和
Rootfs 加载到内存,并跳转到 Linux Kernel 的入口地址执行程序。这篇文章将侧重对该种
情况进行分析。
三.根文件系统加载代码分析
1. VFS 的注册
首先不得不从老掉牙的 Linux 系统的函数 start_kernel()说起。函数 start_kernel()中会去调
用 vfs_caches_init()来初始化 VFS。
下面看一下函数 vfs_caches_init ()的代码:
'%'*+,-.%.""/+.0
1
.%.$$'2
&34+,+,5+'++(""$6,+$$'7+
8*$$)$53&
$$'"--""/+.$*$/+.-0039&!""/+.02
""/+.$$'2
+"+,/)""+,$+-+"+,:;<=;>
;4=?;=;@;4:;A02
%+,-02
%-02
B-""/+.02
CD"-02
(%'+,-02
,$%'-02
E
代码【1】:vfs_caches_init()中最重要的函数。函数 mnt_init()会创建一个 rootfs,这是个
虚拟的 rootfs,即内存文件系统,后面还会指向真实的文件系统。
接下来看一下函数 mnt_init():
F%"-'%0
1
.%2
$$2
$6"-G+"/+"02
"+,)""+,$+-"+,5*-$
'*"0
;4=?;=;@;4:;A02
",+,+(-$,+%
30.*$/+.-:;<02
*-H",+,+(0
/+-+%++",+,+(&02
/$)-+,,+,+($I8&=;=J02
*$-2K=;=J2LL0
<<=;-G",+,+(CD02
$$*-02
*-$$0
/$)-MN?;N8I*$$$I8%&
*$$02
*)(O)(O$++%+%%-*A02
*-H*)(O0
/$)-MN?;N8I)(O$+$$$&*02
CD$*-02
C!D"$-02
E
代码[1]:创建虚拟根文件系统;
代码[2]:注册根文件系统。
接下来看一下函数 init_mount_tree()的代码:
+'%"$-'%0
1
$'*"3"2
$"+"/+32
$/+,$2
CD"%)$"-$*$*A02
*-NN-"00
/+-+P$+$*02
)"+-5*-30:MN02
*-H0
/+-+P++++"/+02
+"-GQ02
<<=;-GQ02
6+7,+%-GQ/02
Q'2
+%%-G"Q"GQ02
Q$"2
"Q"2
+)R/$Q"2
."-02
$R"Q$2
$R%$Q$Q"$2
*/6%-$$Q*G$02
C!D*$-$$Q*G$02
E
代码[1]:创建虚拟文件系统;
代码[2]:将当前的文件系统配置为根文件系统。
可能有人会问,为什么不直接把真实的文件系统配置为根文件系统?
剩余24页未读,继续阅读
资源评论
iloveqqi
- 粉丝: 0
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功