移植

摘自列表存檔 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)

用於初始化中斷的機器特定函式。