請注意,我並不熟悉ARM或嵌入式Linux的具體內容,因此我所有的評論都是從一般觀點出發的。
首先,關於緩存:在引導很早的時候,操作系統會做一些緩存初始化。實際上,每個處理器會有所不同,但最終效果是確保緩存正確初始化,然後啓用處理器使用。在此之後,緩存僅由處理器操作,操作系統或程序無需進一步交互。現在
,到外部(芯片外)和內部(片內)存儲器:
操作系統擁有系統上的所有硬件,包括內部和外部存儲器等是最終用於發現負責,在內核和用戶進程中配置和分配這些資源。在典型的系統中(例如桌面或1u服務器),通常不會有任何特殊的內部(片上)內存,因此操作系統可以平等對待所有的內存。它將進入一個普通的頁面池(通常爲4k),用於分配進程,文件系統緩衝區等。在具有各種特殊內存(nvram,高速片上內存和其他一些內存)的系統上,操作系統的一般政策通常不正確。
這如何呈現給用戶將取決於將操作系統移植到此係統時所做的選擇。
下面是一些具體問題的答案。
操作系統在區分這些不同的內存方面扮演了多大的角色?
如果您的系統已經採取上述的設備驅動程序的方法,那麼操作系統可能只知道大約外部存儲器,或者只是有足夠的瞭解內部存儲器他們正確初始化儘管這有可能會在設備驅動程序太,如果可能的話。如果操作系統更清楚地瞭解片上內存,那麼它肯定會包含任何所需的初始化代碼,以及某種方案來提供對用戶進程的訪問。
它是如何決定哪些緩衝區將在外部存儲器中,哪些會在內部SRAM分配等
這似乎不太可能,我認爲操作系統會嘗試這樣的選擇自動化。相反,我懷疑操作系統或設備驅動程序會提供一個通用接口來提供對片上存儲器的訪問,並將其留給用戶代碼來決定如何處理它。
當在這樣的系統/代碼上調用calloc/malloc時,返回的指針來自哪個內存:內部還是外部?
幾乎可以肯定,malloc
和朋友會返回指向一般片外存儲器的指針。在上面建議的基於驅動程序的方法中,您可以使用mmap
訪問片上存儲器。如果您需要進行更細粒度的分配,您需要編寫自己的分配器,或者找到一個可以提供顯式內存區域的分配器。
用戶可以將緩衝區設置爲被分配在他選擇的記憶中(內部/外部)?
如果你指的是從地區標準malloc
調用返回,大概不會緩衝區。但是,如果您的意思是「用戶程序能否以某種方式獲得指向片上內存的指針」,那麼答案几乎肯定是,但機制將取決於將Linux移植到此係統時所做的選擇。
在ARM體系結構中,還有另一個稱爲「緊耦合存儲器」(TCM)的存儲器。那是什麼以及用戶如何啓用和使用它?我可以在這個內存中聲明緩衝區嗎?
我不知道這是什麼。如果我不得不猜測,我會認爲這只是片上內存的另一種形式,但由於它有不同的名稱,可能我錯了。
我是否需要查看硬件板的內存映射(如果有)以瞭解典型硬件板中存在的所有這些不同的物理內存?
如果操作系統和/或設備驅動程序提供了對這些內存區域的某種抽象訪問,那麼您不需要明確瞭解地址映射。然而,這種知識需要在內核或設備驅動程序中實現這種訪問。
我希望這有些幫助。
你是什麼意思的內部與外部記憶?您已經分別提到了緩存,所以我認爲既不是「內存」,也不是「緩存」的一部分。您是否使用「內部存儲器」來指代由Cortex-A8提供的一些片上RAM? – 2010-04-10 18:50:24
@戴爾:我的意思是內部存儲器 - 快速訪問芯片內存。外部存儲器=高延遲內存片外存儲器,高速緩存是分開的,可以說L1高速緩存。 – goldenmean 2010-04-11 06:49:43