chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

Linux里面最大的套路是“一切都是文件”?

Linux閱碼場(chǎng) ? 來(lái)源:Linux閱碼場(chǎng) ? 作者:宋寶華 ? 2021-04-04 17:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

當(dāng)一個(gè)女生讓你替她抓100只螢火蟲(chóng),她一定不是為了折磨你,而是因?yàn)樗龕?ài)上了你。當(dāng)你們之間經(jīng)歷了無(wú)數(shù)的恩恩怨怨和彼此傷害,她再次讓你替她抓100只螢火蟲(chóng),那一定是因?yàn)樗€愛(ài)著你。

為什么?因?yàn)檫@就是套路,是在下偶爾瞟一眼古裝肥皂劇總結(jié)出來(lái)的套路。

Linux里面最大的套路,就是“一切都是文件”。愛(ài)一個(gè)人,就為她捉螢火蟲(chóng);做一件事,就讓它成為一個(gè)“文件”。

為什么自古深情留不住,唯有“文件”得人心呢?因?yàn)槲募谟脩魬B(tài)最直觀的形式是隨著一次open,獲得一個(gè)fd,有了這個(gè)fd,長(zhǎng)城內(nèi)外,你基本可以為所欲為:

在本進(jìn)程內(nèi),fd的最直觀操作是open、close、mmap、ioctl、poll這些。mmap讓你具備把fd透射到內(nèi)存的能力,所以你可以通過(guò)指針訪問(wèn)文件的內(nèi)容。再者,這個(gè)mmap,如果底層透射的是framebuffer、V4L2、DRM等,則讓我們具備了從用戶態(tài)操作底層顯存、多媒體數(shù)據(jù)等的能力;比如,無(wú)論是V4L2還是DRM,都支持把底層的dma_buf導(dǎo)出為fd。poll則提供給用戶阻塞等待某事件發(fā)生的能力。至于ioctl,就更加不用說(shuō)了,你可以透過(guò)ioctl靈活地為fd添加控制命令。

在跨進(jìn)程的情況下,Linux支持fd的跨進(jìn)程socket傳輸,從而可以實(shí)現(xiàn)共享內(nèi)存、dma_buf跨進(jìn)程共享等。比如一個(gè)進(jìn)程可以通過(guò)send_fd可以把fd發(fā)送出去:

c77a48b4-8cdd-11eb-8b86-12bb97331649.png

而另外一個(gè)進(jìn)程可以通過(guò)recv_fd把fd收過(guò)來(lái):

c7fd6e10-8cdd-11eb-8b86-12bb97331649.png

這種fd在長(zhǎng)城內(nèi)外可以互訪,fd最終可以指向dma_buf同時(shí)可以被mmap,而dma_buf又最終可以被顯卡、顯示控制器、video decoder/encoder等設(shè)備訪問(wèn)的能力,讓fd打通了設(shè)備、CPU和跨進(jìn)程的障礙,從此可以橫著走。

c8a1bc0e-8cdd-11eb-8b86-12bb97331649.png

我們?cè)凇端螌毴A:世上最好的共享內(nèi)存(Linux共享內(nèi)存最透徹的一篇)》一文中已經(jīng)詳細(xì)闡述過(guò)這個(gè)過(guò)程,這里我們就不再贅述了。本文的重點(diǎn)在于匿名inode。

02

inode源頭file活水

我們把文件想象成一個(gè)object,那么inode描述的是本源,和最終的object一一對(duì)應(yīng);dentry是inode的一個(gè)路徑馬甲,比如我們可以通過(guò)"ln"命令為同一個(gè)inode創(chuàng)建很多的硬鏈接馬甲;而file則是活水,進(jìn)程對(duì)object的一次“open”,獲得一個(gè)file,導(dǎo)致用戶態(tài)得到一個(gè)"fd"的句柄來(lái)操作這個(gè)object。

經(jīng)典的inode、dentry、file誰(shuí)都不缺席的模型是這樣的:

c923ab6a-8cdd-11eb-8b86-12bb97331649.png

上圖中,我們有一個(gè)inode,這個(gè)inode有2個(gè)dentry,進(jìn)程A、B open的是第一個(gè)dentry;而進(jìn)程C、D open的是第二個(gè)dentry。變了的是file和fd,不變的是inode,中間的dentry馬甲沒(méi)那么重要。

但是在inode、dentry、file這個(gè)經(jīng)典鐵三角中,從來(lái)都是可以有一個(gè)缺席者的,那就是dentry,因?yàn)?,有時(shí)候用戶態(tài)想獲得長(zhǎng)城內(nèi)外行走的便利,但是卻不想這個(gè)inode在文件系統(tǒng)里面留下一個(gè)路徑的痕跡。簡(jiǎn)單來(lái)說(shuō),我希望有個(gè)fd,但是這個(gè)fd,你在從"/"往下面搜索的任何一條路徑下,你都找不到它,它根本在根文件系統(tǒng)以下不存在路徑,它是無(wú)名氏,它沒(méi)有馬甲,它是個(gè)傳說(shuō)。

比如,近期名震江湖的劍客usefaultfd允許我們?cè)谟脩艨臻g處理page fault,我們是通過(guò)userfaultfd這個(gè)系統(tǒng)調(diào)用先獲得一個(gè)fd,之后就可以對(duì)它進(jìn)行各種ioctl了:

c955e08a-8cdd-11eb-8b86-12bb97331649.png

我們透過(guò)userfaultfd系統(tǒng)獲得了一個(gè)fd,它在/xxx/yyy/zzz這樣的文件系統(tǒng)下沒(méi)有路徑。這種情況下的fd,對(duì)應(yīng)著的是一個(gè)沒(méi)有名字的匿名inode,你顯然沒(méi)有辦法像fd = open ("xxx", ..)那樣來(lái)得到匿名inode的fd,因?yàn)?xxx"是一個(gè)路徑,而匿名inode沒(méi)有xxx,所以你是直接透過(guò)syscall userfaultfd這樣的系統(tǒng)調(diào)用,來(lái)獲得anon_inode在你的進(jìn)程里面對(duì)應(yīng)的fd的:

c992adda-8cdd-11eb-8b86-12bb97331649.png

人過(guò)留名,雁過(guò)留聲;殺人者,打虎武松也。但是anon inode不吃這一套,它是一個(gè)絕頂?shù)妮p功高手,它給與的,是透過(guò)fd長(zhǎng)城內(nèi)外行走的能力,但是,在文件系統(tǒng)里面卻從未來(lái)過(guò)。這是用戶真實(shí)的需求,如果這種需求一定要透過(guò)一個(gè)dentry的open才能實(shí)現(xiàn),這未免有點(diǎn)畫(huà)蛇添足了。

03

匿名inode的內(nèi)核實(shí)例

我們接下來(lái)可以隨便打開(kāi)個(gè)anon inode的實(shí)例來(lái)看看它是怎么工作的了。首先userfaultd是一個(gè)系統(tǒng)調(diào)用:

c9af1254-8cdd-11eb-8b86-12bb97331649.png

這個(gè)代碼里面比較核心的是就是,它通過(guò):

anon_inode_getfd_secure()

生成一個(gè)匿名inode,并獲得一個(gè)句柄fd。重點(diǎn)別忘記了,這種“文件”也是可以有file_operations的,比如上面anon_inode_getfd_secure()參數(shù)中的userfaultfd_fops:

ca50fb3c-8cdd-11eb-8b86-12bb97331649.png

這樣,我們就可以在file_operations的ioctl,poll,read等callback里面實(shí)現(xiàn)自己特別的“文件”邏輯,這是我們自由發(fā)揮的舞臺(tái)。

說(shuō)起anon_inode_getfd_secure(),它再往底層走一級(jí)是__anon_inode_getfd():

caaeae4e-8cdd-11eb-8b86-12bb97331649.png

進(jìn)而再走一級(jí)是__anon_inode_getfile():

cad2b118-8cdd-11eb-8b86-12bb97331649.png

所以本質(zhì)上,是先造一個(gè)anon_inode,然后再在這個(gè)anon_inode上面造一個(gè)pseudo的file,最后通過(guò)fd_install(fd, file),把fd和file纏在一起。再次強(qiáng)調(diào),用戶有了這個(gè)fd就可以為所欲為;而內(nèi)核本身,則是通過(guò)file_operations的不同實(shí)現(xiàn)來(lái)為所欲為的。

anon_inode之上添加一個(gè)系統(tǒng)調(diào)用,造一種特殊的fd,讓用戶去poll,去ioctl,把想象空間拉大了。這種實(shí)現(xiàn)方法,如此拉風(fēng)靈活,以至于它本身也成為了一種套路。比如內(nèi)核里面fs目錄下的:

cb1f06a8-8cdd-11eb-8b86-12bb97331649.png

eventfd,eventpoll,fscontext,io_uring,fanotify,inotify,signalfd,timerfd.......

正所謂, 待到秋來(lái)九月八,我花開(kāi)后百花殺。沖天香陣透長(zhǎng)安,滿城盡帶黃金甲。文件,哪怕最終是匿名的,都以沖天的香陣,彌漫整個(gè)Linux的世界。

04

用戶使用匿名inode

到了要說(shuō)再見(jiàn)的時(shí)刻了,用戶可見(jiàn)的就是fd,通過(guò)fd來(lái)使用匿名inode。下面我們來(lái)制造一個(gè)page fault的例子,讓用戶態(tài)來(lái)處理它,這個(gè)例子直接簡(jiǎn)化自u(píng)serfaultfd的man page。我們?cè)谥骶€程中,通過(guò)mmap申請(qǐng)一頁(yè)內(nèi)存,然后通過(guò)userfaultfd的ioctl告訴內(nèi)核這頁(yè)的開(kāi)始地址和長(zhǎng)度,以及通過(guò)UFFDIO_REGISTER告訴內(nèi)核這頁(yè)的page fault想用戶空間處理:

cb9e5016-8cdd-11eb-8b86-12bb97331649.png

然后我們?cè)趐thread_create()創(chuàng)建的fault_handler_thread線程中,poll userfaultfd等待事件,之后把一頁(yè)全是0x66的內(nèi)容拷貝到page fault發(fā)生的那一頁(yè):

cbcb0f52-8cdd-11eb-8b86-12bb97331649.png

我們運(yùn)行這個(gè)程序得到的輸出如下:

cbf2495a-8cdd-11eb-8b86-12bb97331649.png

我們主線程在執(zhí)行addr[0]=0x5A5A5A5A的時(shí)候,觸發(fā)了page fault。在fault線程里面,page fault發(fā)生后,poll阻塞返回,之后用戶通過(guò)read()讀到了一個(gè)uffd_msg的結(jié)構(gòu)體,里面的成員包含了page fault的地址。之后,我們通過(guò)UFFDIO_COPY這個(gè)ioctl,把內(nèi)容為0x66的頁(yè)面拷貝給page fault的頁(yè)面。

所以,最終主線程在執(zhí)行printf打印的時(shí)候,addr[0]里面讀到了5A5A5A5A,剩下的addr[1]里面讀到了66666666??吹絧age fault由用戶態(tài)靈活這么靈活自如地處理,我的小伙伴們都嚇尿了。

可以看出來(lái):

poll()在等什么,完全被定制化了;

read()能讀什么,完全被定制化了;

ioctl()能控制什么,完全被定制化了。

我們通過(guò)“文件”這個(gè)不變的“靜”,制造了poll、read、ioctl的靈動(dòng)自如。兵法有云,以不變應(yīng)萬(wàn)變,以萬(wàn)變應(yīng)不變。

原文標(biāo)題:宋寶華:論一切都是文件之匿名inode

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

責(zé)任編輯:haq

聲明:本文內(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)注

    88

    文章

    11631

    瀏覽量

    218052
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    587

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    飛凌嵌入式ElfBoard-Linux系統(tǒng)中的文件分類

    從本質(zhì)上講,Linux系統(tǒng)就是由文件組成的,一切文件linux系統(tǒng)設(shè)計(jì)的核心理念,接下來(lái)介紹一下文件
    發(fā)表于 12-09 08:59

    別再裝系統(tǒng)了!Linux 鏡像到底是什么?篇講到你懷疑人生

    多小、環(huán)境多復(fù)雜,如何快速安裝、部署和維護(hù) Linux 系統(tǒng),都是開(kāi)發(fā)者和運(yùn)維人員必須掌握的核心技能。 這時(shí),“Linux 鏡像文件”就顯得尤為重要。它就像
    的頭像 發(fā)表于 12-03 16:12 ?472次閱讀
    別再裝系統(tǒng)了!<b class='flag-5'>Linux</b> 鏡像到底是什么?<b class='flag-5'>一</b>篇講到你懷疑人生

    存儲(chǔ)失憶癥的AI守護(hù)官

    未來(lái)的數(shù)據(jù)失火可以防患于未然,這一切都有賴于這個(gè)叫AI的記憶守護(hù)官
    的頭像 發(fā)表于 11-25 17:12 ?6358次閱讀
    存儲(chǔ)失憶癥的AI守護(hù)官

    Linux新手通關(guān)!5分鐘掌握文件/目錄管理,告別“找不到北”

    文件夾時(shí)明明點(diǎn)了操作,打開(kāi)卻空無(wú)物…?其實(shí)?Linux?的文件?/?目錄管理有?“固定套路”,學(xué)會(huì)?8?個(gè)核心命令,再記住?3?個(gè)避坑技巧
    的頭像 發(fā)表于 11-17 10:42 ?187次閱讀
    <b class='flag-5'>Linux</b>新手通關(guān)!5分鐘掌握<b class='flag-5'>文件</b>/目錄管理,告別“找不到北”

    新手小白必看!關(guān)于A100云主機(jī)租用,你想知道的一切都在這!

    “我想租臺(tái)A100云主機(jī)來(lái)跑我的模型,但完全不知道從何下手?!薄@是我們聽(tīng)到最多的來(lái)自AI新手的聲音。A100,這個(gè)聽(tīng)起來(lái)就“高大上”的名詞,背后其實(shí)是套清晰、可操作的流程。今天,我們就用
    的頭像 發(fā)表于 10-31 19:24 ?1112次閱讀
    新手小白必看!關(guān)于A100云主機(jī)租用,你想知道的<b class='flag-5'>一切都</b>在這!

    硬件工程師:一切都要從誤判說(shuō)起

    行業(yè)資訊
    揚(yáng)興科技
    發(fā)布于 :2025年09月09日 18:06:12

    Linux三大主流文件系統(tǒng)解析

    還在為選擇哪個(gè)文件系統(tǒng)而糾結(jié)?作為名摸爬滾打多年的運(yùn)維老鳥(niǎo),我將用最接地氣的方式,帶你徹底搞懂 Linux 三大主流文件系統(tǒng)的奧秘。
    的頭像 發(fā)表于 08-05 17:37 ?1075次閱讀

    Linux系統(tǒng)目錄結(jié)構(gòu)全面剖析

    Linux文件系統(tǒng)采用層次化的目錄結(jié)構(gòu),這種設(shè)計(jì)遵循了Unix哲學(xué)中的"一切文件"原則。理解Linux目錄層次架構(gòu)對(duì)于系統(tǒng)管理員、運(yùn)維工程
    的頭像 發(fā)表于 07-21 17:33 ?611次閱讀

    CYUSB4347供電的USB集線器存在個(gè)奇怪的問(wèn)題,求解答

    種場(chǎng)景: PC 就緒,無(wú)需客戶端設(shè)備即可熱插拔集線器--> 一切都很好,永遠(yuǎn) PC 就緒,熱插拔擴(kuò)展了客戶端設(shè)備的集線器--> 一切都很好,永遠(yuǎn)都很好。 電腦啟動(dòng)時(shí)已經(jīng)
    發(fā)表于 05-28 07:44

    Linux主要的性能有哪些?

    ? 什么是Linux? ? Linux套自由傳播的類Unix操作系統(tǒng),是個(gè)基于posix和unix的多用戶、多任務(wù)、支持多線程和多cpu的操作系統(tǒng)。它的基本思想有兩點(diǎn),
    的頭像 發(fā)表于 04-30 18:09 ?495次閱讀
    <b class='flag-5'>Linux</b>主要的性能有哪些?

    從零開(kāi)始馴服Linux):ZYNQ-Linux啟動(dòng)文件構(gòu)建全解析

    本帖最后由 jf_85110202 于 2025-3-20 17:42 編輯 從零開(kāi)始馴服Linux):ZYNQ-Linux啟動(dòng)文件構(gòu)建全解析 ZYNQ系列芯片集成了ARM
    發(fā)表于 03-20 16:48

    云存儲(chǔ)中控電腦,云存儲(chǔ)中控電腦如何實(shí)現(xiàn)文件同步?

    煩惱,一切都變得如此簡(jiǎn)單和高效。今天小編給大家分享云存儲(chǔ)中控電腦如何實(shí)現(xiàn)文件同步。 ? ?云存儲(chǔ)中控電腦實(shí)現(xiàn)文件同步的步驟如下: ? ?1.選擇云存儲(chǔ)服務(wù):首先,選擇個(gè)適合的云存儲(chǔ)服
    的頭像 發(fā)表于 02-10 11:19 ?933次閱讀
    云存儲(chǔ)中控電腦,云存儲(chǔ)中控電腦如何實(shí)現(xiàn)<b class='flag-5'>文件</b>同步?

    CES 2025 “AI+一切”成為關(guān)鍵趨勢(shì)

    一年一度的全球最大科技界盛會(huì) 2025 CES(國(guó)際消費(fèi)電子展)以“Dive in”為主題,強(qiáng)調(diào)人類與創(chuàng)新技術(shù)的結(jié)合,探索如何“潛入”未來(lái),吸引了來(lái)自全球的4500多家企業(yè)參加,其中有1/3左右
    的頭像 發(fā)表于 01-15 10:32 ?907次閱讀

    DAC7564修改成4通輸出的時(shí)候就沒(méi)有反應(yīng),為什么?

    基準(zhǔn)輸出2.497V看著一切都是正常,但是我修改成4通輸出的時(shí)候 就沒(méi)有反應(yīng),檢查基準(zhǔn)輸出 為2.667V通道也沒(méi)有了輸出,是不是就是壞了?還有疑問(wèn)項(xiàng)目中需要用到5片(20通道模擬電壓輸出) 可否將所有的REF腳接在起, 防
    發(fā)表于 01-01 07:13

    用DAC39J84EVM做個(gè)任意波形發(fā)生器,給80M方波的數(shù)據(jù)用示波器看到的波形占空比是相反的?為什么?

    試圖用DAC39J84EVM做個(gè)任意波形發(fā)生器,在產(chǎn)生方波的時(shí)候出現(xiàn)了問(wèn)題。 當(dāng)我給30M方波數(shù)據(jù)的時(shí)候,一切都很正常,但是給80M方波的數(shù)據(jù)的時(shí)候,用示波器看到的波形占空比是相反的,我給的25
    發(fā)表于 12-30 07:55