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

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

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

3天內不再提示

BPF為內核編程提供了一個新的參考模型

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

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

BPF的使命

Starovoitov 首先描述了他對 BPF 的 "mission statement, 使命宣言":"創新、并啟發大家創新"。內核中的編程歷來是在兩種情況下進行的:

core kernel 開發,包括主要的核心子系統,如內存管理、調度器、read-copy-update,等等。

kernel-module 開發,指的是構建那些不被編譯到 main kernel image 里的內容,由 module loader 在后續加載。例如,驅動程序被寫成一些內核 module,也有其他功能是這么做的,如文件系統、網絡協議等等。

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

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

BPF編程環境

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

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

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

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

Extending the programming environment past full C

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

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

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

Plans for the future

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

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

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

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

審核編輯 :李倩

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

    關注

    180

    文章

    7608

    瀏覽量

    137156
  • 編程
    +關注

    關注

    88

    文章

    3628

    瀏覽量

    93818
  • 驅動程序
    +關注

    關注

    19

    文章

    839

    瀏覽量

    48098
  • BPF
    BPF
    +關注

    關注

    0

    文章

    25

    瀏覽量

    4016

原文標題:LWN:讓BPF成為一個更安全的內核編程環境!

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

收藏 人收藏

    評論

    相關推薦

    卡諾模型為人工智能領域提供種全新的視角

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

    THS3001構建簡單的SPICE模型

    電子發燒友網站提供THS3001構建簡單的SPICE模型.pdf》資料免費下載
    發表于 10-29 10:11 ?0次下載
    <b class='flag-5'>為</b>THS3001構建<b class='flag-5'>一</b><b class='flag-5'>個</b>簡單的SPICE<b class='flag-5'>模型</b>

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

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

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

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

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

    在本案例中,Dify 以模型中立以及開源生態的優勢,廣大 AI 創新者提供豐富的模型選擇。其集成的 NVIDIAAPI Catalog、NVIDIA NIM和Triton 推理服務器
    的頭像 發表于 09-09 09:19 ?489次閱讀

    為了學習內核開發,大佬手搓輕量級操作系統YiYiYa OS

    一小個模塊都提供基本的功能。按各自的職責劃分,分別對應與傳統內核層則為核心領域業務。每一小個模塊都提供基本的功能。按各自的職責劃分,分別對應
    發表于 08-30 14:57

    為了學習內核開發,大佬手搓輕量級操作系統YiYiYa OS

    對應與傳統內核層則為核心領域業務。每一小個模塊都提供基本的功能。按各自的職責劃分,分別對應與傳統操作系統的內存管理、進程通信、文件系統、進程通信、等等。在演進操作系統時候,可以修改這里,對應源碼目錄
    發表于 08-27 10:08

    Stack Overflow與OpenAI簽訂協議模型提供數據

    OpenAI與知名的軟件開發者問答論壇Stack Overflow達成了重要合作,旨在提升生成式人工智能模型編程領域的性能。根據雙方周宣布的合作協議,OpenAI將利用Stack Overflow的豐富數據資源,不斷優化其人
    的頭像 發表于 05-09 09:25 ?399次閱讀

    【大語言模型:原理與工程實踐】大語言模型的應用

    輸出的關鍵詞或短語。對于任何輸入,大語言模型都會根據提示詞提供相應的輸出。例如,“天空是”就是提示詞,引導模型輸出關于天空的描述。提示詞
    發表于 05-07 17:21

    【大語言模型:原理與工程實踐】大語言模型的評測

    的工具。通過這框架,研究人員和使用者可以更準確地了解模型在實際應用中的表現,后續的優化和產品化提供有力支持。針對語言理解類評測任務,特別是古文及諺語理解,我們深入評估
    發表于 05-07 17:12

    【大語言模型:原理與工程實踐】揭開大語言模型的面紗

    維基百科、網頁內容和書籍等,不僅掌握語言的語法、語義和上下文信息,還能生成結構連貫、語義合理的句子和段落。大語言模型顯著特點是其龐大的參數量,已達數億甚至數十億級別。這種規模賦
    發表于 05-04 23:55

    【大語言模型:原理與工程實踐】探索《大語言模型原理與工程實踐》

    的未來發展方向進行了展望,包括跨領域、跨模態和自動提示生成能力方向,讀者提供對未來技術發展的深刻見解?!洞笳Z言模型原理與工程實踐》是
    發表于 04-30 15:35

    工業大模型的五基本問題

    工業業大模型是大模型賦能工業應用所產生的產業新形態,是制造業數字化轉型3.0的重要載體,是新質體。
    發表于 04-23 16:04 ?732次閱讀
    工業大<b class='flag-5'>模型</b>的五<b class='flag-5'>個</b>基本問題

    谷歌發布用于輔助編程的代碼大模型CodeGemma

    谷歌發布用于輔助編程的代碼大模型 CodeGemma。CodeGemma 基于谷歌今年 2 月發布的輕量級開源大模型 Gemma,針對 Gemma 的兩
    的頭像 發表于 04-17 16:07 ?719次閱讀
    谷歌發布用于輔助<b class='flag-5'>編程</b>的代碼大<b class='flag-5'>模型</b>CodeGemma

    使用iLD API對TC357進行編程,如何將其兩ADC內核配置同時連續地采樣?

    使用 iLD API 對 TC357 進行編程,如何將其兩 ADC 內核配置同時連續地對以下兩通道進行采樣: AN2 (EVADC_
    發表于 01-18 07:12
    主站蜘蛛池模板: 国产精品97久久AV麻豆| 熟妇少妇任你躁在线无码| 91麻豆精品| 文中字幕一区二区三区视频播放| 久久久擼擼擼麻豆| 国产精品女上位在线观看| 99精品99| 伊人亚洲AV久久无码精品| 午夜理论片日本中文在线| 欧美成人猛片aaaaaaa| 久久成人免费观看全部免费| 国产成人免费在线观看| 99视频国产热精品视频| 伊人情涩网| 亚洲欧美日本中文子不卡| 偷柏自拍亚洲综合在线| 欧美最猛黑人AAAAA片| 麻豆AV蜜桃AV久久| 精品久久香蕉国产线看观看麻豆 | 秋霞伦理高清视频在线| 麻豆高潮AV久久久久久久| 九热这里只有精品| 韩国三级久久精品| 国产高清视频在线观看97| 成人免费观看在线视频| a一级毛片视频免费看| 99精品久久精品一区二区| 中文字幕日本久久2019| 在线播放一区二区精品产| 亚洲视频精选| 亚洲午夜精品A片久久不卡蜜桃| 午夜影院老司机| 私人玩物黑丝| 色欲AV精品人妻一二三区| 色即是空 BT| 少妇性饥渴BBBBBBBBB| 色噜噜噜视频| 十分钟视频影院免费| 骚妇BB双飞插| 无码任你躁久久久久久久| 亚洲 欧美无码原创区|