<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

void __init start_kernel(void)

{

char * command_line;

unsigned long mempages;

extern char saved_command_line[];

/*

* Interrupts are still disabled. Do necessary setups, then

* enable them

*/

lock_kernel();

printk(linux_banner);

setup_arch(command_line);

printk(“Kernel command line: %s/n”, saved_command_line);

parse_options(command_line);

trap_init();

init_IRQ();

sched_init();

softirq_init();

time_init();

/*

* HACK ALERT! This is early. We‘re enabling the console before

* we’ve done PCI setups etc, and console_init() must be aware of

* this. But we do want output early, in case something goes wrong.

*/

console_init();

#ifdef CONFIG_MODULES

init_modules();

#endif

if (prof_shift) {

unsigned int size;

/* only text is profiled */

prof_len = (unsigned long) _etext - (unsigned long) _stext;

prof_len 》》= prof_shift;

size = prof_len * sizeof(unsigned int) + PAGE_SIZE-1;

prof_buffer = (unsigned int *) alloc_bootmem(size);

}

kmem_cache_init();

sti();

calibrate_delay();

#ifdef CONFIG_BLK_DEV_INITRD

if (initrd_start !initrd_below_start_ok initrd_start 《 min_low_pfn 《《 PAGE_SHIFT)

{

printk(KERN_CRIT “initrd overwritten (0x%08lx 《 0x%08lx) - ”

“disabling it./n”,initrd_start,min_low_pfn 《《 PAGE_SHIFT);

initrd_start = 0;

}

#endif

mem_init();

kmem_cache_sizes_init();

pgtable_cache_init();

mempages = num_physpages;

fork_init(mempages);

proc_caches_init();

vfs_caches_init(mempages);

buffer_init(mempages);

page_cache_init(mempages);

#if defined(CONFIG_ARCH_S390)

ccwcache_init();

#endif

signals_init();

#ifdef CONFIG_PROC_FS

proc_root_init();

#endif

#if defined(CONFIG_SYSVIPC)

ipc_init();

#endif

check_bugs();

printk(“POSIX conformance testing by UNIFIX/n”);

/*

* We count on the initial thread going ok

Like idlers init is an unlocked kernel thread,which will

* make syscalls (and thus be locked)。

*/

smp_init();

rest_init();

}

內核啟動(dòng)之后需要執行的第一個(gè)函數是start_kernel()(在linux/init/main.c文件中)。

start_kernel()

完成下面一系列初始化的工作。

◆printk(1inux_banner),顯示Linux內核的版本信息。

◆ setup_arch(command_line),做與體系結構相關(guān)的初始化工作。

◆ parse_options(command_line),解釋系統參數。

◆ trap_init(),設置系統異常的入口點(diǎn)。

◆ init_IRQ(),初始化系統中斷服務(wù)。

◆ sched_init(),系統調度器的初始化。

◆ time_init(),時(shí)鐘、定時(shí)器初始化。

◆ softirq_init(),系統軟中斷的初始化。

◆console_init(),控制臺初始化。

◆kmem_cache_init(),內核cache的初始化。

◆calibrate_delay(),校準時(shí)鐘。

◆mem_init(),內存初始化。

◆kmem_cache_sizes_init(),創(chuàng )建及設置通用cache。

◆fork_init(mempages),建立uidcache,并且根據系統內存大小來(lái)確定最大進(jìn)程數目。

◆buffer_init(mempages),塊設備緩沖區的初始化。初始化一系列的cache。

◆check_bugs(),檢查體系結構漏洞。

◆kernel_thread(init NULL,CLONE_FS | CLONE_FILES | CLONE_SIGNAL),創(chuàng )建第一個(gè)核心進(jìn)程,啟動(dòng)init進(jìn)程。

_idle(),運行idle進(jìn)程

接下去做的工作由init()函數來(lái)完成。init()首先要鎖定內核,然后調用do_basic_setup( )來(lái)完成外部設備以及驅動(dòng)程序的初始化。外設的初始化要根據內核的配置來(lái)決定,一般需要做下面的初始化工作:

◆PCI總線(xiàn)初始化。

◆網(wǎng)絡(luò )初始化。

◆一系列其他設備的初始化。

◆start_context_thread()創(chuàng )建事件管理核心進(jìn)程keventd。

◆通過(guò)do_initcalls()函數來(lái)啟動(dòng)任何使用__initcall標識的函數。

◆文件系統初始化。

◆加載文件系統。

在do_basic_setup()調用完成之后,init()會(huì )釋放初始化函數所用的內存,并且打開(kāi)/dev/console設備重新定向控制臺,讓系統調用execve來(lái)執行程序init。

到這里為止,Linux 內核的初始化工作已經(jīng)完成。然后開(kāi)始用戶(hù)態(tài)進(jìn)程的初始化。

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

中內存模塊的啟動(dòng)初始化

arch/armnommu/kernel/entry_armv.S是一個(gè)匯編文件,他包含了一個(gè)kernel_entry的定義,這是整個(gè)內核的進(jìn)入點(diǎn)。在完成某些平臺相關(guān)的初始化工作之后,執行流程跳轉到start_kerne()處。從這里開(kāi)始考察的內存模塊啟動(dòng)初始化是如何實(shí)現的。

start_kernel()中與內存模塊相關(guān)的函數調用流程如下:

setup_arch() paging_init() free_area_init() mem_init()

下面分別分析這些函數各自的功能以及對他們的改造。

(1) setup_arch()

setup_arch()首先根據目前內核所配置的平臺向某些特定地址寫(xiě)入特殊字符序列,以完成對特定硬件的初始化,比如工作狀態(tài)發(fā)光二極管、錯誤和報警發(fā)光二極管。



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