2011-10-20 60 views
1

這更像是一個知識問題而不是實際的實現。我想知道是否有任何內核函數在系統啓動後可以擁有不同的虛擬地址。我對編譯可執行文件的理解是虛擬地址被分配給它的二進制文件,但是虛擬地址到物理地址是在運行時通過操作系統來完成的(分頁,我知道這些東西,所以不需要解釋) 但是在內核函數的情況下,每次重新啓動系統時,都會看到它們具有不同的虛擬地址。 1.內核函數如何映射到地址範圍? 2.它們可以在運行時映射到不同的虛擬地址。 (我想知道它是如何可能的)3. dll的地址映射如何?他們是在編譯時給虛擬地址還是在運行時分配了一個相對地址? (我認爲這是如何完成的。)4.是否有任何方法來查找是否有內核虛擬地址被固定到物理內存。內核函數可以有不同的虛擬地址

謝謝

回答

4

傳統上,可執行文件在編譯時會分配一個固定的虛擬地址映射。然而,近年來,已經證明這對安全性不利 - 攻擊者可以利用他們的知識確切地將事情記在內存中作爲攻擊的一部分。爲了緩解這種情況,可以使用與位置無關或可重定位的可執行文件,以允許加載地址隨機化(至少在Linux上)。然而,這帶來了一個不利之處 - 啓動程序需要更多的時間,因爲動態加載器必須執行重定位(或者是在位置無關的機器代碼的運行時有額外的開銷)。

對於OS內核,與其餘開機時間相比,額外的開銷是微不足道的;實際上,Windows內核實際上是動態鏈接其許多組件的。所以內核是一個明顯的地方來隨機化加載地址。

+0

Thanks.Can內核在運行時在不同的位置卸載和重新加載模塊。它試圖執行內核庫的相對映射,但是一旦加載,虛擬地址就會改變?(我猜NO是因爲其他模塊依賴於這些地址。但是如果這些地址保存在需要查詢的表中,那麼運行時加載/卸載可以工作。因此,內核可以在運行時保持虛擬地址的移動。然而,系統可能無法爲一些不能執行的關鍵內核例程在運行時卸載)你知道我們是否可以找出是否有任何虛擬地址固定在phy內存中? –

+1

@ agent.smith,請打開一個不同的問題,而不是在評論中提出複雜的跟進。此外,你似乎有多個問題要問,請確保將這些問題作爲分離問題_,因爲有些人可能只知道某些問題的答案,但不是全部。 – bdonlan

1
  1. 內核函數如何映射到地址範圍?

它們不一定映射到用戶空間中。直到我停止在這方面練習,他們才被軟中斷觸及。

+0

是的。所以,如果我考慮4GB地址空間,那麼大約一半的空間包含內核代碼/數據和一半的用戶空間。內核代碼在所有用戶空間中保持不變。當你想調用任何內核例程時,那麼去那裏的方式是軟件中斷,因爲你不能訪問該地址範圍。我想知道的是這些內核虛擬地址是如何給出的。 –

+0

@ agent.smith如果你接受我說的話,這個問題是沒有意義的。內核有自己的地址空間,與任何進程的用戶模式空間不同,所以不可能出現內核地址映射到用戶空間的問題。 – EJP

相關問題