当OD停在入口点,程序一行代码都尚未执行,此时寄存器中的值是如何确定的?eip指向当前地址,esp指向堆栈,那么eax,ebx,ecx中的值是如何来的?
学习是最好的投资!
就x86來說,最主要的使用者程式可以控制的通用暫存器不多,其中最重要的是eip, esp 分別對應是使用者程式的第一條指令和使用者程式的堆疊位址,這2個寄存器的os會在載入使用者程式的時候根據elf檔案的格式設定好。當使用者程式運行的時候,其他的通用暫存器eax,ebx,ecx,edx之類的使用是有編譯器來管理的,使用者程式在使用一個暫存器以前,編譯器也會先將需要的值載入到寄存器中。對於cs,ds,es,fs這樣的段寄存器,也都是作業系統設定好的。至於cr3這樣的控制虛擬記憶體到實體記憶體映射表的暫存器,也是os設定好的,使用者程式沒有權限改變的。
eax, ebx, ecx屬於通用暫存器吧, CPU啟動時會有預設值(應該是0).
eax
ebx
ecx
作業系統運行一個程式(比方說C語言編譯而成的)的方式是:先生成一個新進程,然後運行程式載入器,把堆疊設定好並把程式從磁碟拷貝到內存,然後最後才是把控制權轉移給main()函數(其實main()並不是程式內第一個被呼叫到的函數,但這裡為了簡化才這麼說),之後才是愉快地程式運行。前面執行了那麼多程式碼,總得操作一下暫存器吧…
OS為了載入執行一個程式有多努力你們造嗎? OS要建立頁表讀檔切LDT設暫存器要不然你根本看不見hello world你們造嗎? 後台做了所有累活的CPU君在默默地流淚…
就x86來說,最主要的使用者程式可以控制的通用暫存器不多,其中最重要的是eip, esp 分別對應是使用者程式的第一條指令和使用者程式的堆疊位址,這2個寄存器的os會在載入使用者程式的時候根據elf檔案的格式設定好。當使用者程式運行的時候,其他的通用暫存器eax,ebx,ecx,edx之類的使用是有編譯器來管理的,使用者程式在使用一個暫存器以前,編譯器也會先將需要的值載入到寄存器中。對於cs,ds,es,fs這樣的段寄存器,也都是作業系統設定好的。至於cr3這樣的控制虛擬記憶體到實體記憶體映射表的暫存器,也是os設定好的,使用者程式沒有權限改變的。
eax
,ebx
,ecx
屬於通用暫存器吧, CPU啟動時會有預設值(應該是0).作業系統運行一個程式(比方說C語言編譯而成的)的方式是:先生成一個新進程,然後運行程式載入器,把堆疊設定好並把程式從磁碟拷貝到內存,然後最後才是把控制權轉移給main()函數(其實main()並不是程式內第一個被呼叫到的函數,但這裡為了簡化才這麼說),之後才是愉快地程式運行。前面執行了那麼多程式碼,總得操作一下暫存器吧…
OS為了載入執行一個程式有多努力你們造嗎? OS要建立頁表讀檔切LDT設暫存器要不然你根本看不見hello world你們造嗎?
後台做了所有累活的CPU君在默默地流淚…