在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

鴻蒙系統(tǒng) IO棧和Linux IO棧對(duì)比分析

鴻蒙系統(tǒng)HarmonyOS ? 來(lái)源:oschina ? 作者:GongMingWei ? 2020-10-16 10:45 ? 次閱讀

華為的鴻蒙系統(tǒng)開(kāi)源之后第一個(gè)想看的模塊就是 FS 模塊,想了解一下它的 IO 路徑與 linux 的區(qū)別。現(xiàn)在鴻蒙開(kāi)源的倉(cāng)庫(kù)中有兩個(gè)內(nèi)核系統(tǒng),一個(gè)是 liteos_a 系統(tǒng),一個(gè)是 liteos_m 系統(tǒng)。兩者的區(qū)別主要是適應(yīng)的場(chǎng)景不一樣,liteos_a 系統(tǒng)適用于硬件資源更加豐富的場(chǎng)景,比如 CPU 更強(qiáng),內(nèi)存更大;而 liteos_m 系統(tǒng)則適用于 IoT 設(shè)備,相對(duì)來(lái)說(shuō)硬件資源比較弱一些。所以我們就拿 liteos_a 系統(tǒng)來(lái)分析一下它的 IO 棧吧,畢竟它應(yīng)對(duì)的場(chǎng)景更加復(fù)雜一些。

鴻蒙系統(tǒng) liteos_a Kernel 的下載地址在這:https://gitee.com/openharmony/kernel_liteos_a。

1.FS 源碼結(jié)構(gòu)

下載內(nèi)核源碼后發(fā)現(xiàn) fs 目錄下似乎缺少很多東西。

當(dāng)時(shí)覺(jué)得好奇怪,啥都沒(méi)有,那它的 shell 相關(guān)命令是怎么使用 fs 模塊進(jìn)行讀寫(xiě)的呢?于是發(fā)現(xiàn)鴻蒙的 FS 模塊主要是從 Nuttx (注:Nuttx 是 Apache 正在孵化的實(shí)時(shí)操作系統(tǒng)內(nèi)核)那里借用了 FS 的相關(guān)實(shí)現(xiàn)。這是從內(nèi)核的 fs.h 引用的路徑發(fā)現(xiàn)的,它引用的路徑內(nèi)容如下:

../../../../../third_party/NuttX/include/nuttx/fs/fs.h

所以我們需要找到這個(gè)模塊,在 gitee 的倉(cāng)庫(kù)中搜索 Nuttx 發(fā)現(xiàn)的確有這個(gè)倉(cāng)庫(kù),所以我們需要聯(lián)合兩個(gè)倉(cāng)庫(kù)的代碼一起解讀 IO 棧的源碼。Nuttx 的倉(cāng)庫(kù)地址為:https://gitee.com/openharmony/third_party_NuttX。

我們來(lái)看一下 Nuttx 的目錄結(jié)構(gòu):

可以發(fā)現(xiàn) FS 的具體實(shí)現(xiàn)都在這個(gè) Nuttx 倉(cāng)庫(kù)內(nèi)。接下來(lái)我們來(lái)看看鴻蒙系統(tǒng)的 IO 棧吧,因?yàn)?IO 棧的路徑比較多,所以我們選取塊設(shè)備(block device)的路徑來(lái)分析。

2. IO 整體架構(gòu)

鴻蒙系統(tǒng)關(guān)于塊設(shè)備的 IO 棧路徑整體架構(gòu)如下圖所示:

整體 IO 流程如下:

上層應(yīng)用會(huì)在用戶(hù)態(tài)下調(diào)用 read / write 接口,這會(huì)觸發(fā)系統(tǒng)調(diào)用(syscall)進(jìn)入內(nèi)核態(tài);

系統(tǒng)調(diào)用往下調(diào)用 VFS 的接口,如 read 則對(duì)應(yīng) read,write 對(duì)應(yīng) write;

VFS 這層會(huì)根據(jù) fd 對(duì)應(yīng)的 file 結(jié)構(gòu)拿出超級(jí)塊的 inode,利用這個(gè) inode 繼續(xù)往下調(diào)用具體 driver 的 read / write 接口;

在塊設(shè)備的場(chǎng)景下,它是利用字符設(shè)備的驅(qū)動(dòng)作為它的代理,也就是 driver 下面的 bch。鴻蒙系統(tǒng)的設(shè)備驅(qū)動(dòng)中并沒(méi)有塊設(shè)備的驅(qū)動(dòng),所以它做了一層 block_proxy,無(wú)論是字符設(shè)備還是塊設(shè)備的 IO 都會(huì)經(jīng)過(guò) bch 驅(qū)動(dòng)。數(shù)據(jù)所位于的扇區(qū)以及偏移量(offset)計(jì)算位于這層;

IO 往下走會(huì)有一層緩存,叫 bcache。bcache 采用紅黑樹(shù)管理這些緩存的數(shù)據(jù);

IO 再往下走就是塊設(shè)備的驅(qū)動(dòng),內(nèi)核沒(méi)有通用的塊設(shè)備驅(qū)動(dòng)實(shí)現(xiàn),它應(yīng)該是由不同的廠商來(lái)實(shí)現(xiàn)的。

3.鴻蒙 IO 流程源碼解讀

讀寫(xiě)流程大致一樣,我們就看一下鴻蒙的讀數(shù)據(jù)流程吧。由于函數(shù)的源碼比較長(zhǎng),全貼出來(lái)也不太好,所以太長(zhǎng)的源碼我只將關(guān)鍵的部分截出。

3.1 上層應(yīng)用讀取數(shù)據(jù)

上層應(yīng)用調(diào)用 read 接口,這個(gè)是系統(tǒng)的 POSIX 接口,read 接口原型如下:

#include 
ssize_t read(int fd, void *buf, size_t count); 

3.2 VFS

上層應(yīng)用在用戶(hù)態(tài)調(diào)用 read 接口后會(huì)觸發(fā)系統(tǒng)調(diào)用,這個(gè)系統(tǒng)調(diào)用在 Kernel 的如下文件中進(jìn)行注冊(cè):

syscall/fs_syscall.c

對(duì)應(yīng)的系統(tǒng)調(diào)用函數(shù)為

237 行的 read 調(diào)用的是 VFS 這層的 read,VFS 這層的 read 函數(shù)實(shí)現(xiàn)位于 Nuttx 項(xiàng)目的如下路徑:

fs/vfs/fs_read.c

read函數(shù)從 fd (文件描述符)中獲取對(duì)應(yīng)的 file 對(duì)象指針,然后在調(diào)用 file_read 接口。file_read 也和 read 函數(shù)位于同一個(gè)文件下。它從 file 對(duì)象中獲取了超級(jí)塊的 inode 對(duì)象,然后使用這個(gè) inode 調(diào)用 bch 驅(qū)動(dòng)的 read 函數(shù)。

3.3 bch 驅(qū)動(dòng)

bch 驅(qū)動(dòng)是一個(gè)字符設(shè)備驅(qū)動(dòng),它被用來(lái)當(dāng)做上層與塊設(shè)備驅(qū)動(dòng)的中間層。注冊(cè)塊設(shè)備驅(qū)動(dòng)時(shí)會(huì)調(diào)用 block_proxy 來(lái)做代理轉(zhuǎn)換,它的實(shí)現(xiàn)位于:

fs/driver/fs_blockproxy.c

當(dāng)打開(kāi)(open)一個(gè)塊設(shè)備時(shí),內(nèi)核會(huì)判斷 inode 是否是塊設(shè)備類(lèi)型,如果是則調(diào)用 block_proxy 來(lái)做轉(zhuǎn)換處理。 當(dāng)上層調(diào)用 u.i_ops->read 時(shí),它對(duì)應(yīng)的是 bch_read,它的實(shí)現(xiàn)位于:

drivers/bch/bchdev_driver.c

bch_read 會(huì)接著調(diào)用 bchlib_read,這個(gè)函數(shù)的實(shí)現(xiàn)位于:

drivers/bch/bchlib_read.c

它會(huì)根據(jù)偏移(offset)計(jì)算出在哪個(gè)扇區(qū)進(jìn)行讀數(shù)據(jù),如果要讀取的數(shù)據(jù)只是某個(gè)扇區(qū)的一部分,則它會(huì)先利用 bchlib_readsector 將這個(gè)扇區(qū)全部讀出來(lái),然后再把對(duì)應(yīng)的那部分?jǐn)?shù)據(jù)拷貝到內(nèi)存并返回。 bchlib_readsector 的實(shí)現(xiàn)位于如下位置:

drivers/bch/bchlib_cache.c

它會(huì)先將位于內(nèi)存的臟數(shù)據(jù)下刷,等臟數(shù)據(jù)都下刷完成后才會(huì)利用 los_disk_read 把數(shù)據(jù)從磁盤(pán)上讀上來(lái)。 los_disk_read 的實(shí)現(xiàn)位于 kernel 的如下位置:

fs/vfs/disk/disk.c

這 los_disk_read 這層會(huì)有一層緩存,叫 bcache。它會(huì)把每次 IO 的扇區(qū)緩存到內(nèi)存中,緩存的組織方式為紅黑樹(shù)。它是有大小限制的,不是無(wú)限增長(zhǎng),具體大小與內(nèi)存大小有關(guān)。 los_disk_read 在讀數(shù)據(jù)之前會(huì)先從 bcache 緩存中查找有沒(méi)有對(duì)應(yīng)的緩存扇區(qū),如果有則直接將這個(gè)扇區(qū)返回,如果沒(méi)有則調(diào)用真正塊設(shè)備的 read 函數(shù)。這個(gè) read 函數(shù)在內(nèi)核中沒(méi)有對(duì)應(yīng)的實(shí)現(xiàn),所以它是跟隨每個(gè)塊設(shè)備的驅(qū)動(dòng)的不同而不同。

整個(gè)讀數(shù)據(jù)流程源碼分析就到這里。

鴻蒙系統(tǒng)的 IO 棧分支比較多,這次的源碼解讀選用了塊設(shè)備的分支進(jìn)行分析,希望可以幫助大家更好的理解鴻蒙系統(tǒng)。最后我還想做一下鴻蒙系統(tǒng)與 Linux 關(guān)于 IO 棧的對(duì)比。

4.鴻蒙 IO 棧與 Linux IO 棧的對(duì)比

如果有研究過(guò) linux IO 棧的同學(xué)應(yīng)該能體會(huì)到鴻蒙的 IO 棧是比較簡(jiǎn)單。先來(lái)看一下 Linux 的 IO 棧整體架構(gòu)圖:

所以,我們對(duì)比一下鴻蒙系統(tǒng)和 Linux IO 棧的主要區(qū)別吧:

鴻蒙沒(méi)有 pagecache。所以鴻蒙的系統(tǒng)調(diào)用加不加 O_SYNC 應(yīng)該是一樣的,都是直接下到磁盤(pán)。

鴻蒙沒(méi)有通用塊層和 IO 調(diào)度層。在 Linux 中通用塊層是用來(lái)將連續(xù)的塊請(qǐng)求組成一個(gè) bio 結(jié)構(gòu)體,便于對(duì)接下層的調(diào)度管理。調(diào)度層的目的則是用來(lái)減少 IO 尋址時(shí)間,在這層也有多種調(diào)度算法可以選擇,如 cfq/deadline/noop 等。我覺(jué)得鴻蒙不是沒(méi)有這兩層,而是還沒(méi)有做,目前只是 IoT 的適用場(chǎng)景。等明年適用于手機(jī)的時(shí)候再看看,我覺(jué)得應(yīng)該也會(huì)做相關(guān)的處理,只不過(guò)不一定與 Linux 的處理一樣。

鴻蒙的驅(qū)動(dòng)層次不夠完整,需要用字符設(shè)備的驅(qū)動(dòng)來(lái)代理塊設(shè)備的驅(qū)動(dòng),不知道這是基于什么考慮。

鴻蒙 bcache 的作用與 linux 的 pagecache 作用基本一致,只不過(guò)它們?cè)?IO 棧上所在的位置不一樣。
編輯:hfy

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

    關(guān)注

    87

    文章

    11322

    瀏覽量

    209864
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2636

    瀏覽量

    66455
  • IO棧
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    558
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    意法半導(dǎo)體展示IO-Link收發(fā)器和低邊功率開(kāi)關(guān)的組合應(yīng)用

    意法半導(dǎo)體推出了一款基于IO-Link的工業(yè)標(biāo)準(zhǔn)和設(shè)備報(bào)警執(zhí)行器參考設(shè)計(jì),最終交貨形式是開(kāi)箱即用的成品板卡及配套協(xié)議和應(yīng)用軟件。
    的頭像 發(fā)表于 12-24 13:35 ?127次閱讀

    電流倒灌揭秘:IO口損壞與系統(tǒng)故障的真相

    導(dǎo)讀本期文章將繼續(xù)深入了解電流倒灌,分析嵌入式系統(tǒng)IO口損壞和系統(tǒng)穩(wěn)定性問(wèn)題的根本原因。在上期的工程筆記中,我們了解了電流倒灌并探討了電流倒灌可能導(dǎo)致的一系列問(wèn)題,包括
    的頭像 發(fā)表于 12-11 11:38 ?358次閱讀
    電流倒灌揭秘:<b class='flag-5'>IO</b>口損壞與<b class='flag-5'>系統(tǒng)</b>故障的真相

    λ-IO:存儲(chǔ)計(jì)算下的IO設(shè)計(jì)

    動(dòng)機(jī)和背景? ? 存儲(chǔ)計(jì)算存儲(chǔ)資源的充分利用。IO是管理存儲(chǔ)器的的基本組件,包括設(shè)備驅(qū)動(dòng)、塊接口層、文件系統(tǒng),目前一些用戶(hù)空間IO庫(kù)(如SPDK)有效降低了延遲,但是
    的頭像 發(fā)表于 12-02 10:35 ?223次閱讀
    λ-<b class='flag-5'>IO</b>:存儲(chǔ)計(jì)算下的<b class='flag-5'>IO</b><b class='flag-5'>棧</b>設(shè)計(jì)

    RoCE與IB對(duì)比分析(二):功能應(yīng)用篇

    在上一篇中,我們對(duì)RoCE、IB的協(xié)議層級(jí)進(jìn)行了詳細(xì)的對(duì)比分析,二者本質(zhì)沒(méi)有不同,但基于實(shí)際應(yīng)用的考量,RoCE在開(kāi)放性、成本方面更勝一籌。本文我們將繼續(xù)分析RoCE和IB在擁塞控制、QoS、ECMP三個(gè)關(guān)鍵功能中的性能表現(xiàn)。
    的頭像 發(fā)表于 11-15 14:03 ?328次閱讀
    RoCE與IB<b class='flag-5'>對(duì)比分析</b>(二):功能應(yīng)用篇

    一文解讀Linux 5種IO模型

    Linux里有五種IO模型:阻塞IO、非阻塞IO、多路復(fù)用IO、信號(hào)驅(qū)動(dòng)式IO和異步
    的頭像 發(fā)表于 11-09 11:12 ?356次閱讀
    一文解讀<b class='flag-5'>Linux</b> 5種<b class='flag-5'>IO</b>模型

    華納云監(jiān)視Linux磁盤(pán)IO性能命令:iotop,iostat,vmstat,atop,dstat,ioping

    以下介紹6個(gè)監(jiān)視 Linux 磁盤(pán)IO性能的命令(工具),它們分別是iotop、iostat、vmstat、atop、dstat、ioping,以下將附上簡(jiǎn)單的使用方法。 前言 磁盤(pán)IO
    的頭像 發(fā)表于 10-24 14:43 ?203次閱讀

    亞信電子于IAS 2024展出最新IO-Link主站&amp;設(shè)備軟件協(xié)議解決方案

    亞信電子即將于IAS 2024展示最新的亞信IO-Link主站/設(shè)備軟件協(xié)議、集成亞信IO-Link主站軟件協(xié)議的AX58400 EtherCAT轉(zhuǎn)
    的頭像 發(fā)表于 09-18 15:28 ?312次閱讀
    亞信電子于IAS 2024展出最新<b class='flag-5'>IO</b>-Link主站&amp;設(shè)備軟件協(xié)議<b class='flag-5'>棧</b>解決方案

    Linux網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)

    網(wǎng)絡(luò)協(xié)議是操作系統(tǒng)核心的一個(gè)重要組成部分,負(fù)責(zé)管理網(wǎng)絡(luò)通信中的數(shù)據(jù)包處理。在 Linux 操作系統(tǒng)中,網(wǎng)絡(luò)協(xié)議(Network Stac
    的頭像 發(fā)表于 09-10 09:51 ?331次閱讀
    <b class='flag-5'>Linux</b>網(wǎng)絡(luò)協(xié)議<b class='flag-5'>棧</b>的實(shí)現(xiàn)

    初識(shí)IO-Link及IO-Link設(shè)備軟件協(xié)議

    IO-Link概述什么是IO-LinkIO-Link是一種用于工業(yè)自動(dòng)化領(lǐng)域的數(shù)字通信協(xié)議,最早由西門(mén)子提出,現(xiàn)在已經(jīng)成為了國(guó)際標(biāo)準(zhǔn),旨在實(shí)現(xiàn)工業(yè)設(shè)備和控制系統(tǒng)之間的連接和通信。它允許傳感器、執(zhí)行器
    的頭像 發(fā)表于 07-08 16:41 ?8709次閱讀
    初識(shí)<b class='flag-5'>IO</b>-Link及<b class='flag-5'>IO</b>-Link設(shè)備軟件協(xié)議<b class='flag-5'>棧</b>

    初識(shí)IO-Link及IO-Link設(shè)備軟件協(xié)議

    亞信IO-Link設(shè)備軟件協(xié)議是基于亞信電子AXM-IOLS IO-Link設(shè)備評(píng)估板設(shè)計(jì)的,搭載意法半導(dǎo)體 STM32F469AI微控制器,并在STM32CubeIDE開(kāi)發(fā)環(huán)境中進(jìn)行開(kāi)發(fā)。此
    的頭像 發(fā)表于 07-08 13:55 ?2796次閱讀
    初識(shí)<b class='flag-5'>IO</b>-Link及<b class='flag-5'>IO</b>-Link設(shè)備軟件協(xié)議<b class='flag-5'>棧</b>

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

    1 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核 ? 6月21日,在華為開(kāi)發(fā)者大會(huì)上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨(dú)立于安卓和iOS的鴻蒙操作
    的頭像 發(fā)表于 06-27 11:30 ?861次閱讀

    遠(yuǎn)程IO與分布式IO的區(qū)別

    在工業(yè)自動(dòng)化和控制系統(tǒng)設(shè)計(jì)中,遠(yuǎn)程IO(Input/Output)和分布式IO是兩個(gè)重要的概念。它們各自具有獨(dú)特的特點(diǎn)和優(yōu)勢(shì),適用于不同的應(yīng)用場(chǎng)景。本文將詳細(xì)探討遠(yuǎn)程IO與分布式
    的頭像 發(fā)表于 06-15 15:57 ?2635次閱讀

    堆和的區(qū)別和使用注意事項(xiàng)

    堆和是在計(jì)算機(jī)科學(xué)中廣泛使用的兩種數(shù)據(jù)結(jié)構(gòu),它們具有不同的用途和特點(diǎn)。堆和的區(qū)別涉及到內(nèi)存分配、訪問(wèn)方式、數(shù)據(jù)存儲(chǔ)等方面。在使用堆和時(shí),還需要注意一些細(xì)節(jié),以確保程序的正確性和效率。本文將詳細(xì)
    的頭像 發(fā)表于 01-18 17:24 ?2258次閱讀

    亞信電子推出全新IO-Link設(shè)備軟件協(xié)議解決方案

    亞信電子提供完整的EtherCAT從站轉(zhuǎn)IO-Link主站網(wǎng)關(guān)和IO-Link設(shè)備軟件協(xié)議解決方案,使客戶(hù)能夠?qū)⒆钚碌?b class='flag-5'>IO-Link智能傳感器和執(zhí)行器等設(shè)備,輕松地導(dǎo)入EtherCA
    的頭像 發(fā)表于 01-17 08:11 ?578次閱讀
    亞信電子推出全新<b class='flag-5'>IO</b>-Link設(shè)備軟件協(xié)議<b class='flag-5'>棧</b>解決方案

    亞信電子推出全新IO-Link設(shè)備軟件協(xié)議解決方案

    亞信電子提供完整的EtherCAT從站轉(zhuǎn)IO-Link主站網(wǎng)關(guān)和IO-Link設(shè)備軟件協(xié)議解決方案,使客戶(hù)能夠?qū)⒆钚碌?b class='flag-5'>IO-Link智能傳感器和執(zhí)行器等設(shè)備,輕松地導(dǎo)入EtherCA
    的頭像 發(fā)表于 01-16 11:24 ?600次閱讀
    亞信電子推出全新<b class='flag-5'>IO</b>-Link設(shè)備軟件協(xié)議<b class='flag-5'>棧</b>解決方案
    主站蜘蛛池模板: 美女免费黄| 大量国产后进翘臀视频| 国产精品欧美一区二区| 天天色影院| 五月四房婷婷| 特级一级毛片| 最近新韩国hd视频| 在线观看国产日本| 日本不卡一区视频| 免费被黄网站在观看| 久草在线资源网| 天天干天天射天天操| www.色午夜| 国产一卡二卡≡卡四卡无人| 国产精品伦理久久久久| 一级午夜| 又粗又硬又大久久久| 五月天婷婷色综合| 夜夜爽66| 欧美7777kkkk免费看258| 天天射日| 国产午夜精品理论片久久影视| а8天堂资源在线官网| 华人黄网站大全| 美女天天操| 手机看日韩毛片福利盒子| 久操视频网站| 4444kk在线看片| 亚洲色啦啦狠狠网站| 亚洲v视频| 欧美一区二区三区精品| 欧美色图日韩| 国产91久久最新观看地址| 国产美女流出白浆在线观看| 精品视频免费看| 久久噜国产精品拍拍拍拍| 免费在线色视频| 欧美日韩国产在线一区| 国产三级一区| 日韩欧美伦理| 成人夜色香网站在线观看|