簡體   English   中英

這些預處理器定義的內核函數是如何工作的?

[英]How do these pre-processor defined kernel functions work?

我正在嘗試在 Apple M1 上執行一些內核函數,並且遇到了這段代碼,它似乎使用 C 宏在編譯時定義了一些內核函數。 這些是存在於 Apple 的kern/kpc 中的內核函數,但該庫的頭文件不包含在任何地方,我相信 API 可能是私有的。

我想知道是否有人可以解釋它是如何工作的,函數定義(即通常在函數體中的代碼)是如何向程序顯示的? 我不熟悉##proc符號。

#define KPERF_LIST                               \
    /*  ret, name, params */                     \
    F(int, kpc_get_counting, void)               \
    F(int, kpc_force_all_ctrs_set, int)          \
    F(int, kpc_set_counting, uint32_t)           \
    F(int, kpc_set_thread_counting, uint32_t)    \
    F(int, kpc_set_config, uint32_t, void *)     \
    F(int, kpc_get_config, uint32_t, void *)     \
    F(int, kpc_set_period, uint32_t, void *)     \
    F(int, kpc_get_period, uint32_t, void *)     \
    F(uint32_t, kpc_get_counter_count, uint32_t) \
    F(uint32_t, kpc_get_config_count, uint32_t)  \
    F(int, kperf_sample_get, int *)              \
    F(int, kpc_get_thread_counters, int, unsigned int, void *)

#define F(ret, name, ...)                \
    typedef ret name##proc(__VA_ARGS__); \
    static name##proc *name;
KPERF_LIST
#undef F

如果有F(int, kpc_get_counting, void)第一個是返回值的類型。 第二個是函數名,后面都是參數。

我已經聯系了原始代碼的作者來解決這個問題。

宏定義的函數稍后在代碼中使用dlsym()鏈接到內核庫函數。 所以,這些函數實際上並沒有在這段代碼中定義; 相反,聲明相同/相似名稱的函數,然后動態鏈接到內核庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM