Linux內(nèi)核——用戶堆棧和內(nèi)核堆棧

定義

每個(gè)進(jìn)程都有用戶堆棧和內(nèi)核堆棧兩個(gè)堆棧。進(jìn)程在用戶態(tài)時(shí)使用用戶堆棧,陷入到內(nèi)核態(tài)時(shí)便使用內(nèi)核堆棧。

切換過程

  1. 用戶進(jìn)程X正常運(yùn)行時(shí),堆棧寄存器ESP指向的的用戶堆棧地址。
  2. 當(dāng)進(jìn)程X調(diào)用某系統(tǒng)調(diào)用時(shí)(int 0x80),CPU會(huì)首先將用戶堆棧地址保存到內(nèi)核堆棧內(nèi)(還有EIP,F(xiàn)LAG等寄存器),然后將ESP指針指向內(nèi)核堆棧地址(還有將內(nèi)態(tài)的EIP,F(xiàn)LAG等也一并存入相應(yīng)的寄存器中,切換到用戶態(tài)進(jìn)程),這時(shí)便切換到來內(nèi)核堆棧中。
  3. 當(dāng)系統(tǒng)調(diào)用完成后,再將用戶堆棧地址從內(nèi)核堆棧中出棧存儲(chǔ)ESP寄存器中,此時(shí)便切換到了用戶堆棧。

中斷過程

  1. X函數(shù)調(diào)用syscall_x (用戶態(tài))
  2. int 0x80 (保存部分寄存器,內(nèi)核態(tài))
  3. syscall_call (SAVE_ALL保存全部現(xiàn)場(chǎng),內(nèi)核態(tài))
  4. iret后(用戶態(tài))

中斷代碼(簡(jiǎn)易)

ENTRY(system_call)
    RING0_INT_FRAME
    ASM_CLAC
    push_cfi %eax #保存系統(tǒng)調(diào)用號(hào)
    SAVE_ALL #保存現(xiàn)場(chǎng)??
    GET_THREAD_INFO(%ebp)
    testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%epb) 
    jnz syscall_trace_entry
  cmpl $(nr_syscalls), %eax #檢查傳入到系統(tǒng)調(diào)用號(hào)是否合法
    jae syscall_badsys
  syscall_call:
    call *sys_call_table(,%eas,4) #執(zhí)行相應(yīng)的系統(tǒng)調(diào)用函數(shù)
    movl %eax,PT_EAX(%ebp) #保存結(jié)果到eax寄存器
  syscall_exit:
    testl $_TIF_ALLWORK_MASK,%ecx #檢查是否有其他任務(wù)處理
    jne syscall_exit_work #進(jìn)行進(jìn)程調(diào)度
  restore_all
    TRACE_IRQS_IRET #恢復(fù)現(xiàn)場(chǎng)
  irq_return:
    INTERRUPT_RETURN #iret 將ESP,EIP,F(xiàn)LAG等寄存器恢復(fù)為用戶態(tài)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 內(nèi)核在創(chuàng)建進(jìn)程時(shí),會(huì)同時(shí)創(chuàng)建task_struct和進(jìn)程相應(yīng)堆棧。每個(gè)進(jìn)程都會(huì)有兩個(gè)堆棧,一個(gè)用戶棧,存在于用戶空...
    saviochen閱讀 7,064評(píng)論 2 11
  • 為了區(qū)分程序的運(yùn)行級(jí)別,有用戶態(tài)和核心態(tài)之分,也叫目態(tài)和管態(tài)。硬件驅(qū)動(dòng)、CPU和內(nèi)存管理等底層操作和進(jìn)程管理、診斷...
    小碼弟閱讀 2,293評(píng)論 0 0
  • intel的cpu分為四個(gè)運(yùn)行級(jí)別ring0~ring3,內(nèi)核創(chuàng)建進(jìn)程,創(chuàng)建進(jìn)程的同時(shí)創(chuàng)建進(jìn)程控制塊,創(chuàng)建進(jìn)程自己...
    vbuer閱讀 607評(píng)論 0 0
  • 在Linux系統(tǒng)中,每一個(gè)用戶進(jìn)程都有兩個(gè)棧,一個(gè)用戶棧,存在于用戶空間,一個(gè)內(nèi)核棧,存在于內(nèi)核空間。當(dāng)進(jìn)程在用戶...
    西元前__YP閱讀 1,056評(píng)論 0 0
  • 1.1. 進(jìn)程的堆棧 內(nèi)核在創(chuàng)建進(jìn)程的時(shí)候,在創(chuàng)建task_struct的同時(shí),會(huì)為進(jìn)程創(chuàng)建相應(yīng)的堆棧。每個(gè)進(jìn)程會(huì)...
    Hope_加貝閱讀 179評(píng)論 0 0

友情鏈接更多精彩內(nèi)容