這是來自內核代碼中header.S文件的代碼片段。我無法理解lretw
指令的功能。我已經檢查過這麼多在線資源的說明。幫助理解此代碼片段
# We will have entered with %cs = %ds+0x20, normalize %cs so
# it is on par with the other segments.
pushw %ds
pushw $6f
lretw
任何人都可以幫助我理解這條指令嗎?
這是來自內核代碼中header.S文件的代碼片段。我無法理解lretw
指令的功能。我已經檢查過這麼多在線資源的說明。幫助理解此代碼片段
# We will have entered with %cs = %ds+0x20, normalize %cs so
# it is on par with the other segments.
pushw %ds
pushw $6f
lretw
任何人都可以幫助我理解這條指令嗎?
ret
是從程序返回的指令。所以基本上它將棧中的返回地址彈出到EIP寄存器中。
l
前綴在這裏告訴它是一個遠從程序返回。在這種情況下,指令首先從棧中彈出一個值到EIP寄存器中,然後將第二個值彈出到CS寄存器中。
w
後綴在這裏,因爲在這一步我們在實模式下運行,操作數是16位寬。
確切的代碼是:
pushw %ds
pushw $6f
lretw
6:
的6:
在這裏非常重要。所以這樣做是:將ds的值推入堆棧,將6
標籤的地址推入堆棧,然後觸發此lretw
指令。所以基本上,它會將標籤6
的地址加載到指令指針寄存器中,並將cs
寄存器的值加載到ds
寄存器的值中。所以這只是繼續執行標籤6
並改變cs
寄存器值的一種技巧。
您應該下載http://www.intel.com/design/intarch/manuals/243191.htm,其中給出了所有指令的詳細信息,包括詳細說明每個指令正在執行的僞代碼。
我看了這本手冊......但找不到具體的說明。可能是我不是很清楚.. 你真的很棒非常感謝您的明確解釋..我喜歡它.. –
順便說一句,當它說正常化%cs時,意思是什麼......感謝幫助我。 –
爲什麼是6美元?不$ 6f平均值的絕對值爲6 ..和f後綴是什麼?對於一系列問題感到抱歉。 –
http://disi.unitn.it/~abeni/SO2/LinuxKernel/boot.html? – istepura