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

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

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

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

BPF為內(nèi)核編程提供了一個新的參考模型

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Linux閱碼場 ? 2022-10-19 11:27 ? 次閱讀

無論好壞,C語言已經(jīng)是內(nèi)核開發(fā)領(lǐng)域的通用語言了。Linux 內(nèi)核的核心邏輯完全是用 C 語言編寫的(加上一點(diǎn)匯編),它的驅(qū)動程序和 module 也是如此。雖然 C 語言因其強(qiáng)大而簡單的語義而受到贊譽(yù),但它是一種古老的語言,缺乏現(xiàn)代語言(如 Rust)中的許多特性。另一方面,BPF 子系統(tǒng)也提供了一個編程環(huán)境,工程師能夠編寫可以在內(nèi)核空間安全運(yùn)行的程序。在愛爾蘭都柏林舉行的 2022 年 Linux Plumbers Conference 上,Alexei Starovoitov 概述了 BPF 多年來的發(fā)展,為內(nèi)核編程提供了一個新的參考模型。

BPF的使命

Starovoitov 首先描述了他對 BPF 的 "mission statement, 使命宣言":"創(chuàng)新、并啟發(fā)大家創(chuàng)新"。內(nèi)核中的編程歷來是在兩種情況下進(jìn)行的:

core kernel 開發(fā),包括主要的核心子系統(tǒng),如內(nèi)存管理、調(diào)度器、read-copy-update,等等。

kernel-module 開發(fā),指的是構(gòu)建那些不被編譯到 main kernel image 里的內(nèi)容,由 module loader 在后續(xù)加載。例如,驅(qū)動程序被寫成一些內(nèi)核 module,也有其他功能是這么做的,如文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議等等。

這是內(nèi)核在很長一段時間內(nèi)的狀態(tài),直到 3.15 版的內(nèi)核中加入了最早版本的 extended BPF(eBPF)虛擬機(jī)。有了它之后,BPF program 可以用一個受到嚴(yán)格限制的 C 語言來編寫,并被編譯成 BPF 字節(jié)碼,這將允許用戶編寫的代碼可以經(jīng)過驗(yàn)證確保安全,然后再在內(nèi)核空間運(yùn)行。

從那時起,BPF 在代碼的規(guī)模、用戶及貢獻(xiàn)者社區(qū)的規(guī)模方面都穩(wěn)步增長。根據(jù) Starovoitov 的說法,BPF 郵件列表上每天都會收到 50-70 條信息,每月大約收到 2000 封郵件。平均每月里活躍貢獻(xiàn)的 BPF 貢獻(xiàn)者的數(shù)量也在同步增長,截至 2022 年 9 月,已達(dá)到約 140 人。目前來說,對 BPF 子系統(tǒng)的大部分貢獻(xiàn)都不是來自 Meta BPF 小組了。

BPF編程環(huán)境

雖然大多數(shù) BPF 程序是用 C 語言編寫的,并用 LLVM Clang 編譯器編譯,但 BPF program 只是二進(jìn)制 BPF 字節(jié)碼對象文件,并未規(guī)定要用某種特定的語言來寫。比如說,BPF 程序可以使用 Aya 來采用 Rust 編寫,甚至可以直接用 BPF 匯編語言編寫。也就是說,C是 BPF 程序的典型(canonical)編程語言;Starovoitov 的演講繼續(xù)概述了 BPF program 開發(fā)中 C 編程環(huán)境是如何演進(jìn)的。

這個新的編程環(huán)境混合使用了 C 語言擴(kuò)展以及運(yùn)行時環(huán)境的組合實(shí)現(xiàn)的,這個運(yùn)行時環(huán)境包含了 Clang、用戶空間的 BPF 加載器庫(libbpf)和內(nèi)核中的 BPF 子系統(tǒng)。要想創(chuàng)建一個 BPF 程序,用戶只要用 C 語言寫一個程序,由 Clang 的 backend 實(shí)現(xiàn)來轉(zhuǎn)換成 BPF 指令。在運(yùn)行程序時,libbpf 將 BPF 程序加載到內(nèi)存中,對程序進(jìn)行重定位以使其可以跨平臺以及不同的內(nèi)核版本從而具備良好的可移植性,然后調(diào)用 kernel 來加載程序。最后在內(nèi)核中,verifier 會采用靜態(tài)方式驗(yàn)證該程序是否可以安全運(yùn)行,然后啟用之。

然而,BPF 的編程環(huán)境并不是一上來就這么豐富的。在 BPF 的早期,程序被要求使用 Starovoitov 所說的 "restricted C"。BPF 程序中的所有函數(shù)都必須完全是 inline 的,loop 循環(huán)、靜態(tài)變量和全局變量以及內(nèi)存分配都是不允許的。也沒有類型信息(type information),所以 BPF 程序只能接收單一的、固定的 input context,用于 tracing 以及 network-filtering 相關(guān)功能。

盡管在這樣一個高度限制性的環(huán)境中編寫 BPF 程序也是很有用的,但很明顯, BPF 所支持的使用場景還可以得到很大的擴(kuò)展。其中一個擴(kuò)展就是允許在 BPF 程序中使用靜態(tài)函數(shù)。這樣做需要使用 libbpf 在程序加載時對內(nèi)核 BPF 程序進(jìn)行重定位。經(jīng)過多年的設(shè)計和嘗試,最終也增加了對有限循環(huán)的支持,此外也支持了 iterator。

Extending the programming environment past full C

雖然這些使得 BPF 更接近于完整的 C 語言了,但最終可以看到,BPF 程序需要的一些功能甚至在完整的 C 語言標(biāo)準(zhǔn)中都沒有。于是 BPF 社區(qū)開始擴(kuò)展 BPF 編程環(huán)境,從而包括一些傳統(tǒng) C 語言沒有的新特性。其中一個擴(kuò)展功能就是 "一次編譯-到處運(yùn)行"(CO-RE, Compile Once - Run Everywhere)。

CO-RE 使 BPF 程序可以在不同的內(nèi)核版本和平臺上都可以運(yùn)行。在 BPF 程序中,訪問內(nèi)核數(shù)據(jù)結(jié)構(gòu)是很常見的行為。然而,內(nèi)核沒有為 struct layer 確保 ABI 不變,因此,如果內(nèi)核結(jié)構(gòu)在未來的版本或不同的 config 下發(fā)生了變化,在固定偏移的地方對內(nèi)核結(jié)構(gòu)進(jìn)行讀取的 BPF 程序可能就會讀到錯誤的值。CO-RE 通過利用運(yùn)行中的內(nèi)核中的 BPF 類型格式(BTF)數(shù)據(jù)來解決這個問題。在加載一個程序時,libbpf 對所有的 struct 的訪問都會進(jìn)行重定位,以便根據(jù)當(dāng)前運(yùn)行的內(nèi)核的 BTF 信息讓被訪問的字段的偏移量匹配上。

Starovoitov 還描述了 BPF 編程環(huán)境的其他一些有趣的新增功能。其中一個是 kptrs,它允許將內(nèi)核內(nèi)存的指針存儲在 BPF map 中。另一個功能是允許程序在加載時訪問內(nèi)核 config 參數(shù)。內(nèi)核 module 只能使用編譯時設(shè)置的 config 值,但 BPF 程序在加載時可以根據(jù)當(dāng)前內(nèi)核的配置來決定自己的行為。還有一個特點(diǎn)是 "type tags",可以讓程序能對變量進(jìn)行 annotation,從而描述它們的使用方式。例如,kptrs 可以用 __kptr 和 __kptr_ref type tags 來進(jìn)行標(biāo)注,從而表明它們分別是 unreferenced 或者 referenced kptr。當(dāng)然指針也可以用 __user 或 __percpu 標(biāo)準(zhǔn),來告訴編譯器和 verifier 這個指針分別指向用戶內(nèi)存或 per-CPU 內(nèi)存。

Plans for the future

目前正在設(shè)計和實(shí)現(xiàn)更多的擴(kuò)展,包括 lock-correctness 正確性驗(yàn)證,以及支持 BPF 程序包含 assertion。lock 的驗(yàn)證乍一看似乎是一個很難解決的問題,而 Dave Marchevsky 和 Kumar Kartikeya Dwivedi 都已經(jīng)發(fā)出了 RFC patch set 來實(shí)現(xiàn)用于 lock 驗(yàn)證的新 map type。Marchevsky 的 patch set 提出了一個新的紅黑樹 map type,而 Dwivedi 的 patch set 提出了一個 list map type。這兩個 patch set 都實(shí)現(xiàn)了共同的效果,允許 BPF 程序執(zhí)行由 verifier 檢查和驗(yàn)證過的 locking 機(jī)制。

assertion 驗(yàn)證仍處于規(guī)劃階段,實(shí)現(xiàn)起來可能會很復(fù)雜。assertion 將作為給編譯器和 verifier 的信號,assertion 被用來指示程序中的一些不變的因素,這些不變因素的失敗將導(dǎo)致程序中止。Starovoitov 聲稱,弄清如何讓程序中止,這會是一個 "有趣" 的問題,因?yàn)樗枰踩貙Χ褩_M(jìn)行 unwind,調(diào)用 kptr destructor,以及其他收尾工作。

Starovoitov 在演講的最后分享了他對 BPF 未來的觀點(diǎn):會取代內(nèi)核模塊成為擴(kuò)展內(nèi)核的有效方式。早期版本的 BPF 程序看起來更像是帶有固定的 BPF helper function 和固定的 map type 的用戶空間程序,而如今新的 BPF 已經(jīng)可以讓用戶在更多個性化使用場景下對內(nèi)核進(jìn)行擴(kuò)展。事實(shí)上,這樣的使用場景已經(jīng)在 upstream 社區(qū)被提出來了。在 Starovoitov 之后在 LPC 發(fā)言的 Benjamin Tissoires,一直在開發(fā)一個 patch set,希望用 BPF 程序來 fix 人類輸入設(shè)備(HID)的 quirk。到目前為止,還沒有一個內(nèi)核 module 被 BPF 程序完全取代掉,不過,很期待看到內(nèi)核的其他一些功能可以在 BPF 程序中實(shí)現(xiàn)。

一位聽眾要求了解 Starovoitov 所提到的 lock-correctness 驗(yàn)證的更多細(xì)節(jié)。Starovoitov 說,這個工作還在進(jìn)行當(dāng)中,但他樂觀地認(rèn)為可以找到一種方法來進(jìn)行 static lock checking,從而驗(yàn)證數(shù)據(jù)保護(hù)是正確的,并保證不會發(fā)生死鎖。Dave Miller 回應(yīng)說,如果鎖可以由 verifier 進(jìn)行靜態(tài)檢查,那么可能可以研究一下 locking 邏輯是否可以由 verifier 自動生成。Starovoitov 回答說,這就是他們希望實(shí)現(xiàn)的目標(biāo),目前的設(shè)計中將 lock 和受保護(hù)的數(shù)據(jù)在同一次 allocation 中放在一起。對于不能跟 lock 放在一起的數(shù)據(jù),可以用 BTF type tag 來指定它需要明確進(jìn)行鎖保護(hù)。

審核編輯 :李倩

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

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140555
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3685

    瀏覽量

    94922
  • 驅(qū)動程序
    +關(guān)注

    關(guān)注

    19

    文章

    859

    瀏覽量

    48894
  • BPF
    BPF
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    4278

原文標(biāo)題:LWN:讓BPF成為一個更安全的內(nèi)核編程環(huán)境!

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

收藏 人收藏

    評論

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

    FA模型訪問Stage模型DataShareExtensionAbility說明

    DataShareExtensionAbility提供數(shù)據(jù)庫的讀寫服務(wù)。 服務(wù)端由FA模型升級到Stage模型后,會導(dǎo)致FA模型的客戶端在API 9(含)之后的版本上無法訪問服務(wù)端。
    發(fā)表于 06-04 07:53

    如何將FA模型開發(fā)的聲明式范式應(yīng)用切換到Stage模型

    模型切換概述 本文介紹如何將FA模型開發(fā)的聲明式范式應(yīng)用切換到Stage模型,您需要完成如下動作: 工程切換:新建
    發(fā)表于 06-04 06:22

    KaihongOS操作系統(tǒng)FA模型與Stage模型介紹

    ,是目前主推且會長期演進(jìn)的模型。Stage模型提供AbilityStage、WindowStage等類作為應(yīng)用組件和Window窗口的“舞臺”,因此稱這種應(yīng)用
    發(fā)表于 04-24 07:27

    中微推出7款計量方案,客戶提供站式服務(wù)

    中微推出7款計量方案,客戶提供站式服務(wù)測量芯片主要是中微RISC內(nèi)核的高精度測量芯片,內(nèi)置大容量的Flash,具有多級可編程放大器和差分
    的頭像 發(fā)表于 01-14 15:03 ?430次閱讀
    中微推出7款計量方案,<b class='flag-5'>為</b>客戶<b class='flag-5'>提供</b><b class='flag-5'>一</b>站式服務(wù)

    中微推出5款計量方案,客戶提供站式服務(wù)

    中微推出5款計量方案,客戶提供站式服務(wù)前言測量芯片主要是中微MCS-51內(nèi)核的高精度測量芯片,內(nèi)置大容量的Flash,具有多級可編程放大
    的頭像 發(fā)表于 01-10 18:58 ?341次閱讀
    中微推出5款計量方案,<b class='flag-5'>為</b>客戶<b class='flag-5'>提供</b><b class='flag-5'>一</b>站式服務(wù)

    卡諾模型為人工智能領(lǐng)域提供種全新的視角

    在探索人工智能如何更深層次滿足用戶需求、提升用戶體驗(yàn)的旅程中,卡諾模型(Kano Model)提供極具價值的理論框架。這
    的頭像 發(fā)表于 12-11 10:17 ?590次閱讀

    THS3001構(gòu)建簡單的SPICE模型

    電子發(fā)燒友網(wǎng)站提供THS3001構(gòu)建簡單的SPICE模型.pdf》資料免費(fèi)下載
    發(fā)表于 10-29 10:11 ?1次下載
    <b class='flag-5'>為</b>THS3001構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個</b>簡單的SPICE<b class='flag-5'>模型</b>

    接口芯片的編程模型方法是什么

    、以太網(wǎng)控制器,也可以是特定于應(yīng)用的,如用于特定傳感器或執(zhí)行器的接口。 2. 編程模型的重要性 編程模型定義軟件如何與硬件接口交互。
    的頭像 發(fā)表于 09-30 11:30 ?581次閱讀

    下載MAX4488的運(yùn)放模型,在TINA中仿真噪聲,總提示OPERATING POINT IS NOT FOUND,為什么?

    你好我自己下載MAX4488的運(yùn)放模型,在TINA中仿真噪聲,總提示OPERATING POINT IS NOT FOUND
    發(fā)表于 09-24 08:11

    NVIDIA助力提供多樣、靈活的模型選擇

    在本案例中,Dify 以模型中立以及開源生態(tài)的優(yōu)勢,廣大 AI 創(chuàng)新者提供豐富的模型選擇。其集成的 NVIDIAAPI Catalog、NVIDIA NIM和Triton 推理服務(wù)器
    的頭像 發(fā)表于 09-09 09:19 ?867次閱讀

    為了學(xué)習(xí)內(nèi)核開發(fā),大佬手搓輕量級操作系統(tǒng)YiYiYa OS

    一小個模塊都提供基本的功能。按各自的職責(zé)劃分,分別對應(yīng)與傳統(tǒng)內(nèi)核層則為核心領(lǐng)域業(yè)務(wù)。每一小個模塊都提供基本的功能。按各自的職責(zé)劃分,分別對應(yīng)
    發(fā)表于 08-30 14:57

    為了學(xué)習(xí)內(nèi)核開發(fā),大佬手搓輕量級操作系統(tǒng)YiYiYa OS

    對應(yīng)與傳統(tǒng)內(nèi)核層則為核心領(lǐng)域業(yè)務(wù)。每一小個模塊都提供基本的功能。按各自的職責(zé)劃分,分別對應(yīng)與傳統(tǒng)操作系統(tǒng)的內(nèi)存管理、進(jìn)程通信、文件系統(tǒng)、進(jìn)程通信、等等。在演進(jìn)操作系統(tǒng)時候,可以修改這里,對應(yīng)源碼目錄
    發(fā)表于 08-27 10:08

    EvolutionaryScale推出基于NVIDIA GPU模型的新型蛋白質(zhì)研究方案

    EvolutionaryScale 于 6 月 25 日發(fā)布第三代 ESM 模型 ESM3,該模型可同時對蛋白質(zhì)的序列、結(jié)構(gòu)和功能進(jìn)行推理,蛋白質(zhì)研發(fā)工程師
    的頭像 發(fā)表于 08-23 16:45 ?985次閱讀

    在PyTorch中搭建最簡單的模型

    在PyTorch中搭建最簡單的模型通常涉及幾個關(guān)鍵步驟:定義模型結(jié)構(gòu)、加載數(shù)據(jù)、設(shè)置損失函數(shù)和優(yōu)化器,以及進(jìn)行模型訓(xùn)練和評估。
    的頭像 發(fā)表于 07-16 18:09 ?2724次閱讀

    如何使用MATLAB創(chuàng)建預(yù)測模型

    MATLAB 簡介 MATLAB 是由 MathWorks 公司開發(fā)的,它提供集成的計算環(huán)境,包括
    的頭像 發(fā)表于 07-11 14:29 ?1083次閱讀
    主站蜘蛛池模板: 亚洲第一永久在线观看 | 1024免费永久福利视频 | 五月激情婷婷综合 | 轻点灬大ji巴太粗太长了h | 在线观看视频免费 | 午夜性a一级毛片 | 亚洲精品视频在线看 | 米奇影院777 | 免费一级特黄特色大片 | 亚洲免费成人在线 | 欧美视频精品一区二区三区 | 婷婷色香五月激情综合2020 | 狠狠干2015| 四虎在线电影 | 网红和老师啪啪对白清晰 | 一级特黄aaa大片 | 中文字幕天堂 | 日本成人福利视频 | 高清成人 | 婷婷丁香四月 | 午夜影院普通用户体验区 | 三级免费观看 | 一区二区三区免费视频网站 | 香蕉视频黄色片 | 视频一区视频二区在线观看 | 国产黄色片在线观看 | 午夜香港三级在线观看网 | 欧美午夜一区 | 日韩一级在线播放免费观看 | 91大神亚洲影视在线 | 色噜噜狠狠狠狠色综合久 | 性欧美乱又伦 | 精品一区二区三区18 | 欧美18videosex性欧美1819 | 人人搞人人爽 | 国产高清一级视频在线观看 | 国产免费啪啪 | 四虎国产精品4hu永久 | 在线黄色大片 | 欧美午夜小视频 | 日本一视频一区视频二区 |