




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第第頁Linux內核中系統調用詳解什么是系統調用?
(Linux)內核中設置了一組用于實現各種系統功能的子程序,稱為系統調用。用戶可以通過系統調用命令在自己的應用程序中調用它們。從某種角度來看,系統調用和普通的函數調用非常相似。區別僅僅在于,系統調用由(操作系統)核心提供,運行于核心態;而普通的函數調用由函數庫或用戶自己提供,運行于用戶態。
隨Linux核心還提供了一些(C語言)函數庫,這些庫對系統調用進行了一些包裝和擴展,因為這些庫函數與系統調用的關系非常緊密,所以習慣上把這些函數也稱為系統調用。
為什么要用系統調用?
實際上,很多已經被我們習以為常的C語言標準函數,在Linux平臺上的實現都是靠系統調用完成的,所以如果想對系統底層的原理作深入的了解,掌握各種系統調用是初步的要求。進一步,若想成為一名Linux下(編程)高手,也就是我們常說的Hacker,其標志之一也是能對各種系統調用有透徹的了解。
即使除去上面的原因,在平常的編程中你也會發現,在很多情況下,系統調用是實現你的想法的簡潔有效的途徑,所以有可能的話應該盡量多掌握一些系統調用,這會對你的程序設計過程帶來意想不到的幫助。
系統調用是怎么工作的?
一般的,進程是不能訪問內核的。它不能訪問內核所占內存空間也不能調用內核函數。(CPU)(硬件)決定了這些(這就是為什么它被稱作"保護模式")。系統調用是這些規則的一個例外。其原理是進程先用適當的值填充(寄存器),然后調用一個特殊的指令,這個指令會跳到一個事先定義的內核中的一個位置(當然,這個位置是用戶進程可讀但是不可寫的)。在(Intel)CPU中,這個由中斷0x80實現。硬件知道一旦你跳到這個位置,你就不是在限制模式下運行的用戶,而是作為操作系統的內核--所以你就可以為所欲為。
進程可以跳轉到的內核位置叫做sysem_call。這個過程檢查系統調用號,這個號碼告訴內核進程請求哪種服務。然后,它查看系統調用表(sys_call_table)找到所調用的內核函數入口地址。接著,就調用函數,等返回后,做一些系統檢查,最后返回到進程(或到其他進程,如果這個進程時間用盡)。
具體過程如下圖所示:
如何使用系統調用?
先來看一個例子:
這是因為在(ti)me.h中實際上已經用庫函數的形式實現了time這個系統調用,替我們省掉了調用_syscall1宏展開得到函數原型這一步。
大多數系統調用都在各種C語言函數庫中有所實現,所以在一般情況下,我們都可以像調用普通的庫函數那樣調用系統調用,只在極個別的情況下,我們才有機會用到_syscall*()這幾個宏。
調用性能問題
系統調用需要從用戶空間陷入內核空間,處理完后,又需要返回用戶空間。其中除了系統調用服務例程的實際耗時外,陷入/返回過程和系統調用處理程序(查系統調用表、存儲恢復用戶現場)也需要花銷一些時間,這些時間加起來就是一個系統調用的響應速度。系統調用不比別的用戶程序,它對性能要求很苛刻,因為它需要陷入內核執行,所以和其他內核程序一樣要求代碼簡潔、執行迅速。幸好Linux具有令人難以置信的上下文切換速度,使得其進出內核都被優化得簡潔高效;同時所有Linux系統調用處理程序和每個系統調用本身也都非常簡潔。
絕大多數情況下,Linux系統調用性能是可以接受的,但是對于一些對性能要求非常高的應用來說,它們雖然希望利用系統調用的服務,但卻希望加快相應速度,避免陷入/返回和系統調用處理程序帶來的花銷,因此采用由內核直接調用系統調用服務例程,最好的例子就HTTPD——它為了避免上述開銷,從內核調用socket等系統調用服務例程。
Linux系統調用列表
·進程控制
f(or)k創建一個新進程
clone按指定條件創建子進程
execve運行可執行文件
exit中止進程
_exit立即中止當前進程
getdtablesize進程所能打開的最大文件數
getpgid獲取指定進程組標識號
setpgid設置指定進程組標志號
getpgrp獲取當前進程組標識號
setpgrp設置當前進程組標志號
get(pi)d獲取進程標識號
getppid獲取父進程標識號
getpriority獲取調度優先級
setpriority設置調度優先級
modify_ldt讀寫進程的本地描述表
nanosleep使進程睡眠指定的時間
n(ic)e改變分時進程的優先級
pause掛起進程,等待(信號)
pe(rs)onality設置進程運行域
prctl對進程進行特定操作
ptrace進程跟蹤
sched_get_priority_max取得靜態優先級的上限
sched_get_priority_min取得靜態優先級的下限
sched_getpa(ram)取得進程的調度參數
sched_getscheduler取得指定進程的調度策略
sched_rr_get_interval取得按RR(算法)調度的實時進程的時間片長度
sched_setparam設置進程的調度參數
sched_setscheduler設置指定進程的調度策略和參數
sched_yield進程主動讓出(處理器),并將自己等候調度隊列隊尾
vfork創建一個子進程,以供執行新程序,常與execve等同時使用
w(ai)t等待子進程終止
wait3參見wait
waitpid等待指定子進程終止
wait4參見waitpid
capget獲取進程權限
capset設置進程權限
getsid獲取會晤標識號
setsid設置會晤標識號
·文件系統控制
1.文件讀寫操作
fcntl文件控制
open打開文件
creat創建新文件
close關閉文件描述字
re(ad)讀文件
wri(te)寫文件
readv從文件讀入數據到緩沖數組中
writev將緩沖數組里的數據寫入文件
pread對文件隨機讀
pwrite對文件隨機寫
lseek移動文件指針
_llseek在64位地址空間里移動文件指針
dup復制已打開的文件描述字
dup2按指定條件復制文件描述字
flock文件加/解鎖
pollI/O多路轉換
truncate截斷文件
ftruncate參見truncate
umask設置文件權限掩碼
fsync把文件在內存中的部分寫回磁盤
2.文件系統操作
(ac)cess確定文件的可存取性
chdir改變當前工作目錄
fchdir參見chdir
chmod改變文件方式
fchmod參見chmod
chown改變文件的屬主或用戶組
fchown參見chown
lchown參見chown
chroot改變根目錄
stat取文件狀態信息
lstat參見stat
fstat參見stat
statfs取文件系統信息
fstatfs參見statfs
readdir讀取目錄項
getdents讀取目錄項
mkdir創建目錄
mknod創建索引節點
rmdir刪除目錄
rename文件改名
link創建鏈接
symlink創建符號鏈接
unlink刪除鏈接
readlink讀符號鏈接的值
mount安裝文件系統
umount卸下文件系統
ustat取文件系統信息
utime改變文件的訪問修改時間
utimes參見utime
quotactl控制磁盤配額
·系統控制
ioctlI/O總控制函數
_sysctl讀/寫系統參數
acct啟用或禁止進程記賬
getrlimit獲取系統資源上限
setrlimit設置系統資源上限
getrusage獲取系統資源使用情況
uselib選擇要使用的二進制函數庫
ioperm設置(端口)I/O權限
iopl改變進程I/O權限級別
outb低級端口操作
reboot重新啟動
swapon打開交換文件和設備
swapoff關閉交換文件和設備
bdflush控制bdflush守護進程
sysfs取核心支持的文件系統類型
sysinfo取得系統信息
adjtimex調整系統(時鐘)
al(arm)設置進程的鬧鐘
getitimer獲取計時器值
setitimer設置計時器值
gettimeofday取時間和時區
settimeofday設置時間和時區
stime設置系統日期和時間
time取得系統時間
times取進程運行時間
uname獲取當前UNIX系統的名稱、版本和主機等信息
vhangup掛起當前終端
nfsservctl對NFS守護進程進行控制
vm86進入(模擬)8086模式
create_module創建可裝載的模塊項
delete_module刪除可裝載的模塊項
init_module初始化模塊
query_module查詢模塊信息
*get_kernel_syms取得核心符號,已被query_module代替
·內存管理
brk改變數據段空間的分配
sbrk參見brk
mlock內存頁面加鎖
munlock內存頁面解鎖
mlockall調用進程所有內存頁面加鎖
munlockall調用進程所有內存頁面解鎖
mmap映射虛擬內存頁
munmap去除內存頁映射
mremap重新映射虛擬內存地址
msync將映射內存中的數據寫回磁盤
mprotect設置內存映像保護
getpagesize獲取頁面大小
sync將內存緩沖區數據寫回硬盤
cacheflush將指定緩沖區中的內容寫回磁盤
·(網絡)管理
getdomainname取域名
setdomainname設置域名
gethostid獲取主機標識號
sethostid設置主機標識號
gethostname獲取本主機名稱
sethostname設置主機名稱
·socket控制
socketcallsocket系統調用
socket建立socket
bind綁定socket到端口
connect連接遠程主機
accept響應socket連接請求
send通過socket發送信息
sendto發送UDP信息
sendmsg參見send
recv通過socket接收信息
recvfrom接收UDP信息
recvmsg參見recv
listen監聽socket端口
select對多路同步I/O進行輪詢
shutdown關閉socket上的連接
getsockname取得本地socket名字
getpeername獲?。ㄍㄐ牛Ψ降膕ocket名字
getsockopt取端口設置
setsockopt設置端口參數
sendfile在文件或端口間傳輸數據
socketpair創建一對已聯接的無名socket
·用戶管理
getuid獲取用戶標識號
setuid設置用戶標志號
getgid獲取組標識號
setgid設置組標志號
getegid獲取有效組標識號
setegid設置有效組標識號
geteuid獲取有效用戶標識號
seteuid設置有效用戶標識號
setregid分別設置真實和有效的的組標識號
setreuid分別設置真實和有效的用戶標識號
getresgid分別獲取真實的,有效的和保存過的組標識號
setresgid分別設置真實的,有效的和保存過的組標識號
getresuid分別獲取真實的,有效的和保存過的用戶標識號
setresuid分別設置真實的,有效的和保存過的用戶標識號
se(tf)sgid設置文件系統檢查時使用的組標識號
setfsuid設置文件系統檢查時使用的用戶標識號
getgroups獲取后補組標志清單
setgroups設置后補組標志清單
·進程間通信
ipc進程間通信總控制調用
信號
sigaction設置對指定信號的處理方法
sigprocmask根據參數對信號集中的信號執行阻塞/解除阻塞等
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國農業大學《自然地理與地貌》2023-2024學年第二學期期末試卷
- 四川長江職業學院《跨國管理》2023-2024學年第二學期期末試卷
- 煙臺幼兒師范高等??茖W?!渡镏扑幑に噷W實驗一》2023-2024學年第二學期期末試卷
- 課件HRBP年度述職報告2024
- 禮儀用品綠色環保設計考核試卷
- 無機堿在木材防腐劑的應用考核試卷
- 摩托車改裝文化與創新實踐考核試卷
- 電影道具制作中的快速原型技術考核試卷
- 硅冶煉過程中的自動化控制系統設計考核試卷
- 玩具行業人才培養與需求分析策略考核試卷
- 護士如何應對患者和家屬的抱怨和不滿
- 2023年河南省普通高校專升本公共英語真題(試卷+答案)
- 23秋國家開放大學《液壓與氣壓傳動》形考任務1-2參考答案
- 2023架空線路復合絕緣子無人機紅外檢測導則
- 2023分布式光伏電站安裝作業指導書
- 新生嬰兒落戶申請表
- 2023年新部編版六年級語文上冊《丁香結》課件
- 化妝造型師工作手冊
- 美國眼科協會臨床指南糖尿病視網膜病變
- 安龍縣海子至灑雨農村道路改擴建項目環境影響報告表
- 菜鳥驛站在小區內申請書
評論
0/150
提交評論