91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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 語言編寫的(加上一點匯編),它的驅(qū)動程序和 module 也是如此。雖然 C 語言因其強大而簡單的語義而受到贊譽,但它是一種古老的語言,缺乏現(xiàn)代語言(如 Rust)中的許多特性。另一方面,BPF 子系統(tǒng)也提供了一個編程環(huán)境,工程師能夠編寫可以在內(nèi)核空間安全運行的程序。在愛爾蘭都柏林舉行的 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)過驗證確保安全,然后再在內(nèi)核空間運行。

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

然而,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ò)展功能就是 "一次編譯-到處運行"(CO-RE, Compile Once - Run Everywhere)。

CO-RE 使 BPF 程序可以在不同的內(nèi)核版本和平臺上都可以運行。在 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 通過利用運行中的內(nèi)核中的 BPF 類型格式(BTF)數(shù)據(jù)來解決這個問題。在加載一個程序時,libbpf 對所有的 struct 的訪問都會進(jìn)行重定位,以便根據(jù)當(dāng)前運行的內(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)核的配置來決定自己的行為。還有一個特點是 "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è)計和實現(xiàn)更多的擴(kuò)展,包括 lock-correctness 正確性驗證,以及支持 BPF 程序包含 assertion。lock 的驗證乍一看似乎是一個很難解決的問題,而 Dave Marchevsky 和 Kumar Kartikeya Dwivedi 都已經(jīng)發(fā)出了 RFC patch set 來實現(xiàn)用于 lock 驗證的新 map type。Marchevsky 的 patch set 提出了一個新的紅黑樹 map type,而 Dwivedi 的 patch set 提出了一個 list map type。這兩個 patch set 都實現(xiàn)了共同的效果,允許 BPF 程序執(zhí)行由 verifier 檢查和驗證過的 locking 機(jī)制。

assertion 驗證仍處于規(guī)劃階段,實現(xiàn)起來可能會很復(fù)雜。assertion 將作為給編譯器和 verifier 的信號,assertion 被用來指示程序中的一些不變的因素,這些不變因素的失敗將導(dǎo)致程序中止。Starovoitov 聲稱,弄清如何讓程序中止,這會是一個 "有趣" 的問題,因為它需要安全地對堆棧進(jìn)行 unwind,調(diào)用 kptr destructor,以及其他收尾工作。

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

一位聽眾要求了解 Starovoitov 所提到的 lock-correctness 驗證的更多細(xì)節(jié)。Starovoitov 說,這個工作還在進(jìn)行當(dāng)中,但他樂觀地認(rèn)為可以找到一種方法來進(jìn)行 static lock checking,從而驗證數(shù)據(jù)保護(hù)是正確的,并保證不會發(fā)生死鎖。Dave Miller 回應(yīng)說,如果鎖可以由 verifier 進(jìn)行靜態(tài)檢查,那么可能可以研究一下 locking 邏輯是否可以由 verifier 自動生成。Starovoitov 回答說,這就是他們希望實現(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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

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

    關(guān)注

    90

    文章

    3716

    瀏覽量

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

    關(guān)注

    19

    文章

    869

    瀏覽量

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

    關(guān)注

    0

    文章

    26

    瀏覽量

    4708

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    IT崗位天塌了!Claude 4震撼發(fā)布:AI編程模型再進(jìn)化

    Claude Opus 4 和 Claude Sonnet 4。這兩模型旨在更好地遵循指令,在編寫代碼、解答復(fù)雜問題等任務(wù)中,能夠更自主地運行。其中,Opus 4 堪稱全球頂級編程模型
    的頭像 發(fā)表于 05-26 07:52 ?5788次閱讀
    IT崗位天塌了!Claude 4震撼發(fā)布:AI<b class='flag-5'>編程</b>大<b class='flag-5'>模型</b>再進(jìn)化

    對 M7 內(nèi)核上的 memcpy 速度的疑問求解

    我對 M7 內(nèi)核上的 memcpy 速度有疑問。 對于 M7 和 A53 內(nèi)核之間的數(shù)據(jù)共享,我基于 IPCF 演示實現(xiàn)
    發(fā)表于 03-02 06:14

    深入解析WE-BPF多層芯片帶通濾波器:設(shè)計、特性與應(yīng)用考量

    GmbH Co. KG的WE-BPF多層芯片帶通濾波器(型號:748323024),從其電氣特性、使用條件到包裝規(guī)格和注意事項,電子工程師們在實際設(shè)計中提供全面的參考。 文件下載
    的頭像 發(fā)表于 01-29 16:45 ?214次閱讀

    深入了解WE - BPF多層芯片帶通濾波器:從規(guī)格到應(yīng)用注意事項

    Elektronik eiSos公司的WE-BPF多層芯片帶通濾波器(型號748351124),起看看它的各項特性和使用時的注意要點。 文件下載: 748351124.pdf 規(guī)格參數(shù)解讀 電氣特性 該
    的頭像 發(fā)表于 01-07 18:10 ?732次閱讀

    詳解WE - BPF多層芯片帶通濾波器:從參數(shù)到使用注意事項

    詳解WE - BPF多層芯片帶通濾波器:從參數(shù)到使用注意事項 在電子產(chǎn)品的設(shè)計中,濾波器是至關(guān)重要的組件,它能夠幫助我們精確地篩選出所需頻率的信號,抑制不需要的干擾。今天,我們就來詳細(xì)了解
    的頭像 發(fā)表于 12-29 15:55 ?284次閱讀

    文了解Mojo編程語言

    Mojo 是種由 Modular AI 公司開發(fā)的編程語言,旨在將 Python 的易用性與 C 語言的高性能相結(jié)合,特別適合人工智能(AI)、高性能計算(HPC)和系統(tǒng)級編程場景。以下是關(guān)于
    發(fā)表于 11-07 05:59

    汽車HIL測試系統(tǒng),歐美標(biāo)充電模型Simulink模型,開發(fā),有償

    提供歐美標(biāo)充電模型,交付物白盒Simulink模型
    發(fā)表于 09-04 16:23

    3Dfindit 提供的數(shù)字立方體模型研究項目的可視化提供支持

    作為學(xué)習(xí)項目的部分,羅伊特林根教育大學(xué)的學(xué)生們在比辛根集中營紀(jì)念地的博物館中使用 3Dfindit 動畫立方體模型進(jìn)行了學(xué)習(xí)。作為歷史教學(xué)研討會的部分,學(xué)生們研究巴登-符騰堡州
    發(fā)表于 08-01 14:36

    FA模型的ServiceAbility的切換介紹

    應(yīng)用ServiceAbility切換 目前系統(tǒng)提供ServiceExtensionAbility供系統(tǒng)應(yīng)用使用。切換步驟和PageAbility基本致。 在Stage應(yīng)用中創(chuàng)建ServiceExtensionAbilit
    發(fā)表于 06-05 07:24

    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

    ABAQUS內(nèi)置豐富的材料模型

    在現(xiàn)代工程設(shè)計與分析中,材料模型的準(zhǔn)確選擇與應(yīng)用是決定仿真結(jié)果可靠性的關(guān)鍵因素之。ABAQUS作為有限元分析(FEA)領(lǐng)域的旗艦軟件,憑借其內(nèi)置的豐富材料模型庫,工程師們
    的頭像 發(fā)表于 05-14 10:34 ?766次閱讀
    ABAQUS內(nèi)置<b class='flag-5'>了</b>豐富的材料<b class='flag-5'>模型</b>庫

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

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

    如何成為名合格的KaihongOS南向驅(qū)動開發(fā)工程師

    (KHDF)’。 簡單劃分如下圖所示: 3. 如何開發(fā)UHDF(用戶態(tài)驅(qū)動框架)? KaiHongOS驅(qū)動架構(gòu)用戶提供多種標(biāo)準(zhǔn)外設(shè)驅(qū)動模型。這些
    發(fā)表于 04-23 08:02

    如何基于Kahn處理網(wǎng)絡(luò)定義AI引擎圖形編程模型

    本白皮書探討了如何基于 Kahn 處理網(wǎng)絡(luò)( KPN )定義 AI 引擎圖形編程模型。KPN 模型有助于實現(xiàn)數(shù)據(jù)流并行化,進(jìn)而提高系統(tǒng)的整體性能。
    的頭像 發(fā)表于 04-17 11:31 ?863次閱讀
    如何基于Kahn處理網(wǎng)絡(luò)定義AI引擎圖形<b class='flag-5'>編程</b><b class='flag-5'>模型</b>