雖然這是一個古老的問題,想到回答這個問題,因爲它可能會幫助像我這樣的其他人試圖從計算器獲得足夠的答案。
你的解釋幾乎是正確的,但要給出一點解釋這一個: 外設引導加載程序初始化,然後將它們映射到物理內存空間
片上外設已經有一個預先定義的物理地址空間。對於其他外部IO映射外設(如PCIe),我們需要配置物理地址空間,但其物理地址空間範圍仍是預定義的。它們不能在隨機地址空間中配置。
現在你的問題,這裏是我的答案.. 如果引導程序尚未映射到地址空間,引導程序如何初始化外設?如上所述,所有(片上)外設都具有預定義的物理地址空間(通常將在處理器RM的存儲器映射章節中列出)。因此,引導裝載程序(假設MMU關閉)可以直接訪問它們。
使用虛擬內存映射,有表格告訴MMU在哪裏映射什麼。但是什麼決定了外設在物理內存中的映射位置?
在VMM中,有一些頁表(通過內核在物理DRAM中創建並存儲)告訴MMU將虛擬地址映射到物理地址。在具有1G內核虛擬空間的Linux內核中(比如0xc0000000-0xffffffff的內核虛擬地址),片上外設將需要在上述內核虛擬機空間內擁有虛擬機空間(以便內核只能訪問內核)。並且將設置頁表以將該外設virt addr映射到其實際物理地址(在RM中定義的地址)
謝謝,這有助於解決問題。最後一個問題:是否有可能在物理內存空間中「取消映射」某些內容? – tangrs
您可以對GPMC進行重新編程,並有效地取消映射內存,但我懷疑這是一個很好的用例。 – doron