1. 系統呼叫的作用
實現多工和虛擬記憶體的需要
2. 在linux中,系統呼叫是除了異常和陷入之外,使用者空間訪問kernel的唯一手段。
3. 系統呼叫在出現錯誤的時候c庫會把錯誤碼寫入errno全域性變數。通過呼叫perror()庫函式,可以把變數翻譯成使用者可以理解的錯誤字串。
4. 在include/linux/syscalls.h中列出了一些列定義系統呼叫時用到的巨集,如:
#define syscall_define1(name, ...) syscall_definex(1, _##name, __va_args__)
#define syscall_define2(name, ...) syscall_definex(2, _##name, __va_args__)
#define syscall_define3(name, ...) syscall_definex(3, _##name, __va_args__)
#define syscall_define4(name, ...) syscall_definex(4, _##name, __va_args__)
#define syscall_define5(name, ...) syscall_definex(5, _##name, __va_args__)
#define syscall_define6(name, ...) syscall_definex(6, _##name, __va_args__)
#define syscall_definex(x, sname, ...) \
syscall_metadata
(sname,x
,__va_args__
)\
__syscall_definex(x
,sname
,__va_args__
)
如open系統呼叫的定義 (fs/open.c中):
syscall_define3
(open
,const
char
__user
*,filename
,int
,flags
,umode_t
,mode
)
5. 在定義系統呼叫是會使用asmlinkage限定詞,目的是告訴編譯器僅從棧中提取該函式的引數。
6. 每乙個系統呼叫都被賦予乙個系統呼叫號,獨一無二。使用者空間的程序執行系統呼叫時會將系統呼叫號傳遞給kernel,kernel據此判斷需要執行那個系統呼叫。
在arm架構的kernel程式碼,系統呼叫表如下,其中在表中的號就是系統呼叫號。
arch
/arm
/kernel
/entry
-common.s
中:
.
type sys_call_table
,#object
entry
(sys_call_table
)
#include "calls.s"
在
arch
/arm
/kernel
/call.s
中:
/*0*/
call
(sys_restart_syscall
)
call
(sys_exit
)
call
(sys_fork
)
call
(sys_read
)
call
(sys_write
)
/*5*/
call
(sys_open
)
call
(sys_close
)
call
(sys_ni_syscall)/*
was sys_waitpid
*/
call
(sys_creat
)
...
...
在arm64架構的kernel程式碼中如下:
在
arch
/arm64
/kernel
/sys.c
中:
#undef __syscall
#define __syscall(nr, sym) [nr] = sym,
/*
*
thesys_call_table array must be
4kaligned to be accessible from
*
kernel
/entry.s
.
*/
void
*sys_call_table
[__nr_syscalls
]__aligned
(4096)=
;
在
arch
/arm64
/include
/asm
/unistd32.h
中:
#define __nr_restart_syscall 0
__syscall
(__nr_restart_syscall
,sys_restart_syscall
)
#define __nr_exit 1
__syscall
(__nr_exit
,sys_exit
)
#define __nr_fork 2
__syscall
(__nr_fork
,sys_fork
)
#define __nr_read 3
__syscall
(__nr_read
,sys_read
)
#define __nr_write 4
__syscall
(__nr_write
,sys_write
)
#define __nr_open 5
__syscall
(__nr_open
,compat_sys_open
)
#define __nr_close 6
__syscall
(__nr_close
,sys_close
)
/*
7was sys_waitpid
*/
__syscall(7
,sys_ni_syscall
)
#define __nr_creat 8
__syscall
(__nr_creat
,sys_creat
)
...
...
7. linux核心通過軟中斷引發乙個異常來促使系統切換到核心態去執行異常處理程式,在該異常處理程式中會或獲得使用者傳給的系統呼叫號和其他引數,根據系統呼叫號決定執行那個系統呼叫處理程式。對於arm架構是通過svc軟中斷指令實現的。
8. copy_to_user()和copy_from_user()
在核心空間接受乙個使用者空間的指標的時候,需要做如下檢查:
上述的兩個方法在完成了必須的檢查和核心空間和使用者空間之間資料拷貝 。需要注意的是返回值的含義:
此外,當包含使用者資料的頁被換出到硬碟上而不是在物理記憶體上時,這個兩函式都會引起阻塞,此時程序會休眠,知道缺頁處理程式將頁從硬碟重新換回到物理記憶體。
9. 核心執行系統呼叫的時候處於程序上下文,current指標指向當前任務,即引發系統呼叫的那個程序
10. 在程序上下文,核心可以睡眠並且可以被搶占。
11. 必須保證系統呼叫是可衝入的。
12. 下面是執行系統呼叫的連鎖反應:陷入核心,傳遞系統呼叫號和引數,執行正確的系統呼叫函式,並把返回值帶回到使用者空間
來自為知筆記(wiz)
第五章 系統呼叫
系統呼叫在使用者程序和硬體裝置之間新增了乙個中間層。該層的作用有三個 系統呼叫是使用者空間訪問核心的唯一手段 除異常和陷入外,它們是核心唯一的合法入口,實際上其它裝置檔案和 proc之類的方式,最終也還是要通過系統呼叫進行訪問。一般情況下,應用程式通過使用者空間時線的應用程式設計介面 api 而不是...
第五章 系統呼叫
第二,系統呼叫保證了系統的穩定和安全。作為硬體裝置和應用程式之間的中間人,核心可以基於許可權 使用者型別和其它一些規則對需要進行的訪問進行裁決。第三,每個程序都執行在虛擬系統中,而在使用者空間和系統的其餘部分提供這樣一層公共介面,也是出於這種考慮。linux 系統呼叫的高效能顯而易見。系統呼叫被加入...
python第五章 Python學習(第五章)
記錄所有的名片字典 card list defshow menu 顯示資訊 print 50 print 歡迎使用 名片管理系統 v1.0 print print 1.新增名片 print 2.顯示全部 print 3.搜尋名片 print print 0.退出系統 print 50 defnew ...