eBPF 系統呼叫¶
- 作者:
Alexei Starovoitov <ast@kernel.org>
Joe Stringer <joe@wand.net.nz>
Michael Kerrisk <mtk.manpages@gmail.com>
關於 bpf 系統呼叫的主要資訊可在 man-pages 的 bpf(2) 中找到。
bpf() 子命令參考¶
bpf() 系統呼叫要執行的操作由 cmd 引數確定。每個操作都帶有一個伴隨引數,透過 attr 提供,該引數是指向 bpf_attr 型別聯合的指標(參見下文)。size 引數是 attr 指向的聯合的大小。
- BPF_MAP_CREATE
- 描述
建立一個對映並返回一個引用該對映的檔案描述符。新檔案描述符的 close-on-exec 檔案描述符標誌(參見 fcntl(2))會自動啟用。
對 BPF_MAP_CREATE 返回的檔案描述符應用 close(2) 將刪除該對映(但請參閱注意事項)。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_MAP_LOOKUP_ELEM
- 描述
在 map_fd 檔案描述符所引用的對映中,根據給定的 key 查詢元素。
flags 引數可以指定為以下之一:
- BPF_F_LOCK
查詢自旋鎖對映的值而不返回鎖。如果元素包含自旋鎖,則必須指定此項。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_MAP_UPDATE_ELEM
- 描述
在指定的對映中建立或更新元素(鍵/值對)。
flags 引數應指定為以下之一:
- BPF_ANY
建立新元素或更新現有元素。
- BPF_NOEXIST
僅當元素不存在時才建立新元素。
- BPF_EXIST
更新現有元素。
- BPF_F_LOCK
更新一個自旋鎖(spin_lock)對映元素。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
可能將 errno 設定為 EINVAL、EPERM、ENOMEM、E2BIG、EEXIST 或 ENOENT。
- E2BIG
對映中的元素數量達到了對映建立時指定的 max_entries 限制。
- EEXIST
如果 flags 指定 BPF_NOEXIST 且具有 key 的元素已存在於對映中。
- ENOENT
如果 flags 指定 BPF_EXIST 且具有 key 的元素不存在於對映中。
- BPF_MAP_DELETE_ELEM
- 描述
在指定的對映中按鍵查詢並刪除元素。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_MAP_GET_NEXT_KEY
- 描述
在指定對映中按鍵查詢元素並返回下一個元素的鍵。可用於遍歷對映中的所有元素。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
以下情況可用於遍歷對映中的所有元素:
如果未找到 key,操作返回零並將 next_key 指標設定為第一個元素的鍵。
如果找到 key,操作返回零並將 next_key 指標設定為下一個元素的鍵。
如果 key 是最後一個元素,返回 -1 且 errno 設定為 ENOENT。
錯誤時可能將 errno 設定為 ENOMEM、EFAULT、EPERM 或 EINVAL。
- BPF_PROG_LOAD
- 描述
驗證並載入 eBPF 程式,返回與程式關聯的新檔案描述符。
對 BPF_PROG_LOAD 返回的檔案描述符應用 close(2) 將解除安裝 eBPF 程式(但請參閱注意事項)。
新檔案描述符的 close-on-exec 檔案描述符標誌(參見 fcntl(2))會自動啟用。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_OBJ_PIN
- 描述
將由指定 bpf_fd 引用的 eBPF 程式或對映固定到檔案系統上的指定 pathname。
pathname 引數不得包含點(“.”)。
成功時,pathname 保留對 eBPF 物件的引用,防止在原始 bpf_fd 關閉時物件被解除分配。這允許 eBPF 物件在 close(bpf_fd) 之後以及父程序的生命週期之後繼續存在。
對 pathname 應用 unlink(2) 或類似呼叫將物件從檔案系統中解除固定,從而移除引用。如果沒有其他檔案描述符或檔案系統節點引用同一物件,它將被解除分配(參見 NOTES)。
pathname 父目錄的檔案系統型別必須是 BPF_FS_MAGIC。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_OBJ_GET
- 描述
為固定到指定 pathname 的 eBPF 物件開啟檔案描述符。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_PROG_ATTACH
- 描述
將 eBPF 程式附加到指定 attach_type 掛鉤處的 target_fd。
attach_type 指定了將程式附加到的 eBPF 附加點,並且必須是 bpf_attach_type 之一(參見下文)。
attach_bpf_fd 必須是已載入的 cgroup、流分解器、LIRC、sockmap 或 sock_ops 型別的 eBPF 程式的有效檔案描述符,對應於指定的 attach_type。
target_fd 必須是核心物件的有效檔案描述符,該核心物件取決於 attach_bpf_fd 的附加型別
BPF_PROG_TYPE_CGROUP_DEVICE, BPF_PROG_TYPE_CGROUP_SKB, BPF_PROG_TYPE_CGROUP_SOCK, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_PROG_TYPE_CGROUP_SOCKOPT, BPF_PROG_TYPE_CGROUP_SYSCTL, BPF_PROG_TYPE_SOCK_OPS
啟用 eBPF 控制器的控制組 v2 層級結構。需要核心編譯時帶 CONFIG_CGROUP_BPF。
BPF_PROG_TYPE_FLOW_DISSECTOR
網路名稱空間(例如 /proc/self/ns/net)。
BPF_PROG_TYPE_LIRC_MODE2
LIRC 裝置路徑(例如 /dev/lircN)。需要核心編譯時帶 CONFIG_BPF_LIRC_MODE2。
BPF_PROG_TYPE_SK_SKB, BPF_PROG_TYPE_SK_MSG
套接字型別的 eBPF 對映(例如 BPF_MAP_TYPE_SOCKHASH)。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_PROG_DETACH
- 描述
從 attach_type 指定的掛鉤處分離與 target_fd 關聯的 eBPF 程式。該程式必須已透過 BPF_PROG_ATTACH 附加。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_PROG_TEST_RUN
- 描述
針對提供的程式上下文 ctx_in 和資料 data_in,執行與 prog_fd 關聯的 eBPF 程式 repeat 次,並返回修改後的程式上下文 ctx_out、data_out(例如,資料包資料)、執行結果 retval 和測試執行的 duration。
作為輸入和輸出引數提供的緩衝區 ctx_in、ctx_out、data_in 和 data_out 的大小必須在相應的變數 ctx_size_in、ctx_size_out、data_size_in 和/或 data_size_out 中提供。如果這些引數中的任何一個未提供(即設定為 NULL),則相應的 size 欄位必須為零。
某些程式型別有特定要求
- BPF_PROG_TYPE_SK_LOOKUP
data_in 和 data_out 必須為 NULL。
BPF_PROG_TYPE_RAW_TRACEPOINT, BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
ctx_out, data_in 和 data_out 必須為 NULL。repeat 必須為零。
BPF_PROG_RUN 是 BPF_PROG_TEST_RUN 的別名。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- ENOSPC
data_size_out 或 ctx_size_out 太小。
- ENOTSUPP
此命令不受 prog_fd 所引用程式的程式型別支援。
- BPF_PROG_GET_NEXT_ID
- 描述
獲取當前載入到核心中的下一個 eBPF 程式。
查詢 ID 大於 start_id 的 eBPF 程式,並在成功時更新 next_id。如果沒有其他 ID 高於 start_id 的 eBPF 程式,則返回 -1 並將 errno 設定為 ENOENT。
- 返回
成功時返回零。發生錯誤或沒有剩餘 ID 時,返回 -1 並適當設定 errno。
- BPF_MAP_GET_NEXT_ID
- 描述
獲取當前載入到核心中的下一個 eBPF 對映。
查詢 ID 大於 start_id 的 eBPF 對映,並在成功時更新 next_id。如果沒有其他 ID 高於 start_id 的 eBPF 對映,則返回 -1 並將 errno 設定為 ENOENT。
- 返回
成功時返回零。發生錯誤或沒有剩餘 ID 時,返回 -1 並適當設定 errno。
- BPF_PROG_GET_FD_BY_ID
- 描述
開啟與 prog_id 對應的 eBPF 程式的檔案描述符。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_MAP_GET_FD_BY_ID
- 描述
開啟與 map_id 對應的 eBPF 對映的檔案描述符。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_OBJ_GET_INFO_BY_FD
- 描述
獲取有關與 bpf_fd 對應的 eBPF 物件的資訊。
根據 bpf_fd 的 eBPF 物件型別,填充 info 最多 info_len 位元組,其格式將是以下之一:
struct bpf_prog_info
struct bpf_map_info
struct bpf_btf_info
struct bpf_link_info
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_PROG_QUERY
- 描述
獲取與指定 attach_type 掛鉤關聯的 eBPF 程式資訊。
target_fd 必須是核心物件的有效檔案描述符,該核心物件取決於 attach_bpf_fd 的附加型別
BPF_PROG_TYPE_CGROUP_DEVICE, BPF_PROG_TYPE_CGROUP_SKB, BPF_PROG_TYPE_CGROUP_SOCK, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_PROG_TYPE_CGROUP_SOCKOPT, BPF_PROG_TYPE_CGROUP_SYSCTL, BPF_PROG_TYPE_SOCK_OPS
啟用 eBPF 控制器的控制組 v2 層級結構。需要核心編譯時帶 CONFIG_CGROUP_BPF。
BPF_PROG_TYPE_FLOW_DISSECTOR
網路名稱空間(例如 /proc/self/ns/net)。
BPF_PROG_TYPE_LIRC_MODE2
LIRC 裝置路徑(例如 /dev/lircN)。需要核心編譯時帶 CONFIG_BPF_LIRC_MODE2。
BPF_PROG_QUERY 總是獲取附加程式的數量以及用於附加這些程式的 attach_flags。此外,如果 prog_ids 非零且附加程式的數量小於 prog_cnt,則用 target_fd 處附加的 eBPF 程式的 ID 填充 prog_ids。
以下標誌可能會改變結果
- BPF_F_QUERY_EFFECTIVE
僅返回有關當前在指定 target_fd 處有效的程式的資訊。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_RAW_TRACEPOINT_OPEN
- 描述
將 eBPF 程式附加到追蹤點 name,以原始形式訪問追蹤點的核心內部引數。
prog_fd 必須是與型別為 BPF_PROG_TYPE_RAW_TRACEPOINT 的已載入 eBPF 程式關聯的有效檔案描述符。
對於暴露給相應 eBPF 程式的追蹤點引數內容,不提供任何 ABI 保證。
對 BPF_RAW_TRACEPOINT_OPEN 返回的檔案描述符應用 close(2) 將刪除對映(但請參閱注意事項)。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_BTF_LOAD
- 描述
驗證並將 BPF 型別格式(BTF)元資料載入到核心中,返回一個與該元資料關聯的新檔案描述符。BTF 的詳細資訊請參見 https://kernel.linux.club.tw/doc/html/latest/bpf/btf.html。
btf 引數必須指向有效記憶體,提供 btf_size 位元組的 BTF 二進位制元資料。
返回的檔案描述符可以傳遞給其他 bpf() 子命令,例如 BPF_PROG_LOAD 或 BPF_MAP_CREATE,以將 BTF 與這些物件關聯起來。
與 BPF_PROG_LOAD 類似,BPF_BTF_LOAD 具有可選引數,用於指定 btf_log_buf、btf_log_size 和 btf_log_level,允許核心返回有關 BTF 驗證過程的自由格式日誌輸出。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_BTF_GET_FD_BY_ID
- 描述
為與 btf_id 對應的 BPF 型別格式 (BTF) 開啟檔案描述符。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_TASK_FD_QUERY
- 描述
獲取有關與由 pid 和 fd 標識的目標程序關聯的 eBPF 程式的資訊。
如果 pid 和 fd 與 tracepoint、kprobe 或 uprobe perf 事件關聯,則 prog_id 和 fd_type 將填充 eBPF 程式 ID 和型別為 bpf_task_fd_type 的檔案描述符型別。如果與 kprobe 或 uprobe 關聯,則 probe_offset 和 probe_addr 也將填充。可選地,如果提供了 buf,則 buf 中最多 buf_len 位元組將填充 tracepoint、kprobe 或 uprobe 的名稱。
結果 prog_id 可以使用 BPF_PROG_GET_FD_BY_ID 和 BPF_OBJ_GET_INFO_BY_FD 進行更深入的內省。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_MAP_LOOKUP_AND_DELETE_ELEM
- 描述
在 fd 檔案描述符引用的對映中查詢給定 key 的元素,如果找到則刪除該元素。
對於 BPF_MAP_TYPE_QUEUE 和 BPF_MAP_TYPE_STACK 對映型別,flags 引數需要設定為 0,但對於其他對映型別,可以指定為:
- BPF_F_LOCK
查詢並刪除自旋鎖對映的值而不返回鎖。如果元素包含自旋鎖,則必須指定此項。
BPF_MAP_TYPE_QUEUE 和 BPF_MAP_TYPE_STACK 對映型別將此命令實現為“pop”操作,刪除頂部元素而不是與 key 對應的元素。當對這些對映型別發出此操作時,key 和 key_len 引數應清零。
此命令僅對以下對映型別有效: * BPF_MAP_TYPE_QUEUE * BPF_MAP_TYPE_STACK * BPF_MAP_TYPE_HASH * BPF_MAP_TYPE_PERCPU_HASH * BPF_MAP_TYPE_LRU_HASH * BPF_MAP_TYPE_LRU_PERCPU_HASH
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_MAP_FREEZE
- 描述
凍結指定對映的許可權。
可以透過傳遞零 flags 來凍結寫入許可權。成功後,未來的系統呼叫呼叫將不能更改 map_fd 的對映狀態。eBPF 程式對凍結的對映仍然可以執行寫入操作。
不支援 BPF_MAP_TYPE_STRUCT_OPS 型別的對映。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_BTF_GET_NEXT_ID
- 描述
獲取當前載入到核心中的下一個 BPF 型別格式(BTF)物件。
查詢 ID 大於 start_id 的 BTF 物件,並在成功時更新 next_id。如果沒有其他 ID 高於 start_id 的 BTF 物件,則返回 -1 並將 errno 設定為 ENOENT。
- 返回
成功時返回零。發生錯誤或沒有剩餘 ID 時,返回 -1 並適當設定 errno。
- BPF_MAP_LOOKUP_BATCH
- 描述
迭代並獲取對映中的多個元素。
使用兩個不透明值 in_batch 和 out_batch 來管理批處理操作。最初,in_batch 必須設定為 NULL 以開始批處理操作。在每次後續的 BPF_MAP_LOOKUP_BATCH 之後,呼叫者應將結果 out_batch 作為 in_batch 傳遞,以從當前點繼續迭代。in_batch 和 out_batch 都必須指向足夠大的記憶體以容納一個鍵,但 BPF_MAP_TYPE_{HASH, PERCPU_HASH, LRU_HASH, LRU_PERCPU_HASH} 型別的對映除外,對於這些對映,批處理引數的寬度必須至少為 4 位元組,無論鍵大小如何。
keys 和 values 是輸出引數,它們必須指向足夠大的記憶體,以根據對映 map_fd 的鍵和值大小容納 count 個專案。keys 緩衝區的大小必須為 key_size * count。values 緩衝區的大小必須為 value_size * count。
elem_flags 引數可以指定為以下之一:
- BPF_F_LOCK
查詢自旋鎖對映的值而不返回鎖。如果元素包含自旋鎖,則必須指定此項。
成功時,count 個元素從映射覆制到使用者緩衝區,鍵複製到 keys,值複製到 values 中對應的索引。
如果返回錯誤且 errno 不是 EFAULT,則 count 設定為成功處理的元素數量。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
可能將 errno 設定為 ENOSPC,表示在迭代基於雜湊的對映型別時,keys 或 values 太小,無法轉儲整個桶。
- BPF_MAP_LOOKUP_AND_DELETE_BATCH
- 描述
迭代並刪除對映中的所有元素。
此操作的行為與 BPF_MAP_LOOKUP_BATCH 相同,但有兩個例外:
每個成功返回的元素也會從對映中刪除。這至少是 count 個元素。注意,count 既是輸入引數也是輸出引數。
當返回時 errno 設定為 EFAULT,最多 count 個元素可能已被刪除,但未返回已刪除元素的鍵和值。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_MAP_UPDATE_BATCH
- 描述
按 key 批次更新對映中的多個元素。
keys 和 values 是輸入引數,它們必須指向足夠大的記憶體,以根據對映 map_fd 的鍵和值大小容納 count 個專案。keys 緩衝區的大小必須為 key_size * count。values 緩衝區的大小必須為 value_size * count。
keys 中指定的每個元素都會依次更新為 values 中相應索引的值。in_batch 和 out_batch 引數被忽略,應清零。
elem_flags 引數應指定為以下之一
- BPF_ANY
建立新元素或更新現有元素。
- BPF_NOEXIST
僅當新元素不存在時才建立。
- BPF_EXIST
更新現有元素。
- BPF_F_LOCK
更新自旋鎖對映元素。如果對映值包含自旋鎖,則必須指定此項。
成功時,對映中的 count 個元素被更新。
如果返回錯誤且 errno 不是 EFAULT,則 count 設定為成功處理的元素數量。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
可能將 errno 設定為 EINVAL、EPERM、ENOMEM 或 E2BIG。E2BIG 表示對映中的元素數量已達到對映建立時指定的 max_entries 限制。
在特定情況下可能將 errno 設定為以下錯誤程式碼之一
- EEXIST
如果 flags 指定 BPF_NOEXIST 且具有 key 的元素已存在於對映中。
- ENOENT
如果 flags 指定 BPF_EXIST 且具有 key 的元素不存在於對映中。
- BPF_MAP_DELETE_BATCH
- 描述
按 key 批次刪除對映中的多個元素。
keys 引數是一個輸入引數,它必須指向足夠大的記憶體,以根據對映 map_fd 的鍵大小容納 count 個專案,即 key_size * count。
keys 中指定的每個元素將依次刪除。in_batch、out_batch 和 values 引數將被忽略並應清零。
elem_flags 引數可以指定為以下之一:
- BPF_F_LOCK
查詢自旋鎖對映的值而不返回鎖。如果元素包含自旋鎖,則必須指定此項。
成功時,對映中的 count 個元素被更新。
如果返回錯誤且 errno 不是 EFAULT,則 count 設定為成功處理的元素數量。如果 errno 是 EFAULT,則最多 count 個元素可能已被刪除。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_LINK_CREATE
- 描述
將 eBPF 程式附加到指定 attach_type 掛鉤處的 target_fd,並返回用於管理連結的檔案描述符控制代碼。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_LINK_UPDATE
- 描述
將指定 link_fd 中的 eBPF 程式更新為 new_prog_fd。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_LINK_GET_FD_BY_ID
- 描述
開啟與 link_id 對應的 eBPF 連結的檔案描述符。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_LINK_GET_NEXT_ID
- 描述
獲取當前載入到核心中的下一個 eBPF 連結。
查詢 ID 大於 start_id 的 eBPF 連結,並在成功時更新 next_id。如果沒有其他 ID 高於 start_id 的 eBPF 連結,則返回 -1 並將 errno 設定為 ENOENT。
- 返回
成功時返回零。發生錯誤或沒有剩餘 ID 時,返回 -1 並適當設定 errno。
- BPF_ENABLE_STATS
- 描述
啟用 eBPF 執行時統計資訊收集。
eBPF 執行時的統計資訊收集預設停用,以最大程度地減少相應的效能開銷。此命令會全域性啟用統計資訊。
多個程式可以獨立啟用統計資訊。在收集到所需的統計資訊後,可以透過對本函式返回的檔案描述符呼叫 close(2) 來再次停用 eBPF 執行時統計資訊。只有當透過此子命令先前呼叫返回的所有未關閉的檔案描述符都關閉後,統計資訊才會在系統範圍內停用。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_ITER_CREATE
- 描述
在指定的 link_fd(先前使用 BPF_LINK_CREATE 建立)之上建立一個迭代器,並返回一個可用於觸發迭代的檔案描述符。
如果結果檔案描述符使用 BPF_OBJ_PIN 固定到檔案系統,則對該路徑的後續 read(2) 系統呼叫將觸發迭代器使用附加到 link_fd 的 eBPF 程式讀取核心狀態。
- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- BPF_LINK_DETACH
- 描述
強制將指定的 link_fd 從其對應的附著點分離。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_PROG_BIND_MAP
- 描述
將對映繫結到 eBPF 程式的生命週期。
由 map_fd 標識的對映繫結到由 prog_fd 標識的程式,並且僅當 prog_fd 釋放時才釋放。這可用於元資料應與程式關聯的情況,否則該程式不包含對對映的任何引用(例如,嵌入在 eBPF 程式指令中)。
- 返回
成功時返回零。發生錯誤時,返回 -1 並適當設定 errno。
- BPF_TOKEN_CREATE
- 描述
建立 BPF 令牌,其中嵌入了有關其允許哪些 BPF 相關功能的資訊:- 允許的
bpf()系統呼叫命令集;- 如果允許 BPF_MAP_CREATE 命令,則允許使用該命令建立的 BPF 對映型別集;- 如果允許 BPF_PROG_LOAD 命令,則允許使用該命令載入的 BPF 程式型別和 BPF 程式附加型別集。BPF 令牌是從 BPF FS 的例項建立(派生)的,假設它已指定了必要的委派掛載選項。此 BPF 令牌可以作為額外引數傳遞給各種
bpf()系統呼叫命令,以授予非特權程序 BPF 子系統功能。BPF 令牌建立後,會與派生它的 BPF FS 例項(超級塊)的擁有使用者名稱空間“關聯”,後續使用 BPF 令牌執行的 BPF 操作將在該使用者名稱空間內執行能力檢查(即 CAP_BPF、CAP_PERFMON、CAP_NET_ADMIN、CAP_SYS_ADMIN)。如果沒有 BPF 令牌,這些能力必須在 init 使用者名稱空間中授予,這使得
bpf()系統呼叫在大多數情況下與使用者名稱空間不相容。- 返回
一個新的檔案描述符(一個非負整數),如果發生錯誤則返回 -1(此時,errno 會被適當地設定)。
- 注意事項
eBPF 物件(對映和程式)可以在程序之間共享。
在 fork(2) 後,子程序會繼承引用相同 eBPF 物件的檔案描述符。
引用 eBPF 物件的檔案描述符可以透過 unix(7) 域套接字傳輸。
引用 eBPF 物件的檔案描述符可以使用 dup(2) 及類似呼叫以通常方式複製。
引用 eBPF 物件的檔案描述符可以使用 bpf(2) 的 BPF_OBJ_PIN 命令固定到檔案系統。
eBPF 物件只有在所有引用該物件的檔案描述符都已關閉且沒有引用被固定到檔案系統或已附加(例如,繫結到程式或裝置)後才會被解除分配。