大家都知道如何產生乙個新的程序。
通過sys_fork,之後再呼叫
sys_execve
系統初啟後(核心態)的第乙個使用者態程序是init。
這要涉及到內層(特權級高)向外層(特權級低)轉移的問題。
通常情況下,核心是不會呼叫使用者層的**,要想實現這逆向的轉移,一般做法是在使用者程序的核心棧(tss->esp0)壓入使用者態的
ss,esp,eflags,cs,eip,
偽裝成使用者程序是通過陷阱門進入核心態,之後通過
iret
返回使用者態。
那麼linux
2.2.14中的使用者態程序
init
是如何實現的?
首先在kernel_thread(init...)函式中,利用系統呼叫
sys_clone fork
出乙個核心級程序
(此時要給該程序分配核心棧
<-esp0),
之後call init
函式,init
函式還會再起幾個
kernel_thread,
然後會載入
/sbin/init(
通過execve呼叫)
在sys_execve中,要完成核心態到使用者態的轉移。
大體流程是sys_execve-->do_execve-->load_elf_binary()
-->do_load_elf_binary()-->do_mmap()
start_thread(reg,newip,newsp) (
processor.h
)start_thread()
很重要哦
do_mmap完成從檔案虛擬空間到記憶體虛擬空間的對映。
而start_thread就是要在程序核心棧中的相應位置填入程序使用者態的
xss,esp and xcs,eip.
最後程序從ret_from_sys_call返回,
iret
指令從核心棧
pop出
xcs, eip
完成特權及指令的轉移
, pop
出 xss,esp
,完成堆疊的切換。
從使用者態切換到核心態
在linux系統中,每個系統呼叫被賦予乙個系統呼叫號。這樣通過這個系統呼叫號就可以關聯系統呼叫。當使用者空間執行的程序執行乙個系統呼叫的時候,這個系統呼叫號就告訴核心需要呼叫哪個。核心記錄了系統調表中所有已註冊過的系統呼叫的列表,這個表為每乙個有效的系統呼叫指定了唯一的系統呼叫號。使用者空間程式無法...
使用者態切換到核心態 補充
剛剛看了別的博文,才知道不是只有系統呼叫才切換到核心態,還有別的操作可以切換到核心 這是使用者態程序主動要求切換到核心的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的的服務完成工程的過程,比如fork 實際上就是執行了乙個建立新程序的系統呼叫。而系統呼叫的機制其核心還是使用了作業系統為使用...
使用者態切換到核心態(May 22)
一般來講,從使用者態切換到核心態主要通過以下方式 1.系統呼叫 windows int 0x2e,linux int 0x80 2.中斷 3.異常 4.裡直接int 0x3 除錯斷點 5.彙編指令 sysenter sy it 1.系統呼叫 windows ntstatus stdcall ntre...