版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第第頁(yè)Linux內(nèi)核中系統(tǒng)調(diào)用詳解什么是系統(tǒng)調(diào)用?
(Linux)內(nèi)核中設(shè)置了一組用于實(shí)現(xiàn)各種系統(tǒng)功能的子程序,稱(chēng)為系統(tǒng)調(diào)用。用戶(hù)可以通過(guò)系統(tǒng)調(diào)用命令在自己的應(yīng)用程序中調(diào)用它們。從某種角度來(lái)看,系統(tǒng)調(diào)用和普通的函數(shù)調(diào)用非常相似。區(qū)別僅僅在于,系統(tǒng)調(diào)用由(操作系統(tǒng))核心提供,運(yùn)行于核心態(tài);而普通的函數(shù)調(diào)用由函數(shù)庫(kù)或用戶(hù)自己提供,運(yùn)行于用戶(hù)態(tài)。
隨Linux核心還提供了一些(C語(yǔ)言)函數(shù)庫(kù),這些庫(kù)對(duì)系統(tǒng)調(diào)用進(jìn)行了一些包裝和擴(kuò)展,因?yàn)檫@些庫(kù)函數(shù)與系統(tǒng)調(diào)用的關(guān)系非常緊密,所以習(xí)慣上把這些函數(shù)也稱(chēng)為系統(tǒng)調(diào)用。
為什么要用系統(tǒng)調(diào)用?
實(shí)際上,很多已經(jīng)被我們習(xí)以為常的C語(yǔ)言標(biāo)準(zhǔn)函數(shù),在Linux平臺(tái)上的實(shí)現(xiàn)都是靠系統(tǒng)調(diào)用完成的,所以如果想對(duì)系統(tǒng)底層的原理作深入的了解,掌握各種系統(tǒng)調(diào)用是初步的要求。進(jìn)一步,若想成為一名Linux下(編程)高手,也就是我們常說(shuō)的Hacker,其標(biāo)志之一也是能對(duì)各種系統(tǒng)調(diào)用有透徹的了解。
即使除去上面的原因,在平常的編程中你也會(huì)發(fā)現(xiàn),在很多情況下,系統(tǒng)調(diào)用是實(shí)現(xiàn)你的想法的簡(jiǎn)潔有效的途徑,所以有可能的話(huà)應(yīng)該盡量多掌握一些系統(tǒng)調(diào)用,這會(huì)對(duì)你的程序設(shè)計(jì)過(guò)程帶來(lái)意想不到的幫助。
系統(tǒng)調(diào)用是怎么工作的?
一般的,進(jìn)程是不能訪(fǎng)問(wèn)內(nèi)核的。它不能訪(fǎng)問(wèn)內(nèi)核所占內(nèi)存空間也不能調(diào)用內(nèi)核函數(shù)。(CPU)(硬件)決定了這些(這就是為什么它被稱(chēng)作"保護(hù)模式")。系統(tǒng)調(diào)用是這些規(guī)則的一個(gè)例外。其原理是進(jìn)程先用適當(dāng)?shù)闹堤畛洌拇嫫鳎?,然后調(diào)用一個(gè)特殊的指令,這個(gè)指令會(huì)跳到一個(gè)事先定義的內(nèi)核中的一個(gè)位置(當(dāng)然,這個(gè)位置是用戶(hù)進(jìn)程可讀但是不可寫(xiě)的)。在(Intel)CPU中,這個(gè)由中斷0x80實(shí)現(xiàn)。硬件知道一旦你跳到這個(gè)位置,你就不是在限制模式下運(yùn)行的用戶(hù),而是作為操作系統(tǒng)的內(nèi)核--所以你就可以為所欲為。
進(jìn)程可以跳轉(zhuǎn)到的內(nèi)核位置叫做sysem_call。這個(gè)過(guò)程檢查系統(tǒng)調(diào)用號(hào),這個(gè)號(hào)碼告訴內(nèi)核進(jìn)程請(qǐng)求哪種服務(wù)。然后,它查看系統(tǒng)調(diào)用表(sys_call_table)找到所調(diào)用的內(nèi)核函數(shù)入口地址。接著,就調(diào)用函數(shù),等返回后,做一些系統(tǒng)檢查,最后返回到進(jìn)程(或到其他進(jìn)程,如果這個(gè)進(jìn)程時(shí)間用盡)。
具體過(guò)程如下圖所示:
如何使用系統(tǒng)調(diào)用?
先來(lái)看一個(gè)例子:
這是因?yàn)樵冢╰i)me.h中實(shí)際上已經(jīng)用庫(kù)函數(shù)的形式實(shí)現(xiàn)了time這個(gè)系統(tǒng)調(diào)用,替我們省掉了調(diào)用_syscall1宏展開(kāi)得到函數(shù)原型這一步。
大多數(shù)系統(tǒng)調(diào)用都在各種C語(yǔ)言函數(shù)庫(kù)中有所實(shí)現(xiàn),所以在一般情況下,我們都可以像調(diào)用普通的庫(kù)函數(shù)那樣調(diào)用系統(tǒng)調(diào)用,只在極個(gè)別的情況下,我們才有機(jī)會(huì)用到_syscall*()這幾個(gè)宏。
調(diào)用性能問(wèn)題
系統(tǒng)調(diào)用需要從用戶(hù)空間陷入內(nèi)核空間,處理完后,又需要返回用戶(hù)空間。其中除了系統(tǒng)調(diào)用服務(wù)例程的實(shí)際耗時(shí)外,陷入/返回過(guò)程和系統(tǒng)調(diào)用處理程序(查系統(tǒng)調(diào)用表、存儲(chǔ)恢復(fù)用戶(hù)現(xiàn)場(chǎng))也需要花銷(xiāo)一些時(shí)間,這些時(shí)間加起來(lái)就是一個(gè)系統(tǒng)調(diào)用的響應(yīng)速度。系統(tǒng)調(diào)用不比別的用戶(hù)程序,它對(duì)性能要求很苛刻,因?yàn)樗枰萑雰?nèi)核執(zhí)行,所以和其他內(nèi)核程序一樣要求代碼簡(jiǎn)潔、執(zhí)行迅速。幸好Linux具有令人難以置信的上下文切換速度,使得其進(jìn)出內(nèi)核都被優(yōu)化得簡(jiǎn)潔高效;同時(shí)所有Linux系統(tǒng)調(diào)用處理程序和每個(gè)系統(tǒng)調(diào)用本身也都非常簡(jiǎn)潔。
絕大多數(shù)情況下,Linux系統(tǒng)調(diào)用性能是可以接受的,但是對(duì)于一些對(duì)性能要求非常高的應(yīng)用來(lái)說(shuō),它們雖然希望利用系統(tǒng)調(diào)用的服務(wù),但卻希望加快相應(yīng)速度,避免陷入/返回和系統(tǒng)調(diào)用處理程序帶來(lái)的花銷(xiāo),因此采用由內(nèi)核直接調(diào)用系統(tǒng)調(diào)用服務(wù)例程,最好的例子就HTTPD——它為了避免上述開(kāi)銷(xiāo),從內(nèi)核調(diào)用socket等系統(tǒng)調(diào)用服務(wù)例程。
Linux系統(tǒng)調(diào)用列表
·進(jìn)程控制
f(or)k創(chuàng)建一個(gè)新進(jìn)程
clone按指定條件創(chuàng)建子進(jìn)程
execve運(yùn)行可執(zhí)行文件
exit中止進(jìn)程
_exit立即中止當(dāng)前進(jìn)程
getdtablesize進(jìn)程所能打開(kāi)的最大文件數(shù)
getpgid獲取指定進(jìn)程組標(biāo)識(shí)號(hào)
setpgid設(shè)置指定進(jìn)程組標(biāo)志號(hào)
getpgrp獲取當(dāng)前進(jìn)程組標(biāo)識(shí)號(hào)
setpgrp設(shè)置當(dāng)前進(jìn)程組標(biāo)志號(hào)
get(pi)d獲取進(jìn)程標(biāo)識(shí)號(hào)
getppid獲取父進(jìn)程標(biāo)識(shí)號(hào)
getpriority獲取調(diào)度優(yōu)先級(jí)
setpriority設(shè)置調(diào)度優(yōu)先級(jí)
modify_ldt讀寫(xiě)進(jìn)程的本地描述表
nanosleep使進(jìn)程睡眠指定的時(shí)間
n(ic)e改變分時(shí)進(jìn)程的優(yōu)先級(jí)
pause掛起進(jìn)程,等待(信號(hào))
pe(rs)onality設(shè)置進(jìn)程運(yùn)行域
prctl對(duì)進(jìn)程進(jìn)行特定操作
ptrace進(jìn)程跟蹤
sched_get_priority_max取得靜態(tài)優(yōu)先級(jí)的上限
sched_get_priority_min取得靜態(tài)優(yōu)先級(jí)的下限
sched_getpa(ram)取得進(jìn)程的調(diào)度參數(shù)
sched_getscheduler取得指定進(jìn)程的調(diào)度策略
sched_rr_get_interval取得按RR(算法)調(diào)度的實(shí)時(shí)進(jìn)程的時(shí)間片長(zhǎng)度
sched_setparam設(shè)置進(jìn)程的調(diào)度參數(shù)
sched_setscheduler設(shè)置指定進(jìn)程的調(diào)度策略和參數(shù)
sched_yield進(jìn)程主動(dòng)讓出(處理器),并將自己等候調(diào)度隊(duì)列隊(duì)尾
vfork創(chuàng)建一個(gè)子進(jìn)程,以供執(zhí)行新程序,常與execve等同時(shí)使用
w(ai)t等待子進(jìn)程終止
wait3參見(jiàn)wait
waitpid等待指定子進(jìn)程終止
wait4參見(jiàn)waitpid
capget獲取進(jìn)程權(quán)限
capset設(shè)置進(jìn)程權(quán)限
getsid獲取會(huì)晤標(biāo)識(shí)號(hào)
setsid設(shè)置會(huì)晤標(biāo)識(shí)號(hào)
·文件系統(tǒng)控制
1.文件讀寫(xiě)操作
fcntl文件控制
open打開(kāi)文件
creat創(chuàng)建新文件
close關(guān)閉文件描述字
re(ad)讀文件
wri(te)寫(xiě)文件
readv從文件讀入數(shù)據(jù)到緩沖數(shù)組中
writev將緩沖數(shù)組里的數(shù)據(jù)寫(xiě)入文件
pread對(duì)文件隨機(jī)讀
pwrite對(duì)文件隨機(jī)寫(xiě)
lseek移動(dòng)文件指針
_llseek在64位地址空間里移動(dòng)文件指針
dup復(fù)制已打開(kāi)的文件描述字
dup2按指定條件復(fù)制文件描述字
flock文件加/解鎖
pollI/O多路轉(zhuǎn)換
truncate截?cái)辔募?/p>
ftruncate參見(jiàn)truncate
umask設(shè)置文件權(quán)限掩碼
fsync把文件在內(nèi)存中的部分寫(xiě)回磁盤(pán)
2.文件系統(tǒng)操作
(ac)cess確定文件的可存取性
chdir改變當(dāng)前工作目錄
fchdir參見(jiàn)chdir
chmod改變文件方式
fchmod參見(jiàn)chmod
chown改變文件的屬主或用戶(hù)組
fchown參見(jiàn)chown
lchown參見(jiàn)chown
chroot改變根目錄
stat取文件狀態(tài)信息
lstat參見(jiàn)stat
fstat參見(jiàn)stat
statfs取文件系統(tǒng)信息
fstatfs參見(jiàn)statfs
readdir讀取目錄項(xiàng)
getdents讀取目錄項(xiàng)
mkdir創(chuàng)建目錄
mknod創(chuàng)建索引節(jié)點(diǎn)
rmdir刪除目錄
rename文件改名
link創(chuàng)建鏈接
symlink創(chuàng)建符號(hào)鏈接
unlink刪除鏈接
readlink讀符號(hào)鏈接的值
mount安裝文件系統(tǒng)
umount卸下文件系統(tǒng)
ustat取文件系統(tǒng)信息
utime改變文件的訪(fǎng)問(wèn)修改時(shí)間
utimes參見(jiàn)utime
quotactl控制磁盤(pán)配額
·系統(tǒng)控制
ioctlI/O總控制函數(shù)
_sysctl讀/寫(xiě)系統(tǒng)參數(shù)
acct啟用或禁止進(jìn)程記賬
getrlimit獲取系統(tǒng)資源上限
setrlimit設(shè)置系統(tǒng)資源上限
getrusage獲取系統(tǒng)資源使用情況
uselib選擇要使用的二進(jìn)制函數(shù)庫(kù)
ioperm設(shè)置(端口)I/O權(quán)限
iopl改變進(jìn)程I/O權(quán)限級(jí)別
outb低級(jí)端口操作
reboot重新啟動(dòng)
swapon打開(kāi)交換文件和設(shè)備
swapoff關(guān)閉交換文件和設(shè)備
bdflush控制bdflush守護(hù)進(jìn)程
sysfs取核心支持的文件系統(tǒng)類(lèi)型
sysinfo取得系統(tǒng)信息
adjtimex調(diào)整系統(tǒng)(時(shí)鐘)
al(arm)設(shè)置進(jìn)程的鬧鐘
getitimer獲取計(jì)時(shí)器值
setitimer設(shè)置計(jì)時(shí)器值
gettimeofday取時(shí)間和時(shí)區(qū)
settimeofday設(shè)置時(shí)間和時(shí)區(qū)
stime設(shè)置系統(tǒng)日期和時(shí)間
time取得系統(tǒng)時(shí)間
times取進(jìn)程運(yùn)行時(shí)間
uname獲取當(dāng)前UNIX系統(tǒng)的名稱(chēng)、版本和主機(jī)等信息
vhangup掛起當(dāng)前終端
nfsservctl對(duì)NFS守護(hù)進(jìn)程進(jìn)行控制
vm86進(jìn)入(模擬)8086模式
create_module創(chuàng)建可裝載的模塊項(xiàng)
delete_module刪除可裝載的模塊項(xiàng)
init_module初始化模塊
query_module查詢(xún)模塊信息
*get_kernel_syms取得核心符號(hào),已被query_module代替
·內(nèi)存管理
brk改變數(shù)據(jù)段空間的分配
sbrk參見(jiàn)brk
mlock內(nèi)存頁(yè)面加鎖
munlock內(nèi)存頁(yè)面解鎖
mlockall調(diào)用進(jìn)程所有內(nèi)存頁(yè)面加鎖
munlockall調(diào)用進(jìn)程所有內(nèi)存頁(yè)面解鎖
mmap映射虛擬內(nèi)存頁(yè)
munmap去除內(nèi)存頁(yè)映射
mremap重新映射虛擬內(nèi)存地址
msync將映射內(nèi)存中的數(shù)據(jù)寫(xiě)回磁盤(pán)
mprotect設(shè)置內(nèi)存映像保護(hù)
getpagesize獲取頁(yè)面大小
sync將內(nèi)存緩沖區(qū)數(shù)據(jù)寫(xiě)回硬盤(pán)
cacheflush將指定緩沖區(qū)中的內(nèi)容寫(xiě)回磁盤(pán)
·(網(wǎng)絡(luò))管理
getdomainname取域名
setdomainname設(shè)置域名
gethostid獲取主機(jī)標(biāo)識(shí)號(hào)
sethostid設(shè)置主機(jī)標(biāo)識(shí)號(hào)
gethostname獲取本主機(jī)名稱(chēng)
sethostname設(shè)置主機(jī)名稱(chēng)
·socket控制
socketcallsocket系統(tǒng)調(diào)用
socket建立socket
bind綁定socket到端口
connect連接遠(yuǎn)程主機(jī)
accept響應(yīng)socket連接請(qǐng)求
send通過(guò)socket發(fā)送信息
sendto發(fā)送UDP信息
sendmsg參見(jiàn)send
recv通過(guò)socket接收信息
recvfrom接收UDP信息
recvmsg參見(jiàn)recv
listen監(jiān)聽(tīng)socket端口
select對(duì)多路同步I/O進(jìn)行輪詢(xún)
shutdown關(guān)閉socket上的連接
getsockname取得本地socket名字
getpeername獲?。ㄍㄐ牛?duì)方的socket名字
getsockopt取端口設(shè)置
setsockopt設(shè)置端口參數(shù)
sendfile在文件或端口間傳輸數(shù)據(jù)
socketpair創(chuàng)建一對(duì)已聯(lián)接的無(wú)名socket
·用戶(hù)管理
getuid獲取用戶(hù)標(biāo)識(shí)號(hào)
setuid設(shè)置用戶(hù)標(biāo)志號(hào)
getgid獲取組標(biāo)識(shí)號(hào)
setgid設(shè)置組標(biāo)志號(hào)
getegid獲取有效組標(biāo)識(shí)號(hào)
setegid設(shè)置有效組標(biāo)識(shí)號(hào)
geteuid獲取有效用戶(hù)標(biāo)識(shí)號(hào)
seteuid設(shè)置有效用戶(hù)標(biāo)識(shí)號(hào)
setregid分別設(shè)置真實(shí)和有效的的組標(biāo)識(shí)號(hào)
setreuid分別設(shè)置真實(shí)和有效的用戶(hù)標(biāo)識(shí)號(hào)
getresgid分別獲取真實(shí)的,有效的和保存過(guò)的組標(biāo)識(shí)號(hào)
setresgid分別設(shè)置真實(shí)的,有效的和保存過(guò)的組標(biāo)識(shí)號(hào)
getresuid分別獲取真實(shí)的,有效的和保存過(guò)的用戶(hù)標(biāo)識(shí)號(hào)
setresuid分別設(shè)置真實(shí)的,有效的和保存過(guò)的用戶(hù)標(biāo)識(shí)號(hào)
se(tf)sgid設(shè)置文件系統(tǒng)檢查時(shí)使用的組標(biāo)識(shí)號(hào)
setfsuid設(shè)置文件系統(tǒng)檢查時(shí)使用的用戶(hù)標(biāo)識(shí)號(hào)
getgroups獲取后補(bǔ)組標(biāo)志清單
setgroups設(shè)置后補(bǔ)組標(biāo)志清單
·進(jìn)程間通信
ipc進(jìn)程間通信總控制調(diào)用
信號(hào)
sigaction設(shè)置對(duì)指定信號(hào)的處理方法
sigprocmask根據(jù)參數(shù)對(duì)信號(hào)集中的信號(hào)執(zhí)行阻塞/解除阻塞等
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《建設(shè)工程施工合同示范文本》
- 幼兒園健康教案《五官很重要》及教學(xué)反思
- 2025年運(yùn)載火箭控制系統(tǒng)仿真實(shí)時(shí)處理系統(tǒng)合作協(xié)議書(shū)
- 后勤部門(mén)工作參考計(jì)劃
- 2025年聚甲醛、聚甲醛合金及改性材料項(xiàng)目發(fā)展計(jì)劃
- 大型型貨車(chē)租賃合同書(shū)
- 特別贊助協(xié)議書(shū)
- 國(guó)際航運(yùn)船只租賃合同
- 商場(chǎng)租賃合同書(shū)
- 2025年古馬隆樹(shù)脂項(xiàng)目建議書(shū)
- 無(wú)縫鋼管服務(wù)方案
- 排澇泵站養(yǎng)護(hù)方案范本
- XX醫(yī)院臨床醫(yī)療質(zhì)量考核通用記錄表
- 城市交通樞紐運(yùn)營(yíng)故障應(yīng)急預(yù)案
- 料場(chǎng)加工施工方案
- 【淺析人工智能在石油行業(yè)中的應(yīng)用3400字(論文)】
- 湖北省十堰市竹山縣2023-2024學(xué)年三上數(shù)學(xué)期末經(jīng)典模擬試題含答案
- 產(chǎn)品試制前準(zhǔn)備狀態(tài)檢查報(bào)告
- (全)外研版丨九年級(jí)下冊(cè)英語(yǔ)各模塊作文范文(名校版)
- 煤礦企業(yè)瓦斯防治能力評(píng)估管理辦法和基本標(biāo)準(zhǔn)
- 食品供應(yīng)質(zhì)量承諾書(shū)
評(píng)論
0/150
提交評(píng)論