庫檔案
先從我們熟悉的
c庫入手,理解系統呼叫(system call)。c**中呼叫printf函式,經歷了以下呼叫過程:
最終輸出的功能由核心中write呼叫完成,c庫封裝了系統呼叫。
對於以下hello world程式:
#includeintmain()
我們可以使用ldd檢視程式依賴的庫檔案:
linux # ldd hellolinux-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.6glibc-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.4rpm -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...