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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙系統 IO棧和Linux IO棧對比分析

鴻蒙系統HarmonyOS ? 來源:oschina ? 作者:GongMingWei ? 2020-10-16 10:45 ? 次閱讀

華為的鴻蒙系統開源之后第一個想看的模塊就是 FS 模塊,想了解一下它的 IO 路徑與 linux 的區別?,F在鴻蒙開源的倉庫中有兩個內核系統,一個是 liteos_a 系統,一個是 liteos_m 系統。兩者的區別主要是適應的場景不一樣,liteos_a 系統適用于硬件資源更加豐富的場景,比如 CPU 更強,內存更大;而 liteos_m 系統則適用于 IoT 設備,相對來說硬件資源比較弱一些。所以我們就拿 liteos_a 系統來分析一下它的 IO 棧吧,畢竟它應對的場景更加復雜一些。

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

1.FS 源碼結構

下載內核源碼后發現 fs 目錄下似乎缺少很多東西。

當時覺得好奇怪,啥都沒有,那它的 shell 相關命令是怎么使用 fs 模塊進行讀寫的呢?于是發現鴻蒙的 FS 模塊主要是從 Nuttx (注:Nuttx 是 Apache 正在孵化的實時操作系統內核)那里借用了 FS 的相關實現。這是從內核的 fs.h 引用的路徑發現的,它引用的路徑內容如下:

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

所以我們需要找到這個模塊,在 gitee 的倉庫中搜索 Nuttx 發現的確有這個倉庫,所以我們需要聯合兩個倉庫的代碼一起解讀 IO 棧的源碼。Nuttx 的倉庫地址為:https://gitee.com/openharmony/third_party_NuttX。

我們來看一下 Nuttx 的目錄結構:

可以發現 FS 的具體實現都在這個 Nuttx 倉庫內。接下來我們來看看鴻蒙系統的 IO 棧吧,因為 IO 棧的路徑比較多,所以我們選取塊設備(block device)的路徑來分析。

2. IO 整體架構

鴻蒙系統關于塊設備的 IO 棧路徑整體架構如下圖所示:

整體 IO 流程如下:

上層應用會在用戶態下調用 read / write 接口,這會觸發系統調用(syscall)進入內核態;

系統調用往下調用 VFS 的接口,如 read 則對應 read,write 對應 write;

VFS 這層會根據 fd 對應的 file 結構拿出超級塊的 inode,利用這個 inode 繼續往下調用具體 driver 的 read / write 接口;

在塊設備的場景下,它是利用字符設備的驅動作為它的代理,也就是 driver 下面的 bch。鴻蒙系統的設備驅動中并沒有塊設備的驅動,所以它做了一層 block_proxy,無論是字符設備還是塊設備的 IO 都會經過 bch 驅動。數據所位于的扇區以及偏移量(offset)計算位于這層;

IO 往下走會有一層緩存,叫 bcache。bcache 采用紅黑樹管理這些緩存的數據;

IO 再往下走就是塊設備的驅動,內核沒有通用的塊設備驅動實現,它應該是由不同的廠商來實現的。

3.鴻蒙 IO 流程源碼解讀

讀寫流程大致一樣,我們就看一下鴻蒙的讀數據流程吧。由于函數的源碼比較長,全貼出來也不太好,所以太長的源碼我只將關鍵的部分截出。

3.1 上層應用讀取數據

上層應用調用 read 接口,這個是系統的 POSIX 接口,read 接口原型如下:

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

3.2 VFS

上層應用在用戶態調用 read 接口后會觸發系統調用,這個系統調用在 Kernel 的如下文件中進行注冊:

syscall/fs_syscall.c

對應的系統調用函數為

237 行的 read 調用的是 VFS 這層的 read,VFS 這層的 read 函數實現位于 Nuttx 項目的如下路徑:

fs/vfs/fs_read.c

read函數從 fd (文件描述符)中獲取對應的 file 對象指針,然后在調用 file_read 接口。file_read 也和 read 函數位于同一個文件下。它從 file 對象中獲取了超級塊的 inode 對象,然后使用這個 inode 調用 bch 驅動的 read 函數。

3.3 bch 驅動

bch 驅動是一個字符設備驅動,它被用來當做上層與塊設備驅動的中間層。注冊塊設備驅動時會調用 block_proxy 來做代理轉換,它的實現位于:

fs/driver/fs_blockproxy.c

當打開(open)一個塊設備時,內核會判斷 inode 是否是塊設備類型,如果是則調用 block_proxy 來做轉換處理。 當上層調用 u.i_ops->read 時,它對應的是 bch_read,它的實現位于:

drivers/bch/bchdev_driver.c

bch_read 會接著調用 bchlib_read,這個函數的實現位于:

drivers/bch/bchlib_read.c

它會根據偏移(offset)計算出在哪個扇區進行讀數據,如果要讀取的數據只是某個扇區的一部分,則它會先利用 bchlib_readsector 將這個扇區全部讀出來,然后再把對應的那部分數據拷貝到內存并返回。 bchlib_readsector 的實現位于如下位置:

drivers/bch/bchlib_cache.c

它會先將位于內存的臟數據下刷,等臟數據都下刷完成后才會利用 los_disk_read 把數據從磁盤上讀上來。 los_disk_read 的實現位于 kernel 的如下位置:

fs/vfs/disk/disk.c

這 los_disk_read 這層會有一層緩存,叫 bcache。它會把每次 IO 的扇區緩存到內存中,緩存的組織方式為紅黑樹。它是有大小限制的,不是無限增長,具體大小與內存大小有關。 los_disk_read 在讀數據之前會先從 bcache 緩存中查找有沒有對應的緩存扇區,如果有則直接將這個扇區返回,如果沒有則調用真正塊設備的 read 函數。這個 read 函數在內核中沒有對應的實現,所以它是跟隨每個塊設備的驅動的不同而不同。

整個讀數據流程源碼分析就到這里。

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

4.鴻蒙 IO 棧與 Linux IO 棧的對比

如果有研究過 linux IO 棧的同學應該能體會到鴻蒙的 IO 棧是比較簡單。先來看一下 Linux 的 IO 棧整體架構圖:

所以,我們對比一下鴻蒙系統和 Linux IO 棧的主要區別吧:

鴻蒙沒有 pagecache。所以鴻蒙的系統調用加不加 O_SYNC 應該是一樣的,都是直接下到磁盤。

鴻蒙沒有通用塊層和 IO 調度層。在 Linux 中通用塊層是用來將連續的塊請求組成一個 bio 結構體,便于對接下層的調度管理。調度層的目的則是用來減少 IO 尋址時間,在這層也有多種調度算法可以選擇,如 cfq/deadline/noop 等。我覺得鴻蒙不是沒有這兩層,而是還沒有做,目前只是 IoT 的適用場景。等明年適用于手機的時候再看看,我覺得應該也會做相關的處理,只不過不一定與 Linux 的處理一樣。

鴻蒙的驅動層次不夠完整,需要用字符設備的驅動來代理塊設備的驅動,不知道這是基于什么考慮。

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11320

    瀏覽量

    209835
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2636

    瀏覽量

    66445
  • IO棧
    +關注

    關注

    0

    文章

    2

    瀏覽量

    558
收藏 人收藏

    評論

    相關推薦

    意法半導體展示IO-Link收發器和低邊功率開關的組合應用

    意法半導體推出了一款基于IO-Link的工業標準和設備報警執行器參考設計,最終交貨形式是開箱即用的成品板卡及配套協議和應用軟件。
    的頭像 發表于 12-24 13:35 ?127次閱讀

    電流倒灌揭秘:IO口損壞與系統故障的真相

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

    λ-IO:存儲計算下的IO設計

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

    RoCE與IB對比分析(二):功能應用篇

    在上一篇中,我們對RoCE、IB的協議層級進行了詳細的對比分析,二者本質沒有不同,但基于實際應用的考量,RoCE在開放性、成本方面更勝一籌。本文我們將繼續分析RoCE和IB在擁塞控制、QoS、ECMP三個關鍵功能中的性能表現。
    的頭像 發表于 11-15 14:03 ?326次閱讀
    RoCE與IB<b class='flag-5'>對比分析</b>(二):功能應用篇

    一文解讀Linux 5種IO模型

    Linux里有五種IO模型:阻塞IO、非阻塞IO、多路復用IO、信號驅動式IO和異步
    的頭像 發表于 11-09 11:12 ?347次閱讀
    一文解讀<b class='flag-5'>Linux</b> 5種<b class='flag-5'>IO</b>模型

    華納云監視Linux磁盤IO性能命令:iotop,iostat,vmstat,atop,dstat,ioping

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

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

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

    Linux網絡協議的實現

    網絡協議是操作系統核心的一個重要組成部分,負責管理網絡通信中的數據包處理。在 Linux 操作系統中,網絡協議(Network Stac
    的頭像 發表于 09-10 09:51 ?330次閱讀
    <b class='flag-5'>Linux</b>網絡協議<b class='flag-5'>棧</b>的實現

    初識IO-Link及IO-Link設備軟件協議

    IO-Link概述什么是IO-LinkIO-Link是一種用于工業自動化領域的數字通信協議,最早由西門子提出,現在已經成為了國際標準,旨在實現工業設備和控制系統之間的連接和通信。它允許傳感器、執行器
    的頭像 發表于 07-08 16:41 ?8626次閱讀
    初識<b class='flag-5'>IO</b>-Link及<b class='flag-5'>IO</b>-Link設備軟件協議<b class='flag-5'>棧</b>

    初識IO-Link及IO-Link設備軟件協議

    亞信IO-Link設備軟件協議是基于亞信電子AXM-IOLS IO-Link設備評估板設計的,搭載意法半導體 STM32F469AI微控制器,并在STM32CubeIDE開發環境中進行開發。此
    的頭像 發表于 07-08 13:55 ?2758次閱讀
    初識<b class='flag-5'>IO</b>-Link及<b class='flag-5'>IO</b>-Link設備軟件協議<b class='flag-5'>棧</b>

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

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

    遠程IO與分布式IO的區別

    在工業自動化和控制系統設計中,遠程IO(Input/Output)和分布式IO是兩個重要的概念。它們各自具有獨特的特點和優勢,適用于不同的應用場景。本文將詳細探討遠程IO與分布式
    的頭像 發表于 06-15 15:57 ?2622次閱讀

    堆和的區別和使用注意事項

    堆和是在計算機科學中廣泛使用的兩種數據結構,它們具有不同的用途和特點。堆和的區別涉及到內存分配、訪問方式、數據存儲等方面。在使用堆和時,還需要注意一些細節,以確保程序的正確性和效率。本文將詳細
    的頭像 發表于 01-18 17:24 ?2257次閱讀

    亞信電子推出全新IO-Link設備軟件協議解決方案

    亞信電子提供完整的EtherCAT從站轉IO-Link主站網關和IO-Link設備軟件協議解決方案,使客戶能夠將最新的IO-Link智能傳感器和執行器等設備,輕松地導入EtherCA
    的頭像 發表于 01-17 08:11 ?577次閱讀
    亞信電子推出全新<b class='flag-5'>IO</b>-Link設備軟件協議<b class='flag-5'>棧</b>解決方案

    亞信電子推出全新IO-Link設備軟件協議解決方案

    亞信電子提供完整的EtherCAT從站轉IO-Link主站網關和IO-Link設備軟件協議解決方案,使客戶能夠將最新的IO-Link智能傳感器和執行器等設備,輕松地導入EtherCA
    的頭像 發表于 01-16 11:24 ?598次閱讀
    亞信電子推出全新<b class='flag-5'>IO</b>-Link設備軟件協議<b class='flag-5'>棧</b>解決方案
    主站蜘蛛池模板: 国产乱人视频在线观看| 亚洲天堂999| 国产成人无码一区AV在线观看| 亚洲国产日韩欧美在线a乱码 | va亚洲va天堂va视频在线| 亚洲国产女人aaa毛片在线| 啪啪啪社区| 美女动态图真人后进式| 湖南张丽大战黑人hd视频| 公和熄洗澡三级中文字幕| a久久99精品久久久久久蜜芽| 一个人色导航| 亚洲成人黄色片| 双性被疯狂灌满精NP| 欧美日韩亚洲一区二区三区在线观看| 九九热精品在线观看| 国产午夜视频| 国产精品久久久久久无码专区 | 久久99精国产一区二区三区四区| 国产美女久久久久久久久久久| se01短视频在线观看| 综合亚洲桃色第一影院| 亚洲一区电影在线观看| 亚洲精品乱码久久久久久直播| 熟女人妻水多爽中文字幕| 青柠电影在线看| 女子初尝黑人巨嗷嗷叫| 老头xxx| 久久强奷乱码老熟女| 九九热在线观看视频| 精彩国产萝视频在线| 好想被狂躁A片免费久99| 国产午夜精品理论片久久影视| 国产精品久久久久久无码专区| 国产成人拍精品视频网| 国产国产人免费观看在线视频| 俄罗斯女人Z0Z0极品| 国产99网站| 国产精品成人影院在线观看| 国产成人在线播放| 国产精品久久久久久免费字体|