移植¶
摘自列表存檔 http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2001-July/004064.html
初始定義¶
以下符號定義依賴於您瞭解 __virt_to_phys() 對您的機器的轉換。 此宏將傳遞的虛擬地址轉換為物理地址。 通常,它只是
phys = virt - PAGE_OFFSET + PHYS_OFFSET
解壓縮器符號¶
- ZTEXTADDR
解壓縮器的起始地址。 在這裡談論虛擬地址或物理地址毫無意義,因為當您呼叫解壓縮器程式碼時,MMU 將關閉。 您通常在此地址呼叫核心以開始引導。 這不必位於 RAM 中,它可以位於快閃記憶體或其他只讀或讀寫可定址介質中。
- ZBSSADDR
解壓縮器的零初始化工作區的起始地址。 這必須指向 RAM。 解壓縮器將為您零初始化此區域。 同樣,MMU 將關閉。
- ZRELADDR
這是將寫入解壓縮核心並最終執行的地址。 以下約束必須有效
__virt_to_phys(TEXTADDR) == ZRELADDR
核心的初始部分經過精心編碼,具有位置獨立性。
- INITRD_PHYS
放置初始 RAM 磁碟的物理地址。 僅當您使用 bootpImage 內容時才相關(僅適用於舊的 struct param_struct)。
- INITRD_VIRT
初始 RAM 磁碟的虛擬地址。 以下約束必須有效
__virt_to_phys(INITRD_VIRT) == INITRD_PHYS
- PARAMS_PHYS
struct param_struct 或標籤列表的物理地址,為核心提供有關其執行環境的各種引數。
核心符號¶
- PHYS_OFFSET
第一塊 RAM 的物理起始地址。
- PAGE_OFFSET
第一塊 RAM 的虛擬起始地址。 在核心引導階段,虛擬地址 PAGE_OFFSET 將對映到物理地址 PHYS_OFFSET,以及您提供的任何其他對映。 這應該與 TASK_SIZE 的值相同。
- TASK_SIZE
使用者程序的最大大小(以位元組為單位)。 由於使用者空間始終從零開始,因此這是使用者程序可以訪問的最大地址 + 1。 使用者空間堆疊從該地址向下增長。
TASK_SIZE 以下的任何虛擬地址都被認為是使用者程序區域,因此由核心在程序的基礎上動態管理。 我將其稱為使用者段。
TASK_SIZE 以上的任何內容對於所有程序都是通用的。 我將其稱為核心段。
(換句話說,您不能將 IO 對映放在 TASK_SIZE 以下,因此也不能放在 PAGE_OFFSET)。
- TEXTADDR
核心的虛擬起始地址,通常為 PAGE_OFFSET + 0x8000。 這是核心映象最終所在的位置。 對於最新的核心,它必須位於 128MB 區域中的 32768 位元組處。 以前的核心在這裡限制為 256MB。
- DATAADDR
核心資料段的虛擬地址。 使用解壓縮器時不得定義。
- VMALLOC_START / VMALLOC_END
限制 vmalloc() 區域的虛擬地址。 此區域中不得有任何靜態對映; vmalloc 將覆蓋它們。 這些地址也必須位於核心段中(參見上文)。 通常,vmalloc() 區域從最後一個虛擬 RAM 地址(使用變數 high_memory 找到)之上 VMALLOC_OFFSET 位元組處開始。
- VMALLOC_OFFSET
通常合併到 VMALLOC_START 中的偏移量,以在虛擬 RAM 和 vmalloc 區域之間提供一個洞。 我們這樣做是為了允許越界記憶體訪問(例如,某些東西寫入對映的記憶體對映的末尾)被捕獲。 通常設定為 8MB。
架構特定宏¶
- BOOT_MEM(pram,pio,vio)
pram 指定 RAM 的物理起始地址。 必須始終存在,並且應與 PHYS_OFFSET 相同。
pio 是包含 IO 的 8MB 區域的物理地址,用於 arch/arm/kernel/debug-armv.S 中的除錯宏。
vio 是 8MB 除錯區域的虛擬地址。
預計除錯區域將在程式碼中稍後由特定於架構的程式碼重新初始化(透過 MAPIO 函式)。
- BOOT_PARAMS
與 PARAMS_PHYS 相同,請參閱 PARAMS_PHYS。
- FIXUP(func)
在記憶體子系統初始化之前執行的機器特定修復程式。
- MAPIO(func)
用於對映 IO 區域(包括上面的除錯區域)的機器特定函式。
- INITIRQ(func)
用於初始化中斷的機器特定函式。