成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux 函數(shù)調(diào)用的用戶態(tài)與內(nèi)核態(tài)

系統(tǒng) Linux
當系統(tǒng)調(diào)用從用戶態(tài)到內(nèi)核態(tài)的時候,首先要做的第一件事情,就是將用戶態(tài)運行過程中的 CPU 上下文保存起來,其實主要就是保存在這個結(jié)構(gòu)的寄存器變量里。這樣當從內(nèi)核系統(tǒng)調(diào)用返回的時候,才能讓進程在剛才的地方接著運行下去。

在用戶態(tài)中,程序的執(zhí)行往往是一個函數(shù)調(diào)用另一個函數(shù)。函數(shù)調(diào)用都是通過棧來進行的。

在進程的內(nèi)存空間里面,棧是一個從高地址到低地址,往下增長的結(jié)構(gòu),也就是上面是棧底,下面是棧頂,入棧和出棧的操作都是從下面的棧頂開始的。

32 位操作系統(tǒng)在 CPU 里,ESP(Extended Stack Pointer)是棧頂指針寄存器,入棧操作 Push 和出棧操作 Pop 指令,會自動調(diào)整 ESP 的值。另外有一個寄存器 EBP(Extended Base Pointer),是?;刂分羔樇拇嫫?,指向當前棧幀的最底部。

例如,A 調(diào)用 B,A 的棧里面包含 A 函數(shù)的局部變量,然后是調(diào)用 B 的時候要傳給它的參數(shù),然后返回 A 的地址,這個地址也應該入棧,這就形成了 A 的棧幀。接下來就是 B 的棧幀部分了,先保存的是 A 棧幀的棧底位置,也就是 EBP。因為在 B 函數(shù)里面獲取 A 傳進來的參數(shù),就是通過這個指針獲取的,接下來保存的是 B 的局部變量等等。

當 B 返回的時候,返回值會保存在 EAX 寄存器中,從棧中彈出返回地址,將指令跳轉(zhuǎn)回去,參數(shù)也從棧中彈出,然后繼續(xù)執(zhí)行 A。

對于 64 位操作系統(tǒng),模式多少有些不一樣。因為 64 位操作系統(tǒng)的寄存器數(shù)目比較多。rax 用于保存函數(shù)調(diào)用的返回結(jié)果。棧頂指針寄存器變成了 rsp,指向棧頂位置。堆棧的 Pop 和 Push 操作會自動調(diào)整 rsp,?;羔樇拇嫫髯兂闪?rbp,指向當前棧幀的起始位置。

改變比較多的是參數(shù)傳遞。rdi、rsi、rdx、rcx、r8、r9 這 6 個寄存器,用于傳遞存儲函數(shù)調(diào)用時的 6 個參數(shù)。如果超過 6 的時候,還是需要放到棧里面。

然而,前 6 個參數(shù)有時候需要進行尋址,但是如果在寄存器里面,是沒有地址的,因而還是會放到棧里面,只不過放到棧里面的操作是被調(diào)用函數(shù)做的。

以上的棧操作,都是在進程的內(nèi)存空間里面進行的。

當系統(tǒng)調(diào)用從用戶態(tài)到內(nèi)核態(tài)的時候,首先要做的第一件事情,就是將用戶態(tài)運行過程中的 CPU 上下文保存起來,其實主要就是保存在這個結(jié)構(gòu)的寄存器變量里。這樣當從內(nèi)核系統(tǒng)調(diào)用返回的時候,才能讓進程在剛才的地方接著運行下去。

在用戶態(tài),應用程序進行了至少一次函數(shù)調(diào)用。32 位和 64 的傳遞參數(shù)的方式稍有不同,32 位的就是用函數(shù)棧,64 位的前 6 個參數(shù)用寄存器,其他的用函數(shù)棧。

在內(nèi)核態(tài),32 位和 64 位都使用內(nèi)核棧,格式也稍有不同,主要集中在 pt_regs 結(jié)構(gòu)上。

在內(nèi)核態(tài),32 位和 64 位的內(nèi)核棧和 task_struct 的關(guān)聯(lián)關(guān)系不同。32 位主要靠 thread_info,64 位主要靠 Per-CPU 變量。

責任編輯:武曉燕 來源: 51CTO博客
相關(guān)推薦

2021-12-20 09:53:51

用戶態(tài)內(nèi)核態(tài)應用程序

2017-08-16 16:20:01

Linux內(nèi)核態(tài)搶占用戶態(tài)搶占

2022-03-25 12:31:49

Linux根文件內(nèi)核

2021-08-31 07:54:24

TCPIP協(xié)議

2023-01-06 08:04:10

GPU容器虛擬化

2021-09-08 10:21:33

內(nèi)核網(wǎng)絡(luò)包Tcpdump

2021-09-17 11:59:21

tcpdump網(wǎng)絡(luò)包Linux

2014-07-17 09:55:23

Linux程序計時

2021-08-10 16:50:37

內(nèi)核內(nèi)存管理

2022-12-30 07:50:05

無棧協(xié)程Linux

2025-01-14 10:09:43

硬中斷Linux系統(tǒng)

2022-04-21 11:26:31

鴻蒙操作系統(tǒng)

2021-10-25 09:53:52

鴻蒙HarmonyOS應用

2021-11-26 15:34:27

鴻蒙HarmonyOS應用

2019-12-12 09:23:29

Hello World操作系統(tǒng)函數(shù)庫

2009-12-07 09:31:23

Linux系統(tǒng)調(diào)用表地址

2020-10-05 22:05:10

Linux系統(tǒng)編程時序競態(tài)

2024-08-01 17:14:53

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2021-09-06 17:50:09

內(nèi)核態(tài)操作系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产成人免费视频网站高清观看视频 | 天天色天天 | 国产一区二区电影 | 精品三级在线观看 | 日韩成人免费视频 | 久久精品国产一区 | 日韩国产中文字幕 | 99爱国产 | 天天草av| 97伊人| 亚洲天堂一区 | 亚洲成人动漫在线观看 | 国产高清久久 | 国产精品久久av | wwww.8888久久爱站网 | 成年人国产在线观看 | 精品在线一区二区三区 | 亚洲精品视频在线播放 | 日韩av在线免费 | 国产精品美女久久久免费 | 免费观看av| 成人高清视频在线观看 | 欧美男人天堂 | 国产成人精品久久二区二区91 | 日韩国产欧美视频 | 日韩视频在线免费观看 | 色综网| 91精品国产麻豆 | 伊人久久麻豆 | 亚洲成av人片在线观看无码 | 国产乱一区二区三区视频 | 国产精品高潮呻吟久久 | 三级av网址 | а天堂中文最新一区二区三区 | 日韩中文在线视频 | 欧美色综合一区二区三区 | 国产精品久久久久久久久久不蜜臀 | 国产黄色在线 | 狠狠久久 | 欧美一区二区三区四区在线 | 91精品国产色综合久久不卡蜜臀 |