自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

系統(tǒng)調(diào)用與函數(shù)調(diào)用有什么區(qū)別?

開發(fā) 前端
如果我們編寫的代碼可以直接調(diào)用所有的操作系統(tǒng)函數(shù)那么從某種程度上講的確可以說是能控制操作系統(tǒng),但如果操作系統(tǒng)只允許你調(diào)用內(nèi)核中的有限的幾個函數(shù)呢?

?大家新年好,我是小風(fēng)哥,這是今年的第一篇技術(shù)文,我們來聊聊系統(tǒng)調(diào)用與普通的函數(shù)調(diào)用之間的區(qū)別。

作為程序員你肯定寫過無數(shù)的函數(shù),假設(shè)有這樣兩個函數(shù):

void funcB()}
void funcA() funcB();}

函數(shù)之間是可以相互調(diào)用的,這很簡單很happy有沒有。

要知道是代碼、是函數(shù)就可以相互調(diào)用,不管你用什么語言寫的。

假設(shè)funcB是內(nèi)核中的函數(shù),funcA是你自己寫的函數(shù),就像這樣:

// Linux內(nèi)核中的函數(shù)void funcB()}
// 你的函數(shù)void funcA() funcB();}

那么funcA應(yīng)該也能調(diào)用funcB(如果funcB可以供外界調(diào)用的話)。

有的同學(xué)可能會驚呼,我們可以自己編寫代碼調(diào)用操作系統(tǒng)的函數(shù),那豈不是可以直接控制操作系統(tǒng)了?

too yong too simple!

如果我們編寫的代碼可以直接調(diào)用所有的操作系統(tǒng)函數(shù)那么從某種程度上講的確可以說是能控制操作系統(tǒng),但如果操作系統(tǒng)只允許你調(diào)用內(nèi)核中的有限的幾個函數(shù)呢?

怎么樣,你(應(yīng)用程序)是不是就被限制住了。

你又會問,操作系統(tǒng)是怎樣限制應(yīng)用程序能調(diào)用哪些內(nèi)核中的函數(shù)呢?

實際上單靠操作系統(tǒng)這種軟件是沒有辦法限制應(yīng)用程序能調(diào)用哪些以及多少個內(nèi)核函數(shù)的,因此為施加這種限制必須依靠——硬件。

這里的硬件指的就是CPU。

那么CPU又是怎么施加這種限制的呢?

我們先來看看普通的函數(shù)調(diào)用,函數(shù)調(diào)用對應(yīng)的機器指令是call指令,就像這樣:

call 0x400410

call指令后的這個地址0x400410就是被調(diào)函數(shù)的第一條機器指令所在的內(nèi)存地址。

當(dāng)CPU執(zhí)行到這條機器指令時直接跳轉(zhuǎn)到對應(yīng)的地址繼續(xù)執(zhí)行指令,從程序員的角度看就是函數(shù)調(diào)用。

而如果是我們程序的函數(shù)調(diào)用操作系統(tǒng)的函數(shù)就不允許使用call指令了,而是syscall機器指令(x86_64)。

使用syscall指令調(diào)用操作系統(tǒng)函數(shù)時也是把相應(yīng)函數(shù)的第一條指令的地址放到syscall之后嗎?

顯然不是的,因為操作系統(tǒng)系統(tǒng)代碼和你的代碼都是單獨編譯以及運行的,你根本就不知道操作系統(tǒng)的某個函數(shù)存放在內(nèi)存的什么位置上,也不應(yīng)該讓你知道,因此使用syscall調(diào)用操作系統(tǒng)的函數(shù)時我們只能附加一個序號,比如序號0對應(yīng)操作系統(tǒng)中的A函數(shù)、序號1對應(yīng)操作系統(tǒng)中的B函數(shù)等等,這樣使用syscall指令時只需要將該序號寫入rax寄存器即可,CPU在執(zhí)行syscall指令時通過讀取rax寄存器的值就能知道到底該調(diào)用操作系統(tǒng)中的哪個函數(shù)了。

可以看到,利用這種機制操作系統(tǒng)限制了應(yīng)用程序可以調(diào)用哪些內(nèi)核中的函數(shù)。

有的同學(xué)可能會有疑問,如果一個call指令因為種種原因后面跟上的地址”無意“中指向了一個內(nèi)核函數(shù)的地址,那么CPU執(zhí)行call指令時會怎樣呢?就像這樣:

call 0x400410

這里假設(shè)0x400410這個地址指向了一個內(nèi)核函數(shù)地址。

很簡單,CPU在執(zhí)行這條指令時會判斷出當(dāng)前進程沒有權(quán)限訪問0x400410這個地址,因此CPU在執(zhí)行這條指令時會產(chǎn)生異常,該進程會被直接kill掉。

這里列舉了Linux在各種處理器上怎樣進行系統(tǒng)調(diào)用。

圖片

看到了吧,syscall和call在使用方法上還是有很大不同的,可以看到call是直接調(diào)用的,也就是說應(yīng)用程序這一層中的函數(shù)調(diào)用是直接調(diào)用的,而syscall其實是間接調(diào)用的,即我們調(diào)用操作系統(tǒng)中的函數(shù)時其實是間接調(diào)用的。

除此之外,CPU在執(zhí)行call指令以及syscall指令時另外一個不同點在于模式的切換。

當(dāng)CPU執(zhí)行普通函數(shù)時其實是運行在用戶態(tài),user mode,在這種模式下CPU不能執(zhí)行某些特權(quán)指令,這也就意味著我們的程序其實是受限的;而當(dāng)CPU執(zhí)行syscall開始執(zhí)行操作系統(tǒng)的代碼時會切換到內(nèi)核態(tài),kernel mode,在這種模式下CPU可以執(zhí)行任何特權(quán)指令,不受任何限制,操作系統(tǒng)才是真正的管理計算機的大boss。

可以看到,當(dāng)在普通程序中進行函數(shù)調(diào)用時就是函數(shù)調(diào)用,而普通函數(shù)調(diào)用操作系統(tǒng)中的函數(shù)時才叫系統(tǒng)調(diào)用。

最后再說一點,普通的函數(shù)調(diào)用所使用的棧全部位于進程的棧區(qū),假設(shè)main函數(shù)調(diào)用funcA函數(shù),funcA調(diào)用funcB函數(shù),那么此時的進程內(nèi)存布局就像這樣:

圖片

而進行系統(tǒng)調(diào)用時當(dāng)CPU開始執(zhí)行操作系統(tǒng)的代碼時不再基于進程棧區(qū)而是會跳轉(zhuǎn)到操作系統(tǒng)某個特定內(nèi)存區(qū)域,該區(qū)域作為進程在內(nèi)核中的棧區(qū),因此也叫做內(nèi)核棧,每個進程在內(nèi)核中都有自己的內(nèi)核棧,因此我們可以看到一個進程其實有兩個棧區(qū),一個在用戶態(tài)一個在內(nèi)核態(tài)。

假設(shè)main函數(shù)調(diào)用funcA,funcA進行系統(tǒng)調(diào)用,調(diào)用內(nèi)核中的funcB函數(shù),funcB函數(shù)調(diào)用內(nèi)核中的funcC函數(shù),那么此時的內(nèi)存布局就像這樣:

圖片

好啦,這個話題就到這里,希望對大家理解操作系統(tǒng)有所幫助。?

責(zé)任編輯:武曉燕 來源: 碼農(nóng)的荒島求生
相關(guān)推薦

2023-10-13 15:48:17

OT系統(tǒng)

2020-12-22 13:46:48

APISKD

2011-08-08 14:09:55

dhcpbootp

2018-07-13 17:05:22

SQLMySQL數(shù)據(jù)庫

2020-09-06 09:51:57

SNMP TrapSyslog網(wǎng)絡(luò)協(xié)議

2021-05-16 15:28:59

沙箱容器惡意軟件

2019-02-27 15:22:15

混合云云計算多云

2021-06-17 08:19:37

操作系統(tǒng)OS Kernel

2024-01-02 08:21:00

LinuxUbuntu操作系統(tǒng)

2013-07-30 13:35:12

methodfunction

2021-12-27 06:57:40

This SuperJava

2012-07-25 15:45:28

ERPSCM

2022-09-14 09:45:15

指標(biāo)標(biāo)簽

2024-06-24 21:24:12

云計算云網(wǎng)絡(luò)

2022-11-22 10:21:23

5GLTE

2024-02-21 14:37:56

2020-07-13 23:39:16

物聯(lián)網(wǎng)IoT萬物互聯(lián)

2023-06-27 14:49:34

數(shù)據(jù)中心IT 設(shè)備

2014-11-26 17:42:00

亞馬遜互聯(lián)網(wǎng)阿里巴巴

2021-01-13 09:27:31

微服務(wù)API分布式
點贊
收藏

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