日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

鴻蒙系統(tǒng)HarmonyOS ? 來源:oschina ? 作者:GongMingWei ? 2020-10-16 10:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

華為的鴻蒙系統(tǒng)開源之后第一個(gè)想看的模塊就是 FS 模塊,想了解一下它的 IO 路徑與 linux 的區(qū)別?,F(xiàn)在鴻蒙開源的倉庫中有兩個(gè)內(nèi)核系統(tǒng),一個(gè)是 liteos_a 系統(tǒng),一個(gè)是 liteos_m 系統(tǒng)。兩者的區(qū)別主要是適應(yīng)的場景不一樣,liteos_a 系統(tǒng)適用于硬件資源更加豐富的場景,比如 CPU 更強(qiáng),內(nèi)存更大;而 liteos_m 系統(tǒng)則適用于 IoT 設(shè)備,相對(duì)來說硬件資源比較弱一些。所以我們就拿 liteos_a 系統(tǒng)來分析一下它的 IO 棧吧,畢竟它應(yīng)對(duì)的場景更加復(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í)覺得好奇怪,啥都沒有,那它的 shell 相關(guān)命令是怎么使用 fs 模塊進(jìn)行讀寫的呢?于是發(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 的倉庫中搜索 Nuttx 發(fā)現(xiàn)的確有這個(gè)倉庫,所以我們需要聯(lián)合兩個(gè)倉庫的代碼一起解讀 IO 棧的源碼。Nuttx 的倉庫地址為:https://gitee.com/openharmony/third_party_NuttX。

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

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

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

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

整體 IO 流程如下:

上層應(yīng)用會(huì)在用戶態(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è)備的場景下,它是利用字符設(shè)備的驅(qū)動(dòng)作為它的代理,也就是 driver 下面的 bch。鴻蒙系統(tǒng)的設(shè)備驅(qū)動(dòng)中并沒有塊設(shè)備的驅(qū)動(dòng),所以它做了一層 block_proxy,無論是字符設(shè)備還是塊設(shè)備的 IO 都會(huì)經(jīng)過 bch 驅(qū)動(dòng)。數(shù)據(jù)所位于的扇區(qū)以及偏移量(offset)計(jì)算位于這層;

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

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

3.鴻蒙 IO 流程源碼解讀

讀寫流程大致一樣,我們就看一下鴻蒙的讀數(shù)據(jù)流程吧。由于函數(shù)的源碼比較長,全貼出來也不太好,所以太長的源碼我只將關(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)用在用戶態(tài)調(diào)用 read 接口后會(huì)觸發(fā)系統(tǒng)調(diào)用,這個(gè)系統(tǒng)調(diào)用在 Kernel 的如下文件中進(jìn)行注冊:

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),它被用來當(dāng)做上層與塊設(shè)備驅(qū)動(dòng)的中間層。注冊塊設(shè)備驅(qū)動(dòng)時(shí)會(huì)調(diào)用 block_proxy 來做代理轉(zhuǎn)換,它的實(shí)現(xiàn)位于:

fs/driver/fs_blockproxy.c

當(dāng)打開(open)一個(gè)塊設(shè)備時(shí),內(nèi)核會(huì)判斷 inode 是否是塊設(shè)備類型,如果是則調(diào)用 block_proxy 來做轉(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ū)全部讀出來,然后再把對(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ù)從磁盤上讀上來。 los_disk_read 的實(shí)現(xiàn)位于 kernel 的如下位置:

fs/vfs/disk/disk.c

這 los_disk_read 這層會(huì)有一層緩存,叫 bcache。它會(huì)把每次 IO 的扇區(qū)緩存到內(nèi)存中,緩存的組織方式為紅黑樹。它是有大小限制的,不是無限增長,具體大小與內(nèi)存大小有關(guān)。 los_disk_read 在讀數(shù)據(jù)之前會(huì)先從 bcache 緩存中查找有沒有對(duì)應(yīng)的緩存扇區(qū),如果有則直接將這個(gè)扇區(qū)返回,如果沒有則調(diào)用真正塊設(shè)備的 read 函數(shù)。這個(gè) read 函數(shù)在內(nè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ì)比

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

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

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

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

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

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

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

    關(guān)注

    88

    文章

    11822

    瀏覽量

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

    關(guān)注

    183

    文章

    2642

    瀏覽量

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

    關(guān)注

    0

    文章

    2

    瀏覽量

    661
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    IDT Serial RapidIO 交換機(jī)特性對(duì)比分析

    IDT Serial RapidIO 交換機(jī)特性對(duì)比分析 在電子工程師的硬件設(shè)計(jì)工作中,選擇合適的交換機(jī)對(duì)于系統(tǒng)性能至關(guān)重要。Integrated Device Technology(IDT
    的頭像 發(fā)表于 04-14 10:30 ?137次閱讀

    如何基于現(xiàn)場需求選配PLC本地/遠(yuǎn)程IO?

    很多剛接觸工控的朋友,常常會(huì)被“本地IO”和“遠(yuǎn)程IO”這兩個(gè)概念搞混。 它們到底有什么區(qū)別?在實(shí)際項(xiàng)目中又該如何選擇?今天我們就來一次性說清楚。 什么是IO? 在深入討論之前,我們先簡單回顧一下
    的頭像 發(fā)表于 03-30 17:15 ?510次閱讀
    如何基于現(xiàn)場需求選配PLC本地/遠(yuǎn)程<b class='flag-5'>IO</b>?

    三格電子一體式io和分體式io的區(qū)別#

    IO
    jf_68793483
    發(fā)布于 :2026年02月27日 14:15:48

    IO控制模塊修改波特率操作方法#IO擴(kuò)展模塊 #分布式IO模塊 #遠(yuǎn)程IO模塊 #碩博電子

    IO模塊
    長沙碩博電子科技股份有限公司
    發(fā)布于 :2026年01月08日 09:46:47

    Stack到底用來干嘛的呢?

    我們在函數(shù)的局部變量、數(shù)組這些不能超過1K(含嵌套的函數(shù)),否則程序就會(huì)崩潰進(jìn)入hardfaul。 除了這些局部變量以外,還有一些實(shí)時(shí)操作系統(tǒng)的現(xiàn)場保護(hù)、返回地址都是存儲(chǔ)在里面。 還有一點(diǎn)題外話,就是的增長方向是從高地址到低
    發(fā)表于 12-01 08:04

    無源探頭與高壓探頭技術(shù)對(duì)比分析

    本文對(duì)比分析了無源探頭與高壓探頭的技術(shù)原理、性能參數(shù)及應(yīng)用場景,為選擇合適探頭提供參考。
    的頭像 發(fā)表于 11-30 15:47 ?831次閱讀

    全球前四!京東云云海AI存儲(chǔ)躋身IO500高性能存儲(chǔ)榜單

    近日,在最新公布的 IO500 排行榜中,京東云云海 AI 存儲(chǔ)基于通用 NVMe 盤存儲(chǔ)服務(wù)器,結(jié)合全自研軟件體系與深度調(diào)優(yōu),成功躋身 IO500 生產(chǎn)榜單全球前四、國產(chǎn)自研第一。相較傳統(tǒng)超算
    的頭像 發(fā)表于 11-27 14:51 ?472次閱讀
    全球前四!京東云云海AI存儲(chǔ)躋身<b class='flag-5'>IO</b>500高性能存儲(chǔ)榜單

    遠(yuǎn)程IO不就是分布式IO?其實(shí)很多人都理解錯(cuò)了

    一、引言 在工業(yè)自動(dòng)化和控制系統(tǒng)中,分布式io和遠(yuǎn)程io作為兩種常見的IO技術(shù),各自具有獨(dú)特的特點(diǎn)和優(yōu)勢,以下對(duì)遠(yuǎn)程io和分布式
    的頭像 發(fā)表于 09-28 11:06 ?924次閱讀
    遠(yuǎn)程<b class='flag-5'>IO</b>不就是分布式<b class='flag-5'>IO</b>?其實(shí)很多人都理解錯(cuò)了

    自動(dòng)駕駛中常提的“全”是個(gè)啥?有必要“全”嗎?

    [首發(fā)于智駕最前沿微信公眾號(hào)]隨著自動(dòng)駕駛技術(shù)落地,越來越多車企公布了自己的自動(dòng)駕駛方案,在很多車企的宣傳中,會(huì)使用“全自研”的說法來證明自己的實(shí)力。所謂“全”,字面意思是全套技術(shù)的自主開發(fā)
    的頭像 發(fā)表于 08-27 09:43 ?1441次閱讀
    自動(dòng)駕駛中常提的“全<b class='flag-5'>棧</b>”是個(gè)啥?有必要“全<b class='flag-5'>棧</b>”嗎?

    GraniStudio:IO初始化以及IO資源配置例程

    1.文件運(yùn)行 導(dǎo)入工程 雙擊運(yùn)行桌面GraniStudio.exe。 通過引導(dǎo)界面導(dǎo)入IO初始化以及IO資源配置例程,點(diǎn)擊導(dǎo)入按鈕。 打開IO初始化以及IO資源配置例程所在路徑,選中
    的頭像 發(fā)表于 08-22 17:34 ?1093次閱讀
    GraniStudio:<b class='flag-5'>IO</b>初始化以及<b class='flag-5'>IO</b>資源配置例程

    GraniStudio:IO寫入例程

    1.文件運(yùn)行 導(dǎo)入工程 雙擊運(yùn)行桌面GraniStudio.exe。 通過引導(dǎo)界面導(dǎo)入IO寫入例程,點(diǎn)擊導(dǎo)入按鈕。 打開IO寫入例程所在路徑,選中IO寫入.gsp文件,點(diǎn)擊打開,完成導(dǎo)入。 2.功能
    的頭像 發(fā)表于 08-22 16:47 ?898次閱讀
    GraniStudio:<b class='flag-5'>IO</b>寫入例程

    干貨分享 | TSMaster IO功能使用指南—基于同星帶IO設(shè)備的配置與操作步驟

    IO模塊是一種用于連接計(jì)算機(jī)系統(tǒng)或控制系統(tǒng)與外部設(shè)備之間的接口模塊。數(shù)字IO模塊用于處理二進(jìn)制信號(hào)的輸入和輸出,它們可以接收和發(fā)送數(shù)字信號(hào),通常用于控制邏輯開關(guān)、觸發(fā)器和其他數(shù)字設(shè)備。
    的頭像 發(fā)表于 08-09 20:04 ?1230次閱讀
    干貨分享 | TSMaster <b class='flag-5'>IO</b>功能使用指南—基于同星帶<b class='flag-5'>IO</b>設(shè)備的配置與操作步驟

    Analog Devices / Maxim Integrated MAXREFDES177 IO-Link通用模擬IO特性/框圖

    Analog Devices MAXREFDES177 IO-Link通用模擬IO是一款完備的IO-Link?通用模擬輸入-輸出 (IO) 參考設(shè)計(jì),采用內(nèi)置集成保護(hù)功能的MAX225
    的頭像 發(fā)表于 06-30 09:30 ?959次閱讀
    Analog Devices / Maxim Integrated MAXREFDES177 <b class='flag-5'>IO</b>-Link通用模擬<b class='flag-5'>IO</b>特性/框圖

    國內(nèi)外電機(jī)結(jié)構(gòu) 工藝對(duì)比分析

    純分享帖,需要者可點(diǎn)擊附件免費(fèi)獲取完整資料~~~*附件:國內(nèi)外電機(jī)結(jié)構(gòu) 工藝對(duì)比分析.pdf【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請第一時(shí)間告知,刪除內(nèi)容!
    發(fā)表于 05-29 14:06

    主流汽車電子SoC芯片對(duì)比分析

    主流汽車電子SoC芯片對(duì)比分析 隨著汽車智能化、電動(dòng)化趨勢加速,系統(tǒng)級(jí)芯片(SoC)已成為汽車電子核心硬件。本文從技術(shù)參數(shù)、市場定位、應(yīng)用場景及國產(chǎn)化進(jìn)程等維度,對(duì)主流汽車電子SoC芯片進(jìn)行對(duì)比分析
    的頭像 發(fā)表于 05-23 15:33 ?6703次閱讀
    焉耆| 鹿泉市| 昌乐县| 安义县| 吉安县| 九江市| 彩票| 四会市| 朝阳市| 习水县| 永清县| 武隆县| 昌吉市| 乌兰浩特市| 新田县| 平昌县| 河池市| 新化县| 龙南县| 新余市| 蒙城县| 于都县| 安徽省| 绥化市| 砀山县| 长治市| 玛纳斯县| 和硕县| 咸丰县| 云林县| 南溪县| 乌兰浩特市| 绥中县| 淄博市| 惠州市| 黄陵县| 沿河| 涿鹿县| 佳木斯市| 牟定县| 永善县|