2012-06-19 93 views
2

我正在閱讀OS理論,其中我發現一個進程具有虛擬地址空間(爲簡單起見,使用技術庫和限制寄存器鬆散),但無法訪問任何其他地址。但是在嵌入式系統中,我們可以使用placement new或reinterpret_cast(C++)來訪問內存映射的IO地址,但如果我們無法訪問除進程的虛擬地址空間之外的任何其他地址,這將如何實現呢?進程如何訪問不屬於它的虛擬地址空間的內存映射IO地址?

class ControlReg { 
public: 
bool ready() const { return readyBit; } 
private: 
volatile unsigned readyBit :1; 
}; 

ControlReg *pcr = reinterpret_cast<ControlReg*>(0xFFFF0000); // address 0xFFFF0000 is still virtual or absolute physical mapped address? 

是否有一些指令可以讓進程訪問任何地址? 。我很困惑,我猜,任何人都可以幫助我清楚地看待事情嗎?

感謝

回答

4

這是一個純粹的操作系統問題,並適用於所有語言(包括 彙編)。現代的通用操作系統映射用戶進程的內存,並且不允許在映射內存之外訪問;一個用戶 進程無法正常訪問內存映射IO,甚至無法訪問該操作系統使用的內存。但這種映射是由系統完成的:系統可能有 允許繞過它的特殊請求;內核級代碼definitly 可以繞過它;許多嵌入式系統,特別是較小的嵌入式系統,根本沒有內存映射。

0

對於在真實的虛擬內存系統工作,必須將設備映射到進程的虛擬地址空間。例如,在一個類似Unix的操作系統中,這可以通過在設備文件上調用mmap()來完成。這將使設備驅動程序有機會創建將虛擬地址與相應物理地址相關聯的頁表項。

(我猜測這裏,雖然,我沒有用這種嵌入式開發的經驗。)

0

從您的進程中看到的所有地址都是虛擬地址,至少在高級語言的角度看。如果您正在運行linux,您可以cat /proc/{pid}/maps查看您的代碼如何從虛擬地址映射到物理地址。

相關問題