国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

深入理解Linux系統調用

系統 Linux
一提到服務,大家最先想到的一定是服務器,假設客戶端是瀏覽器,瀏覽器發送http請求,服務器接收到請求后進行解析然后調用相應的hander,從本質上講就是客戶端觸發了服務器端的某個函數的運行,這時我們說客戶端請求了服務器端上的服務。

系統調用和普通的函數調用沒有本質區別,普通的函數調用一般調用的是我們自己編寫的函數或者其它庫函數,而系統調用調用的則是內核中的函數,更學術一點的說法是這樣的,所謂系統調用是指用戶態程序請求操作系統提供的服務。

一提到服務,大家最先想到的一定是服務器,假設客戶端是瀏覽器,瀏覽器發送http請求,服務器接收到請求后進行解析然后調用相應的hander,從本質上講就是客戶端觸發了服務器端的某個函數的運行,這時我們說客戶端請求了服務器端上的服務。

而系統調用與此類似,只不過用戶態程序并不是通過http觸發了操作系統中某個函數的運行,而是通過機器指令來觸發的,因為用戶態的App和操作系統運行在同一臺計算機系統上,而客戶端和服務器端運行在不同的計算機系統中(絕大部分情況下),因此客戶端只能通過網絡協議http來與服務器進行通信。

圖片圖片

更通俗的說法就是所謂系統調用是指用戶態的某個函數調用內核中的某個函數。

接下來我們用一段簡單的hello world程序看下系統調用,這段程序需要運行在x86_64下:

.section .data
msg:
    .ascii "Hello, world!\n"    # 字符串定義,包含換行符
    len = . - msg               # 計算字符串長度(包括換行符)
.section .text
.global _start
_start:
    # 調用 write(1, msg, len)
    movq  $1, %rax              # syscall 1 (write)
    movq  $1, %rdi              # fd = 1 (stdout)
    movq  $msg, %rsi            # 字符串地址
    movq  $len, %rdx            # 字符串長度
    syscall
    # 調用 exit(0)
    movq  $60, %rax             # syscall 60 (exit)
    xorq  %rdi, %rdi            # status = 0
    syscall

使用以下命令編譯:

$ gcc -c test.S
$ ld -o test test.o

然后執行:

./test
Hello, world!

這段匯編代碼成功的打印出了hello world,這段代碼是什么意思呢?

注意看.data這一段,這里說的是程序定義了哪些數據,.text段是說程序中包含了哪些執行,我們之前提到進程的內存布局時總是說數據段以及代碼段,這里的數據段指的就是匯編中的.data段、代碼段指的就是匯編中的.text段,現在你應該明白了吧。

圖片圖片

在.text段我們看到了一條略顯奇怪的指令,syscall,這條指令是什么意思呢?

我們來翻看一下intel的開發手冊:

SYSCALL invokes an OS system-call handler at privilege level 0. It does so by loading RIP from the IA32_LSTAR MSR (after saving the address of the instruction following SYSCALL into RCX). (The WRMSR instruction ensures that the IA32_LSTAR MSR always contain a canonical address.)

這段話告訴我們intel處理器在執行syscall指令時會在內核態調用操作系統的某個函數,即syscall-call handler,這個過程就是所謂的系統調用,我們知道CPU執行某個函數時必須知道某個函數在內存中的地址,那么CPU是怎么知道某個syscall-call handler的內存地址呢?

原來syscall-call handler所在的內存地址存儲在寄存器MSR中,那么又是誰將這個地址存儲在了寄存器MSR中呢?很顯然是操作系統,接下來以Linux為例來講解。

Linux內核初始化時將syscall-call handler也就是Linux內核中entry_SYSCALL_64函數的地址寫入寄存器MSR中:

wrmsrl(MSR_LSTAR, entry_SYSCALL_64);

其中syscall-call handler也就是entry_SYSCALL_64定義在了Linux源碼中的arch/x86/entry/entry_64.S,上述初始化寄存器MSR的代碼定義在了arch/x86/kernel/cpu/common.c。

現在我們知道了,當CPU執行syscall時會無腦跳轉到寄存器MSR中保存的函數地址,也就是entry_SYSCALL_64函數,那么很顯然的,所有系統調用的入口都是entry_SYSCALL_64函數,那么操作系統該怎么區分到底是調用的read系統調用還是write等系統調用?

原來,操作系統中給每種系統調用分配了一個序號,就像Linux中這樣:

0common  read      sys_read
1common  write      sys_write
2common  open      sys_open
3common  close      sys_close
4common  stat      sys_newstat
5common  fstat      sys_newfstat
6common  lstat      sys_newlstat
7common  poll      sys_poll
8common  lseek      sys_lseek
9common  mmap      sys_mmap
...

可以看到,0號系統調用表示的是內核中的read函數,1號系統調用表示的內核中的write函數,在進行系統調用時會將表示系統調用類別的序號寫入通用寄存器中。

從上面這個表格中可以看到write系統調用的序號是1,因此在hello world程序中我們將1寫入寄存器rax中:

movq  $1, %rax

這條指令就表示我們將要調用第1號系統調用,也就是sys_write,hello world程序中后續三條機器指令的函數是:

# 寫入文件描述符1
movq  $1, %rdi


# 保存指向字符串的指針
movq  $msg, %rsi


# 寫入數據的大小
movq  $len, %rdx

實際上這四條機器指令都是為執行syscall進行的鋪墊,也就是執行syscall所需要的參數,可以看到我們進行系統調用傳遞參數時都是通過寄存器來完成的。

這樣當CPU執行syscall執行時就會跳轉到Linux內核中的write函數,同時在執行該函數時也能知道write函數所需要的參數是什么。

責任編輯:武曉燕 來源: 碼農的荒島求生
相關推薦

2023-02-10 08:11:43

Linux系統調用

2023-09-18 11:34:17

Linux系統

2022-11-09 08:12:07

2022-09-01 08:08:35

Android移動操作系統

2021-08-31 10:32:11

LinuxPage Cache命令

2013-06-20 10:25:56

2020-07-21 08:26:08

SpringSecurity過濾器

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2018-04-16 11:04:23

HBaseRegion Serv數據庫

2018-09-12 15:48:35

ext4Linux文件系統

2017-01-12 19:34:58

2021-05-19 07:56:26

Linux內核搶占

2009-09-25 09:14:35

Hibernate日志

2021-02-17 11:25:33

前端JavaScriptthis

2023-10-19 11:12:15

Netty代碼

2013-09-22 14:57:19

AtWood

2020-09-23 10:00:26

Redis數據庫命令

2025-06-05 05:51:33

2017-08-15 13:05:58

Serverless架構開發運維
點贊
收藏

51CTO技術棧公眾號

caoporn成人免费视频在线| 成人免费视频国产在线观看| 精品久久久久久无码中文野结衣| 久久亚洲一区二区三区四区| av伦理在线| 免费观看成人高| 成人国产精品视频| 成人在线观看亚洲| 91夜夜未满十八勿入爽爽影院| 亚洲国产高清一区二区三区| 亚洲午夜精品久久| 午夜免费久久看| 亚洲亚洲免费| 日本在线中文电影| 久久国产精品亚洲| 国产综合成人久久大片91| 成人ww免费完整版在线观看| 午夜精品亚洲一区二区三区嫩草| 1024成人网| 国产一区二区三区亚洲| 国产第一页视频| 日韩av免费在线| 欧美丝袜美女中出在线| 国内视频精品| av男人的天堂在线| 欧美黑人xxxx| 青青草原av在线播放| 色偷偷av一区二区三区乱| 国产一区二区在线免费观看| 澳门成人av网| 九热视频在线观看| www.xxxx欧美| 亚洲国产色一区| 久久中文欧美| 91av久久| 一级黄色特级片| 色综合天天综合网天天看片| 日本成人在线电影网| 亚洲大胆精品| 日韩精品伦理第一区| 精品少妇一区二区三区免费观看 | 韩国成人一区| 国产精品国产自产拍高清av王其| 国产精品一在线观看| 黄色精品在线观看| 日韩一级片播放| 国产欧美日韩视频一区二区三区| 在线观看欧美日韩国产| 亚洲人成人一区二区三区| 色综合视频一区二区三区日韩| 欧美xxxxxxxxx59| 亚洲一区二区在线免费观看| 亚洲天堂成人在线| 色综合久久99| 99热国产精品| 日韩精品久久理论片| 成人三级黄色免费网站| 美女网站免费观看视频| 国产精品一区二区三区成人| 亚洲欧洲在线看| 色婷婷久久久久swag精品| av不卡一区二区三区| 久久免费国产| 国产精一区二区| 日韩欧美看国产| 国产视频视频一区| a美女胸又www黄视频久久| 男女男精品视频| 亚洲国产免费看| 91精品xxx在线观看| 国内在线视频| 精品一二三区视频| 午夜影院在线免费观看| 羞羞网www| 宅男宅女性影片资源在线1| 秋霞久久久久久一区二区| 国产精品影片在线观看| 国产精品扒开腿做爽爽爽视频| 69久久夜色精品国产69乱青草| 日韩电视剧在线观看免费网站| 欧美剧情片在线观看| 91精品一区二区三区久久久久久 | 国产精品一二三在| 丝袜诱惑制服诱惑色一区在线观看| 国产一区二区三区四区五区| 中文字幕区一区二区三| 韩国av网站在线| 色一区二区三区| 九色porny丨首页入口在线| 免费h视频在线观看| 国外成人福利视频| 国产精品香蕉| 忘忧草精品久久久久久久高清| 亚洲精品1234| 国产成人免费在线| 欧美国产精品中文字幕| 欧美性极品少妇精品网站| 666欧美在线视频| 国产亚洲精品久久久久久777| 久久成人18免费网站| 国产精品丝袜高跟| 国产伦精品一区二区三区| 超碰97免费观看| 看黄色免费网站| 午夜在线视频| 先锋影音网一区二区| 五月精品视频| 精品一区二区三区av| 2017欧美狠狠色| 欧美另类变人与禽xxxxx| 337p亚洲精品色噜噜| 欧美日韩午夜精品| 欧美极品在线视频| 久久涩涩网站| 日本www在线视频| √新版天堂资源在线资源| avav成人| 国产亚洲激情| 午夜精品久久久久久久| 日韩亚洲欧美综合| 欧美一级电影久久| 国产精品有限公司| 无码av中文一区二区三区桃花岛| 日本乱人伦一区| 欧美精品一区二区免费| 不卡一区二区三区视频| 日本精品一区二区三区四区| 日韩电影免费| 亚洲电影一区| 狠狠久久亚洲欧美| 在线观看视频一区二区欧美日韩| 精彩视频一区二区| 欧美精品一级二级三级| 国产精品久久久久久久久免费看 | 成人在线视频福利| 亚洲久久中文字幕| 国产日本久久| 麻豆精品蜜桃视频网站| 欧美一区二区福利视频| 999热视频在线观看| 免费特级黄毛片| 日本欧美韩国国产| 欧美国产日韩一二三区| 亚洲人成伊人成综合网久久久| 国产日韩欧美中文| 蜜桃av色综合| 五月花成人网| 日韩影院精彩在线| 欧美日本在线播放| 国产在线98福利播放视频| 99免费视频观看| 黄色av电影在线播放| 91精品91| 亚洲欧美成人一区二区三区| 国内精久久久久久久久久人| 久久精品国产精品亚洲色婷婷| 不卡视频观看| 成人av免费网站| 一区二区三区四区五区在线| 国产伦精品一区二区三区千人斩 | 国产激情在线视频| 欧美激情五月| 久久精品日产第一区二区三区高清版| 欧美成人免费全部| 看黄的a网站| 欧美一卡二卡| 99久久综合狠狠综合久久| 日韩精品在线免费播放| 日本久久久久久久久| 美女在线一区| 影音先锋国产精品| 国产亚洲精品久久久久久牛牛| 亚洲区一区二区三区| 在线观看欧美| 欧美性猛片xxxx免费看久爱| 亚洲看片网站| 日韩欧美国产大片| 精品国产亚洲一区二区三区在线观看 | 欧美调教在线| 日韩区在线观看| av手机免费观看| 日韩精品一区二区久久| 日韩一区二区影院| 日韩伦理在线免费观看| 欧美电影《睫毛膏》| 亚洲国产欧美在线成人app | 亚洲36d大奶网| 亚洲欧洲午夜| 97精品视频在线播放| 牛牛电影国产一区二区| 亚洲黄色免费网站| 青青草原国产免费| 婷婷激情综合| 欧美极品欧美精品欧美视频| 日本高清在线观看视频| 亚洲一二三四久久| 日本在线观看免费视频| 久久激情五月激情| 官网99热精品| 亚洲人体av|