<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > uclinux啟動(dòng)過(guò)程詳細分析

uclinux啟動(dòng)過(guò)程詳細分析

作者: 時(shí)間:2018-08-31 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/201808/388126.htm

存儲了可用物理內存起始地址的變量memory_start的初始化是通過(guò)一個(gè)ld腳本中定義的變量_end進(jìn)行的。ld腳本是用來(lái)控制GNU ld連接器在連接內核各個(gè)目標文件部分的時(shí)候的配置動(dòng)作,比如這樣一個(gè)腳本:

SECTION

{

。=0x10000;

.text:{*(.text)}

。=0x8000000;

.data:{*(.data)}

.bss :{*(.bss)}

}

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

這個(gè)ld配置腳本文件對每個(gè)平臺都是不同的。如為MICETEK上所使用的版本使用的ld配置文件為arch/armnomm/vmLinux.lds??梢酝ㄟ^(guò)修改某個(gè)平臺上的ld腳本配置文件中的_end變量來(lái)達到配置其可用物理內存起始地址的目的。

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

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

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

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

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

(2) paging_init()

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

empty_bad_page_table 占用1頁(yè)(4KB)

empty_bad_page 占用1頁(yè)(4KB)

empty_zero_page 占用1頁(yè),并初始化為全0

mem_map

bitmap

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

(3)free_area_init()

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

(3) mem_init()

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

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

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

關(guān)鍵字:S3C44B0X;uClinux;嵌入式系統;內核引導

1 前言

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

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

2 BootLoader程序概念

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

2.1 典型的BootLoader程序框架

操作系統角度來(lái)說(shuō),Boot Loader的總目標就是正確的調用內核來(lái)執行。

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

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

1) 硬件設備初始化



關(guān)鍵詞: uClinux cpu 控制器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>