0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

探秘Linux:从分区表到块设备——我不是表, 我是块设备

电子工程师 来源:未知 作者:电子大兵 2017-09-11 16:03 次阅读

作者简介: 黄伟亮(Huang weller),毕业于苏州大学,就职于苏州博世汽车部件汽车多媒体事业部,从事汽车多媒体娱乐系统的平台开发工作六年有余, 接触Linux 系统近10年。感兴趣的方向有Linux系统性能优化,多媒体框架, 文件系统和存储器件, USB以及虚拟化等。


前言


我们的学习习惯基本都是由浅入深的, 比如我们先学习如何使用fdisk工具来给磁盘分区, 之后才想到去看看fdisk到底对磁盘做了什么, 许久以后看到除了fdisk还有别的分区工具可以给磁盘分区. 通常我们只需要知道怎么用就可以了, 也有很多原因促使我们去思考它的背后到底发生了什么,这些原因可能是你碰到了具体问题, 不得不让你往下去看, 去看你认为肯定不会出问题的那一部分, 也有可能是你觉得现在的自己技术太浮于表面, 想深入一些, 也可能是受周围人的影响, 一起学习.

佛家讲究因果, 使用者往往接触的是果, 因为使用者在乎的是可用性, 开发者或者说设计者则要考虑因, 因为什么样的因就会导致什么样的果, 因为这样的设计, 所以就有那样的bug, 就像黑客帝国中的Neo 要找到architecture!

本文由来于心中的两个疑问,即平凡的存储器件是怎么从分区变成一个个块设备的, 根是怎么被mount.

Romcode


通常,processor上电后, 最早执行的代码是固化在CPU ROM中的程序, 它其实就是最早被执行的bootloader, 它的终极目的是从存储介质(包含uart, USB)加载另外一个bootloader, 比如u-boot. 拿启动介质是eMMC或者SD的例子来说, romcode一般会从offset = sector_size * 1的位置开始读取程序, 这么做的原因其实是为了跳开分区表.

当然笔者也见过一个奇葩的例子, 海思的一款ARM9芯片, ROMCODE直接从eMMC data partition offset 0的位置开始读取程序, 这就导致当你从emmc 上的u-boot启动, 兴冲冲的进到ramdiskeMMC进行分区, 格式化, 烧写系统之后, 发现系统再也起不来了, 那是因为分区表已经覆盖了第一个分区,破坏了bootloader. 整个系统没有使用分区工具来划分分区, 而是通过u-bootboot arguments描述分区信息. 不管怎样, 本文描述的是前者,而非这个特例.

从分区表到块设备: 我不是表, 我是块设备


Linux Storage device 通常是作为块设备被访问的,例如mtdblock, mmcblock 和宇宙第一强的nandblk 块设备(实在太崇拜该设备了,NAND发挥到了极致). Storage device的设备驱动作为底层支撑, 负责注册块设备并且直接和存储器件打交道, 接受, 执行和响应块设备层的过来的访问请求. 比如说, 一次文件读取的操作会变成文件系统提交到块设备的块读取请求, 该块设备的读访问请求, 在块设备驱动和Host controller driver会把它被转化为MMC协议的CMD17或者CMD18指令给到EMMC物理设备.

Storage device的设备驱动注册到块设备层,并且扫描分区表, 识别分区表, 然后解析分区表, 把磁盘上的分区注册为块设备. 所以, 当你奇怪为什么没有mmcblkp0这个设备时, 其实不是没有mmcblk0p0,而是p0被定义为就是mmcblk0. 代表了整个磁盘. 下面从代码上来看一下一个块设备驱动的初始化过程:

: 木叶的根


我们知道u-bootboot argument 会把root device的设备名称带给内核, 例如通过参数root=/dev/mmcblk0p2来告知内核, 根目录所在的分区. 事情真的那么简单吗?

原来这里面有一点点小弯弯:

原来在天地混沌的时候, 内核已经为了自己的未来初始化了一个ramfs, 并在ramfs中创建了一些必要的目录和设备节点, 例如/dev , /dev/console, /root.

然后, 为了mount mmcblk0p2, 它又根据设备文件名/dev/mmcblk0p2查找设备变量, ramfs下创建设备节点/dev/root, 这个设备文件指向的就是设备mmcblk0p2. 然后把ramfs下的设备/dev/mmcblk0p2挂载到ramfs/root. 切换当前路径到ramfs/root. 至此已经完成了设备mmcblk0p2的挂载工作, 但是此时它还不是根.

接着, 内核挂载devtmpfsdev目录, 然后调用sys_chroot(“.”)change root 到当前路径, 也就是ramfs/root.

反映到代码上:

因此在系统起来后, cat /proc/mounts, 我们可以看到以下信息:

可以看到有一个文件系统的类型是rootfs, 它被mount到了“/”.

这个文件系统在init/do_mount.c中被定义, 它就是ramfs的一个实例,

该类型的文件系统在init_rootfs()中被注册.

mount命令的输出上, 我们可以看到/dev/mmcblk0p2被挂载在了”/”, 殊不知这里的根已经不是原来的根.

结束语


本文没有对代码的细节作过多的分析, 一方面本文不是为了做代码分析的, 另一方面网络上有很多朋友也做过块设备的代码分析, 本文罗列了代码的脉络是为了来更好的表达分析的结果. Block layer是个很复杂的子系统, 有很多关于它的内容,比如IO-schecduler, buffer cache, 相信自己可以越来越深入的研究这个子系统.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209494

原文标题:黄伟亮: 探秘Linux的块设备和根

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    《DNESP32S3使用指南-IDF版_V1.6》第七章 分区表

    的偏移与空间大小;另一种则是用于烧录设备的.bin文件格式。在系统编译时,系统会将.csv文件转化为.bin文件格式的分区表。下面展示了基础例程的分区表文件的内容。图7.1.1 基础例程的分区
    发表于 12-03 15:15

    硬盘分区表错误与解决办法

    ,甚至有可能丢失硬盘中的所有数据。 3.操作不当   如果在一硬盘上同时安装了多个操作系统,那么在卸载的时候就有可能导致分区表故障,比如在同时安装了Windows 2000和Windows 98的计算机
    发表于 02-26 15:56

    关于Linux nandflash分区表的疑问?

    Linux分区表在那个文件.移植的时候根据不同的处理器会用不用的文件分区表吗?另外uboot里面也有分区表.在那个文件.不同版本的uboot怎么找到
    发表于 09-17 19:47

    uboot源码怎么查看spiflash分区表

    请问 uboot 源码怎么查看 spiflash 分区表在那个工程文件里面?因为换了 spiflash
    发表于 06-21 07:27

    MySQL分区类型及介绍

    分区是将一个的数据按照一定规则水平划分成不同的逻辑,并分别进行物理存储,这个规则就叫做分区函数,可以有不同的
    发表于 06-29 16:31

    详解Hive分区表

    黑猴子的家:Hive 分区表基本操作
    发表于 05-16 10:47

    怎样去修改分区表参数文件呢

    怎样去创建可以修改分区日期数据备份呢?怎样去修改分区表参数文件呢?
    发表于 03-04 07:13

    RK3399Pro入门教程(2)RK3399Pro分区表和固件组成

    如何自己修改烧写固件,如何修改分区表,现在就教大家识别下分区表文件parameter.txt以及固件的启动方式1. 分区表首先大家拿到的开发版默认是双系统启动的,里头包含了Android和Li
    发表于 03-29 17:46

    瑞芯微在开源支持中使用GPT作为其主要分区表

    介绍瑞芯微在开源支持中使用GPT作为其主要分区表。我们将 GPT 存储在 LBA0 ~ LBA63。U-boot中的GPT分区表U-boot 支持标准 GPT 分区表格式。默认存储映射注1:如果
    发表于 04-21 14:48

    求助,默认分区表中关于app分区大小的理解

    请问默认分区表文件中指示app分配了1M,是不是意味着芯片存储空间中,出去bootloader和分区表存储空间外,其它位置都是空余着可以被分配过来存储数据?
    发表于 02-10 08:44

    默认分区表中关于app分区大小的问题求解

    请问默认分区表文件中指示app分配了1M,是不是意味着芯片存储空间中,出去bootloader和分区表存储空间外,其它位置都是空余着可以被分配过来存储数据?
    发表于 03-03 08:16

    零磁道和分区表修复是什么意思

    零磁道和分区表修复是什么意思 零磁道的修复   零磁道处于硬盘上一个非常重要的位置,硬盘的主
    发表于 03-29 10:04 890次阅读

    硬盘分区表破坏,所有盘符或部分盘符丢失故障

    硬盘分区表破坏,所有盘符或部分盘符丢失故障 首先使用“FDISK/MBR”重建主引导区,再根据情况修正分区表。修正分区表的基本思路是查找以55AA为结束的扇区,再
    发表于 01-11 11:26 1057次阅读

    Linux设备驱动开发详解》第13章、Linux设备驱动

    Linux设备驱动开发详解》第13章、Linux设备驱动
    发表于 10-27 11:24 18次下载
    《<b class='flag-5'>Linux</b><b class='flag-5'>设备</b>驱动开发详解》第13章、<b class='flag-5'>Linux</b><b class='flag-5'>块</b><b class='flag-5'>设备</b>驱动

    MySQL分区表的类型及原理

    那么在分区表上的操作是怎样进行的呢?其实常规的CRUD操作以及返回结果和普通没有任何区别。具体分区层实现是先打开并锁定所有底层,优化器先判断是否可以过滤部分
    的头像 发表于 03-29 13:58 976次阅读
    MySQL<b class='flag-5'>分区表</b>的类型及原理