bugsplat( 四 )


* 量,因为Linux内核使用irq_desc来描述一个中断 。
*/
init_IRQ();/* 中断初始化 */
tick_init();/* tick初始化 */
rcu_init_nohz();
init_timers();/* 初始化定时器 */
hrtimers_init();/* 初始化高精度定时器 */
softirq_init();/* 软中断初始化 */
timekeeping_init();
time_init(); /* 初始化系统时间 */
sched_clock_postinit();
perf_event_init();
profile_init();
call_function_init();
WARN(!irqs_disabled(),"Interrupts were enabled early\n");
early_boot_irqs_disabled = false;
local_irq_enable(); /* 使能中断 */


kmem_cache_init_late(); /* slab初始化,slab是Linux内存分配器 */
console_init(); /* 初始化控制台,之前printk打印的信息都存放
* 缓冲区中,并没有打印出来 。只有调用此函数
* 初始化控制台以后才能在控制台上打印信息 。
*/
if(panic_later)
panic("Too many boot %s vars at `%s\'", panic_later,
panic_param);


lockdep_info();/* 如果定义了宏CONFIG_LOCKDEP,那么此函数打印一些信息 。*/


locking_selftest() /* 锁自测 */
......
page_ext_init();
debug_objects_mem_init();
kmemleak_init(); /* kmemleak初始化,kmemleak用于检查内存泄漏 */
setup_per_cpu_pageset();
numa_policy_init();
if(late_time_init)
late_time_init();
sched_clock_init();
calibrate_delay();/* 测定BogoMIPS值,可以通过BogoMIPS来判断CPU的性能
* BogoMIPS设置越大,说明CPU性能越好 。
*/
pidmap_init(); /* PID位图初始化 */
anon_vma_init(); /* 生成anon_vma slab缓存 */
acpi_early_init();
......
thread_info_cache_init();
cred_init(); /* 为对象的每个用于赋予资格(凭证) */
fork_init(); /* 初始化一些结构体以使用fork函数 */
proc_caches_init(); /* 给各种资源管理结构分配缓存 */
buffer_init(); /* 初始化缓冲缓存 */
key_init(); /* 初始化密钥 */
security_init(); /* 安全相关初始化 */
dbg_late_init();
vfs_caches_init(totalram_pages); /* 为VFS创建缓存 */
signals_init(); /* 初始化信号 */


page_writeback_init(); /* 页回写初始化 */
proc_root_init(); /* 注册并挂载proc文件系统 */
nsfs_init();
cpuset_init(); /* 初始化cpuset,cpuset是将CPU和内存资源以逻辑性
* 和层次性集成的一种机制,是cgroup使用的子系统之一
*/
cgroup_init(); /* 初始化cgroup */
taskstats_init_early(); /* 进程状态初始化 */
delayacct_init();


check_bugs(); /* 检查写缓冲一致性 */


acpi_subsystem_init();
sfi_init_late();


if(efi_enabled(EFI_RUNTIME_SERVICES)){
efi_late_init();
efi_free_boot_services();
}


ftrace_init();


rest_init(); /* rest_init函数 */
}
start_kernel里面调用了大量的函数,每一个函数都是一个庞大的知识点,如果想要学习Linux内核,那么这些函数就需要去详细的研究 。本教程注重于嵌入式Linux入门,因此不会去讲太多关于Linux内核的知识 。start_kernel函数最后调用了rest_init,接下来简单看一下rest_init函数 。
36.2.4 rest_init函数rest_init函数定义在文件init/main.c中,函数内容如下:
示例代码36.2.4.1 rest_init函数
383static noinline void __init_refok rest_init(void)
384{
385int pid;
386
387 rcu_scheduler_starting();
388 smpboot_thread_init();
389/*
390 * We need to spawn init first so that it obtains pid 1, however
391 * the init task will end up wanting to create kthreads, which,
392 * if we schedule it before we create kthreadd, will OOPS.


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。