在uboot啟動流程關鍵函式介紹(一)介紹_main函式的過程,至此以將uboot的**拷貝到ddr中,下面主要講解uboot命令的相關處理函式。
run_main_loop
函式(在common/board_r.c中):
uboot
啟動後3
秒倒計時,如果在
3秒倒計時結束前按下回車鍵,那麼就會進入
uboot
的命令模式,如果沒有按下回車鍵,那麼就會自動啟動
linux
核心。
先進入死迴圈,死迴圈中有乙個
main_loop
函式(在
common/main.c
中定義)
main_loop
函式:呼叫
bootstage_mark_name
函式,列印出啟動進度,呼叫
setenv
函式將變數
ver的值設為
version_string
,也就是設定版本號的環境變數。呼叫
cli_init
函式初始化命令,初始化
hush shell
相關的變數。
bootdelay_process
函式用於讀取環境變數
bootdelay
和bootcmd
的內容,然後將
bootdelay
的值賦值給全域性變數
stored_bootdelay
,返回bootcmd
的值。
autoboot_command
函式,此函式檢查倒計時是否結束,倒計時結束前是否被打斷。如果倒計時正常結束,就會執行run_command_list,此函式會執行引數s指定的一系列命令,也就是環境變數bootcmd的命令,bootcmd中儲存著預設的啟動命令,因此linux核心啟動。如果在倒計時結束錢按下回車鍵,run_command_list就不會執行,相當於空函式,然後執行cli_loop函式,這個是命令列處理函式,負責接收處理輸入命令。
總結一下
main_loop
函式,開始會呼叫一些函式,設定一些環境變數,初始化hush shell等,接著呼叫auto_command函式,用於判斷倒計時前鍵盤是否按下,如果按下就執行cli_loop函式,如果沒有按下,就直接啟動linux核心。
cli_loop
函式是uboot命令列處理函式,輸入的各種命令,進行各種操作就是cli_loop函式來處理的,此函式定義在command/cli.c中
cli_loop會呼叫parse_file_outer函式
parse_file_outer先呼叫setup_file_str函式初始化input的成員變數;再呼叫parse_stream_outer函式,該函式就是 hush shell的命令直譯器,使用do-while迴圈接收命令列輸入,然後利用函式parse_stream函式解析,呼叫run_list函式在經過一系列函式呼叫cmd_process
函式來處理命令。
cmd_process函式
在uboot
中,命令是通過巨集
u-boot-cmd
來定義,最終目的是為了定義乙個
cmd_tbl_t
型別的變數,並初始化這個變數的各個成員。
uboot
中的每個命令都存放在
.uboot_boot_list
段中,每個命令都有乙個名為
do_***
(***
為具體的命令名)的函式,這個
do_***
函式就是具體的命令處理函式。了解了
uboot
中命令的組成再來看一下
cmd_process
函式的處理過程。
cmd_process
在common/command.c
中定義。通過呼叫
find_cmd
函式在命令表中找到指定的命令,命令表其實就是
cmd_tlb_t
結構體陣列,在
find_cmd
函式中通過函式
ll_entry_start
得到陣列的第乙個元素,也就是命令表起始位址,通過
ll_entry_count
得到陣列長度,也就是命令表的長度,最後通過
find_cmd_tlb
在命令表中找到所需的命令。
在命令表中找到命令以後,就呼叫
cmd_call
函式來執行具體的命令
uboot啟動流程概述 uboot啟動流程
u boot系統啟動流程 大多數bootloader都分為stage1和stage2兩大部分,u boot也不例外。依賴於cpu體系結構的 如裝置初始化 等 通常都放在stage1,且可以用組合語言來實現,而stage2則通常用c語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。2.1...
u boot啟動流程
uboot啟動流程分析 華清遠見嵌入式學院講師。uboot是嵌入式系統中最常用的bootloader,這裡我們以s3c2410為例分析一下uboot的啟動流程。首先通過uboot的鏈結檔案,我們可以看到uboot執行是執行的第一段 在start.s中。entry start sections ali...
uboot啟動流程
華清遠見嵌入式學院 講師。uboot是嵌入式系統中最常用的bootloader,這裡我們以s3c2410為例分析一下uboot的啟動流程。首先通過uboot的鏈結檔案,我們可以看到uboot執行是執行的第一段 在start.s中。entry start sections align 4 rodata...