kernel筆記 庫檔案與系統呼叫

2021-09-08 20:15:05 字數 2557 閱讀 2685

庫檔案

先從我們熟悉的

c庫入手,理解系統呼叫(system call)。c**中呼叫printf函式,經歷了以下呼叫過程:

最終輸出的功能由核心中write呼叫完成,c庫封裝了系統呼叫。

對於以下hello world程式:

#include

intmain()

我們可以使用ldd檢視程式依賴的庫檔案:

linux # ldd hello

linux-vdso.so.1 => (0x00007fff89fe2000

)    libc.so.

6 => /lib64/libc.so.6 (0x00007fd142094000

)    /lib64/ld-linux-x86-64.so.2 (0x00007fd1423f2000)

輸出結果中顯示了hello程式依賴的動態庫檔案,其中linux-vdso.so.1指向程序虛擬記憶體位址,是乙個虛擬的庫檔案,在每個程式的虛擬記憶體都存在,其將核心態的呼叫對映到使用者位址空間中,使得呼叫開銷更小。

有些時候,在我們編譯程式時,會出現找不到某某lib的提示,又或者ldd查詢到某庫鏈結指示」not found」,這是因為ldd在/etc/ld.so.cache中不存在相應庫檔案的查詢路徑(使用strace跟蹤ldd命令可以看到ld.so.cache檔案被讀取)。

要解決找不到某庫的問題,我們可以將庫檔案路徑加到使用者的library_path環境變數中,也可以新增到全域性的/etc/ld.so.conf配置檔案中,新增完後以root使用者執行ldconfig,以更新/etc/ld.so.cache快取檔案。

使用rpm命令可以查到動態庫屬於哪個rpm包:

linux # rpm -qf /lib64/libc.so.6

glibc-2.11.1-0.17.4

反過來,對某一rpm包,我們可以查其包含的內容:

linux # rpm -ql glibc-2.11.1-0.17.4

/etc/bindresvport.blacklist

/etc/default/nss

/etc/gai.conf

/etc/ld

.so.cache

/etc/ld

.so.conf

……

devel包中包含了c庫函式的標頭檔案,而普通包中不包含標頭檔案,可以使用rpm查詢對比開發包和普通包:

rpm -ql glibc-2.4-31.77.88.4

rpm -ql glibc-devel-2.4-31.77.88.4

系統呼叫

每乙個系統呼叫對應乙個系統呼叫號(system call number),使用系統呼叫的過程就是將系統呼叫號和引數傳遞給核心。

使用objdump,可以對庫檔案進行反彙編,以下對/lib64/libc.so.6進行反彙編,並檢視getpid函式相應的部分彙編**:

00000000000933e0 <__getpid>:

……933fa:

00933fb:

85 c0 test %eax,%eax

933fd:

75 f0 jne 933ef <__getpid+0xf>933ff: b8

2700

0000 mov $0x27,%eax

93404: 0f 05

syscall

93406: 85 d2 test %edx,%edx

……

在以上輸出中,mov指令將系統呼叫號0x27放入eax暫存器中,0x27作為syscall的引數,syscall完成呼叫getpid的工作。

系統呼叫與系統呼叫號對應關係在include/asm/unistd.h中定義,我們可以查到getpid相應的定義語句:

#define __nr_getpid 39__syscall(__nr_getpid, sys_getpid)

unistd.h定義了posix標準提供的系統呼叫,所有符合posix標準的unix系統均提供該標頭檔案。

我們可以直接傳遞系統呼叫號給syscall函式,完成系統呼叫,以下程式說明了如何使用syscall直接完成getpid系統呼叫:

#define _gnu_source#include

#include

#include

#include

int main(int argc, char *ar**)

因而總結來說,使用系統呼叫的方式有兩種:

c庫中封裝了系統呼叫,通過c庫間接呼叫

傳遞系統呼叫號,通過syscall直接呼叫

第2種方式存在的意義在於,當kernel提供了新的系統呼叫,而c庫又沒有更新時,可以使用syscall呼叫新的系統呼叫。

reference: chapter 5 - system calls, linux kernel development.3rd.edition

kernel與檔案系統通訊

在linux的 proc檔案下生成乙個模組,用於kernel與檔案系統進行資料互動 makefile檔案內容如下 makefile 3.2.0 obj m myproctest.o kernel home wireless documents mydnew update linux 3.2.0 pw...

kernel筆記 核心同步與鎖

核心同步 核心同步解決併發帶來的問題,多個執行緒對同一資料進行修改,資料會出現不一致的情況,同步用於保護共享資料等資源。有兩種形式的併發 同時進行式併發,在不同cpu上執行的程序同時訪問共享資料 二次進入式併發,某程序讀寫一段資料時,中斷觸發,在中斷處理函式中再次修改之前程序讀寫的內容 訪問共享資料...

檔案與檔案系統筆記

開啟檔案 open file,mode r buffering none,encoding none,errors none,newline none,closefd true open file and return a stream.raise oserror upon failure.file...