当前位置: 技术问答>linux和unix
散分+嵌入式+文件系统+问题!
来源: 互联网 发布时间:2016-08-26
本文导语: 我最近在做u-boot移植,其中看到文件系统颇为不解: 我的任务就是用u-boot把flash的内容重烧。我是这样认为的:我的机器从flash加载u-boot代码到内存后我就完全运行内存中的u-boot这时跟flash无关了,所以能对其改写(...
我最近在做u-boot移植,其中看到文件系统颇为不解:
我的任务就是用u-boot把flash的内容重烧。我是这样认为的:我的机器从flash加载u-boot代码到内存后我就完全运行内存中的u-boot这时跟flash无关了,所以能对其改写(当然如果u-boot坏了就重新启动不了了)。
我看到一些关于bootloader的说明,大体就是分3部分bootloader(我这具体就是u-boot)、kernel、文件系统1(为了更好的说明我的问题,这里的文件系统我叫做“文件系统1”)。
系统的启动过程简单说就是bootloader初始化环境然后转到kernel执行然后kernel加载文件系统1(其实细节很复杂,我们只是看看流程)。
我的问题也就来了,我认为(可能有错)文件系统就是一些对存储设备设定的数据结构,内核根据这些结构存取存储设备。我认为(可能有错)硬盘的文件系统(数据结构)是对其格式化的时候写入的而且是存在整个硬盘上。那我的flash并没有格式化而且它的内容只是随意组织的(我把bootloader放在一个地方、kernel一个地方、文件系统1一个地方但对地址有一定的要求)。那么对于flash存储设备本身有没有文件系统?
就是说我认为文件系统是对硬件的类似格式化的操作,怎么linux竟然能把文件系统(我上面的文件系统1就是被弄成了可以拷贝的文件)当成文件来随意拷贝呢。
再往细里说就是linux kernel是怎么加载文件系统的(文件系统是一个文件吗)。
我的任务就是用u-boot把flash的内容重烧。我是这样认为的:我的机器从flash加载u-boot代码到内存后我就完全运行内存中的u-boot这时跟flash无关了,所以能对其改写(当然如果u-boot坏了就重新启动不了了)。
我看到一些关于bootloader的说明,大体就是分3部分bootloader(我这具体就是u-boot)、kernel、文件系统1(为了更好的说明我的问题,这里的文件系统我叫做“文件系统1”)。
系统的启动过程简单说就是bootloader初始化环境然后转到kernel执行然后kernel加载文件系统1(其实细节很复杂,我们只是看看流程)。
我的问题也就来了,我认为(可能有错)文件系统就是一些对存储设备设定的数据结构,内核根据这些结构存取存储设备。我认为(可能有错)硬盘的文件系统(数据结构)是对其格式化的时候写入的而且是存在整个硬盘上。那我的flash并没有格式化而且它的内容只是随意组织的(我把bootloader放在一个地方、kernel一个地方、文件系统1一个地方但对地址有一定的要求)。那么对于flash存储设备本身有没有文件系统?
就是说我认为文件系统是对硬件的类似格式化的操作,怎么linux竟然能把文件系统(我上面的文件系统1就是被弄成了可以拷贝的文件)当成文件来随意拷贝呢。
再往细里说就是linux kernel是怎么加载文件系统的(文件系统是一个文件吗)。
|
存储设备本身也是有驱动的,比如硬盘和flash都有扇区的概念,这就是硬件驱动的事,由kernel加载。而文件系统说到底就是如何去读写这些扇区。理论上,没有文件系统,也能访问数据,比如直接读bootloader,又比如oracle的Raw分区等等。
kernel有一个虚拟的文件系统架构,包含了各种系统调用,比如read、write等等,不同的文件系统需要实现这些调用。所以说,文件系统不是一个文件,而是文件在硬件上存储和读取的系统。比如说每个文件占用多少个扇区,改文件占用的每个扇区的索引值等等。可以这么理解,文件系统就是管理这些扇区,将文件按一定规则存放到这些扇区里去。
所以,没有文件系统你也能访问硬件数据。比如说假设flash的设备是/dev/sda,直接去读/dev/sda这个文件的前512字节,就是读到了flash的第一个扇区的数据。
至于格式化,就是针对不同的文件系统,初始化一些扇区,比如预留某些扇区作为索引,某些扇区保留目录等等。
kernel有一个虚拟的文件系统架构,包含了各种系统调用,比如read、write等等,不同的文件系统需要实现这些调用。所以说,文件系统不是一个文件,而是文件在硬件上存储和读取的系统。比如说每个文件占用多少个扇区,改文件占用的每个扇区的索引值等等。可以这么理解,文件系统就是管理这些扇区,将文件按一定规则存放到这些扇区里去。
所以,没有文件系统你也能访问硬件数据。比如说假设flash的设备是/dev/sda,直接去读/dev/sda这个文件的前512字节,就是读到了flash的第一个扇区的数据。
至于格式化,就是针对不同的文件系统,初始化一些扇区,比如预留某些扇区作为索引,某些扇区保留目录等等。
|
加载的是根文件系统,它是一个特殊的文件系统,它主要是为系统提供命令集、配置文件、设备文件等这些系统所需要的东西。而我们一般说的文件系统只是存储设备上数据的一个组织结构,也就是说是用户文件的组织。如果没有那个根文件系统,系统有许多功能实现起来不太方便。大致就是这样...
|
文件系统分为好几种,一种是根文件系统,比如romfs,j2ffs等,这些文件系统提供了许多命令行接口。在内核启动的时候进行挂载。当进入系统后实际上就是进入了根文件系统。
还有一种对文件系统的解释就是一种 如何组织外部存储器上文件存储,访问方式的系统,比如传统的ext2,ext3,ntfs等。一般也称为格式化方式。
还有一种对文件系统的解释就是一种 如何组织外部存储器上文件存储,访问方式的系统,比如传统的ext2,ext3,ntfs等。一般也称为格式化方式。
|
先说说PC的grub:
stage1 这个前面的446B与MBR前446B是相同的 这个是为了找到boot sector
xxfs_stage1_5 这个是加载到ram中的文件系统 如果没有它 就无法针对某个由xxfs格式的分区读写
显示开机选项
加载stage2 这个在MBR后32k处(忘记是不是这个数了) 开机后面的事情就都交给stage2了
内核加载运行
文件系统初始化 查找intrd.img(假定是这个名字 这个就是文件系统镜像了也就是你说的文件系统1)
intrd.img做什么呢
挂载 文件系统设备文件 如/proc /sys
生成相应的设备文件
开户一些系统服务
等等
没有这些 内核是跑不下去的 会panic掉
内核本身实现了一层VFS 对各种文件系统进行了抽象 这样可以支持很多文件系统
比如ext2 ext3现在到ext4了 这里的文件系统是对磁盘的一种组织与管理了 比如数据怎么存放
flash文件系统有jffs yaffs(这个是专门针对nand) 等
当然你直接读取rad data也是可以的 比如u-boot烧到flash就是这样
但是如果你要把block type flash nand flash mount到某个结点并像一般文件那样访问里面的数据你就得用到文件系统
stage1 这个前面的446B与MBR前446B是相同的 这个是为了找到boot sector
xxfs_stage1_5 这个是加载到ram中的文件系统 如果没有它 就无法针对某个由xxfs格式的分区读写
显示开机选项
加载stage2 这个在MBR后32k处(忘记是不是这个数了) 开机后面的事情就都交给stage2了
内核加载运行
文件系统初始化 查找intrd.img(假定是这个名字 这个就是文件系统镜像了也就是你说的文件系统1)
intrd.img做什么呢
挂载 文件系统设备文件 如/proc /sys
生成相应的设备文件
开户一些系统服务
等等
没有这些 内核是跑不下去的 会panic掉
内核本身实现了一层VFS 对各种文件系统进行了抽象 这样可以支持很多文件系统
比如ext2 ext3现在到ext4了 这里的文件系统是对磁盘的一种组织与管理了 比如数据怎么存放
flash文件系统有jffs yaffs(这个是专门针对nand) 等
当然你直接读取rad data也是可以的 比如u-boot烧到flash就是这样
但是如果你要把block type flash nand flash mount到某个结点并像一般文件那样访问里面的数据你就得用到文件系统
|
x86大哥来了。
呵呵
|
X86全说了,支持。
|
接分。。。
我的“下载”里面有这方面的资料,可能有帮助。。。
我的“下载”里面有这方面的资料,可能有帮助。。。
|
不懂,突然发现X86神人来了,以前没遇到过。膜拜下
|
x86大哥已经说的很详细了。
|
顶
|
再怎么存储都是一堆二进制数据,这里是把整个文件系统做成一个映像文件,格式化过程太啰嗦,再写数据麻烦,直接烧写一个映像文件,bang!文件管理结构、文件数据。。。都有了
|
不懂,特来支持...
|
主要是这个问题不好说。
|
内核和根文件系统是不能单独用的,楼主学习下linux系统的基本原理就明白了。
|
第一次 这么认真地敲这么多的字 linux有些问题的确令人很纠结
希望我说的对你有帮助
你不要把它跟kernel中的那个搞混了就是了
搞清楚你说的文件系统1 具体做了什么 会明白一些
希望我说的对你有帮助
你不要把它跟kernel中的那个搞混了就是了
搞清楚你说的文件系统1 具体做了什么 会明白一些
|
楼上一堆牛人,膜拜~