亞寵展、全球?qū)櫸锂a(chǎn)業(yè)風(fēng)向標(biāo)——亞洲寵物展覽會(huì)深度解析
2140
2022-05-29
【引言】
有朋友要求學(xué)習(xí)一下系統(tǒng)調(diào)用的知識(shí)。我們就通過(guò)這篇文章來(lái)了解一下。
【概述】
在計(jì)算機(jī)中,系統(tǒng)調(diào)用(通常縮寫(xiě)為syscall)是計(jì)算機(jī)程序從操作系統(tǒng)的內(nèi)核請(qǐng)求服務(wù)的程序化方式。這可能包括與硬件相關(guān)的服務(wù)(例如,訪(fǎng)問(wèn)硬盤(pán)驅(qū)動(dòng)器),創(chuàng)建和執(zhí)行新進(jìn)程,以及與內(nèi)核服務(wù)(如進(jìn)程調(diào)度)的通信。系統(tǒng)調(diào)用提供了進(jìn)程和操作系統(tǒng)之間的重要接口。
在大多數(shù)系統(tǒng)中,系統(tǒng)調(diào)用只能由用戶(hù)空間的進(jìn)程來(lái)進(jìn)行,而在某些系統(tǒng)中,例如在OS/360及其繼任者中,有特權(quán)的系統(tǒng)代碼也會(huì)發(fā)出系統(tǒng)調(diào)用。
【系統(tǒng)調(diào)用的類(lèi)別】
系統(tǒng)調(diào)用大致可以分為六大類(lèi):
1.??過(guò)程控制
a.??創(chuàng)建進(jìn)程
b.??終止進(jìn)程
c.??載入、執(zhí)行
d.??獲取/設(shè)置過(guò)程屬性
e.??等待時(shí)間、等待事件、信號(hào)事件
f.??分配和釋放內(nèi)存
2.??文件管理
a.??建文件、刪文件
b.??打開(kāi)文件、關(guān)閉文件
c.??讀、寫(xiě)、調(diào)位置
d.??獲取/設(shè)置文件屬性
3.??設(shè)備管理
a.??請(qǐng)求設(shè)器、釋放設(shè)器
b.??讀、寫(xiě)、調(diào)位位置
c.??獲取/設(shè)置設(shè)備屬性
d.??連接或斷開(kāi)設(shè)備
4.??信息維護(hù)
a.??獲取/設(shè)定時(shí)間或日期
b.??獲取/設(shè)置系統(tǒng)數(shù)據(jù)
c.??獲取/設(shè)置進(jìn)程、文件或設(shè)備屬性
5.??通信
a.??建立、斷開(kāi)通信
b.??收發(fā)信息
c.??轉(zhuǎn)移狀態(tài)信息
d.??連接和斷開(kāi)遠(yuǎn)程設(shè)備
6.??保護(hù)措施
a.??獲取/設(shè)置權(quán)限
【安全模型】
除了一些嵌入式系統(tǒng)外,大多數(shù)現(xiàn)代處理器的架構(gòu)都涉及到安全模型。例如,環(huán)形模型指定了軟件可以執(zhí)行的多個(gè)權(quán)限級(jí)別:一個(gè)程序通常被限制在自己的地址空間內(nèi),這樣它就不能訪(fǎng)問(wèn)或修改其他運(yùn)行中的程序或操作系統(tǒng)本身,并且通常被阻止直接操作硬件設(shè)備(如幀緩沖區(qū)或網(wǎng)絡(luò)設(shè)備)。
但是,很多時(shí)候許多應(yīng)用程序需要訪(fǎng)問(wèn)這些組件來(lái)完成自己的任務(wù),因此操作系統(tǒng)就提供了系統(tǒng)調(diào)用,為這類(lèi)操作提供定義良好的、實(shí)現(xiàn)安全的通信方式。
操作系統(tǒng)以最高級(jí)別的權(quán)限執(zhí)行,允許應(yīng)用程序通過(guò)系統(tǒng)調(diào)用請(qǐng)求使用服務(wù),而系統(tǒng)調(diào)用通常是通過(guò)中斷發(fā)起的。中斷會(huì)自動(dòng)使CPU進(jìn)入某種高權(quán)限級(jí)別,然后將控制權(quán)傳遞給內(nèi)核,由內(nèi)核決定調(diào)用程序是否應(yīng)該被授予所請(qǐng)求的服務(wù)。
如果請(qǐng)求服務(wù)被允許的話(huà),內(nèi)核會(huì)執(zhí)行一組特定的指令來(lái)完成任務(wù)。而調(diào)用程序?qū)?nèi)核沒(méi)有直接控制權(quán),任務(wù)完成后將控制權(quán)返回給調(diào)用程序。
【程序庫(kù)API】
一般來(lái)說(shuō),系統(tǒng)環(huán)境會(huì)提供了一個(gè)程序庫(kù)來(lái)暴露一些API,這些API可以在應(yīng)用程序和操作系統(tǒng)之間完成通信任務(wù)。
在類(lèi)似Unix的系統(tǒng)中,這些API通常是C程序庫(kù)庫(kù)(libc)實(shí)現(xiàn)的一部分,例如glibc,它為系統(tǒng)調(diào)用提供了封裝函數(shù),通常與系統(tǒng)調(diào)用的名稱(chēng)相同。
在Windows NT上,這個(gè)API是Native API的一部分,在ntdll.dll庫(kù)中;這是一個(gè)未公開(kāi)發(fā)行的API,被常規(guī)Windows API的實(shí)現(xiàn)所使用,也被Windows上的一些系統(tǒng)程序直接使用。該庫(kù)的封裝函數(shù)層提供了一個(gè)普通函數(shù)調(diào)用的方法(是匯編級(jí)的子程序調(diào)用),用于使用系統(tǒng)調(diào)用,這也使得系統(tǒng)調(diào)用更加模塊化。
在這里,封裝層的主要功能是將所有要傳遞給系統(tǒng)調(diào)用的參數(shù)都放在相應(yīng)的處理器寄存器中(有時(shí)也可以放在調(diào)用棧中),同時(shí)也為內(nèi)核設(shè)置一個(gè)唯一的系統(tǒng)調(diào)用編號(hào)來(lái)調(diào)用。這樣一來(lái),存在于操作系統(tǒng)和應(yīng)用程序之間的庫(kù)就增加了可移植性。
對(duì)庫(kù)函數(shù)本身的調(diào)用不會(huì)導(dǎo)致切換到內(nèi)核模式,通常是正常的子程序調(diào)用(例如,在某些指令集架構(gòu)(ISA)中使用 "CALL"匯編指令)。
實(shí)際的系統(tǒng)調(diào)用確實(shí)將控制權(quán)轉(zhuǎn)移到了內(nèi)核(而且這比抽象的庫(kù)調(diào)用更依賴(lài)于具體的實(shí)現(xiàn)和平臺(tái)環(huán)境)。例如,在類(lèi)似Unix的系統(tǒng)中,fork和execve是C庫(kù)函數(shù),這些函數(shù)反過(guò)來(lái)調(diào)用fork和exec這些系統(tǒng)調(diào)用的指令。
直接在應(yīng)用程序代碼中進(jìn)行系統(tǒng)調(diào)用比較復(fù)雜,可能需要使用嵌入式匯編代碼(在C和C++中),并且需要了解系統(tǒng)調(diào)用操作的底層二進(jìn)制接口,而這些二進(jìn)制接口可能會(huì)隨著時(shí)間的推移而變化,它們不是應(yīng)用程序二進(jìn)制接口的一部分,而程序庫(kù)函數(shù)的作用就是為了抽象出這些邏輯而創(chuàng)建的。
在基于exokernel的系統(tǒng)中,庫(kù)作為中介的作用尤為重要。在exokernels上,庫(kù)將用戶(hù)應(yīng)用屏蔽在非常低級(jí)的內(nèi)核API中,并提供抽象層和資源管理。
由OS/360和DOS/360衍生出來(lái)的IBM操作系統(tǒng),包括z/OS和z/VSE,都是通過(guò)匯編語(yǔ)言宏程序庫(kù)來(lái)實(shí)現(xiàn)系統(tǒng)調(diào)用的。它們的起源于匯編語(yǔ)言編程比高級(jí)語(yǔ)言更普遍的年代。因此,IBM的系統(tǒng)調(diào)用不能被高級(jí)語(yǔ)言程序直接調(diào)用,而是需要一個(gè)封裝的可調(diào)用的匯編語(yǔ)言子程序。
【系統(tǒng)中的示例和檢測(cè)工具】
在Unix、Unix-like和其他兼容POSIX的操作系統(tǒng)上,常用的系統(tǒng)調(diào)用有open、read、write、close、wait、exec、exc、fork、exit和kill。許多現(xiàn)代操作系統(tǒng)都有數(shù)百個(gè)系統(tǒng)調(diào)用。例如,Linux和OpenBSD各有300多個(gè)不同的調(diào)用,NetBSD有近500個(gè),F(xiàn)reeBSD有500多個(gè),Windows 7有近700個(gè),而Plan9有51個(gè)。
有些工具如strace、ftrace和truss等可以從進(jìn)程一開(kāi)始就跟蹤報(bào)告該進(jìn)程調(diào)用的所有系統(tǒng)調(diào)用,或者可以把這些工具綁定附加到一個(gè)已經(jīng)運(yùn)行的進(jìn)程上來(lái)跟蹤其進(jìn)程調(diào)用情況。只要該追蹤操作不違反用戶(hù)的權(quán)限,就可以攔截該進(jìn)程所做的任何系統(tǒng)調(diào)用。這些程序工具的這種特殊能力通常也是通過(guò)系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)的,例如strace是通過(guò)ptrace或procfs中的文件的系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)。
【典型的實(shí)現(xiàn)方式】
實(shí)現(xiàn)系統(tǒng)調(diào)用需要將控制權(quán)從用戶(hù)空間轉(zhuǎn)移到內(nèi)核空間,這涉及到某種特定的架構(gòu)特性。一個(gè)典型的實(shí)現(xiàn)方式是使用軟件中斷。中斷將控制權(quán)從用戶(hù)程序轉(zhuǎn)移到操作系統(tǒng)內(nèi)核,因此軟件只需要設(shè)置一些帶有系統(tǒng)調(diào)用編號(hào)的寄存器,通過(guò)觸發(fā)這些寄存器內(nèi)容的變化來(lái)執(zhí)行軟件中斷。
在許多RISC處理器上軟中斷是系統(tǒng)調(diào)用的唯一可用技術(shù),但CISC架構(gòu)如x86等還支持其他技術(shù)。
例如,x86指令集包含了SYSCALL/SYSRET和SYSENTER/SYSEXIT指令(這兩種機(jī)制分別由AMD和Intel獨(dú)立創(chuàng)建,但實(shí)質(zhì)上它們的作用是一樣的)。
這些指令集都是為了"快速"控制轉(zhuǎn)移指令,其目的是為了在沒(méi)有中斷發(fā)生的情況下,將系統(tǒng)調(diào)用的控制權(quán)快速轉(zhuǎn)移到內(nèi)核中。
Linux 2.5版本在x86上開(kāi)始使用這項(xiàng)技術(shù);以前它使用的是中斷(INT)指令,那時(shí)的方式是先將系統(tǒng)調(diào)用編號(hào)0x80寫(xiě)入在EAX寄存器中,再觸發(fā)中斷。
一種較老的系統(tǒng)調(diào)用機(jī)制是調(diào)用門(mén)。最初它在Multics中使用,后來(lái)在Intel x86上使用。
它允許程序直接使用操作系統(tǒng)事先設(shè)置的安全控制轉(zhuǎn)移機(jī)制來(lái)調(diào)用內(nèi)核函數(shù)。這種方法在x86上一直不受歡迎,大概是由于使用x86內(nèi)存分段的遠(yuǎn)程調(diào)用的需求以及由此導(dǎo)致的可移植性不夠。而且x86上有上面所說(shuō)的更快的方式。
對(duì)于IA-64架構(gòu),采用了EPC(EnterPrivileged Code)指令。前8個(gè)系統(tǒng)調(diào)用參數(shù)在寄存器中傳遞,其余的在棧中傳遞。
在大多數(shù)IBM自己的操作系統(tǒng)中,比如IBM的System/360大型機(jī)系列及其后繼者中,在Linux的所有系統(tǒng)調(diào)用指令中,都實(shí)現(xiàn)了對(duì)遺留設(shè)施的系統(tǒng)調(diào)用。
而值得注意的是,在IBM的System/360大型機(jī)系列及其后繼者中,存在一個(gè)觀(guān)察者調(diào)用(SupervisorCall)指令,其編號(hào)是在指令中而不是在寄存器中,這實(shí)現(xiàn)了對(duì)遺留設(shè)施的系統(tǒng)調(diào)用。
在IBM自己的操作系統(tǒng)中,程序調(diào)用(PC)指令用于較新的設(shè)施。特別地,當(dāng)調(diào)用者處于SRB模式時(shí),程序調(diào)用(PC)會(huì)被使用
【處理器模式和上下文切換】
在大多數(shù)類(lèi)似Unix的系統(tǒng)中,系統(tǒng)調(diào)用都是在內(nèi)核模式下進(jìn)行處理的,而內(nèi)核模式是通過(guò)將處理器的執(zhí)行模式改變?yōu)楦嗟奶貦?quán)模式來(lái)實(shí)現(xiàn)的,但不需要進(jìn)行進(jìn)程上下文切換--盡管特權(quán)上下文切換確實(shí)會(huì)發(fā)生。硬件根據(jù)處理器狀態(tài)寄存器的執(zhí)行模式來(lái)看待周邊情況,而進(jìn)程是操作系統(tǒng)提供的一個(gè)抽象概念。一個(gè)系統(tǒng)調(diào)用一般不需要對(duì)另一個(gè)進(jìn)程進(jìn)行上下文切換;相反,無(wú)論哪個(gè)進(jìn)程調(diào)用了它,它都會(huì)在那個(gè)進(jìn)程的上下文中進(jìn)行處理。
在多線(xiàn)程進(jìn)程中,系統(tǒng)調(diào)用可以由多個(gè)線(xiàn)程進(jìn)行。對(duì)這類(lèi)調(diào)用的處理取決于具體的操作系統(tǒng)內(nèi)核和應(yīng)用程序運(yùn)行時(shí)環(huán)境的設(shè)計(jì)。下面列出了操作系統(tǒng)所遵循的典型模式:
多對(duì)一模式。進(jìn)程中任何用戶(hù)線(xiàn)程的所有系統(tǒng)調(diào)用都由一個(gè)內(nèi)核級(jí)線(xiàn)程處理。這種模式有一個(gè)嚴(yán)重的缺點(diǎn)--任何阻塞的系統(tǒng)調(diào)用(如等待用戶(hù)的輸入)都會(huì)凍結(jié)所有其他線(xiàn)程。另外,由于一次只能有一個(gè)線(xiàn)程訪(fǎng)問(wèn)內(nèi)核,這種模式無(wú)法利用多個(gè)內(nèi)核的處理器。
一對(duì)一模型。每個(gè)用戶(hù)線(xiàn)程在系統(tǒng)調(diào)用過(guò)程中,都會(huì)被連接到一個(gè)獨(dú)立的內(nèi)核級(jí)線(xiàn)程上。這種模式解決了上述阻斷系統(tǒng)調(diào)用的問(wèn)題。它在所有主流的Linux發(fā)行版、macOS、iOS、最近的Windows和Solaris版本中都得到了應(yīng)用。
多對(duì)多模式。在這個(gè)模型中,一個(gè)用戶(hù)線(xiàn)程池被映射到內(nèi)核線(xiàn)程池中。來(lái)自用戶(hù)線(xiàn)程池的所有系統(tǒng)調(diào)用都由相應(yīng)的內(nèi)核線(xiàn)程池中的線(xiàn)程處理。
混合模型。這種模式結(jié)合了多對(duì)多和一對(duì)一模式,最終取決于內(nèi)核的選擇。這在舊版本的IRIX、HP-UX和Solaris中都比較常見(jiàn)。
【小結(jié)】
本文對(duì)于系統(tǒng)調(diào)用做了探討和學(xué)習(xí),一般來(lái)說(shuō),所有需要資源的程序都必須通過(guò)系統(tǒng)調(diào)用才能完成任務(wù),希望對(duì)大家有所裨益。
歡迎討論。
【參考資源】
https://www.geeksforgeeks.org/introduction-of-system-call/
http://fxr.watson.org/fxr/source/kern/syscalls.master
https://en.wikipedia.org/wiki/System_call
https://www.guru99.com/system-call-operating-system.html
http://man7.org/linux/man-pages/man2/syscalls.2.html
全系統(tǒng)上云
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。