uclinux啟動過程詳細分析

2021-01-12 電子產品世界

uclinux表示micro-control linux.即「微控制器領域中的Linux系統」,是Lineo公司的主打產品,同時也是開放源碼的嵌入式Linux的典範之作。uCLinux主要是針對目標處理器沒有存儲管理單元MMU(Memory Management Unit)的嵌入式系統而設計的。它已經被成功地移植到了很多平臺上。由於沒有MMU,其多任務的實現需要一定技巧。

本文引用地址:http://www.eepw.com.cn/article/201808/388126.htm

uClinux啟動過程

uCinux的啟動主要經歷三個階段。首先,必須完成CPU和存儲器的硬體初始化,在系統RAM中建立程序堆棧和數據段,建立程序的運行時的環境。初始化完成之後,uClinux內核就取得了CPU的控制權,開始作業系統自身的初始化,這包括建立RAM中斷矢量表、加載設備驅動程序、內存管理模塊等等。這一切完成後,uClinux啟動一個最初的init線程,進入到第三階段,這時內核已經正常運行,外圍模塊也都就緒,開始執行一些腳本文件(如/etc/rc腳本文件)。

一.kernel代碼段之前的系統初始化

1. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S

開發板從上電開始,最開始執行的程序放在uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S中。

(1) 切換模式,關閉中斷。 (line 96 )

(2) 首先程序要先給SYSCFG,EXTDBWTH,ROMCON0等一系列系統控制寄存器賦值,此時flash地址在 0X0,DRAM地址在0X1000000.(line 141 )

(3) 點亮I/O口的指示燈。 (line 152 )

(4) 把在flash上的image複製到DRAM上。(line 161 )

(5) 執行remap,把flash地址映射為0X1000000,DRAM地址映射為0.(line 172 )

(6) 打開cache和write buffer.(line 196 )

(7) 設置好64K堆棧。(line 204 )

(8) 跳轉到decompress_kernel函數(line 217 ),此處的跳轉為帶返回的跳轉,以便於執行完此函數跳轉回來。

2. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/misc.c

此時的函數decompress_kernel是用C語言寫的,line 297 。

(1) makecrc();進行crc校驗。

(2) puts(「Uncompressing Linux.。.」); 輸出linux起動後的第一句話。

(3) gunzip();解壓縮kernel.

(4) puts(「 done, booTIng the kernel./n」);

3. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S

執行完decompress_kernel函數後,kernel又跳轉回head.S中,因為此時我們還要檢驗解壓縮之後的kernel起始地址是否緊接著kernel image,如果是,beq call_kernel(line 220),執行解壓後的kernel.

如果解壓縮之後的kernel起始地址不是緊接著kernel image,執行relocate(line 236),將其拷貝到緊接著kernel image的地方,然後跳轉,執行解壓後的kernel.

二.kernel執行

1.uClinux-dist/linux-2.4.x/init/main.c中的start_kernel() (line 352)

系統啟動過程到此,轉入體系結構無關的通用C代碼中,start_kernel() 中調用了一系列初始化函數,以完成kernel本身的設置。這些動作有的是公共的,有的則是需要配置的才會執行的。

(1) 輸出Linux版本信息(printk(linux_banner))

(2) 設置與體系結構相關的環境(setup_arch())

(3) parse_opTIons(command_line);解析command_line,將其轉化為環境變量。

(4) 初始化系統IRQ(init_IRQ())

(5) 核心進程調度器初始化(sched_init())

(6) 軟中段初始化sofTIrq_init();

(7) 時間、定時器初始化(包括估測主頻、初始化定時器中斷等,TIme_init())

(8) 控制臺初始化console_init();

(9) 核心CACHE初始化kmem_cache_init();

(10)延遲校準calibrate_delay();

(11)內存初始化(設置內存上下界和頁表項初始值,mem_init())

(12)文件,目錄,塊設備讀寫緩衝區初始化

(13)檢查體系結構漏洞(check_bugs())

(14)啟動init過程(創建第一個核心線程,調用init()函數,原執行序列調用cpu_idle() 等待調度,init())

至此start_kernel()結束,基本的核心環境已經建立起來了。

2.uClinux-dist/linux-2.4.x/init/main.c中的init() (line 548)

現在我們進入內核引導第二部分,init()函數作為核心線程,首先鎖定內核(僅對SMP機器有效,我們為空函數),然後調用 do_basic_setup() (line 551)完成外設及其驅動程序的加載初始化。

過程如下:

* 網絡初始化(初始化網絡數據結構,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,將調用protocols結構中包含的所有協議的初始化過程,sock_init())

* 創建事件管理核心線程(start_context_thread()函數,這是系統創建的第二個內核線程,名叫「keventd」。其代碼context_thread()也在kernel/context.c中,)

啟動任何使用__initcall標識的函數(方便核心開發者添加啟動函數,此時由do_initcalls()函數啟動)。

此時系統開始加載外部設備的初始化程序,如:在linux-2.4.x/driver/block/genhd.c中的device_init()函數,在genhd.c中由__initcall(device_init)標識在此時調用,device_init()函數是所有外部設備初始化的總入口,包括了塊設備的初始化blk_dev_init,網絡設備的初始化net_dev_init()和atmdev_init()等。

至此do_basic_setup()函數返回init(),在釋放啟動內存段(free_initmem())並給內核解鎖以後,init()打開/dev/console設備,重定向stdin、stdout和stderr到控制臺,最後,搜索文件系統中的init程序(或者由init=命令行參數指定的程序),並使用 execve()系統調用加載執行init程序。(line 576) 。

init()函數到此結束,內核的引導部分也到此結束了,

3. uClinux-dist/linux-2.4.x/init/main.c中的execve(「/etc/init」,argv_init,envp_init); (line 579)

init進程是系統所有進程的起點,內核在完成核內引導以後,即在本線程(進程)空間內加載init程序,它的進程號是1。

init程序需要讀取/vendors/SAMSUNG/4510B/inittab文件作為其行為指針,然後執行。

相關焦點

  • uclinux下stm32開發環境搭建
    什麼是uclinux本文引用地址:http://www.eepw.com.cn/article/201808/388127.htmuclinux表示micro-control linux.即「微控制器領域中的Linux系統」,是Lineo公司的主打產品,同時也是開放源碼的嵌入式Linux的典範之作。
  • Cisco路由器配置 詳細講解設備啟動過程
    【IT168 技術】很多管理員在工作過程中難免會遇到Cisco路由器啟動失敗,口令忘記等情況,這些問題只要掌握了設備的啟動過程,就可以輕鬆解決。今天我們就來分析一下Cisco路由器的啟動過程,其實路由器和計算機一樣,也有一個加電啟動的過程,如果想了解路由器的啟動過程就必須要先了解其內部組件,如下圖所示:▲ 路由器內部組件
  • 【Android 原創】實戰分析一個Crackme的過程(超級詳細)
    ]實戰分析一個Crackme的過程一、寫在前面自學這個也有幾個星期了,今天就總結一下近期學習的成果,實戰分析一個Crackme,並寫下了這篇超級詳細的過程,從軟體環境的配置到軟體詳細的使用再到最後的逆向分析出結果,為了文章的貼圖方便和文章美觀展示,用了兩臺電腦+MUMU模擬器+Google6.0.1版真機,相互切換著截圖附在帖子裡,也主要是因為模擬器動態調試
  • 詳解bootloader的執行流程與ARM Linux啟動過程分析
    ARM Linux啟動過程分析是本文要介紹的內容,嵌入式 Linux 的可移植性使得我們可以在各種電子產品上看到它的身影。對於不同體系結構的處理器來說Linux的啟動過程也有所不同。 本文以S3C2410 ARM處理器為例,詳細分析了系統上電後 bootloader的執行流程及 ARM Linux的啟動過程。
  • Linux啟動過程流程分析
    Linux啟動過程流程分析 李倩 發表於 2018-04-24 14:48:55 內核引導階段 1、bootsect階段 2、setup階段 3、head.S階段
  • 分析STM32的三種上電啟動過程
    分析STM32的三種上電啟動過程 HACK實驗室 發表於 2020-05-03 18:03:00 上一篇文章我寫了STM32的RAM和Flash,文章最後我建議大家來深入研究一下
  • SkyWalking Agent 啟動初始化的過程
    概述本文主要分享SkyWalking Agent 啟動初始化的過程。SkyWalking Agent 基於JavaAgent機制,實現應用透明接入 SkyWalking 。關於 JavaAgent 機制,筆者推薦如下兩篇文章 :《Instrumentation 新功能》《JVM源碼分析之javaagent原理完全解讀》友情提示 :建議自己手擼一個簡單的 JavaAgent ,更容易理解 SkyWalking Agent 。筆者練手的 JavaAgent 項目地址 :github.com/YunaiV/lear…2.
  • 乾貨| Java 程序執行過程的超詳細內存分析
    本文將會對 Java 的內存管理和執行過程中的具體分析,做一個總結。一、Java 內存管理Java 內存管理就是對象的分配和釋放問題。在 Java 中,內存的分配是由「程序」完成的,而內存的釋放是由 Java 垃圾回收器(GC)完成的,這種方式確實簡化了程式設計師的工作,但也同時加重了 JVM 的工作。
  • 機械攪拌機詳細分析組成部分
    機械攪拌機詳細分析組成部分 ,「r44opt」   中藍水處理成套設備(南京)有限公司,機械攪拌機,操作簡單,性能穩定,質量可靠,歡迎來電選購!    機械攪拌機玻璃鋼防腐材料選用軟體發和數控心的綜合磨具成型工藝性能好生產製造可預見性強葉型設計科學研究美觀大方的外觀設計性能好幾何偏差小均衡對稱度極高:適用於汙水處理廠的工藝流程中推進攪拌含有懸浮物的汙水、稀泥漿、工業過程液體等,創建水流,加強攪拌能,防止汙泥沉澱。
  • uClinux介紹
    Flash運行方式:把內核的可執行映象燒寫到flash上,系統啟動時從flash的某個地址開始逐句執行。這種方法實際上是很多嵌入式系統採用的方法。內核加載方式:把內核的壓縮文件存放在flash上,系統啟動時讀取壓縮文件在內存裡解壓,然後開始執行,這種方式相對複雜一些,但是運行速度可能更快(ram的存取速率要比flash高)。
  • ARM多核處理器啟動過程分析
    本文引用地址:http://www.eepw.com.cn/article/201611/317186.htm說明:該流程圖按照代碼執行時間順序劃分為4部分:1.Bootloader在圖片上半部,最先啟動
  • 淺談WINPE(U啟動)製作方法,12步詳細介紹全過程,一學就會!
    它包括運行 Windows安裝程序及腳本、連接網絡共享、自動化基本過程以及執行硬體驗證所需的最小功能。」⑥進入 Windows7PE工具箱V3.0軟體安裝過程,可從界面上的進度條了解安裝進度。7經過等待,進度條裝滿, Windows7PE工具箱V3.0軟體安裝成功,單擊開始製作啟動 Windows7PE工具箱8在打開 Windows7PE工具箱後,默認選擇安裝位置為U盤,然後插入準備好的U盤,等待程序自動識別詳細信息,識別完成後單擊「開始製作」⑨接下來會出現警告提示窗口
  • STM32的啟動過程是怎麼樣的?
    STM32的啟動過程是怎麼樣的? STM32嵌入式開發 發表於 2020-11-27 16:36:44 分享這篇文章,談一下STM32啟動流程。
  • 節點BusOff恢復過程分析與測試
    本文將為大家詳細分析總線關閉及恢復的機制和原理。MCU能夠第一時間知道節點進入了總線關閉狀態(例如在錯誤中斷處理邏輯中查詢狀態寄存器的相應位),這時MCU控制CAN控制器進入「快恢復」過程,即控制CAN控制器停止報文收發,並進行等待,計時達到需要的時間T1(如100ms)後,MCU重新啟動恢復CAN控制器參與總線通信,這樣便完成了一次「快恢復」過程。
  • iDevice 越獄設備啟動過程及多種啟動方式探討
    iOS 內核初始化加載完成後,設備作業系統啟動完成。 這個過程也是越獄的過程,所有越獄都是在這個過程中尋找可能的漏洞並加以利用而實現 root 權限的接管。為了 iOS 系統不被越獄,蘋果使用安全啟動鏈(Secure Boot Chain)技術,將開機過程分不同階段,每個階段負責檢查下個階段的代碼,如果檢查出任何問題,比如籤名錯誤、安全模式不符,就立馬中止過程。
  • 雙生子佯謬的分析全過程
    (2)、飛船啟動哥哥在地球啟動飛船,因為不考慮加速過程,所以我們假設哥哥的飛船立即從0加速到0.995c,然後哥哥進入了飛船慣性系K'。因為不考慮加速時間,所以哥哥是瞬間進入飛船慣性系K',那麼此時飛船慣性系的時間t'=t_B=0,然後哥哥的時鐘指示慣性系K'的時間。
  • JavaScript 啟動性能瓶頸分析與解決方案
    瀏覽器在下載完某個頁面依賴的腳本之後,其還需要經過語法分析、解釋與運行這些步驟。而本文則會深入分析瀏覽器對於 JavaScript 的這些處理流程,挖掘出那些影響你應用啟動時間的罪魁禍首,並且根據我個人的經驗提出相對應的解決方案。
  • 走進Linux之systemd啟動過程
    Linux系統的啟動方式有點複雜,而且總是有需要優化的地方。傳統的Linux系統啟動過程主要由著名的init進程(也被稱為SysV init啟動系統)處理,而基於init的啟動系統被認為有效率不足的問題,systemd是Linux系統機器的另一種啟動方式,宣稱彌補了以傳統Linux SysV init為基礎的系統的缺點。
  • 「高中物理難點突破」汽車啟動問題的分類與分析方法
    汽車啟動問題涉及的兩個公式以此為基礎,下面我們重點對汽車啟動的兩種情況進行詳細的分析。汽車以恆定功率啟動的過程分析所以結論是:以恆定功率啟動的汽車,先做加速度逐漸減小的變加速直線運動,最終以最大速度做勻速直線運動。
  • Spring 容器的啟動過程探秘
    本篇文章記錄我自己在學習Spring Framework的過程中的一小部分源碼解讀和梳理,來談一談Spring 容器在啟動過程中是如何掃描Bean的。二. 學習方法論我相信每個想變成優秀的開發人員都想弄懂Spring源碼,我亦如此。