contributed by < aa860630
>
研讀前述 Linux 效能分析描述,在自己的實體電腦運作 GNU/Linux,做好必要的設定和準備工作 從中也該理解為何不希望在虛擬機器中進行實驗;
閱讀〈Linux 核心模組運作原理〉並對照 Linux 核心原始程式碼 (v6.1+),解釋 insmod
後,Linux 核心模組的符號 (symbol) 如何被 Linux 核心找到 (使用 List API)、MODULE_LICENSE
巨集指定的授權條款又對核心有什麼影響 (GPL 與否對於可用的符號列表有關),以及藉由 strace 追蹤 Linux 核心的掛載,涉及哪些系統呼叫和子系統?
insmod 的主要功能是將特定的模組檔案載入到核心中。這個程序直接處理模組插入,因此並不會自動處理模組間的依賴關係。如果模組有未解決的依賴,insmod 可能會失敗。
利用 strace 追蹤執行insmod fibdrv.ko
的過程可以發現如 close()
、mmap()
、read()
、openat()
等函式 :
openat()
系統調用的操作方式與open()
完全相同,如果pathname
中給出的路徑名是相對的,則它將相對於由檔案描述符dirfd
指示的目錄進行編譯int openat(int dirfd, const char *pathname, int flags, mode_t mode);
close()
關閉檔案描述符,使其不再指向任何文件並且可能被重新使用。read()
函數將嘗試從與打開的檔案描述符 fildes 相關的文件中讀取nbyte
字節,並將其放入由buf
指向的緩衝區。ssize_t read(int fildes, void *buf, size_t nbyte);
mmap()
會在呼叫進程的虛擬地址空間中創建一個新的映射。這個映射的起始地址由addr
指定,而length
參數指定了映射的長度。void *mmap(void *addr, size_t lengthint " prot ", int " flags , int fd, off_t offset);int munmap(void *addr, size_t length);
Producer (生產者):產生新資料,並將其插入到 fast_buf 中,以便快速存儲,或插入到 kfifo 中,以便後續傳輸或消費
Consumer (消費者):從 fast_buf 中讀取資料,然後進一步處理這些資料,可能是將其傳輸到 kfifo,或者進行其他操作
不管是生產者在產生新資料抑或是消費者在讀取資料,我們都不希望這個期間被干擾。舉例來說,當消費者在讀取資料時,我們希望操作是原子性的,不受其他操作的影響。這樣做的目的是避免數據競爭或緩衝區內資料的不一致。
在這個程式碼片段中,consumer_lock
用於保護從fast_buf
中讀取資料的操作。在mutex_lock(&consumer_lock)
和mutex_unlock(&consumer_lock)
之間,確保只有一個執行緒可以訪問fast_buf
,避免同時讀取或修改帶來的競爭條件,mutex_lock(&producer_lock)
與mutex_unlock(&producer_lock)
亦是如此
搭配閱讀《Demystifying the Linux CPU Scheduler》
xoroshiro128+
的原理 (對照〈Scrambled Linear Pseudorandom Number Generators〉論文),並利用 ksort 提供的 xoro
核心模組,比較 Linux 核心內建的 /dev/random
及 /dev/urandom
的速度,說明 xoroshiro128+
是否有速度的優勢?其弱點又是什麼?
搭配閱讀: 不亂的「亂數」