新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > uclinux啟動過程詳細分析

        uclinux啟動過程詳細分析

        作者: 時間:2018-08-31 來源:網絡 收藏

        CPU clock rate: 200 MHz

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

        開發板上所使用的CPU的主頻為200MHZ。

        DRAM size is 128MB (128MB/0MB)

        動態內存ram大小為128M。

        在嵌入式系統中使用DRAM內存的設計比較廣泛。

        在uclinux的系統中,系統運行時間較長后,會出現內存碎片的問題,導致再分配大塊內存時會失敗。這是在uclinux系統中經常遇到的問題,解決的辦法通常有使用靜態內存、應用程序啟動時預先分配大內存、使用內存池等。

        地址輔助說明:

        先說明一下內存地址數字情況,主要是為了方便記憶。

        可以訪問的內存為4G。0x40000000是1GB處;0x00040000是256K處,0x00020000是128K處,0x90000000是2GB多的地方。1M-》0x00100000, 2M-》0x00200000,8M-》0x00800000,16M-》0x01000000, 32M-》0x02000000,256M-》0x10000000,64K-》0x00010000,注意:rootfs并不是一個具體的文件系統類型,如jffs。它只是一個理論上的概念。在具體的嵌入系統實例中,可以將某種具體的文件系統設置為根文件系統rootfs,如我們可以設置romfs為根文件系統,也可以設置jffs為根文件系統。

        這里的ROMFS只讀文件系統只是一種具體的文件系統類型,也是在嵌入系統中經常使用到的類型。

        看完了上面的內容,以后你對出現的類似“kernel Panic:VFS:Unable to mount root fs on 0:00”的含義應該已經了解了。其中“VFS:”就是虛擬文件系統管理器操作時的輸出信息了。

        File linux.bin.gz found

        linux kernel內核文件名,它是在只讀文件系統romfs上的一個組成部分。

        Unzipping image from 0x4639DE60 to 0x90090000, size = 1316021

        將romfs中的linux kernel解壓縮到0x90090000,之后會從這個內存地址啟動內核。romfs為壓縮格式文件,使用壓縮的只讀文件系統,是為了保持制作出來的整 個系統所占用的flash空間減小。這個內核的大小為1.3M左右,這也是目前大多數嵌入系統所使用的方法。

        Inptr = 0x00000014(20)Inflating……

        釋放……

        Outcnt = 0x0030e7c8(3205064)Final Inptr = 0x001414ad(1316013)Original CRC = 0xcbd73adbComputed CRC = 0xcbd73adb

        做釋放后的CRC檢查。

        Boot kernel at 0x90090000 with ROMFS at 0x46040000

        kernel已經被從romfs中釋放到內存地址0x90090000處,可以跳轉到此處啟動kernel了,這里是指定的kernel的起始地址。

        Press ‘enter’ to boot

        系統等待啟動,后面將看到linux kernel的啟動過程了。

        4K-》0x00001000這個是個快速記憶的方法,你可以根據地址中1的位置和其后0的個數來快速知道換算后的地址是在多少兆的地方。比如,1的后面5個0,代表1M的大小,6個0,代表16M,以此類推。

        ROMFS found at 0x46040000, Volume name = rom 43f291aa

        romfs,只讀文件系統所在的地址為:0x46040000 (flash映射后的第3分區)。卷名為rom。

        romfs 和rootfs概念上有所區別。flash在內存中的的起始地址為0x46000000,而ROMFS在flash分區上的起始位置為0x00040000,所以ROMFS在內存地址中的位置就為0x46040000。這個細節的部分可以參考flash分區時的地方,Creating 3 MTD partitions。

        romfs中包括kernel和app應用,不包括bootloader和firmware信息頭。romfs只讀文件系統里的內容有很多種分類方法,我們可以將kernel和app同時放里面,作為根文件系統下的一個文件,也可以在flash上另外劃分區域來分別存放。

        *****************************************************************************

        第一節:start_kernel

        Linux的源代碼可以從 www.kernel.org 得到,或者你可以查看linux代碼交叉引用網站:http://lxr.linux.no/ 進行在線的代碼查看,這是一個很好的工具網站。

        在start_kernel中將調用到大量的init函數,來完成內核的各種初始化。如:

        圖 2:kernel start up初始化過程

        具體內容可以參考[http://lxr.linux.no/source/init/main.c]

        Linux version 2.4.22-uc0 (root@local) (gcc version 2.95.3 20010315 (release)) #33 。?1…… 20 12:09:106

        上面的代碼輸出信息,是跟蹤linux代碼分析后得到的,進入init目錄下的main.c的start_kernel啟動函數。

        uclinux使用的是linux內核版本為2.4.22。linux source code代碼中start_kernel中輸出的linux_banner信息。這個信息是每個linux kernel都會打印一下的信息,如果你沒有把這句去掉的話。

        Found bootloader memory map at 0x10000fc0.

        bootloader經過內存映射后的地址為:0x10000fc0, 按上面的地址換算方法,1后面有7個0,那么虛擬地址256M左右處。

        Processor: ARM pt110 revision 0

        pT110是ARM微處理器arm核的一種,另一種為pT100。此處為顯示ARM的類型。

        On node 0 totalpages: 20480

        zone(0): 20480 pages.

        zone(0): Set minimum memory threshold to 12288KB

        Warning: wrong zone alignment (0x90080000, 0x0000000c, 0x00001000)

        zone(1): 0 pages.

        zone(2): 0 pages.

        預留內存大小,在節點0上總共20頁, zone(0) 設置最小內存為12MB, zone(1)和zone(2)為0頁。警告:對齊不正確。

        Kernel command line: root=/dev/mtdblock3

        Kernel 啟動命令設為:/dev/mtdblock3(在后面的說明中會看到mtdblock3是指的flash上的romfs分區。),用來指定根文件系統所在的位置,kernel會將塊設備mtdblock3當作文件系統來處理。也就是說,內核會根據上面的kernel命令行,知道只讀文件系統romfs將是 根文件系統rootfs。

        start_kernel(void) 中輸出的上面的這句信息。這行命令是在linux內核啟動過程中都會輸出的一句。

        Console: colour dummy device 80x30

        代碼中console_init()的輸出信息, 顯示控制臺屬性:一般使用VGA text console,標準是80 X 25行列的文本控制臺,這里是對屬性進行了設置。



        關鍵詞: uClinux cpu 控制器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大邑县| 西昌市| 克什克腾旗| 兰溪市| 融水| 阳山县| 额济纳旗| 定日县| 通州区| 常州市| 昌乐县| 什邡市| 巴南区| 元谋县| 绥江县| 稻城县| 赤壁市| 凤阳县| 山西省| 高碑店市| 军事| 达孜县| 洛宁县| 汽车| 威远县| 太仓市| 阿勒泰市| 洞口县| 石景山区| 镇宁| 射阳县| 凤庆县| 阳原县| 潍坊市| 华坪县| 睢宁县| 南通市| 灵璧县| 丹江口市| 镇远县| 岑巩县|