2 回答

TA貢獻1966條經(jīng)驗 獲得超4個贊
調(diào)用系統(tǒng)調(diào)用,代碼跳入內(nèi)核態(tài),可以執(zhí)行任何指令,包括 受保護的指令
在用戶態(tài),很多指令是受保護的,不能直接執(zhí)行,或者執(zhí)行會出錯。
例如 286 以上的X86 系列及兼容CPU
IO指令,就是受保護的。
實際上,硬件之間是通過總線相連的,并通過,IO讀寫指令,內(nèi)存讀寫指令,DMA 方式,等等相互通訊。
程序代碼,被CPU取到,然后逐一執(zhí)行
你寫的代碼,加載到內(nèi)存后,操作系統(tǒng)用一個跳轉(zhuǎn)指令(call,jump,ret,iret 等等,都屬于跳轉(zhuǎn)類指令)
轉(zhuǎn)到你的代碼中執(zhí)行的
除非受到保護的指令,都是可以在用戶態(tài)執(zhí)行的,例如加法指令
數(shù)學(xué)庫
math.h,的函數(shù)
string.h
就大部分代碼都屬于,非保護指令
而 IO庫中的許多函數(shù)
例如
stdio.h
io.h
中的很多函數(shù),都會調(diào)用系統(tǒng)調(diào)用的

TA貢獻1772條經(jīng)驗 獲得超8個贊
說說我的理解,C語言里的庫函數(shù)在編譯后都是生成的二進制指令,就包含了對硬件的操作。
舉一個例子,“+”是對兩個數(shù)進行操作,這兩個數(shù)既可能是數(shù)字,也可能是變量。如果是數(shù)字,在匯編語言中對于的就是立即數(shù),編譯成二進制指令時直接利用無符號數(shù)加法指令就可以;而如果是變量的話,就會編譯成多條指令,首先是從內(nèi)存里讀取變量到寄存器,再在寄存器中進行加法運算,運算完再保存到內(nèi)存中。
- 2 回答
- 0 關(guān)注
- 1854 瀏覽
添加回答
舉報