vivi主要包括下面幾個目錄:
arch:此目錄包括了所有vivi支援的目標板的子目錄,例如s3c2410,s3c2440目錄。
drivers:其中包括了引導核心需要的裝置的驅動程式(mtd和串列埠)。mtd目錄下分map、nand和nor三個目錄。
init:這個目錄只有main.c和version.c兩個檔案。和普通的c程式一樣,vivi將從main函式開始執行。
lib:一些平台公共的介面**,比如time.c裡的udelay()和mdelay()。
include:標頭檔案的公共目錄,其中的s3c24xx.h定義了這塊處理器的一些暫存器。platform/smdk24xx.h定義了與開發板相關的資源配置引數,我們往往只需要修改這個檔案就可以配置目標板的引數,如波特率、引導引數、物理記憶體對映等。
vivi的執行可以分為兩個階段:
vivi的第一階段
完成含依賴於cpu的體系結構硬體初始化的**,包括禁止中斷、初始化串列埠、複製自身到ram等。相關**集中在head.s(viviarchs3c24xx目錄下):head.s:
vivi的第二階段
vivi的第二階段是從main()函式開始,同一般的c語言程式一樣,該函式在/init/main.c檔案中,總共可以分為8個步驟。
(1)函式開始,通過putstr(vivi_banner)列印出vivi的版本。vivi_banner在/init/version.c檔案中定義。執行reset_handler,用於將記憶體清零,**在/lib/reset_handle.c中
(2)對開發板進行初始化(board_init函式),board_init是與開發板緊密相關的,這個函式在/arch/s3c24xx/smdk.c檔案中。開發板初始化主要完成兩個功能,時鐘初始化(init_time())和通用io口設定(set_gpios())。其中,gpio口在smdk24xx.h(vivi/include/platform目錄下)檔案中定義。
(3)記憶體對映初始化和記憶體管理單元的初始化工作:這兩個函式都在/arch/s3c24xx/mmu.c檔案中。
(4)初始化堆疊,heap_init()。(定義在vivi/lib/heap.c檔案中)
(5)初始化mtd裝置,mtd_dev_init()。這幾個函式可以在/drivers/mtd/maps/s3c24xx_flash.c裡找到。(drivers/mtd/mtdcore.c)
(6) 初始化私有資料,init_priv_data()。(定義在vivi/lib/priv_data/rw.c檔案中)
(7) 初始化內建命令,init_builtin_cmds()。通過add_command函式,載入vivi內建的幾個命令。(lib/command.c)
(8)啟動boot_or_vivi()。(main.c)
啟動成功後,將通過vivi_shell()啟動乙個shell(如果配置了config_serial_term),此時vivi的任務完成。
vivi的初始配置檔案位置:/vivi/arch/def-configs/smkd24xx, 通過make menuconfig 修改後的配置儲存在這個檔案中,我們也可以載入乙個自己的配置檔案來進行編譯。
int main(int argc, char *argv) /*/init/main.c */
/*記憶體對映初始化和記憶體管理單元的初始化*/
mem_map_init(); /*arch/s3c2410/mmu.c line194*/
mmu_init(); /*arch/s3c2410/mmu.c line120*/
/*初始化堆疊*/
ret = heap_init(); /*lib/heap.c*/
if (ret)
/*初始化mtd裝置*/
ret = mtd_dev_init(); /*drivers/mtd/mtdcore.c*/
misc(); /*arch/s3c2410/smdk.c*/
/* 初始化內建命令*/
init_builtin_cmds(); /*lib/command.c*/
/*啟動boot_or_vivi()。(main.c)*/
boot_or_vivi(); /*call vivi_shell() or run_autoboot.*/
return 0;
}/* 啟動成功後,將通過vivi_shell()啟動乙個shell(如果配置了config_serial_term),此時vivi的任務完成 */
/* vivi的初始配置檔案位置:/vivi/arch/def-configs/smkd24xx, 通過make menuconfig 修改後的配置儲存在這個檔案中,我們也可以載入乙個自己的配置檔案來進行編譯。*/
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
思科VPP原始碼分析(dpo機制原始碼分析)
vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...
redux原始碼分析(三) 原始碼部分
下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...