在程序執行之前,esp
寄存器何時被設置爲指向有效地址?在致電exec
期間?或者在用戶空間本身?我已經通過了內核代碼,似乎無法在任何地方找到它。什麼時候esp寄存器在linux中設置?
3
A
回答
4
背景
的x86 CPU有兩個(實際上有四種)堆棧(每任務):一個是用戶模式,一個用於內核模式。
當中斷在用戶模式下,CPU將設定esp
到內核的堆棧的地址(見「TSS」的詳細信息)時,推動esp
(用戶模式的堆棧的位置)的原來值與(內核的)堆棧。當發生中斷時,eip
,cs
和eflags
總是被推送到堆棧。
從中斷返回時,iret
指令將彈出(內核)堆棧中的「舊」寄存器值,堆棧指針將再次指向用戶的堆棧。
甲搶先多任務操作系統通常工作方式如下:
某些任務正在運行,這意味着此任務佔用CPU負荷的100%的時間的非常小的量。當發生定時器中斷時,當前正在運行的任務的寄存器值被存儲在堆棧中(由CPU)。操作系統將push
所有其他寄存器的值,並將esp
值更改爲另一個任務(發生另一個定時器中斷時保存)的內核堆棧。然後它pops
寄存器並執行iret
所以所有寄存器包含另一個任務的值,另一個任務正在運行。
在Linux(4.12.2)中,x86-32由彙編源代碼「entry_32.S」中的函數__switch_to_asm
完成。
你的問題
直接的答案。當一個新任務中創建兩個堆棧(用戶和內核堆棧),該任務和初始寄存器值是在中斷poped
分配被寫入內核堆棧。這包括用戶模式的初始值esp
。
某些計時器中斷會在第一次啓動任務(與重新啓動已運行的任務的方式相同)。
在(舊版本)的Linux中有是用於創建新任務的兩個命令:
fork()
會簡單地複製內核堆棧。fork()
將複製現有的任務,以便所有寄存器值(包括esp
)必須與已存在的任務execve()
不會分配一個新的內核堆棧(現在的新任務是創建,但另一個可執行文件是在當前任務正在運行) 。 Execve將分配一個新的用戶堆棧並覆蓋內核堆棧上的值esp
。 (Mark Plotnick的評論向你展示了完成這件事的位置。)
相關問題
- 1. 什麼是ESP和EBP寄存器?
- 2. ESP和EIP寄存器有什麼區別
- 3. ARM Linux:爲什麼Linux希望將寄存器r0設置爲零
- 4. 什麼時候在MVC4中設置User.Identity.Name
- 5. 什麼時候在Java中設置mutate?
- 6. 什麼時候由操作系統修改段寄存器?
- 7. $ ESP寄存器沒有找到
- 8. 彙編寄存器esp和ebp
- 9. 什麼時候linux設置計算機的正確時間?
- 10. 寄存器和臨時寄存器有什麼區別?
- 11. 什麼時候在iOS中調用委託設置器?
- 12. 執行新程序時ESP和EBP寄存器如何操作?
- 13. Linux的QEMU重置寄存器
- 14. 什麼時候由ADFS設置relyingpartytrustid?
- 15. 什麼時候JPA設置@GeneratedValue @Id
- 16. 爲什麼我不能在Linux上更改PCI配置寄存器?
- 17. 如何設置寄存器中的位?
- 18. 爲什麼在FreeBSD中重置堆棧指針寄存器?
- 19. 什麼時候在splitViewController中放置final?
- 20. 爲什麼使用臨時寄存器將值傳遞給段寄存器?
- 21. 爲什麼在使用PUSH或POP指令時不鼓勵使用ESP寄存器?
- 22. 什麼使sys_read系統調用linux放入寄存器eax?
- 23. 什麼時候應該保存Windows Phone 7上的設置?
- 24. 爲什麼編譯器將變量存儲在寄存器中?
- 25. 如何在Linux內核和U-boot中設置SoC的寄存器值?
- 26. 如何在App Store中設置iAd網絡?什麼時候?
- 27. 什麼時候需要在Javascript中設置類的'prototype.constructor'屬性?
- 28. 什麼時候在Scala中設置比另一個更少?
- 29. 什麼時候應該在UIViews中設置邊框?
- 30. 什麼時候在Swift類中設置屬性值?