新聞中心

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

        uclinux啟動過程詳細分析

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

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

        存儲了可用物理內存起始地址的變量memory_start的初始化是通過一個ld腳本中定義的變量_end進行的。ld腳本是用來控制GNU ld連接器在連接內核各個目標文件部分的時候的配置動作,比如這樣一個腳本:

        SECTION

        {

        。=0x10000;

        .text:{*(.text)}

        。=0x8000000;

        .data:{*(.data)}

        .bss :{*(.bss)}

        }

        用來配置ld連接目標文件的時候將所有的目標文件中的存儲程序正文的.text段(section)連接到一起,并且映射到輸出文件的地址0x10000處,將所有目標文件中已初始化的數據.data段連接到一起并放置到輸出可執行文件的0x8000000地址處,而所有目標文件中還未初始化的數據段.bss連接起來后影射到輸出文件中緊跟在.data段之后的位置。

        這個ld配置腳本文件對每個平臺都是不同的。如為MICETEK上所使用的版本使用的ld配置文件為arch/armnomm/vmLinux.lds。可以通過修改某個平臺上的ld腳本配置文件中的_end變量來達到配置其可用物理內存起始地址的目的。

        setup_arch()在完成對memory_start變量的初始化之后,通過某些特定手段檢測不同類型的內存分布情況。比如為檢測某段地址范圍是否為RAM的方法是通過將某個地址的數據讀出來,將它加1后寫回內存地址中,然后再讀出來和原始數據比較看看其值是否成功增加了1,這樣反復操作兩次,最后將數據恢復。如果是可讀可寫的RAM,那么這個測試的結果就是每次比較都是成功的,否則就不能將這個地址當作RAM。

        在setup_arch()中還可能根據所用平臺進行對flash memory和ROM的測試。在這些平臺相關的工作完成之后,setup_arch()將對系統運行的第一個進程init_task的mm_struct結構中描述地址空間分布的變量start_code,end_code,end_data和brk進行初始化,start_code為0,其他三個數值分別為來自于ld腳本配置文件中定義的相關變量_etext、_edata和_end。

        此后setup_arch()將根據Linux中為系統中的第一塊rom/flash memory card所分配的固定的主/從設備號(可以從Document/devices.txt中得到)來創建根文件系統的設備號,并存儲在后來將要用到的全局變量ROOT_DEV中。

        setup_arch()最后完成對系統啟動參數的保存。

        在調用setup_arch()返回之后,start_kernel()中得到了系統可用物理內存的起始和結束地址,以及命令啟動時的命令行參數。

        (2) paging_init()

        在Linux中,paging_init()的一項主要功能是建立頁目錄和頁表,而且將Linux移植到不同平臺的過程中非常重要的一個步驟就是修改這個函數來適應新的硬件平臺的虛擬內存體系。但是由于在中不再使用虛擬內存機制,也就不再需要維護頁目錄和頁表數據結構了,所以paging_init()在這里只是為系統啟動的時候保留一部分特殊用途的內存區間。它返回后,從可以使用的內存空間開始,依次是如下的數據結構:

        empty_bad_page_table 占用1頁(4KB)

        empty_bad_page 占用1頁(4KB)

        empty_zero_page 占用1頁,并初始化為全0

        mem_map

        bitmap

        paging_init()函數在返回前通過調用free_area_init(start_mem,end_mem)進行建立buddy system的映射位圖關系,以及建立空閑物理頁面鏈表的操作。

        (3)free_area_init()

        這個函數用于建立管理物理頁幀的數據結構mem_map,有多少物理頁幀就有多少mem_map_t類型的結構體與之相對應。每個頁面的mem_map_t結構中的flags被標明為PG_DMA和PG_reserved,并且頁幀號被賦給相應的數值。同時建立了管理空閑頁面的bitmap映射表,并且所有的位都被清零。

        (3) mem_init()

        mem_init()函數遍歷整個可用物理內存地址空間,將每個頁面相對應的struct page結構中flags的PG_reserved 標志位清除,標志用戶個數的count計數器置1,并同時統計可用物理頁面數量,然后打印系統的各個內存參數,如可用RAM和ROM的大小、內核代碼段和數據段大小等。

        ======================================================

        摘 要:本文采用三星公司的S3C44B0微處理器,對操作系統內核的引導過程進行了剖析。

        關鍵字:S3C44B0X;uClinux;嵌入式系統;內核引導

        1 前言

        伴隨著微電子的發展,用于嵌入式設備的處理器速度越來越快,功能也越來越強大。三星公司生產的S3C44B0微處理器,采用的是ARM7TDMI內核。該內核因為有著功耗小、成本低等特點,因此非常適合作為移動手持終端的處理器核心。Linux操作系統因為它的開放性,使得它不斷的被應用到各個領域。在嵌入式領域同樣也出現了各種各樣的Linux變體,最常用的是uClinux。也正是因為uClinux操作系統支持不帶MMU單元的ARM處理器,因此該系統可以對S3C44B0微處理器有很好的支持。

        在嵌入式系統開發中,第一個部分便是系統的引導。而系統的引導過程是通過BootLoader來完成的。BootLoader程序是與硬件緊密相關的一段代碼,而且編寫的時候比較復雜,它主要的功能是初始化微處理器以及周邊的硬件資源,并且引導操作系統的啟動。下面我將以S3C44B0微處理器來作為例子,對uClinux操作系統內核的引導過程進行一個剖析。

        2 BootLoader程序概念

        簡單的說Boot Lodaer就是在操作系統內核運行之前運行的一段小程序,通過這段小程序,可以初始化硬件設備、建立系統的內存空間映射圖,從而將系統的軟硬件環境設置成一個適合的狀態,以便為最終調用操作系統內核準備好正確的環境。最終,BootLoader把操作系統內核映象加載到RAM中,并將系統控制權傳遞給它。

        2.1 典型的BootLoader程序框架

        操作系統角度來說,Boot Loader的總目標就是正確的調用內核來執行。

        由于Boot Loader的實現依賴于CPU的體系結構,因此大多數Boot Loader都分為Stage1和Stage2兩大部分。依賴于CPU體系結構的代碼,例如設備初始化代碼等,通常都放在Stage1中,而且通常都用匯編語言來實現,以達到短小精悍的目的。而Stage2通常用C語言來實現,這樣可以實現更加復雜的功能,而且代碼會具有更好的可讀性和可移植性。

        Boot Loader的Stage1通常包括如下步驟:

        1) 硬件設備初始化



        關鍵詞: uClinux cpu 控制器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 措美县| 满城县| 金川县| 镇巴县| 托克托县| 安多县| 清苑县| 神池县| 鹤庆县| 九台市| 朝阳县| 新乡市| 洛宁县| 清丰县| 吉安县| 莲花县| 文成县| 大安市| 英吉沙县| 皋兰县| 潼关县| 镇平县| 泗洪县| 宽城| 平塘县| 黑河市| 东乌珠穆沁旗| 张家港市| 河西区| 信丰县| 班戈县| 界首市| 安宁市| 交城县| 博罗县| 大英县| 耿马| 墨玉县| 汉沽区| 高尔夫| 乌拉特前旗|