精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

讓我們一起捋一捋系統調用

系統
系統調用就是調用操作系統提供的一系列內核功能函數,因為內核總是對用戶程序持不信任的態度,一些核心功能不能交由用戶程序來實現執行。用戶程序只能發出請求,然后內核調用相應的內核函數來幫著處理,將結果返回給應用程序。

[[399828]]

本文轉載自微信公眾號「Rand」,作者Rand。轉載本文請聯系Rand公眾號。

系統調用就是調用操作系統提供的一系列內核功能函數,因為內核總是對用戶程序持不信任的態度,一些核心功能不能交由用戶程序來實現執行。用戶程序只能發出請求,然后內核調用相應的內核函數來幫著處理,將結果返回給應用程序。如此才能保證系統的穩定和安全,關于系統調用的這些理論知識不多說,書本上有一大堆,本文旨在捋清楚系統調用這條線。

總述

Linux 里系統調用是由中斷來實現的,既然利用中斷實現,那么總體來說系統調用的過程應該與中斷的過程相似。也的確如此,總體流程是差不多,但也有所區別。

每一種中斷都會有一個中斷向量號或中斷類型號,有相應的中斷服務程序也就是處理中斷的函數。但是我們應該知道,系統調用是有很多的,比如 fork,read,write 等等。雖然中斷向量號有空缺多余的,但系統調用數目更多,到2.6.23版的 Linux,就已經有325個,而中斷向量號只有 256 個,明顯為每一個系統調用單獨分配一個中斷向量號不現實。

那怎么解決呢,采用的辦法是直接為所有的系統調用分配一個中斷類型號,一般是 0x80,再用系統調用號來區分各個不同的系統調用。

所以我們的系統調用大致流程變為根據中斷向量號去IDT中索引相應的中斷門描述符,得到選擇子和偏移量,根據選擇子去GDT中索引相應的段描述符得到段基址,與上面得到的偏移量相加得到中斷服務程序的地址。中斷處理程序根據系統調用號再調用相應的系統調用函數做具體的處理,最后返回。

上述為系統調用的大致過程,下面我們一步步地來具體看看系統調用的過程,或者說系統調用是如何實現的。

1. 用戶接口

我們平常編寫程序調用的是操作系統或者說 C 庫提供的用戶接口,也就是常說的 API,而并不是直接使用系統調用來編程,用戶接口可以看作實際的系統調用函數的封裝。

這里要注意我們平常所說的 API 和系統調用之間并沒有一定的對應關系。一個 API 可以對應一個系統調用,也可以對應多個系統調用,甚至不依賴任何系統調用,更甚多個API對應一個系統調用。所以 API 就只是一個接口,具體使用哪些系統調用實現什么功能,從理論上來講只要邏輯沒問題隨便怎么定義怎么實現都可以,但是為了可移植兼容的考慮,還是必須得遵循一定的規則,大多操作系統 API 都是遵循POSIX標準的。

上述說過系統調用的用戶接口可以看作是系統調用的封裝,咱們以 getpid 來舉例具體看看:

  1. int getpid(){ 
  2.     return _syscall0(SYS_getpid); 

2. 系統調用接口

系統調用接口指的就是上面那個 _syscall 函數,早期的 Linux 里面的 _syscall是用宏來實現的,一共有 7 個,后面跟不同的數字來區分,如_syscall0,_syscall1,分別支持0—6個參數。咱們在這兒也不搬出具體代碼解釋說明,有興趣的朋友可以自己去看看,這7個宏的實現原理都一樣,主要做了以下三件事:

  1. 系統調用號傳給 eax 寄存器
  2. 傳入參數
  3. int 80h

傳參,如果參數少,直接存到寄存器里即可,采用寄存器傳參方便而且速度快。在下x86的系統上,前5個參數按順序存放在ebx, ecx,edx, esi,edi 5 個寄存中。而如果參數過多,會使用一個單獨的寄存器存放所有參數在用戶空間的地址,陷入內核后再將參數從用戶空間拷貝到內核。

系統調用號和最后的返回值都存在 eax 寄存器中,約定俗成的東西。

接著就是 int n 指令,int n 就相當于發生了一個n號中斷,屬于軟中斷,雖然引發中斷的方式不同,但對中斷的處理基本是一樣的,中斷這一塊前文講述的應該很清楚了,這里不再贅述只是簡單說明一下:

  1. 有特權級變化的話壓入 ss 和 esp,因為是系統調用,特權級是肯定發生了變化的
  2. 壓入 eflags,cs,eip 寄存器
  3. 根據中斷類型號索引 IDT 中的中斷門描述符,取出里面的內容修改 cs,eip 寄存器的值;根據 cs 里面的選擇子又去 GDT 中索引段描述符,獲取段基址。再根據 eip 中的偏移量找到系統調用服務程序。

這里對于用戶態的 ss和 esp 寄存器值保存作為題外話補充說明一下。不知大家有沒有想過這個問題,用戶態下的 ss 和 esp 怎么保存到內核棧里面去的,切換到內核棧需要改變 ss 和 esp,那原 ss 和esp不就丟掉了嗎?所以處理器會臨時保存 ss 和 esp 的值,切換到內核態時再重新拷貝一份用戶態的 ss 和 esp 的值。之后再壓入 eflags,cs,eip 寄存器,當然如果特權級沒有發生變化,也就不會有上述過程。

這一塊兒在我寫的中斷文章里面忘記說了,在此補上,這些所有有關處理器的規則約定功能都由指令集體系結構ISA所管,它規定了我們需要做什么,提供什么,然后它就自動完成一些事情。就像調用 API 編程一樣,我們提供合理的參數,然后相應的函數自動完成一些工作。對于CPU而言同樣的道理,只是更偏向于底層具體的物理實現,但從邏輯上來講是相通的。

3. 系統調用號

每個系統調用都有自己的專屬號碼,其實就是個索引號,如下面所示:

  1. #define __NR_eixt   1 
  2. #define __NR_fork   2 
  3. #define __NR_read   3 
  4. /*...................*/ 

4. 系統調用服務例程

系統調用服務例程才是具體干事的內核功能函數,前面的那些用戶接口,系統調用接口,中斷服務程序都不是具體干事的,全都相當于接口一類,而這個系統調用服務例程才是具體做事的一個函數,舉個簡單例子,用 getpid 這個系統調用來說明:

  1. int sys_getpid(void){ 
  2.  return current->pid   //current指向當前進程 

5. 系統調用表

每個系統調用都對應著一個服務例程,將它們的首地址集中起來放在一個數組里方便使用系統調用號來索引,這個表(數組一個意思)在Linux里面是 sys_call_table,就像這樣:

  1. ENTRY(sys_call_table) 
  2.     .long sys_restart_syscall 
  3.     .long sys_exit 
  4.     .long sys_fork 

6. 系統調用服務程序

這個系統調用服務程序就是中斷服務程序,以前的哪些外設引發的中斷相應的服務程序會處理實際的事務,而系統調用前面說過不太一樣,它交給系統調用服務例程來處理的,下面來仔細看看:

  1. system_call: 
  2.     SAVE_ALL      #保存上下文 
  3.     push arg      #壓入參數 
  4.      
  5.     call *sys_call_table(,%eax,4)   #根據eax里面的系統調用號調用相應服務例程 
  6.      
  7.     mov %eax, 24(%esp)  #將服務例程的返回值保存到上下文中的eax處 
  8.    
  9. syscall_exit: 
  10.     #返回退出 

系統調用利用中斷實現,所以處理中斷要先保存上下文,因為系統調用不具體處理事務而是調用其他函數來處理,所以壓入參數然后調用函數。這是調用函數前的一慣做法:先壓入參數再調用。參數從何而來?還記得前面把參數放在寄存器里面吧,所以這兒push arg就是壓入寄存器,就不具體寫了,知道就好。

系統調用服務例程的運行結果是要傳回到用戶態的,eax 里面存放的返回值,所以當服務例程運行完后,只要將當前寄存器 eax 里面的值保存到上下文里面的 eax 處即可。在Linux2.6 里面棧頂向上 24 個字節處就是用戶態下的 eax,這個用戶態下eax的位置與具體保存上下文時如何壓棧有關,前后能夠對應上就行。

注:上述是根據 Linux2.6 簡化來的偽碼,Linux2.6里面是確有 SAVE_ALL 這個宏的,其中壓入參數就是 SAVE_ALL 的一部分,在這兒只是為了過程更清晰所以單獨寫了出來。

7. 總結捋線

上述就是系統調用的大概過程,這兒再總結總結捋一捋:

  1. 調用用戶接口函數
  2. 用戶接口封裝的是系統調用接口,早期的 Linux 里就是那7個宏
  3. _syscall 傳系統調用號,傳參,int 80h
  4. int 80h 陷入內核,保存ss,esp,eflags,cs,eip寄存器
  5. 根據中斷向量號 80h 去IDT中索引中斷門描述符,根據其內容修改 cs,eip 的值
  6. 根據 cs 里的選擇子去 GDT 中索引段描述符,獲得中斷(系統調用)服務程序的段基址,結合 eip 里面的偏移量就得到系統調用服務程序的地址
  7. 系統調用服務程序中 system_call 保存上下文,壓入系統調用服務例程需要的參數
  8. 根據 eax 里面的系統調用號索引 sys_call_table,然后調用執行
  9. 修改上下文中 eax 處的值,將其修改為服務例程返回值
  10. 返回,相當于第4步的逆過程

大致的過程圖如下所示:

并不是所有的系統調用都有上述的過程,在這兒只是從頭至尾的捋一捋,知曉有這么一個過程就好,畢竟本文的目的就是捋一捋系統調用這條線嘛

8. syscall說明

_syscall 宏這種形式的系統調用在 Linux 里面已經廢棄不再提供庫實現支持,因為這種方式最多支持6個參數,而且每個參數還要提供相應的類型,總共就是2n個參數。但是這種實現方式思路清晰簡單,所以上述我也是以這種實現為基來說明的。

現在 Linux 的系統調用都是用庫函數syscall來實現的,原型為:

  1. int syscall(int number, ...); 

number指的是系統調用號。從這原型就能看出,庫函數這種實現方式支持變參(...),所以能夠將所有的系統調用統一起來,不像宏實現方式不同參數的系統調用還需要使用不同的宏。

 

責任編輯:武曉燕 來源: Rand
相關推薦

2021-11-04 18:15:55

下載上傳瀏覽器

2021-07-07 22:27:54

磁盤分區硬盤

2023-11-28 12:42:56

數據分析管理

2024-05-06 12:23:00

GenAI人工智能

2020-12-18 06:09:07

Java淺拷貝深拷貝

2020-05-18 14:12:41

PostgreSQLDB架構數據庫

2023-03-15 10:38:55

2022-03-31 18:59:43

數據庫InnoDBMySQL

2022-03-08 17:52:58

TCP格式IP

2021-08-27 07:06:10

IOJava抽象

2021-12-29 08:27:05

ByteBuffer磁盤服務器

2021-03-10 10:00:31

Go語言strconv包類型轉換工具

2023-08-14 08:38:26

反射reflect結構體

2021-11-26 07:00:05

反轉整數數字

2021-07-15 07:23:28

Singlefligh設計

2016-09-06 10:39:30

Dell Techno

2022-02-14 10:16:22

Axios接口HTTP

2022-02-14 07:03:31

網站安全MFA

2022-06-26 09:40:55

Django框架服務

2023-08-02 08:35:54

文件操作數據源
點贊
收藏

51CTO技術棧公眾號

av激情在线观看| 日韩国产欧美亚洲| 99国产在线播放| 韩日视频一区| 亚洲激情视频在线| 欧美 日韩精品| 欧美高清视频| 成人免费视频播放| 国产精品欧美激情| 老妇女50岁三级| 群体交乱之放荡娇妻一区二区 | 国产偷国产偷精品高清尤物| 91国产美女在线观看| gv天堂gv无码男同在线观看| 亚洲精品在线a| 在线精品观看国产| youjizz.com在线观看| 麻豆影视在线| 成人午夜又粗又硬又大| 国产精品亚洲一区二区三区| 日本熟伦人妇xxxx| 午夜国产一区二区| 亚洲精品一区中文| 欧美一级大片免费看| 欧美暴力调教| 午夜精品视频一区| 久久久久亚洲av无码专区喷水| 看黄色一级大片| 狠狠噜噜久久| 最新亚洲国产精品| www.av欧美| 欧美电影免费网站| 精品人在线二区三区| 天天干天天玩天天操| 在线天堂资源| 亚洲va欧美va国产va天堂影院| 国产日韩欧美二区| 国产精品无码AV| 日韩电影免费在线看| 美女撒尿一区二区三区| 在线看片中文字幕| 欧美三级伦理在线| 亚洲人成网站在线播| 国产熟女高潮一区二区三区| 成人av婷婷| 精品日韩99亚洲| 久久久久久国产精品日本| 欧美一区二区三区婷婷| 欧美色偷偷大香| 99视频在线视频| 欧美日韩尤物久久| 欧美性一二三区| 91激情视频在线| 成人在线免费电影网站| 在线免费观看日本一区| 免费看a级黄色片| 三级成人在线| 91久久奴性调教| 欧美精品成人网| 97久久网站| 精品视频在线看| 亚洲午夜激情影院| 人人九九精品视频| 欧美zozozo| 中文字幕乱码一区| 欧美日韩一本| 亚洲无限av看| 99热这里只有精品4| 亚洲欧美日韩高清在线| 欧美噜噜久久久xxx| 久久久久成人片免费观看蜜芽| 免费观看不卡av| 亚洲系列中文字幕| 一级二级黄色片| 国产精品久久久久久麻豆一区软件 | 最近的2019中文字幕免费一页| 三级网站免费看| 欧美经典一区| 亚洲国产精品高清久久久| www.久久国产| 日本一区二区免费高清| 久久国产精品亚洲| 欧美日韩中文视频| 久热精品在线| 亚洲一区二区免费| 色欲久久久天天天综合网 | 91沈先生在线观看| 超碰人人人人人人| 久久天堂av综合合色蜜桃网| 伊人久久大香线蕉午夜av| 欧美野外wwwxxx| 色菇凉天天综合网| 可以看的av网址| 国产99久久久国产精品成人免费 | 91在线观看免费高清| www.色播.com| 国产欧美一区二区三区在线老狼| 国产一区二区无遮挡| 国产一二三区在线| 一区二区三区在线免费观看| 久久9精品区-无套内射无码| 亚洲日韩中文字幕一区| 精品呦交小u女在线| 欧美性生交大片| 新67194成人永久网站| 91视频国产精品| 欧美一区二区三区少妇| 亚洲欧美激情在线| 国产97色在线 | 日韩| 一区二区三区欧洲区| 一区二区三区精品99久久| 国产一级特黄a高潮片| 美女看a上一区| 久久精品五月婷婷| 97影院秋霞午夜在线观看| 精品美女久久久久久免费| 国产精品久久久久久9999| 久久99国产精一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一 | 91丨porny丨在线中文| 99久久精品情趣| 玖玖精品在线视频| 免费欧美电影| 日韩电视剧免费观看网站| 日韩女优一区二区| 久久电影国产免费久久电影| 日韩成人av网站| 欧产日产国产精品视频| 日韩欧美成人激情| xxxx日本少妇| 国内外成人在线视频| 亚洲7777| 超薄肉色丝袜脚交一区二区| 日韩电影中文字幕在线| 国产午夜精品无码| 高清在线不卡av| 日本福利视频在线观看| www.久久久.com| 久久精品国产99国产精品澳门| 欧美色图一区二区| 精品一区二区三区在线播放视频 | 高清毛片aaaaaaaaa片| 国产精品国产三级国产aⅴ入口 | 欧美一区二区三区爽爽爽| 日本不卡一二三区黄网| 精品无人区一区二区三区| 国内老司机av在线| 精品成人在线观看| 日干夜干天天干| 成人免费福利片| 黄色一级视频在线播放| 狼人精品一区二区三区在线| 97精品在线视频| 青青青草网站免费视频在线观看| 亚洲四区在线观看| 日日躁夜夜躁aaaabbbb| 色喇叭免费久久综合网| 国产美女搞久久| 欧美一级二级三级区| 欧美性猛交xxxx乱大交退制版| 精品国产免费久久久久久婷婷| 日韩高清影视在线观看| 555www成人网| 欧美精品少妇| 91福利视频网站| 青青操在线播放| 国产精品一二三四| 草b视频在线观看| 台湾色综合娱乐中文网| 国产精品1区2区在线观看 | 成人高清视频在线| 成年女人18级毛片毛片免费| 欧美在线关看| 国产精品欧美日韩| 中文av资源在线| 日韩av在线一区| 中文字幕资源网| 亚洲男人的天堂在线aⅴ视频| 国产又黄又猛又粗| 一区二区三区在线电影| 国产中文一区二区| 成人在线高清| 欧美高跟鞋交xxxxhd| 免费一级毛片在线观看| 欧美色国产精品| 精品无码免费视频| 久久精品亚洲精品国产欧美| 一级黄色大片儿| 国产欧美一级| 亚洲视频导航| 国产一区二区在线视频你懂的| 欧美黑人xxxx| 青青草观看免费视频在线| 欧美日韩免费一区二区三区| 青青草在线观看视频| 国产三级精品视频| 无码人妻丰满熟妇区毛片蜜桃精品| 一区二区三区中文| 欧美精品成人一区二区在线观看| 超碰在线99| 色婷婷**av毛片一区| 免费a级片在线观看| 欧美日韩激情一区二区三区| 国产性70yerg老太| 国产精品久久久久久久久图文区| 国产精品区在线| 国模一区二区三区| 亚洲精品国产一区| 网曝91综合精品门事件在线| 亚洲一区亚洲二区亚洲三区| 欧美日韩大片| 久久久这里只有精品视频| 老司机在线看片网av| 亚洲美女视频网站| 人人妻人人澡人人爽精品日本| 亚洲成a天堂v人片| av激情在线观看| 中文在线一区二区| 麻豆国产精品一区| 国产成人av自拍| 亚洲免费在线播放视频| 蜜桃一区二区三区在线观看| 成人中文字幕在线播放| 欧美亚洲不卡| 黄色www在线观看| 奇米狠狠一区二区三区| 久久国产精品99久久久久久丝袜| 另类激情视频| 2024亚洲男人天堂| 爱情岛亚洲播放路线| 欧美不卡视频一区发布| 亚洲欧美视频一区二区| 亚洲欧美三级伦理| 日韩精品系列| 亚洲男人天堂2023| 国产又爽又黄网站亚洲视频123| 欧美制服丝袜第一页| 天天干在线播放| 欧美日韩免费网站| 99久在线精品99re8热| 午夜影院久久久| 国产精品.www| 亚洲va欧美va人人爽| 日本高清www免费视频| 亚洲国产精品自拍| 国产中文字幕免费| 亚洲国产日韩a在线播放性色| 波多野结衣 在线| 91丨九色丨尤物| 日韩中文字幕电影| 日本一区二区视频在线| 日本一二三不卡视频| 中文字幕高清一区| 日本免费网站视频| 亚洲欧美日韩久久精品| www.5588.com毛片| 亚洲在线视频一区| 日韩特黄一级片| 色狠狠桃花综合| 91片黄在线观看喷潮| 日韩三级视频中文字幕| 色婷婷av一区二区三区之e本道| 欧美日韩一区在线| 国产男女无套免费网站| 欧美电视剧在线看免费| 人妻丰满熟妇av无码区hd| 日韩国产激情在线| 超碰97在线免费观看| 久久九九全国免费精品观看| 黄页网站在线观看免费| 5278欧美一区二区三区| 国产极品久久久久久久久波多结野| 性金发美女69hd大尺寸| 免费亚洲电影| 国产在线视频不卡| 国内精品国产成人国产三级粉色 | 欧美交受高潮1| 日韩欧美精品一区二区三区| 日本高清久久天堂| 99热这里有精品| 国产丝袜不卡| 色琪琪久久se色| 精品国产av无码一区二区三区| 午夜电影亚洲| 国产日韩一区二区在线| 老司机午夜精品| 插我舔内射18免费视频| 亚洲国产精品av| 欧美黄色一区二区三区| 欧美性色19p| 国产av无码专区亚洲av| 亚洲精品资源美女情侣酒店| 麻豆网在线观看| 欧美性受xxxx黑人猛交| 国产一区二区三区视频在线| 麻豆av一区二区| 亚洲综合五月| 无人在线观看的免费高清视频| 久久激情中文| 亚洲精品一区二区18漫画| 国产日韩精品一区二区浪潮av| 精品人妻无码一区二区三区换脸| 91在线视频播放| 天美传媒免费在线观看| 天天综合日日夜夜精品| 国产精品亚洲lv粉色| 亚洲深夜福利在线| 欧美黑人猛交的在线视频| 国产精品久久久久久久一区探花 | 日韩一级黄色大片| 国产精品99999| 91精品国产91久久久久久吃药 | 超碰国产在线观看| 97久久精品国产| 日韩欧美中文在线观看| 日本在线播放一区| 国产农村妇女精品一二区| 精人妻一区二区三区| 亚洲色大成网站www久久九九| 久久久久国产精品夜夜夜夜夜| 五月天一区二区三区| 国产美女三级无套内谢| 夜夜嗨av色综合久久久综合网| 在线播放日本| 国产成人一区二区三区电影| 精品三级av| 欧美精品卡一卡二| 懂色av一区二区在线播放| 四虎免费在线视频| 欧美一区二区三区精品| 欧美日本高清| 国产精品永久免费在线| 欧美日韩性在线观看| 免费裸体美女网站| 久久久国产精品不卡| 国产一级大片在线观看| 精品精品欲导航| 免费av不卡在线观看| 成人看片在线| 精品96久久久久久中文字幕无| 亚洲精品乱码久久久久久自慰| 久久精品久久精品| 99精品全国免费观看| 在线一区二区三区做爰视频网站| 国产乱人乱偷精品视频| 精品国产欧美成人夜夜嗨| 精品网站在线| 影音先锋欧美在线| 激情深爱一区二区| 亚洲精品自拍视频在线观看| 欧美日韩国产综合视频在线观看| 日本高清视频www| 91精品国产91久久| 美女视频亚洲色图| 黄色片视频在线播放| 日本一区二区三区久久久久久久久不| 久久激情免费视频| 精品福利一区二区三区免费视频| 91在线不卡| 成人性生交大片免费看视频直播 | 欧美色图另类小说| 菠萝蜜视频在线观看一区| www欧美在线| 亚洲色图av在线| 亚洲三级在线| 成人在线国产视频| 久久色.com| 一区二区www| 欧美激情亚洲视频| 蜜臀av免费一区二区三区 | 欧美男人天堂| 日本成人黄色免费看| 蜜臀久久99精品久久久画质超高清 | 最新国产精品亚洲| 日韩一级淫片| 青青青国产在线观看| 欧美激情一区在线观看| 国产av精国产传媒| 国产91九色视频| 在线中文字幕第一区| 亚洲av无码一区二区三区网址| 亚洲一级二级三级在线免费观看| 亚洲一区二区天堂| 欧美极品在线视频| 国产精品美女久久久久久不卡| 欧美一区二区三区爽大粗免费| 国产成人精品影视| 国产剧情在线视频| 精品国偷自产在线视频99| 欧美a一欧美| 奇米777在线视频| 日韩欧美在线视频观看| av片在线观看| 色阁综合av| 成人av一区二区三区| 91精品国产色综合久久不8| 欧美一级片在线播放| 亚洲欧美在线专区| 手机毛片在线观看| 亚洲国产精品yw在线观看|