linux內核啓動過程和啓動第一個應用程序

內核的最終目的就是運行應用程序(位於根文件系統)。
內核啓動相關的一些重要過程
1、判斷是否支持這個processor,即CPU。
2、判斷是否支持U-boot傳進來的機器ID。
在這裏插入圖片描述
機器ID是在在r1寄存器中存放的。
在這裏插入圖片描述
其中_arch_info_begin和_arch_info_end在連接腳本中定義,他們之間存放的是所以架構相關的初始化信息*(.arch.info.init)。
在這裏插入圖片描述
那麼現在的當務之急便是找到在代碼裏誰被定義爲.arch.info.init。用grep命令在內核中搜索後發現,其定義在arch.h文件中。(用SourceInsight工具查出MACHINE_START和MACHINE_END,並將其置換後,就會發現其相當於定義了一個類型爲machine_desc的結構體,machine_desc仍然定義在arch.h文件中。)
在這裏插入圖片描述
總結:從以上分析不難發現對於每一個單板,內核中都會有一個MACHINE_START結構體與之對應;而這些結構體被放在連接腳本的_arch_info_begin和_arch_info_end之間。內核啓動的時候就會把他們一個個的讀出來去與U-boot傳來的ID進行比較,若吻合的話就表示內核支持這個單板
3、創建頁表
在這裏插入圖片描述
4、使能MMU
5、跳到內核的第一個C函數 start_kernel(init/main.c),它會對在命令行傳入參數的進行處理函數,掛接根文件系統,最終會調用mount_root函數;掛接根文件系統後會調用init_post來打開/dev/console,最終執行應用程序等。函數的調用關係如下:
在這裏插入圖片描述

應用程序這麼多,那麼究竟是怎樣啓動第一個應用程序呢 ?內核源碼啓動應用程序的函數如下:
在這裏插入圖片描述

在這裏插入圖片描述
由此可見其打開了一個設備 /dev/console;通過run_init_process來啓動xxx程序(在U-boot命令行bootargs傳來的int=xxx)若不成功的話就執行/sbin/init,若/sbin/init不成功的話就執行/etc/init,依此輪推,若都失敗的話就會執行panic函數。
內核啓動後輸入ps命令便可看到第一個啓動的應用程序init
在這裏插入圖片描述

另外需要注意的是:和我們緊密相關的flash上沒有嚴格的分區,它的分區在內核代碼中是寫固定的
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章