婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解linux系統(tǒng)調(diào)用原理

詳解linux系統(tǒng)調(diào)用原理

熱門標(biāo)簽:外呼系統(tǒng)坐席費計入會計哪個科目 達(dá)亞電銷機器人官網(wǎng) 電銷機器人價值 如何分析地圖標(biāo)注 高德地圖標(biāo)注好做嗎 新余高德地圖標(biāo)注怎么修改 撫順地圖標(biāo)注 電銷機器人怎么接線路 大連400電話如何申請

操作系統(tǒng)通過系統(tǒng)調(diào)用為運行于其上的進(jìn)程提供服務(wù)。

當(dāng)用戶態(tài)進(jìn)程發(fā)起一個系統(tǒng)調(diào)用, CPU 將切換到 內(nèi)核態(tài) 并開始執(zhí)行一個 內(nèi)核函數(shù) 。 內(nèi)核函數(shù)負(fù)責(zé)響應(yīng)應(yīng)用程序的要求,例如操作文件、進(jìn)行網(wǎng)絡(luò)通訊或者申請內(nèi)存資源等。

舉一個最簡單的例子,應(yīng)用進(jìn)程需要輸出一行文字,需要調(diào)用 write 這個系統(tǒng)調(diào)用:

hello_world.c

#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
 char *msg = "Hello, world!\n";
 write(1, msg, strlen(msg));

 return 0;
}

注解

讀者可能會有些疑問——輸出文本不是用 printf 等函數(shù)嗎?

確實是。 printf 是更高層次的庫函數(shù),建立在系統(tǒng)調(diào)用之上,實現(xiàn)數(shù)據(jù)格式化等功能。 因此,本質(zhì)上還是系統(tǒng)調(diào)用起決定性作用。

調(diào)用流程

那么,在應(yīng)用程序內(nèi),調(diào)用一個系統(tǒng)調(diào)用的流程是怎樣的呢?

我們以一個假設(shè)的系統(tǒng)調(diào)用 xyz 為例,介紹一次系統(tǒng)調(diào)用的所有環(huán)節(jié)。

如上圖,系統(tǒng)調(diào)用執(zhí)行的流程如下:

  • 應(yīng)用程序 代碼調(diào)用系統(tǒng)調(diào)用( xyz ),該函數(shù)是一個包裝系統(tǒng)調(diào)用的 庫函數(shù) ;
  • 庫函數(shù) ( xyz )負(fù)責(zé)準(zhǔn)備向內(nèi)核傳遞的參數(shù),并觸發(fā) 軟中斷 以切換到內(nèi)核;
  • CPU 被 軟中斷 打斷后,執(zhí)行 中斷處理函數(shù) ,即 系統(tǒng)調(diào)用處理函數(shù) ( system_call );
  • 系統(tǒng)調(diào)用處理函數(shù) 調(diào)用 系統(tǒng)調(diào)用服務(wù)例程 ( sys_xyz ),真正開始處理該系統(tǒng)調(diào)用;

執(zhí)行態(tài)切換

應(yīng)用程序 ( application program )與 庫函數(shù) ( libc )之間, 系統(tǒng)調(diào)用處理函數(shù) ( system call handler )與 系統(tǒng)調(diào)用服務(wù)例程 ( system call service routine )之間, 均是普通函數(shù)調(diào)用,應(yīng)該不難理解。 而 庫函數(shù) 與 系統(tǒng)調(diào)用處理函數(shù) 之間,由于涉及用戶態(tài)與內(nèi)核態(tài)的切換,要復(fù)雜一些。

Linux 通過 軟中斷 實現(xiàn)從 用戶態(tài) 到 內(nèi)核態(tài) 的切換。 用戶態(tài) 與 內(nèi)核態(tài) 是獨立的執(zhí)行流,因此在切換時,需要準(zhǔn)備 執(zhí)行棧 并保存 寄存器 。

內(nèi)核實現(xiàn)了很多不同的系統(tǒng)調(diào)用(提供不同功能),而 系統(tǒng)調(diào)用處理函數(shù) 只有一個。 因此,用戶進(jìn)程必須傳遞一個參數(shù)用于區(qū)分,這便是 系統(tǒng)調(diào)用號 ( system call number )。 在 Linux 中, 系統(tǒng)調(diào)用號 一般通過 eax 寄存器 來傳遞。

總結(jié)起來, 執(zhí)行態(tài)切換 過程如下:

  • 應(yīng)用程序 在 用戶態(tài) 準(zhǔn)備好調(diào)用參數(shù),執(zhí)行 int 指令觸發(fā) 軟中斷 ,中斷號為 0x80 ;
  • CPU 被軟中斷打斷后,執(zhí)行對應(yīng)的 中斷處理函數(shù) ,這時便已進(jìn)入 內(nèi)核態(tài) ;
  • 系統(tǒng)調(diào)用處理函數(shù) 準(zhǔn)備 內(nèi)核執(zhí)行棧 ,并保存所有 寄存器 (一般用匯編語言實現(xiàn));
  • 系統(tǒng)調(diào)用處理函數(shù) 根據(jù) 系統(tǒng)調(diào)用號 調(diào)用對應(yīng)的 C 函數(shù)—— 系統(tǒng)調(diào)用服務(wù)例程 ;
  • 系統(tǒng)調(diào)用處理函數(shù) 準(zhǔn)備 返回值 并從 內(nèi)核棧 中恢復(fù) 寄存器 ;
  • 系統(tǒng)調(diào)用處理函數(shù) 執(zhí)行 ret 指令切換回 用戶態(tài) ;

編程實踐

下面,通過一個簡單的程序,看看應(yīng)用程序如何在 用戶態(tài) 準(zhǔn)備參數(shù)并通過 int 指令觸發(fā) 軟中斷 以陷入 內(nèi)核態(tài) 執(zhí)行 系統(tǒng)調(diào)用 :

hello_world-int.S

.section .rodata

msg:
 .ascii "Hello, world!\n"

.section .text

.global _start

_start:
 # call SYS_WRITE
 movl $4, %eax
 # push arguments
 movl $1, %ebx
 movl $msg, %ecx
 movl $14, %edx
 int $0x80

 # Call SYS_EXIT
 movl $1, %eax
 # push arguments
 movl $0, %ebx
 # initiate
 int $0x80

這是一個匯編語言程序,程序入口在 _start 標(biāo)簽之后。

第 12 行,準(zhǔn)備 系統(tǒng)調(diào)用號 :將常數(shù) 4 放進(jìn) 寄存器 eax 。 系統(tǒng)調(diào)用號 4 代表 系統(tǒng)調(diào)用 SYS_write , 我們將通過該系統(tǒng)調(diào)用向標(biāo)準(zhǔn)輸出寫入一個字符串。

第 14-16 行, 準(zhǔn)備系統(tǒng)調(diào)用參數(shù):第一個參數(shù)放進(jìn) 寄存器 ebx ,第二個參數(shù)放進(jìn) ecx , 以此類推。

write 系統(tǒng)調(diào)用需要 3 個參數(shù):

  • 文件描述符 ,標(biāo)準(zhǔn)輸出文件描述符為 1 ;
  • 寫入內(nèi)容(緩沖區(qū))地址;
  • 寫入內(nèi)容長度(字節(jié)數(shù));

第 17 行,執(zhí)行 int 指令觸發(fā)軟中斷 0x80 ,程序?qū)⑾萑雰?nèi)核態(tài)并由內(nèi)核執(zhí)行系統(tǒng)調(diào)用。 系統(tǒng)調(diào)用執(zhí)行完畢后,內(nèi)核將負(fù)責(zé)切換回用戶態(tài),應(yīng)用程序繼續(xù)執(zhí)行之后的指令( 從 20 行開始 )。

第 20-24 行,調(diào)用 exit 系統(tǒng)調(diào)用,以便退出程序。

注解
注意到,這里必須顯式調(diào)用 exit 系統(tǒng)調(diào)用退出程序。 否則,程序?qū)⒗^續(xù)往下執(zhí)行,最終遇到段錯誤( segmentation fault )!

讀者可能很好奇——我在寫 C 語言或者其他程序時,這個調(diào)用并不是必須的!

這是因為 C 庫( libc )已經(jīng)幫你把臟活累活都干了。

接下來,我們編譯并執(zhí)行這個匯編語言程序:

$ ls
hello_world-int.S
$ as -o hello_world-int.o hello_world-int.S
$ ls
hello_world-int.o hello_world-int.S
$ ld -o hello_world-int hello_world-int.o
$ ls
hello_world-int hello_world-int.o hello_world-int.S
$ ./hello_world-int
Hello, world!

其實,將 系統(tǒng)調(diào)用號 和 調(diào)用參數(shù) 放進(jìn)正確的 寄存器 并觸發(fā)正確的 軟中斷 是個重復(fù)的麻煩事。 C 庫已經(jīng)把這臟累活給干了——試試 syscall 函數(shù)吧!

hello_world-syscall.c

#include <string.h>
#include <sys/syscall.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
 char *msg = "Hello, world!\n";
 syscall(SYS_write, 1, msg, strlen(msg));

 return 0;
}

標(biāo)簽:海東 黃石 楊凌 衡水 新鄉(xiāng) 湖南 南通 遼源

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解linux系統(tǒng)調(diào)用原理》,本文關(guān)鍵詞  詳解,linux,系統(tǒng),調(diào)用,原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解linux系統(tǒng)調(diào)用原理》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解linux系統(tǒng)調(diào)用原理的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    99麻豆久久久国产精品免费优播| 精品国产青草久久久久福利| 制服丝袜激情欧洲亚洲| 首页亚洲欧美制服丝腿| 精品福利一区二区三区免费视频| 成人av网站在线| 樱桃视频在线观看一区| 91精品免费在线观看| 国产成人一区二区精品非洲| 亚洲蜜桃精久久久久久久| 亚洲免费视频成人| 欧美狂野另类xxxxoooo| 大尺度一区二区| 天天色图综合网| 夜夜精品视频一区二区| 久久精品综合网| 欧美丝袜自拍制服另类| 国产精品亚洲第一| 国产精品白丝jk黑袜喷水| 亚洲午夜电影在线观看| 国产视频911| 7777精品久久久大香线蕉| 欧美一区二区三区在线观看 | 狠狠色狠狠色综合| 香蕉加勒比综合久久 | 日产欧产美韩系列久久99| 136国产福利精品导航| 久久久久久久久久久黄色| 免费看欧美美女黄的网站| 亚洲免费观看在线观看| 色94色欧美sute亚洲线路二| 国产大片一区二区| 欧美精品xxxxbbbb| 欧美日韩国产经典色站一区二区三区| 成人h精品动漫一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 国产一区二区视频在线| 日韩高清中文字幕一区| 一区二区三区四区在线播放| 日韩精品在线一区二区| 日本一区二区不卡视频| 久久综合久久久久88| 日韩欧美国产综合一区| 久久精品视频网| 久久久亚洲高清| 2024国产精品视频| 亚洲精品一区二区三区99| 国产精品视频一二三区| 久久这里都是精品| 久久精品网站免费观看| 久久精品视频一区二区三区| 色婷婷一区二区三区四区| 91在线精品一区二区三区| 欧美日韩一本到| 欧美一区二区三区人| 国产精品国产三级国产专播品爱网| 国产丝袜欧美中文另类| 欧美—级在线免费片| 国产欧美日韩另类一区| 日本一区二区三区电影| 欧美国产精品中文字幕| 国产精品美女久久久久久久久久久 | 99re热视频精品| 色哟哟国产精品| 久久网站热最新地址| 国产精品黄色在线观看| 亚洲综合一区二区| 亚洲精品美腿丝袜| 免费的成人av| 成人精品gif动图一区| eeuss国产一区二区三区| 日韩免费在线观看| 国产精品久久久久久久久久久免费看| 亚洲色图制服丝袜| 午夜精品福利一区二区蜜股av| 免费精品99久久国产综合精品| 国产高清久久久久| 欧美亚洲国产怡红院影院| 中文字幕av在线一区二区三区| 亚洲人吸女人奶水| 99精品黄色片免费大全| 欧美日本在线观看| 国产欧美一区视频| 一区二区成人在线| 国产在线麻豆精品观看| 91在线观看美女| 精品欧美一区二区三区精品久久| 成人欧美一区二区三区视频网页| 免费在线观看成人| 91香蕉视频黄| 亚洲综合色区另类av| 日本免费新一区视频| 成人黄色小视频| 日韩一区二区三区av| 中文字幕中文字幕一区二区 | 国产精品色哟哟网站| 午夜精品久久久久久久蜜桃app| 成人app在线观看| 欧美电视剧免费观看| 亚洲精选视频在线| 色视频一区二区| 亚洲欧洲av色图| 国产麻豆一精品一av一免费| 欧美一区二区福利视频| 亚洲网友自拍偷拍| 波多野结衣在线aⅴ中文字幕不卡| 国产成人精品免费一区二区| 久久综合999| 日韩国产在线观看| 色94色欧美sute亚洲线路二| 亚洲动漫第一页| 一本久久a久久精品亚洲| 久久久久久电影| 免费人成在线不卡| 欧美精品一区二区高清在线观看| 偷窥少妇高潮呻吟av久久免费| 波多野结衣91| 一区二区三区.www| 99v久久综合狠狠综合久久| 久久九九99视频| 蜜臀av一区二区在线免费观看| 2024国产精品| 黑人巨大精品欧美黑白配亚洲| 色狠狠色狠狠综合| 一区二区视频在线看| 91国产丝袜在线播放| 亚洲综合在线观看视频| 欧美在线观看视频一区二区三区| 亚洲六月丁香色婷婷综合久久 | 日韩中文字幕1| 精品美女在线播放| 精品一区二区三区在线观看 | 欧美成人一区二区三区| 国产精品原创巨作av| 久久久www成人免费毛片麻豆| 国产在线观看一区二区| 亚洲免费观看高清在线观看| 日本久久精品电影| 肉色丝袜一区二区| 在线观看91视频| 粉嫩嫩av羞羞动漫久久久| 亚洲视频在线观看一区| 在线视频一区二区三区| 国产麻豆9l精品三级站| 国产精品国产三级国产普通话蜜臀| 成人av免费观看| 欧美a级理论片| 久久久久久久综合色一本| a4yy欧美一区二区三区| 亚洲国产精品传媒在线观看| 欧美日韩国产综合视频在线观看 | 美女一区二区三区| 91.xcao| 99精品视频一区二区三区| 亚洲va天堂va国产va久| 精品国产成人系列| 56国语精品自产拍在线观看| 国产精品99久久久久久似苏梦涵| 一区二区三区欧美日韩| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 99re这里都是精品| 国产一区二区三区免费播放| 丝袜美腿高跟呻吟高潮一区| 亚洲精品福利视频网站| 中文字幕在线一区二区三区| 久久久精品免费免费| 欧美videos大乳护士334| 欧美日韩高清在线| 欧美日韩一本到| 欧美日韩美少妇| 欧美久久免费观看| 欧美日韩精品一区二区三区 | 蜜臀久久99精品久久久画质超高清| 一区二区三区精品视频在线| 亚洲欧美国产三级| 亚洲图片另类小说| 亚洲女性喷水在线观看一区| 国产精品夫妻自拍| 亚洲色图第一区| 亚洲自拍偷拍图区| 亚洲一区二三区| 视频一区二区中文字幕| 美女尤物国产一区| 国产一区福利在线| 国产大陆精品国产| 成人久久18免费网站麻豆| 99精品久久免费看蜜臀剧情介绍| 91美女视频网站| 欧美日韩在线综合| 日韩一区二区电影在线| 精品黑人一区二区三区久久| 久久日韩精品一区二区五区| 欧美激情一区二区在线| 亚洲色欲色欲www| 偷拍一区二区三区四区| 麻豆91在线看| 国产精品888| 色婷婷综合久色| 日韩欧美成人激情| 欧美国产禁国产网站cc|