2010-12-14 118 views

回答

0

當您啓動應用程序時,eip(程序計數器)被設置爲您的程序的文本數據所在的位置,文本數據就是您的代碼(0..1)。從這裏開始執行來自eip上的地址的指令。這些指令是在cpu(或緩存)附近的ROM上定義的,如果cpu試圖執行某個不是指令的東西,它會引發異常(此級別的中斷)。他如何知道它是否是指令,想象得到的foreach指令會檢查ROM和散列表以查看它是否是有效的指令。

這是一個非常簡單的問題,因爲很多事情都發生在XDD上。

3

處理器只做你告訴它做的事情。正如你所說的,處理器無法區分內存中「數據」和「代碼」之間的區別:它只是一個字節序列。這就是你告訴它如何處理那些定義它如何處理的字節。

編譯程序時,生成的可執行文件中包含有關於哪些部分是代碼以及哪些部分是數據的信息。當程序執行時,操作系統將代碼和數據加載到內存的不同部分,然後告訴處理器在程序的入口點開始執行代碼。從那裏,處理器取出第一條指令,執行它,然後轉到下一條指令。

當然,這一切都非常簡單,但我認爲你明白了。

在較舊的處理器和較舊的操作系統中,沒有任何東西阻止您告知處理器開始執行位於數據段中間的指令。或者,實際上,可以通過修改代碼段中的「數據」來實現自修改代碼。較新的處理器和操作系統通常具有某種形式的數據執行預防和鎖定以防止修改代碼。否則,自修改代碼會成爲一個巨大的安全風險。

簡短回答:處理器會將代碼視爲代碼,因爲您告訴代碼。否則,一切都只是內存中的字節。

2

各種寄存器幫助處理器區分在計算機上執行的進程中的各種內存段。當程序啓動時,代碼段寄存器(cs)和指令指針(ip/eip/rip)被設置爲指向代碼的位置,而數據段寄存器(DS)和其中一個通用寄存器(通常是DX )被用來指向數據段。那麼主要是Intel x86架構,但總的來說,大多數架構都有寄存器來區分數據區的代碼區和堆棧段。通過這些寄存器,CPU可以「知道」或能夠在單個答案中區分代碼地址