Linux內核中系統調用詳解_第1頁
Linux內核中系統調用詳解_第2頁
Linux內核中系統調用詳解_第3頁
Linux內核中系統調用詳解_第4頁
Linux內核中系統調用詳解_第5頁
已閱讀5頁,還剩9頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第第頁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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論