《操作系統》OS學習(三):系統調用

例子

首先看一個標準C庫的例子:當我們程序中使用了C庫中的printf()函數,實際在底層是在內核態中調用了write()函數。圖中右側則是將程序代碼與C庫都算到應用程序中,內核提供了一個系統調用接口。

從這個例子我們可以得到以下幾點:

1. 系統調用是操作系統服務的編程接口;

2. 系統調用通常由高級語言編寫(C或者C++);

3. 程序訪問通常是通過高層次的API接口(比如C庫)而不是直接進行系統調用。最常見的三種:1. Windows下的Win32 API;2. POSIX-based系統(包括UNIX、LINUX、Mac OS等)下的 POSIX API;3. JAVA虛擬機中的Java API。

實現:

每個系統調用對應一個系統調用編號。當使用系統調用時,系統調用首先通過軟中斷的方式進入到內核的中斷向量表產生中斷,發現是系統調用軟中斷后轉移到系統調用表,系統調用表中記錄系統調用編號與具體實現之間的映射關系,根據系統調用編號選取不同的系統調用實現,得到結果之后返回。通過這種方式,用戶不需要知道系統調用內部是如何實現的,而只需要設置調用參數和湖區返回結果即可,并且系統調用接口的細節大部分都隱藏函數庫后面,通過調用庫函數實現。

函數調用與系統調用的不同:

使用的指令不同。系統調用使用INT和IRET,函數調用使用CALL和RET,他們的指令級是完全不同的。具體還有哪些不同呢?我們知道在調用一個函數的時候需要把參數壓到堆棧中去,然后轉到相應函數去執行,執行的時候從堆棧獲取我的參數信息執行,然后返回結果。而對于系統調用來講,內核是受保護的,為了保護內核,內核與應用程序之間使用不同的堆棧,因此系統調用時會有一個堆棧和特權級的切換,首先切換到內核態,此時可以使用特權指令,并擁有自己的堆棧,執行完后再切換回用戶態。而常規調用是沒有堆棧切換的。

開銷不同。系統調用比函數調用更安全,但是開銷更大。主要原因就是有一個用戶態的切換。具體有以下操作導致開銷更大:1. 引導機制,需要引導用戶態到內核態的切換;2. 建立內核堆棧,第一次調用時需要創建新的內核堆棧;3. 驗證參數,需要對傳入的參數的有效性合法性進行驗證;4. 在內核態中需要使用到用戶態中的一些信息,此時需要建立內核態到用戶態地址空間的映射關系;5. 建立用戶態內核態地址空間映射時會導致緩存的變化,TLB中有些內容會失效。

示例:文件復制

一個文件復制過程可以拆分如下圖所示,我們可以先看下整個過程中哪些過程會使用到系統調用:1.鍵盤輸入;2. 屏幕顯示;3. 讀取文件;4. 創建文件?5. 寫入文件。而在操作系統內部,鍵盤、屏幕與文件都視為文件系統里的,只是鍵盤、屏幕作為特殊文件來使用。因此用到了右圖中標紅的系統調用(還有一個creat)。

???

首先是一個read()函數如下圖,我們要知道參數意義和返回值。int fd是要讀的文件句柄,void *buf是緩沖區頭指針, int length是緩沖區的最大長度,返回值為讀出的數據長度int return_value。

那么內部是如何實現的呢?首先準備參數,如下圖中上面的匯編代碼,前6行都是壓棧,壓棧完最后一行是一個函數調用,這個函數調用還不是系統調用。因為所有系統調用都是通過一個宏展開成相應的函數。函數內的int就是進入內核態的指令,i就是系統調用的中斷向量編號,T_SYSCALL代表該軟中斷是系統調用,a(num)是系統調用編號,后面是相應的參數。

進入到內核態之后的過程如下圖:系統調用進入內核態實際是一個軟中斷,所有這些軟中斷會到最開始的一段匯編程序叫做alltraps(),在這里面獲取中斷的相關信息組成的數據結構,也就是TF數據結構。接下來來到trap(),判斷tf中有一個成員trapno(中斷向量)表明了該軟中斷是系統調用,則進入syscall(),發現系統調用編號代表的是sys_read()函數,接下來執行sys_read()函數,該函數讀取堆棧中的參數信息,之后進入sysfile_read()函數,該函數則是直接操作底層的驅動程序進行讀取,最后返回時調用trapret()函數返回給用戶態


補充:

大多數計算機系統將CPU執行狀態分為管態和目態。管態又稱為特權狀態、系統態或核心態。通常,操作系統在管態下運行。目態又叫做常態或用戶態,用戶程序只能在目態下運行,如果用戶程序在目態下執行特權指令,硬件將發生中斷,由操作系統獲得控制,特權指令執行被禁止,這樣可以防止用戶程序有意或無意的破壞系統。從目態轉換為管態的唯一途徑是中斷。

系統調用與庫函數的區別

  • 系統調用:運行在用戶空間的應用程序向操作系統內核請求某些服務的調用過程。是內核提供給應用程序的接口函數,屬于系統的一部分。是為了方便應用使用操作系統的接口
  • 函數庫調用是語言或應用程序的一部分。是為了方便人們編寫應用程序而引出的,比如你自己編寫一個函數其實也可以說就是一個庫函數。
  • write/read就是系統調用,而printf/fread就是C標準庫函數.
    ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454174.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cygwin/gcc與MinGW

cygwin/gcc和MinGW都是gcc在windows下的編譯環境,但是它們有什么區別?在實際工作中如何選擇這兩種編譯器呢?cygwin/gcc完全可以和在linux下的gcc劃等號,這個從boost庫的劃分中就可以看出來端倪,cygwin下的gcc和linux下的gcc使用的是相同的T…

JavaScript服務器端開發技術(對象屬性的枚舉與查詢)

既然對象是屬性的集合,那么檢測與枚舉集合中的屬性就是一項重要任務。對此,我們來分別看一下ES3和ES5提供的解決方案。 1) ES3枚舉方案 示例代碼: var contacts{ ID:[0,1,2,3,4,5], names:["Zero","One","Two&q…

treelistview 所有節點失去焦點_垃圾詢盤過濾,焦點科技的 Milvus 實踐

文章作者:黎陽,焦點科技軟件開發工程師李成龍,Zilliz 數據工程師Milvus (https://milvus.io/) 向量搜索引擎開源半年以來,全球已經有數百家企業或組織用戶。焦點科技是一家以 B2B 外貿交易為主營業務的科技公司,也是 M…

《操作系統》OS學習(四):計算機體系結構、內存層次和地址生成

計算機除了計算能力之外還有存儲能力,存儲能力即計算機擁有一系列的存儲介質,我們可以在存儲介質上存儲我們的代碼和數據。計算機體系結構中約定了哪些地方可以用來存儲數據:CPU內的寄存器、內存和外存。不同的存儲介質,容量、速度…

GCC中SIMD指令的應用方法

X86架構上的多媒體應用開發,如果能夠使用SIMD指令進行優化, 性能將大大提高。目前,IA-32的SIMD指令包括MMX,SSE,SSE2等幾級。 在GCC的開發環境中,有幾種使用SIMD指令的方式,本文逐一介紹。X86的…

使用angular4和asp.net core 2 web api做個練習項目(二), 這部分都是angular

上一篇: http://www.cnblogs.com/cgzl/p/7755801.html 完成client.service.ts: import { Injectable } from angular/core; import { Http, Headers } from angular/http; import { Observable } from rxjs/Observable; import { ErrorHandler } from angular/core; import rxj…

leelen可視對講怎么接線_樓宇對講系統怎么布線 樓宇對講系統布線方式【介紹】...

隨著智能小區規模不斷增加,樓宇可視對講系統應用越來越廣泛,因而視頻信號的傳輸方式與布線設計顯得越來越重要。視頻信號與數據和音頻信號不同,可行的一種傳輸方式為視頻信號基帶傳輸,下面小編就簡要介紹一下這種傳輸方式和布線方…

路由匯總實例

5.2.2.2 路由匯總策略 之前提到過,在網絡管理員計劃好子網選擇并進行預期地路由匯總時,手動路由匯總工作能取得最佳效果。例如,之前的例子設定好了一個考慮周全的計劃,管理員只使用遠離Yosemite路由器并以10.2開頭的子網。這個規定…

《操作系統》OS學習(五):連續內存分配 內存碎片、動態分配、碎片整理、伙伴系統

內存碎片 在沒有其他方式輔助的情況下,我們分配給一個進程的內存是連續的。在分配時候我們需要有動態分配與碎片處理。如何理解呢?就是每個進程需要一塊內存,我們要選取合適的位置的內存分配給它。當有的進程先結束了內存還給操作系統&#…

GCC 中文手冊 - 摘自純C論壇

GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g-GNU工程的C和C編譯器(egcs-1.1.2) 總覽(SYNOPSIS) gcc[option|filename ]... g[option|filename ]... 警告(WARNING) 本手冊頁內容摘自GNU C編譯器的完整文檔,僅限于解釋選項的含義…

python如何實現支持中文

#codingutf-8print("我要python支持中文") 默認情況下,python是不支持中文的。 如果要實現python支持中文(我是從python3.6開始學習的),只要在python文檔的開頭加入:“#codingutf-8"就可以了。轉載于:h…

世界之窗瀏覽器刪除文本框信息_文本框——Excel里的便利貼

工作表里面的單元格應該是足夠我們來記錄數據和信息了。但是文本框這個功能在工作表中還是存在,可以理解為便利貼功能。插入文本框1.點擊“插入”選項卡。2.然后點擊“文本框”。3.在下拉菜單里面,有兩種可供選擇:橫排文本框和垂直文本框。在…

RHEL 5服務篇—常用網絡配置命令

常用網絡配置命令 在“Linux系統管理”的文章中,大家已經學習了Linux系統的基本管理命令和技巧,為了進一步學習Linux網絡服務打下了良好的基礎。所以我作者以后將陸續推出Linux網絡服務的相關文章。希望大家能給與我大大的支持。 今天我們就來學習一下…

清華大學《操作系統》(六):非連續內存分配 段式、頁式、段頁式存儲管理

背景 連續內存分配給內存分配帶來了很多不便,可能所有空閑片區大小都無法滿足需求大小,這個分配就會失敗。基于這種現狀,就有了非連續內存分配的需求。非連續分配成功的幾率更高,但也面對更多的問題,比如分配時是不是…

python監控文件內容變化_Python監控文件內容變化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存儲NAS是一個可共享訪問&#xf…

C語言第三次博客作業---單層循環結構

一、PTA實驗作業。 題目1 1.實驗代碼 int n,i; double height1,height2;//1為輸入身高&#xff0c;2為輸出身高。 char sex; //1<height1<3; //N<1; scanf("%d",&n); while(n--){getchar();scanf("%c%lf",&sex,&height1);switch(sex)…

函數和函數式編程

python的過程就是函數&#xff0c;因為解釋器會隱式地返回默認值None。 實際編程中大部分偏函數更接近過程&#xff0c;不顯示地返回任何東西。 當沒有顯示地返回元素或者如果返回None時&#xff0c;python會返回一個None。 * 元組 ** 字典 def子句的剩余部分包括了一個雖…

清華大學《操作系統》(七):虛擬存儲、覆蓋、交換

接下來幾節都是對虛擬存儲的講解。虛擬存儲是非連續存儲管理的擴展。通過將內存中的數據暫存到外存的方式&#xff0c;為進程提供更大的內存空間。虛擬存儲出現的主要原因是因為程序規模的增長速度遠遠大于存儲器容量的增長速度&#xff0c;導致內存空間不夠用。其實針對內存空…

遵義大數據中心項目工程概況_市委書記張新文到曹州云都大數據中心等項目現場調研建設情況...

4月25日&#xff0c;市委書記張新文到曹縣調研重點項目建設情況&#xff0c;研究推進措施。市委常委、秘書長任仲義參加活動。張新文首先來到曹州云都大數據中心項目建設現場&#xff0c;查看項目推進情況。曹州云都大數據中心&#xff0c;是涵蓋云計算區、研發辦公區、公寓生活…

linux 可執行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年&#xff0c;Richard Stallman發起了自由軟件運動&#xff0c;GNU (Gnus Not Unix)項目應運而生&#xff0c;3年后&#xff0c;最初版的GCC橫空出世&#xff0c;成為第一款可移植、可優化、支持ANSI C的開源C編譯器。GCC最初的全名是GNU C Com…