色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探秘Linux:從分區(qū)表到塊設(shè)備——我不是表, 我是塊設(shè)備

電子工程師 ? 來源:未知 ? 作者:電子大兵 ? 2017-09-11 16:03 ? 次閱讀

作者簡介: 黃偉亮(Huang weller),畢業(yè)于蘇州大學(xué),就職于蘇州博世汽車部件汽車多媒體事業(yè)部,從事汽車多媒體娛樂系統(tǒng)的平臺(tái)開發(fā)工作六年有余, 接觸Linux 系統(tǒng)近10年。感興趣的方向有Linux系統(tǒng)性能優(yōu)化,多媒體框架, 文件系統(tǒng)和存儲(chǔ)器件, USB以及虛擬化等。


前言


我們的學(xué)習(xí)習(xí)慣基本都是由淺入深的, 比如我們先學(xué)習(xí)如何使用fdisk工具來給磁盤分區(qū), 之后才想到去看看fdisk到底對(duì)磁盤做了什么, 許久以后看到除了fdisk還有別的分區(qū)工具可以給磁盤分區(qū). 通常我們只需要知道怎么用就可以了, 也有很多原因促使我們?nèi)ニ伎妓谋澈蟮降装l(fā)生了什么,這些原因可能是你碰到了具體問題, 不得不讓你往下去看, 去看你認(rèn)為肯定不會(huì)出問題的那一部分, 也有可能是你覺得現(xiàn)在的自己技術(shù)太浮于表面, 想深入一些, 也可能是受周圍人的影響, 一起學(xué)習(xí).

佛家講究因果, 使用者往往接觸的是果, 因?yàn)槭褂谜咴诤醯氖强捎眯?/span>, 開發(fā)者或者說設(shè)計(jì)者則要考慮因, 因?yàn)槭裁礃拥囊蚓蜁?huì)導(dǎo)致什么樣的果, 因?yàn)檫@樣的設(shè)計(jì), 所以就有那樣的bug, 就像黑客帝國中的Neo 要找到architecture!

本文由來于心中的兩個(gè)疑問,即平凡的存儲(chǔ)器件是怎么從分區(qū)變成一個(gè)個(gè)塊設(shè)備的, 根是怎么被mount.

Romcode


通常,processor上電后, 最早執(zhí)行的代碼是固化在CPU ROM中的程序, 它其實(shí)就是最早被執(zhí)行的bootloader, 它的終極目的是從存儲(chǔ)介質(zhì)(包含uart, USB)加載另外一個(gè)bootloader, 比如u-boot. 拿啟動(dòng)介質(zhì)是eMMC或者SD的例子來說, romcode一般會(huì)從offset = sector_size * 1的位置開始讀取程序, 這么做的原因其實(shí)是為了跳開分區(qū)表.

當(dāng)然筆者也見過一個(gè)奇葩的例子, 海思的一款ARM9芯片, ROMCODE直接從eMMC data partition offset 0的位置開始讀取程序, 這就導(dǎo)致當(dāng)你從emmc 上的u-boot啟動(dòng), 興沖沖的進(jìn)到ramdisk對(duì)eMMC進(jìn)行分區(qū), 格式化, 燒寫系統(tǒng)之后, 發(fā)現(xiàn)系統(tǒng)再也起不來了, 那是因?yàn)榉謪^(qū)表已經(jīng)覆蓋了第一個(gè)分區(qū),破壞了bootloader. 整個(gè)系統(tǒng)沒有使用分區(qū)工具來劃分分區(qū), 而是通過u-bootboot arguments描述分區(qū)信息. 不管怎樣, 本文描述的是前者,而非這個(gè)特例.

從分區(qū)表到塊設(shè)備: 我不是表, 我是塊設(shè)備


Linux Storage device 通常是作為塊設(shè)備被訪問的,例如mtdblock, mmcblock 和宇宙第一強(qiáng)的nandblk 塊設(shè)備(實(shí)在太崇拜該設(shè)備了,NAND發(fā)揮到了極致). Storage device的設(shè)備驅(qū)動(dòng)作為底層支撐, 負(fù)責(zé)注冊(cè)塊設(shè)備并且直接和存儲(chǔ)器件打交道, 接受, 執(zhí)行和響應(yīng)塊設(shè)備層的過來的訪問請(qǐng)求. 比如說, 一次文件讀取的操作會(huì)變成文件系統(tǒng)提交到塊設(shè)備的塊讀取請(qǐng)求, 該塊設(shè)備的讀訪問請(qǐng)求, 在塊設(shè)備驅(qū)動(dòng)和Host controller driver會(huì)把它被轉(zhuǎn)化為MMC協(xié)議的CMD17或者CMD18指令給到EMMC物理設(shè)備.

Storage device的設(shè)備驅(qū)動(dòng)注冊(cè)到塊設(shè)備層,并且掃描分區(qū)表, 識(shí)別分區(qū)表, 然后解析分區(qū)表, 把磁盤上的分區(qū)注冊(cè)為塊設(shè)備. 所以, 當(dāng)你奇怪為什么沒有mmcblkp0這個(gè)設(shè)備時(shí), 其實(shí)不是沒有mmcblk0p0,而是p0被定義為就是mmcblk0. 代表了整個(gè)磁盤. 下面從代碼上來看一下一個(gè)塊設(shè)備驅(qū)動(dòng)的初始化過程:

: 木葉的根


我們知道u-bootboot argument 會(huì)把root device的設(shè)備名稱帶給內(nèi)核, 例如通過參數(shù)root=/dev/mmcblk0p2來告知內(nèi)核, 根目錄所在的分區(qū). 事情真的那么簡單嗎?

原來這里面有一點(diǎn)點(diǎn)小彎彎:

原來在天地混沌的時(shí)候, 內(nèi)核已經(jīng)為了自己的未來初始化了一個(gè)ramfs, 并在ramfs中創(chuàng)建了一些必要的目錄和設(shè)備節(jié)點(diǎn), 例如/dev , /dev/console, /root.

然后, 為了mount mmcblk0p2, 它又根據(jù)設(shè)備文件名/dev/mmcblk0p2查找設(shè)備變量, ramfs下創(chuàng)建設(shè)備節(jié)點(diǎn)/dev/root, 這個(gè)設(shè)備文件指向的就是設(shè)備mmcblk0p2. 然后把ramfs下的設(shè)備/dev/mmcblk0p2掛載到ramfs/root. 切換當(dāng)前路徑到ramfs/root. 至此已經(jīng)完成了設(shè)備mmcblk0p2的掛載工作, 但是此時(shí)它還不是根.

接著, 內(nèi)核掛載devtmpfsdev目錄, 然后調(diào)用sys_chroot(“.”)change root 到當(dāng)前路徑, 也就是ramfs/root.

反映到代碼上:

因此在系統(tǒng)起來后, cat /proc/mounts, 我們可以看到以下信息:

可以看到有一個(gè)文件系統(tǒng)的類型是rootfs, 它被mount到了“/”.

這個(gè)文件系統(tǒng)在init/do_mount.c中被定義, 它就是ramfs的一個(gè)實(shí)例,

該類型的文件系統(tǒng)在init_rootfs()中被注冊(cè).

mount命令的輸出上, 我們可以看到/dev/mmcblk0p2被掛載在了”/”, 殊不知這里的根已經(jīng)不是原來的根.

結(jié)束語


本文沒有對(duì)代碼的細(xì)節(jié)作過多的分析, 一方面本文不是為了做代碼分析的, 另一方面網(wǎng)絡(luò)上有很多朋友也做過塊設(shè)備的代碼分析, 本文羅列了代碼的脈絡(luò)是為了來更好的表達(dá)分析的結(jié)果. Block layer是個(gè)很復(fù)雜的子系統(tǒng), 有很多關(guān)于它的內(nèi)容,比如IO-schecduler, buffer cache, 相信自己可以越來越深入的研究這個(gè)子系統(tǒng).

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11342

    瀏覽量

    210318

原文標(biāo)題:黃偉亮: 探秘Linux的塊設(shè)備和根

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    《DNESP32S3使用指南-IDF版_V1.6》第七章 分區(qū)表

    的偏移與空間大小;另一種則是用于燒錄設(shè)備的.bin文件格式。在系統(tǒng)編譯時(shí),系統(tǒng)會(huì)將.csv文件轉(zhuǎn)化為.bin文件格式的分區(qū)表。下面展示了基礎(chǔ)例程的分區(qū)表文件的內(nèi)容。圖7.1.1 基礎(chǔ)例程的分區(qū)
    發(fā)表于 12-03 15:15

    硬盤分區(qū)表錯(cuò)誤與解決辦法

    ,甚至有可能丟失硬盤中的所有數(shù)據(jù)。 3.操作不當(dāng)   如果在一硬盤上同時(shí)安裝了多個(gè)操作系統(tǒng),那么在卸載的時(shí)候就有可能導(dǎo)致分區(qū)表故障,比如在同時(shí)安裝了Windows 2000和Windows 98的計(jì)算機(jī)
    發(fā)表于 02-26 15:56

    關(guān)于Linux nandflash分區(qū)表的疑問?

    Linux分區(qū)表在那個(gè)文件.移植的時(shí)候根據(jù)不同的處理器會(huì)用不用的文件分區(qū)表嗎?另外uboot里面也有分區(qū)表.在那個(gè)文件.不同版本的uboot怎么找到
    發(fā)表于 09-17 19:47

    uboot源碼怎么查看spiflash分區(qū)表

    請(qǐng)問 uboot 源碼怎么查看 spiflash 分區(qū)表在那個(gè)工程文件里面?因?yàn)?b class='flag-5'>我換了 spiflash
    發(fā)表于 06-21 07:27

    MySQL分區(qū)類型及介紹

    分區(qū)是將一個(gè)的數(shù)據(jù)按照一定規(guī)則水平劃分成不同的邏輯,并分別進(jìn)行物理存儲(chǔ),這個(gè)規(guī)則就叫做分區(qū)函數(shù),可以有不同的
    發(fā)表于 06-29 16:31

    詳解Hive分區(qū)表

    黑猴子的家:Hive 分區(qū)表基本操作
    發(fā)表于 05-16 10:47

    怎樣去修改分區(qū)表參數(shù)文件呢

    怎樣去創(chuàng)建可以修改分區(qū)日期數(shù)據(jù)備份呢?怎樣去修改分區(qū)表參數(shù)文件呢?
    發(fā)表于 03-04 07:13

    RK3399Pro入門教程(2)RK3399Pro分區(qū)表和固件組成

    如何自己修改燒寫固件,如何修改分區(qū)表,現(xiàn)在就教大家識(shí)別下分區(qū)表文件parameter.txt以及固件的啟動(dòng)方式1. 分區(qū)表首先大家拿到的開發(fā)版默認(rèn)是雙系統(tǒng)啟動(dòng)的,里頭包含了Android和Li
    發(fā)表于 03-29 17:46

    瑞芯微在開源支持中使用GPT作為其主要分區(qū)表

    介紹瑞芯微在開源支持中使用GPT作為其主要分區(qū)表。我們將 GPT 存儲(chǔ)在 LBA0 ~ LBA63。U-boot中的GPT分區(qū)表U-boot 支持標(biāo)準(zhǔn) GPT 分區(qū)表格式。默認(rèn)存儲(chǔ)映射注1:如果
    發(fā)表于 04-21 14:48

    求助,默認(rèn)分區(qū)表中關(guān)于app分區(qū)大小的理解

    請(qǐng)問默認(rèn)分區(qū)表文件中指示app分配了1M,是不是意味著芯片存儲(chǔ)空間中,出去bootloader和分區(qū)表存儲(chǔ)空間外,其它位置都是空余著可以被分配過來存儲(chǔ)數(shù)據(jù)?
    發(fā)表于 02-10 08:44

    默認(rèn)分區(qū)表中關(guān)于app分區(qū)大小的問題求解

    請(qǐng)問默認(rèn)分區(qū)表文件中指示app分配了1M,是不是意味著芯片存儲(chǔ)空間中,出去bootloader和分區(qū)表存儲(chǔ)空間外,其它位置都是空余著可以被分配過來存儲(chǔ)數(shù)據(jù)?
    發(fā)表于 03-03 08:16

    零磁道和分區(qū)表修復(fù)是什么意思

    零磁道和分區(qū)表修復(fù)是什么意思 零磁道的修復(fù)   零磁道處于硬盤上一個(gè)非常重要的位置,硬盤的主
    發(fā)表于 03-29 10:04 ?902次閱讀

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

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

    Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第13章、Linux設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第13章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:24 ?18次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)開發(fā)詳解》第13章、<b class='flag-5'>Linux</b><b class='flag-5'>塊</b><b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)

    MySQL分區(qū)表的類型及原理

    那么在分區(qū)表上的操作是怎樣進(jìn)行的呢?其實(shí)常規(guī)的CRUD操作以及返回結(jié)果和普通沒有任何區(qū)別。具體分區(qū)層實(shí)現(xiàn)是先打開并鎖定所有底層,優(yōu)化器先判斷是否可以過濾部分
    的頭像 發(fā)表于 03-29 13:58 ?1019次閱讀
    MySQL<b class='flag-5'>分區(qū)表</b>的類型及原理
    主站蜘蛛池模板: 91久久精一区二区三区大全 | 亚洲 欧美 中文 日韩 另类 | AV无码久久无遮挡国产麻豆 | RUNAWAY韩国动漫免费官网版 | 村上里沙快播 | 亚洲国产三级在线观看 | 艳鉧动漫1~6全集观看在线 | 蜜桃成人在线 | 荡公乱妇HD中文字幕 | 欧美影院在线观看完整版 mp4 | 国产亚洲精品品视频在线 | 小蝌蚪视频在线观看免费观看WWW | 国产互换后人妻的疯狂VIDEO | 久久久久国产一级毛片高清片 | 金瓶梅 快播 | 曰批国产精品视频免费观看 | 日韩人妻无码精品-专区 | 国产亚洲一区在线 | good神马电影伦理午夜 | 久久夜色撩人精品国产 | 亚洲青青草 | 暖暖免费观看日本在线视频 | 99国产强伦姧在线看RAPE | 伸进同桌奶罩里摸她胸作文 | 两个洞一起插哦!好刺激 | 一本大道熟女人妻中文字幕在线 | BL文高H强交 | SM调教贱屁股眼哭叫求饶H | 久久综合老色鬼网站 | 把腿张开老子CAO烂你动态图 | 放射源分类办法 | 忘忧草研究院一二三 | 国产又黄又粗又爽又色的视频软件 | 国产综合无码一区二区色蜜蜜 | 国产美熟女乱又伦AV | 国产h视频在线观看网站免费 | 精品一区二区三区免费观看 | 快播看av | 日本久久免费大片 | 国产女人喷潮视频免费 | 九九久久精品国产 |