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

系統調用是如何實現的

系統 Linux
在執行 entry_SYSCALL_64 函數時,內核代碼會根據約定,先從rax寄存器中獲取想要執行的系統調用的編號,然后根據該編號從sys_call_table數組中找到對應的系統調用函數。

[[379322]]

 

這張圖畫了挺久的,主要是想讓大家可以從全局角度,看下linux內核中系統調用的實現。

因為圖片比較大,微信公眾號上壓縮的比較厲害,所以很多細節都看不清了,我單獨傳了一份到github上,想要原版圖片的,可以點擊下方的閱讀原文直接訪問github,或者也可以加我微信 yt0x01,我單獨發給你。

在講具體的細節之前,我們先根據上圖,從整體上看一下系統調用的實現。

系統調用的實現基礎,其實就是兩條匯編指令,分別是syscall和sysret。

syscall使執行邏輯從用戶態切換到內核態,在進入到內核態之后,cpu會從 MSR_LSTAR 寄存器中,獲取處理系統調用內核代碼的起始地址,即上面的 entry_SYSCALL_64。

在執行 entry_SYSCALL_64 函數時,內核代碼會根據約定,先從rax寄存器中獲取想要執行的系統調用的編號,然后根據該編號從sys_call_table數組中找到對應的系統調用函數。

接著,從 rdi, rsi, rdx, r10, r8, r9 寄存器中獲取該系統調用函數所需的參數,然后調用該函數,把這些參數傳入其中。

在系統調用函數執行完畢之后,執行結果會被放到rax寄存器中。

最后,執行sysret匯編指令,從內核態切換回用戶態,用戶程序繼續執行。

如果用戶程序需要該系統調用的返回結果,則從rax中獲取。

總體流程就是這樣,相對來說,還是比較簡單的,主要就是先去理解syscall和sysret這兩條匯編指令,在理解這兩條匯編指令的基礎上,再去看內核源碼,就會容易很多。

有關syscall和sysret指令的詳細介紹,請參考Intel® 64 and IA-32 Architectures Software Developer’s Manual。

有了上面對系統調用的整理理解,我們接下來看下其具體的實現細節。

以write系統調用為例,其對應的內核源碼為:

 

在內核中,所有的系統調用函數都是通過 SYSCALL_DEFINE 等宏定義的,比如上面的write函數,使用的是 SYSCALL_DEFINE3。

將該宏展開后,我們可以得到如下的函數定義:

 

由上可見,SYSCALL_DEFINE3宏展開后為三個函數,其中只有__x64_sys_write是外部可訪問的,其它兩個都有被static修飾,不能被外部訪問,所以注冊到上文中提到的sys_call_table數組里的函數,應該就是這個函數。

那該函數是怎么注冊到這個數組的呢?

我們先不說答案,先來看下sys_call_table數組的定義:

 

由上可見,該數組各元素的默認值都是 __x64_sys_ni_syscall:

 

該函數也非常簡單,就是直接返回錯誤碼 -ENOSYS,表示系統調用非法。

sys_call_table數組定義的地方好像只設置了默認值,并沒有設置真正的系統調用函數。

我們再看看其他地方,看是否有代碼會注冊真正的系統調用函數到sys_call_table數組里。

可惜,并沒有。

這就奇怪了,那各系統調用函數到底是在哪里注冊的呢?

我們再回頭仔細看下sys_call_table數組的定義,它在設置完默認值之后,后面還include了一個名為asm/syscalls_64.h的頭文件,這個位置include頭文件還是比較奇怪的,我們看下它里面是什么內容。

但是,這個文件居然不存在。

那我們只能初步懷疑這個頭文件是編譯時生成的,帶著這個疑問,我們去搜索相關內容,確實發現了一些線索:

 

這個文件確實是編譯時生成的,上面的makefile中使用了syscalltbl.sh腳本和syscall_64.tbl模板文件來生成這個syscalls_64.h頭文件。

我們來看下syscall_64.tbl模板文件的內容:

 

這里確實定義了write系統調用,且標明了它的編號是1。

我們再來看下生成的syscalls_64.h頭文件:

 

這里面定義了很多好像宏調用一樣的東西。

__SYSCALL_COMMON,這個不就是sys_call_table數組定義那里define的那個宏嘛。

再去上面看下__SYSCALL_COMMON這個宏定義,它的作用是將sym表示的函數賦值到sys_call_table數組的nr下標處。

所以對于__SYSCALL_COMMON(1, sys_write)來說,它就是注冊__x64_sys_write函數到sys_call_table數組下標為1的槽位處。

而這個__x64_sys_write函數,正是我們上面猜測的,SYSCALL_DEFINE3定義的write系統調用,展開之后的一個外部可訪問的函數。

這樣就豁然開朗了,原來真正的系統調用函數的注冊,是通過先定義__SYSCALL_COMMON宏,再include那個根據syscall_64.tbl模板生成的syscalls_64.h頭文件來完成的,非常巧妙。

系統調用函數注冊到sys_call_table數組的過程,到這里已經非常清楚了。

下面我們繼續來看下哪里在使用這個數組:

 

do_syscall_64在使用,方式是先通過nr在sys_call_table數組中找到對應的系統調用函數,然后再調用該函數,將regs傳入其中。

這個流程和我們上面預估的一樣,且傳入的regs參數類型,和我們上面注冊的系統調用函數所需的類型也一樣。

那也就是說,regs參數的字段里,是帶著各系統調用函數所需的參數的,SYSCALL_DEFINE等宏展開出來的一系列函數,會從這些字段中提取出真正的參數,然后對其進行類型轉換,最后這些參數被傳入到最終的系統調用函數中。

對于上面的write系統調用宏展開后的那些函數,__x64_sys_write會先從regs中提取出di, si, dx字段作為真正參數,然后__se_sys_write會將這些參數轉成正確的類型,最后__do_sys_write函數被調用,轉換后的這些參數被傳入其中。

在系統調用函數執行完畢后,其結果會被賦值到了regs的ax字段里。

由上可見,系統調用函數的參數及返回值的傳遞,都是通過regs來完成的。

但文章開始的時候不是說,系統調用的參數及返回值的傳遞,是通過寄存器來完成的嗎,這里怎么是通過struct pt_regs的字段呢?

先別急,先來看下struct pt_regs的定義:

 

你有沒有發現,這里面的字段名都是寄存器的名字。

那是不是說,在執行系統調用的代碼里,有邏輯把各寄存器里的值放到了這個結構體的對應字段里,在結束系統調用時,這些字段里的值又被賦值到各個對應的寄存器里呢?

離真相越來越近。

我們繼續看使用了do_syscall_64的地方:

 

上圖中的entry_SYSCALL_64方法,就是系統調用流程中最重要的一個方法了,為了便于理解,我對該方法做了很多修改,并添加了很多注釋。

這里需要注意的是100行到121行這段邏輯,它將各寄存器的值壓入到棧中,以此來構建struct pt_regs對象。

這就能構建出一個struct pt_regs對象了?

是的。

我們回上面看下struct pt_regs的定義,看其字段名字及順序是不是和這里的壓棧順序正好相反。

我們再想下,當我們要構建一個struct pt_regs對象時,我們要為其在內存中分配一塊空間,然后用一個地址來指向這段空間,這個地址就是該struct pt_regs對象的指針,這里需要注意的是,這個指針里存放的地址,是這段內存空間的最小地址。

再看上面的壓棧過程,每一次壓棧操作我們都可以認為是在分配內存空間并賦值,當r15被最終壓入到棧中后,整個內存空間分配完畢,且數據也初始化完畢,此時,rsp指向的棧頂地址,就是這段內存空間的最小地址,因為壓棧過程中,棧頂的地址是一直在變小的。

綜上可知,在壓棧完畢后,rsp里的地址就是一個struct pt_regs對象的地址,即該對象的指針。

在構建完struct pt_regs對象后,123行將rax中存放的系統調用編號賦值到了rdx里,124行將rsp里存放的struct pt_regs對象的地址,即該對象的指針,賦值到了rsi中,接著后面執行了call指令,來調用do_syscall_64方法。

調用do_syscall_64方法之前,對rdi和rsi的賦值,是為了遵守c calling convention,因為在該calling convention中約定,在調用c方法時,第一個參數要放到rdi里,第二個參數要放到rsi里。

我們再去上面看下do_syscall_64方法的定義,參數類型及順序是不是和我們這里說的是完全一樣的。

在調用完do_syscall_64方法后,系統調用的整個流程基本上就快結束了,上圖中的129行到133行做的都是一些寄存器恢復的工作,比如從棧中彈出對應的值到rax,rip,rsp等等。

這里需要注意的是,棧中rax的值是在上面do_syscall_64方法里設置的,其存放的是系統調用的最終結果。

另外,在棧中彈出的rip和rsp的值,分別是用戶態程序的后續指令地址及其堆棧地址。

最后執行sysret,從內核態切換回用戶態,繼續執行syscall后面邏輯。

到這里,完整的系統調用處理流程就已經差不多說完了,不過這里還差一小步,就是syscall指令在進入到內核態之后,是如何找到entry_SYSCALL_64方法的:

 

它其實是注冊到了MSR_LSTAR寄存器里了,syscall指令在進入到內核態之后,會直接從這個寄存器里拿系統調用處理函數的地址,并開始執行。

系統調用內核態的邏輯處理就是這些。

下面我們用一個例子來演示下用戶態部分:

 

編譯并執行:

 

我們用syscall來執行write系統調用,寫的字符串為Hi\n,syscall執行完畢后,我們直接使用ret指令將write的返回結果當作程序的退出碼返回。

所以在上圖中,輸出了Hi,且程序的退出碼是3。

如果對上面的匯編不太理解,可以把它想像成下面這個樣子:

 

在這里,我們使用的是glibc中的write方法來執行該系統調用,其實該方法就是對syscall指令做的一層封裝,本質上使用的還是我們上面的匯編代碼。

這個例子到這里就結束了。

有沒有覺得不太盡興?

我們分析了這么多的代碼,最終就用了這么個小例子就結束了,不行,我們要再做點什么。

要不我們來自己寫個系統調用?

說干就干。

我們先在write系統調用下面定義一個我們自己的系統調用:

 

該方法很簡單,就是將參數加10,然后返回。

再把這個系統調用在syscall_64.tbl里注冊一下,編號為442:

 

編譯內核,等待執行。

我們再把上面寫的那個hi程序改下并編譯好:

 

然后在虛擬機中啟動新編譯的linux內核,并執行上面的程序:

 

 

看結果,正好就是20。

 

搞定,收工。

本文轉載自微信公眾號「卯時卯刻」,可以通過以下二維碼關注。轉載本文請聯系卯時卯刻公眾號。

 

責任編輯:武曉燕 來源: 卯時卯刻
相關推薦

2022-08-17 08:10:34

語言VisitorListener

2009-10-23 09:38:59

VB.NET平臺調用

2021-06-03 08:03:13

網絡

2010-03-12 14:38:55

2010-01-28 10:06:05

Linux系統調用

2010-01-26 14:04:14

C++Builder

2022-03-14 15:26:59

Hi3516Ark子系統鴻蒙

2023-12-14 12:56:00

鏈式調用代碼

2024-05-31 08:45:24

2022-04-02 07:52:47

DubboRPC調用動態代理

2022-09-02 08:23:12

軟件開發解耦架構

2022-03-29 09:00:00

Angular框架REST API

2020-11-18 19:11:26

iOSFlutterNative

2016-11-28 15:17:52

大數據應用大數據

2017-01-11 09:22:03

大數據應用資源

2020-06-15 10:45:49

云計算自治系統冠狀病毒

2010-08-25 10:18:27

2011-01-11 16:11:03

2009-07-07 16:38:36

ServletCont

2011-09-08 17:50:34

Windows7放大鏡
點贊
收藏

51CTO技術棧公眾號

成人av网址在线| 久久影院一区| 色婷婷综合五月| 日韩免费av电影| 国产精品区在线观看| 欧美一区免费| 精品亚洲男同gayvideo网站| 国产又猛又黄的视频| 免费高清完整在线观看| 成人免费福利片| 国产成人精品日本亚洲| 黑鬼狂亚洲人videos| 欧美黑白配在线| 欧美性猛交xxxx乱大交退制版| 狠狠精品干练久久久无码中文字幕| 日韩专区第一页| 免费看黄色91| 97国产精品免费视频| 鲁丝一区二区三区| 77成人影视| 欧美在线观看一区二区| 美女扒开大腿让男人桶| 天堂аⅴ在线地址8| 9久草视频在线视频精品| 国产精品一区二区在线| 亚洲天堂av片| 国产一在线精品一区在线观看| 中文字幕免费国产精品| 黄色在线免费播放| 国产精品xnxxcom| 欧美亚洲一区三区| 日韩日韩日韩日韩日韩| 黄色网页在线观看| 久久久欧美精品sm网站| 黑人中文字幕一区二区三区| 国产又爽又黄免费软件| 日韩不卡一区二区| 91产国在线观看动作片喷水| 久草国产在线视频| 婷婷亚洲五月| 少妇精69xxtheporn| 一本加勒比北条麻妃| 粉嫩的18在线观看极品精品| 51精品久久久久久久蜜臀| 亚洲天堂网一区| videos性欧美另类高清| 精品高清一区二区三区| 少妇人妻大乳在线视频| 四虎影院观看视频在线观看| 亚洲日本一区二区三区| 亚洲一区三区在线观看| 1769在线观看| 欧美国产禁国产网站cc| 日本一区二区三不卡| 免费a在线观看| 91麻豆高清视频| 欧美成人综合一区| 日本一区二区三区在线观看视频| 91亚洲精品乱码久久久久久蜜桃| 精品1区2区| 亚洲日本中文字幕在线| 91在线国内视频| 久久精品日产第一区二区三区精品版| 黄色av网站免费在线观看| 国产成人免费在线观看不卡| 91传媒视频免费| а√中文在线资源库| 国产不卡高清在线观看视频| 99国产超薄丝袜足j在线观看 | 色诱亚洲精品久久久久久| 免费看又黄又无码的网站| 国产丝袜在线播放| 激情懂色av一区av二区av| 日韩精品视频一区二区在线观看| 成人免费直播| 欧美日韩国产综合视频在线观看| 91aaa精品| 在线综合色站| 亚洲美女视频网| 亚洲一区二区自偷自拍 | 欧美特级黄色片| 久久精品国产色蜜蜜麻豆| 91免费视频网站| 亚洲精品国产片| 久久你懂得1024| 一本色道久久综合亚洲二区三区| av片在线观看网站| 精品久久久久久| av五月天在线| 亚洲小说春色综合另类电影| 精品在线观看国产| 日本精品久久久久中文| 欧美精品一级| 日韩免费在线播放| 国产喷水吹潮视频www| av电影在线观看完整版一区二区| 欧美日韩国产免费一区二区三区| 婷婷在线视频观看| 亚洲成a人v欧美综合天堂下载| 日韩a在线播放| 豆花视频一区| 亚洲免费一在线| 欧美被狂躁喷白浆精品| 丝袜脚交一区二区| 1区1区3区4区产品乱码芒果精品| 亚洲人视频在线观看| 亚洲欧美一区二区三区国产精品 | 成人av在线资源| 亚洲精品视频一二三| 18video性欧美19sex高清| 欧美午夜精品一区| 免费日本黄色网址| 99久久综合| 日本三级韩国三级久久| 性欧美8khd高清极品| 欧美激情在线观看视频免费| 国产精品久久中文字幕| 亚洲精品aa| 亚洲一级一级97网| 国产一级二级三级| 另类综合日韩欧美亚洲| 久久精品日产第一区二区三区| 中文字幕在线观看网站| 在线看不卡av| 少妇精品一区二区三区| 亚洲国产高清一区二区三区| 91久久综合亚洲鲁鲁五月天| 九色在线免费| 午夜成人免费电影| 动漫av在线免费观看| 天天综合久久| 国产精品天天狠天天看| 你懂的在线网址| 欧美日韩国产页| 手机免费看av片| 欧美日韩在线大尺度| 91香蕉亚洲精品| 日本视频不卡| 欧美日韩亚洲高清一区二区| xxxxx在线观看| 性8sex亚洲区入口| 国产一区喷水| 97人人爽人人澡人人精品| 日韩欧美一二三四区| 国产又色又爽又高潮免费| 免费成人av在线| 色综合电影网| 97精品国产99久久久久久免费| 精品视频在线播放| 五月天综合激情网| 91亚洲精品一区二区乱码| 女人天堂av手机在线| 免费成人三级| 青青草精品毛片| 裸体xxxx视频在线| 色噜噜狠狠一区二区三区果冻| 欧美一区二区三区成人精品| 亚洲欧美清纯在线制服| 久久综合九色综合久99| 中文字幕乱码在线播放| 日韩久久免费电影| 天干夜夜爽爽日日日日| 国产午夜精品一区二区三区视频 | 精品乱码一区二区三区四区| 少妇高潮久久77777| 国产精品无码在线播放| 中文字幕一区二区三区精华液| 国产aⅴ爽av久久久久| 中文字幕午夜精品一区二区三区| 99久热re在线精品996热视频| 色av手机在线| 国产手机视频精品| 中国一级片黄色一级片黄| 中文字幕视频一区二区三区久| 激情图片中文字幕| 亚洲高清在线| 日本三级中国三级99人妇网站| 成人亚洲免费| 欧美人与物videos| 同心难改在线观看| 国产欧美二区| 精品中文字幕一区| 日韩制服一区| 欧美精品在线第一页| 午夜福利视频一区二区| 欧美午夜一区二区三区| 欧洲第一无人区观看| 99久久亚洲一区二区三区青草| 一本久道中文无码字幕av| 水蜜桃久久夜色精品一区| 91久久精品一区二区别| 欧美伦理91| 中文字幕亚洲欧美一区二区三区| 精品人妻伦一二三区久久| 欧美日韩午夜视频在线观看| 精品一区二区三孕妇视频| 国产成人精品免费网站| 99精品视频播放| 中文字幕一区二区三区欧美日韩 | 少妇一级淫片免费看| 日韩欧美在线视频观看| 国产免费美女视频| 91丝袜美腿高跟国产极品老师| 国产美女18xxxx免费视频| 在线不卡欧美| 一区二区三区av在线| 色老板在线视频一区二区| 国产日韩中文在线| 麻豆成全视频免费观看在线看| 日韩中文综合网| 日本v片在线免费观看| 欧美一区二区视频在线观看| 免费污污视频在线观看| 亚洲精品老司机| 中文字幕av久久爽一区| 懂色av一区二区三区免费看| 无需播放器的av| 国产视频亚洲| 成人在线视频一区二区三区| 日韩精品一卡| 欧美亚洲免费高清在线观看 | 亚洲国产精品成人av| 国产精品人人妻人人爽| 色欧美乱欧美15图片| 国产精品500部| 亚洲一区欧美一区| 顶级黑人搡bbw搡bbbb搡| 久久久久久久久久久黄色| 97中文字幕在线观看| 国产一区欧美二区| 在线免费av播放| 天堂一区二区在线免费观看| 成人性免费视频| 国产一区日韩一区| 欧美交换配乱吟粗大25p| 欧美国产美女| 日韩伦理一区二区三区av在线| 西瓜成人精品人成网站| 国产乱码精品一区二区三区日韩精品| 国产一区二区三区亚洲综合| 国产美女久久精品| 欧美与亚洲与日本直播| 国产成人精品优优av| 自拍偷拍亚洲视频| 欧美亚洲另类激情另类| 福利影院在线看| 97精品国产97久久久久久免费| 日韩123区| 欧美激情精品久久久久| 日本在线观看高清完整版| 九九热精品视频| 污污视频在线| 久久久女女女女999久久| 国产福利在线免费观看| 欧美激情精品久久久久久免费印度| caoporm免费视频在线| 操人视频在线观看欧美| av网站免费在线观看| 色综合久久悠悠| 国产桃色电影在线播放| 性欧美暴力猛交69hd| 欧美极品videos大乳护士| 国产91网红主播在线观看| 日本一道高清亚洲日美韩| 国产免费一区二区三区在线观看 | 国内精品久久久久影院一蜜桃| 中文字幕免费高清在线| 精品一区二区三区久久久| 久久精品久久99| 国产成人精品亚洲777人妖| av电影在线播放| 久久久青草青青国产亚洲免观| 国产亚洲精品精品精品| 亚洲欧美国产三级| 日韩精品视频免费看| 色婷婷综合视频在线观看| 一道本无吗一区| 日韩免费福利电影在线观看| 黄色一级大片在线免费看国产一| 日韩精品中文在线观看| 999国产在线视频| 欧美片一区二区三区| 依依综合在线| 成人中文字幕+乱码+中文字幕| 999在线精品| 欧美一区二区三区四区五区六区| 日韩伦理视频| 成人免费性视频| 日本亚洲欧美天堂免费| 亚洲熟女一区二区三区| 久久蜜臀中文字幕| 亚洲精品一区二区三区在线播放| 亚洲成av人在线观看| 在线观看免费视频一区| 精品国产伦一区二区三区观看方式 | 日韩va亚洲va欧美va清高| 午夜在线成人av| 一级做a爰片久久毛片16| 精品电影一区二区| 成人三级黄色免费网站| 久久久久久久国产精品| 成人涩涩视频| 国产私拍一区| 久久中文字幕av| 欧美性久久久久| 国产白丝精品91爽爽久久| 欧美激情 一区| 午夜亚洲国产au精品一区二区| 一区二区视频免费| 日韩电影大全免费观看2023年上| 免费a在线看| 日韩av日韩在线观看| 国产精品45p| 国产高清精品软男同| 久久婷婷丁香| 91传媒理伦片在线观看| 亚洲欧洲成人精品av97| 国产寡妇亲子伦一区二区三区四区| 日韩精品一区二区三区三区免费 | 蜜桃国内精品久久久久软件9| 免费看污污视频| 裸体在线国模精品偷拍| 白丝女仆被免费网站| 亚洲第一精品在线| 99国产精品久久久久99打野战| 国产亚洲人成a一在线v站| 高清在线视频不卡| 99理论电影网| 亚洲网色网站| 精品久久久99| 国产欧美日韩三区| 久久精品无码av| 国产手机视频精品| 擼擼色在线看观看免费| 国产精品 日韩| 国产一区二区三区四区老人| 污免费在线观看| 亚洲男人的天堂在线观看| 亚洲最大成人av| 最新国产成人av网站网址麻豆| 在线成人视屏| 午夜精品福利一区二区| 久久亚洲风情| 69精品无码成人久久久久久| 色哟哟一区二区在线观看| 欧美色视频免费| 日本在线观看天堂男亚洲| 免费视频亚洲| 九一精品在线观看| 欧美国产精品专区| 精品乱码一区内射人妻无码| 国产香蕉精品视频一区二区三区| 免费成人直播| 日韩影院一区| 美腿丝袜亚洲一区| 三级黄色在线观看| 欧美一级高清片在线观看| 国产在线高潮| 国产高清在线一区| 99re国产精品| 性欧美精品中出| 欧美色精品天天在线观看视频| 亚乱亚乱亚洲乱妇| 91香蕉亚洲精品| 亚洲国内精品| 国产成人av一区二区三区不卡| 色国产综合视频| 香蕉视频在线看| 97超碰人人看人人| 亚洲精品护士| 国产探花视频在线播放| 欧美精品高清视频| 中文字幕中文字幕在线中高清免费版| 国产日韩一区欧美| 久久精品麻豆| av在线免费播放网址| 欧美一区午夜精品| 99热99re6国产在线播放| 欧美另类网站| 精品一区二区在线视频| 久久午夜无码鲁丝片| 国产婷婷色综合av蜜臀av| 国产极品久久久久久久久波多结野| 在线观看一区二区三区三州 | 北条麻妃高清一区| 日韩午夜免费| 国产调教在线观看| 日韩亚洲欧美高清| 久久人体大尺度| 日本丰满少妇黄大片在线观看| 成人午夜电影网站| 色婷婷久久综合中文久久蜜桃av| 欧美成人免费全部| 亚州综合一区| 亚洲精品中文字幕乱码无线| 动漫精品一区二区| 久草免费在线观看| 欧美午夜精品理论片a级大开眼界| 国产一区二区美女| 欧美a视频在线观看|