2011-07-11 219 views
7

我最近開始進入低層次的東西,並尋找到引導程序和操作系統等等困惑了內存映射

據我瞭解,至少ARM處理器,外設引導加載程序初始化,然後將它們映射到物理內存空間。從這裏開始,代碼只需將值寫入映射到外設寄存器的內存空間即可訪問外設。稍後如果芯片有MMU,它可以用來進一步重新映射到虛擬內存空間。我對嗎?

什麼我不明白的(假設我上面所說的是正確的):

  • 如何引導裝載程序初始化外設,如果他們沒有被映射到的地址空間了嗎?
  • 使用虛擬內存映射,有表格告訴MMU在哪裏映射什麼。但是什麼決定了外設在物理內存中的映射位置?

回答

5

當設備引導時,MMU將關閉,並且您通常會以管理員模式運行。這意味着提供的任何地址都是物理地址。

每個ARM SOC(系統芯片)都會有一個存儲器映射。與設備地址的對應關係由哪個物理數據和地址線連接到處理器的哪些部分決定。所有這些信息都可以在技術參考手冊中找到。對於OMAP4芯片,可以找到here

有幾種連接片外器件的方法。一種是使用GPMC。在這裏,您需要在GPMC中設置要在芯片上使用的地址。

當MMU接着打開時,這些地址可能會根據MMU的編程方式而改變。通常直接訪問硬件也只能在內核模式下使用。

+0

謝謝,這有助於解決問題。最後一個問題:是否有可能在物理內存空間中「取消映射」某些內容? – tangrs

+1

您可以對GPMC進行重新編程,並有效地取消映射內存,但我懷疑這是一個很好的用例。 – doron

0

您不能在ARM處理器中重新映射外設,所有外圍設備都對應內存映射中的固定位置。即使寄存器映射到具有永久固定位置的內部RAM存儲器。您可以重新映射的唯一東西是內存設備,如SRAM,FLASH等,通過FSMC或類似的核心功能。但是,您可以重新映射內存映射的附加定製外圍設備,而不是內核本身的一部分,例如可以說是硬盤控制器,但是固定的內核是什麼。

一個好的開始是看看飛利浦和ST等公司網站上的處理器數據表,或ARM架構本身www.arm.com上的處理器數據表。

1

雖然這是一個古老的問題,想到回答這個問題,因爲它可能會幫助像我這樣的其他人試圖從計算器獲得足夠的答案。

你的解釋幾乎是正確的,但要給出一點解釋這一個: 外設引導加載程序初始化,然後將它們映射到物理內存空間

片上外設已經有一個預先定義的物理地址空間。對於其他外部IO映射外設(如PCIe),我們需要配置物理地址空間,但其物理地址空間範圍仍是預定義的。它們不能在隨機地址空間中配置。

現在你的問題,這裏是我的答案.. 如果引導程序尚未映射到地址空間,引導程序如何初始化外設?如上所述,所有(片上)外設都具有預定義的物理地址空間(通常將在處理器RM的存儲器映射章節中列出)。因此,引導裝載程序(假設MMU關閉)可以直接訪問它們。

使用虛擬內存映射,有表格告訴MMU在哪裏映射什麼。但是什麼決定了外設在物理內存中的映射位置?

在VMM中,有一些頁表(通過內核在物理DRAM中創建並存儲)告訴MMU將虛擬地址映射到物理地址。在具有1G內核虛擬空間的Linux內核中(比如0xc0000000-0xffffffff的內核虛擬地址),片上外設將需要在上述內核虛擬機空間內擁有虛擬機空間(以便內核只能訪問內核)。並且將設置頁表以將該外設virt addr映射到其實際物理地址(在RM中定義的地址)