微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm Linux系统启动之start_kernel函数

arm Linux系统启动之start_kernel函数

时间:11-09 来源:互联网 点击:

le we still have a functioning scheduler.

*/

//核心进程调度器初始化,调度器的初始化的优先级要高于任何中断的建立,

//并且初始化进程0,即idle进程,但是并没有设置idle进程的NEED_RESCHED标志,

//所以还会继续完成内核初始化剩下的事情。

//这里仅仅为进程调度程序的执行做准备。

//它所做的具体工作是调用init_bh函数(kernel/softirq.c)把timer,tqueue,immediate三个人物队列加入下半部分的数组

sched_init();

/*

* Disable preemption - early bootup scheduling is extremely

* fragile until we cpu_idle() for the first time.

*/

//抢占计数器加1

preempt_disable();

//检查中断是否打开

if (!irqs_disabled()) {

printk(KERN_WARNING "start_kernel(): bug: interrupts were "

"enabled *very* early, fixing it/n");

local_irq_disable();

}

//Read-Copy-Update的初始化

//RCU机制是Linux2.6之后提供的一种数据一致性访问的机制,

//从RCU(read-copy-update)的名称上看,我们就能对他的实现机制有一个大概的了解,

//在修改数据的时候,首先需要读取数据,然后生成一个副本,对副本进行修改,

//修改完成之后再将老数据update成新的数据,此所谓RCU。

//http://blog.ednchina.com/tiloog/193361/message.aspx

//http://blogold.chinaunix.net/u1/51562/showart_1341707.html

rcu_init();

//定义在lib/radix-tree.c。

//Linux使用radix树来管理位于文件系统缓冲区中的磁盘块,

//radix树是trie树的一种

//http://blog.csdn.net/walkland/archive/2009/03/19/4006121.aspx

radix_tree_init();

/* init some links before init_ISA_irqs() */

//early_irq_init 则对数组中每个成员结构进行初始化,

//例如, 初始每个中断源的中断号.其他的函数基本为空.

early_irq_init();

//初始化IRQ中断和终端描述符。

//初始化系统中支持的最大可能的中断描述结构struct irqdesc变量数组irq_desc[NR_IRQS],

//把每个结构变量irq_desc[n]都初始化为预先定义好的坏中断描述结构变量bad_irq_desc,

//并初始化该中断的链表表头成员结构变量pend

init_IRQ();

//prio-tree是一棵查找树,管理的是什么?

//http://blog.csdn.net/dog250/archive/2010/06/28/5700317.aspx

prio_tree_init();

//初始化定时器Timer相关的数据结构

//http://www.ibm.com/developerworks/cn/linux/l-cn-clocks/index.html

init_timers();

//对高精度时钟进行初始化

hrtimers_init();

//软中断初始化

//http://blogold.chinaunix.net/u1/51562/showart_494363.html

softirq_init();

//初始化时钟源

timekeeping_init();

//初始化系统时间,

//检查系统定时器描述结构struct sys_timer全局变量system_timer是否为空,

//如果为空将其指向dummy_gettimeoffset()函数。

//http://www.ibm.com/developerworks/cn/linux/l-cn-clocks/index.html

time_init();

//profile只是内核的一个调试性能的工具,

//这个可以通过menuconfig中的Instrumentation Support->profile打开。

//http://www.linuxdiyf.com/bbs//thread-71446-1-1.html

profile_init();

if (!irqs_disabled())

printk(KERN_CRIT "start_kernel(): bug: interrupts were "

"enabled early/n");

//与开始的early_boot_irqs_off相对应

early_boot_irqs_on();

//与local_irq_disbale相对应,开中断

local_irq_enable();

/* Interrupts are enabled now so all GFP allocations are safe. */

gfp_allowed_mask = __GFP_BITS_MASK;

//memory cache的初始化

//http://my.chinaunix.net/space.php?uid=7588746&do=blog&id=153184

kmem_cache_init_late();

/*

* HACK ALERT! This is early. Were enabling the console before

* weve done PCI setups etc, and console_init() must be aware of

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

*/

//初始化控制台以显示printk的内容,在此之前调用的printk,只是把数据存到缓冲区里,

//只有在这个函数调用后,才会在控制台打印出内容

//该函数执行后可调用printk()函数将log_buf中符合打印级别要求的系统信息打印到控制台上。

console_init();

if (panic_later)

panic(panic_later, panic_param);

//如果定义了CONFIG_LOCKDEP宏,那么就打印锁依赖信息,否则什么也不做

lockdep_info();

/*

* Need to run this when irqs are enabled, because it wants

* to self-test [hard/soft]-irqs on/off lock inversion bugs

* too:

*/

//如果定义CONFIG_DEBUG_LOCKING_API_SELFTESTS宏

//

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top