<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ò ) 收藏

uclinux表示micro-control linux.即“微領(lǐng)域中的Linux系統”,是Lineo公司的主打產(chǎn)品,同時(shí)也是開(kāi)放源碼的嵌入式Linux的典范之作。uCLinux主要是針對目標處理器沒(méi)有存儲管理單元MMU(Memory Management Unit)的嵌入式系統而設計的。它已經(jīng)被成功地移植到了很多平臺上。由于沒(méi)有MMU,其多任務(wù)的實(shí)現需要一定技巧。

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

啟動(dòng)過(guò)程

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

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

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

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

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

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

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

(4) 把在flash上的image復制到DRAM上。(line 161 )

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

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

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

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

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

此時(shí)的函數decompress_kernel是用C語(yǔ)言寫(xiě)的,line 297 。

(1) makecrc();進(jìn)行crc校驗。

(2) puts(“Uncompressing Linux.。.”); 輸出linux起動(dòng)后的第一句話(huà)。

(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中,因為此時(shí)我們還要檢驗解壓縮之后的kernel起始地址是否緊接著(zhù)kernel image,如果是,beq call_kernel(line 220),執行解壓后的kernel.

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

二.kernel執行

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

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

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

(2) 設置與體系結構相關(guān)的環(huán)境(setup_arch())

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

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

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

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

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

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

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

(10)延遲校準calibrate_delay();

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

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

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

(14)啟動(dòng)init過(guò)程(創(chuàng )建第一個(gè)核心線(xiàn)程,調用init()函數,原執行序列調用_idle() 等待調度,init())

至此start_kernel()結束,基本的核心環(huán)境已經(jīng)建立起來(lái)了。

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

現在我們進(jìn)入內核引導第二部分,init()函數作為核心線(xiàn)程,首先鎖定內核(僅對SMP機器有效,我們?yōu)榭蘸瘮?,然后調用 do_basic_setup() (line 551)完成外設及其驅動(dòng)程序的加載初始化。

過(guò)程如下:

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

* 創(chuàng )建事件管理核心線(xiàn)程(start_context_thread()函數,這是系統創(chuàng )建的第二個(gè)內核線(xiàn)程,名叫“keventd”。其代碼context_thread()也在kernel/context.c中,)

啟動(dòng)任何使用__initcall標識的函數(方便核心開(kāi)發(fā)者添加啟動(dòng)函數,此時(shí)由do_initcalls()函數啟動(dòng))。

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

至此do_basic_setup()函數返回init(),在釋放啟動(dòng)內存段(free_initmem())并給內核解鎖以后,init()打開(kāi)/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進(jìn)程是系統所有進(jìn)程的起點(diǎn),內核在完成核內引導以后,即在本線(xiàn)程(進(jìn)程)空間內加載init程序,它的進(jìn)程號是1。

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


上一頁(yè) 1 2 3 4 5 6 7 8 9 10 11 下一頁(yè)

關(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>