精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    11232

    瀏覽量

    208961

原文標題:黃偉亮: 探秘Linux的塊設備和根

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    硬盤分區表錯誤與解決辦法

    ,甚至有可能丟失硬盤中的所有數據。 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

    求助,Micropython調用uos.mkdir報錯,是不是分區表配置出了問題?

    call last):File "", line 1, in OSError: [Errno 19] ENODEV不知道是不是Flash配置有問題,還是分區表配置除了問題
    發表于 02-15 06:39

    默認分區表中關于app分區大小的問題求解

    請問默認分區表文件中指示app分配了1M,是不是意味著芯片存儲空間中,出去bootloader和分區表存儲空間外,其它位置都是空余著可以被分配過來存儲數據?
    發表于 03-03 08:16

    零磁道和分區表修復是什么意思

    零磁道和分區表修復是什么意思 零磁道的修復   零磁道處于硬盤上一個非常重要的位置,硬盤的主
    發表于 03-29 10:04 ?888次閱讀

    硬盤分區表破壞,所有盤符或部分盤符丟失故障

    硬盤分區表破壞,所有盤符或部分盤符丟失故障 首先使用“FDISK/MBR”重建主引導區,再根據情況修正分區表。修正分區表的基本思路是查找以55AA為結束的扇區,再
    發表于 01-11 11:26 ?1053次閱讀

    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 ?943次閱讀
    MySQL<b class='flag-5'>分區表</b>的類型及原理