[Documentation]porting
初始化定義
-------------------
接下來的符號定義的前提是你知道在你的機器上運行的__virt_to_phy()這個轉換函數的意思。這個宏把傳進來的
虛擬地址轉換成物理地址。通常情況下,它可以簡化為:
phys = virt - PAGE_OFFSET + PHYS_OFFSET
?
解壓符號
-------------------
ZTEXTADDR
解壓代碼(解壓代碼負責把內核鏡像解壓到RAM中的指定地址)的起始地址。此時談論虛擬或者物理地址
沒有意義,那是因為當調用解壓代碼時MMU是關閉的。它不必一定處于RAM中,可以處于flash、其他的只讀
或可讀寫媒介。
?
ZBSSADDR
解壓代碼初始化為0的工作區域起始地址。必須指向RAM。解壓代碼會把其初始化為0。同樣的,MMU仍舊
是關閉的。
?
ZRELADDR
解壓后的內核寫入到該地址,并從該地址開始執行。下列限制必須有效:
__virt_to_phys(TEXTADDR) = ZRELADDR
內核的初始化部分是經過精心編碼的,與位置無關。
INITRD_PHYS
放置初始化RAM的物理地址。只有在你使用bootpImage的使用才有用(只在舊的結構體param_struct中用到)。
INITRD_VIRT
初始化RAM的虛擬地址。下列限制必須有效:
__virt_to_phys(INITRD_VIRT) == INITRD_PHYS
PARAMS_PHYS
param_struct結構體或標簽列表的物理地址,提供內核關于其執行環境的變量參數。
?
內核符號
---------------
PHYS_OFFSET
RAM的第一個bank的起始物理地址
PAGE_OFFSET
RAM的第一個bank的起始虛擬地址。在內核啟動階段,虛擬地址PAGE_OFFSET會映射到物理地址PHYS_OFFSET,
TASK_SIZE
用戶空間進程的最大大小(字節)。由于用戶空間總是從0開始,這是一個用戶空間進程可訪問的最大地址。用戶空間棧從該
地址起向下生長。
任何低于TASK_SIZE的虛擬地址都被認為是屬于用戶進程區域,由內核進行動態管理。我把這稱作用戶段(user segment)。
任何超過TASK_SIZE的虛擬地址對所有進程來說都是相同的。我把這稱作內核段(kernel segment)。
(換句話說,你不能把IO映射在低于TASK_SIZE的地方)
TEXTADDR
內核的起始虛擬地址,通常是PAGE_OFFSET + 0x8000。這是內核鏡像結束的地方。最近版本的內核,它必須處于一個
128M區域的32768字節中。之前的內核對此的限制是256MB。
(我的理解:對內核來說,內存的起始物理地址是PHYS_OFFSET,內存的起始虛擬地址是PAGE_OFFSET;內核運行的起始物理地址是ZRELADDR,內核運行的起始虛擬地址是TEXTADDR)
DATAADDR
內核數據段的虛擬地址。解壓代碼運行時不用定義。
VMALLOC_START
VMALLOC_END
限定了vmalloc()區域的虛擬地址范圍。在該區域不能存在任何靜態映射;vmalloc會重寫它們的。該區域地址必須處于內核段。
通常,vmalloc()區域起始于距離上個虛擬RAM地址VMALLOC_OFFSET字節偏移處(上個虛擬RAM指的是VMALLOC區域之前的
物理內存映射區域,內核起來時標注位lowmem的區域)。
VMALLOC_OFFSET
該偏移通常整合進VMALLOC_START在虛擬RAM和vmalloc區域之間提供一個間隔。以防止內存訪問越界。通常是設置成8M。
?
體系相關的宏
--------------
BOOT_MEM(param,pio,vio)
'param'指定了RAM的起始物理地址,和PHYS_OFFSET一樣。
?
MAPIO(func)
體系相關的函數,用來映射IO區域
INITIRQ(func)
體系相關的函數,用來初始化中斷
?
?
?
轉載于:https://www.cnblogs.com/IrisZhou/p/3293186.html
總結
以上是生活随笔為你收集整理的[Documentation]porting的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EXCEL2010经典用法全集(3)
- 下一篇: C++ passes by refere