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

arm Linux系统启动之start_kernel函数

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

则locking_selftest()是一个空函数,否则执行锁自测

locking_selftest();

#ifdef CONFIG_BLK_DEV_INITRD

if (initrd_start && !initrd_below_start_ok &&

page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {

printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "

"disabling it./n",

page_to_pfn(virt_to_page((void *)initrd_start)),

min_low_pfn);

initrd_start = 0;

}

#endif

//页面初始化,可以参考上面的cgroup机制

page_cgroup_init();

//页面分配debug启用

enable_debug_pagealloc();

//此处函数为空

kmemtrace_init();

//memory lead侦测初始化,如何侦测???

kmemleak_init();

//

//Called after the kmem_caches are functional to setup a dedicated

//cache pool, which has the SLAB_DEBUG_OBJECTS flag set. This flag

//prevents that the debug code is called on kmem_cache_free() for the

//debug tracker objects to avoid recursive calls.

//在kmem_caches之后表示建立一个高速缓冲池,建立起SLAB_DEBUG_OBJECTS标志。???

debug_objects_mem_init();

//idr在linux内核中指的就是整数ID管理机制,

//从本质上来说,这就是一种将整数ID号和特定指针关联在一起的机制

//idr机制适用在那些需要把某个整数和特定指针关联在一起的地方。

//http://blogold.chinaunix.net/u3/93255/showart_2524027.html

idr_init_cache();

//是否是对SMP的支持,单核是否需要??这个要分析

setup_per_cpu_pageset();

//NUMA (Non Uniform Memory Access) policy

//具体是什么不懂

numa_policy_init();

if (late_time_init)

late_time_init();

//初始化调度时钟

sched_clock_init();

//calibrate_delay()函数可以计算出cpu在一秒钟内执行了多少次一个极短的循环,

//计算出来的值经过处理后得到BogoMIPS 值,

//Bogo是Bogus(伪)的意思,MIPS是millions of instructions per second(百万条指令每秒)的缩写。

//这样我们就知道了其实这个函数是linux内核中一个cpu性能测试函数。

//http://blogold.chinaunix.net/u2/86768/showart_2196664.html

calibrate_delay();

//PID是process id的缩写

//http://blog.csdn.net/satanwxd/archive/2010/03/27/5422053.aspx

pidmap_init();

//来自mm/rmap.c

//分配一个anon_vma_cachep作为anon_vma的slab缓存。

//这个技术是PFRA(页框回收算法)技术中的组成部分。

//这个技术为定位而生——快速的定位指向同一页框的所有页表项。

anon_vma_init();

#ifdef CONFIG_X86

if (efi_enabled)

efi_enter_virtual_mode();

#endif

//创建thread_info缓存

thread_info_cache_init();

//申请了一个slab来存放credentials??????如何理解?

cred_init();

//根据物理内存大小计算允许创建进程的数量

//http://www.jollen.org/blog/2006/11/jollen_linux_3_fork_init.html

fork_init(totalram_pages);

//给进程的各种资源管理结构分配了相应的对象缓存区

//http://www.shangshuwu.cn/index.php/Linux内核的进程创建

proc_caches_init();

//创建 buffer_head SLAB 缓存

buffer_init();

//初始化key的management stuff

key_init();

//关于系统安全的初始化,主要是访问控制

//http://blog.csdn.net/nhczp/archive/2008/04/29/2341194.aspx

security_init();

//与debug kernel相关

dbg_late_init();

//调用kmem_cache_create()函数来为VFS创建各种SLAB分配器缓存

//包括:names_cachep、filp_cachep、dquot_cachep和bh_cachep等四个SLAB分配器缓存

vfs_caches_init(totalram_pages);

//创建信号队列

signals_init();

/* rootfs populating might need page-writeback */

//回写相关的初始化

//http://blog.csdn.net/yangp01/archive/2010/04/06/5454822.aspx

page_writeback_init();

#ifdef CONFIG_PROC_FS

proc_root_init();

#endif

//它将剩余的subsys初始化.然后将init_css_set添加进哈希数组css_set_table[ ]中.

//在上面的代码中css_set_hash()是css_set_table的哈希函数.

//它是css_set->subsys为哈希键值,到css_set_table[ ]中找到对应项.然后调用hlist_add_head()将init_css_set添加到冲突项中.

//然后,注册了cgroup文件系统.这个文件系统也是我们在用户空间使用cgroup时必须挂载的.

//最后,在proc的根目录下创建了一个名为cgroups的文件.用来从用户空间观察cgroup的状态.

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

cgroup_init();

//http://blogold.chinaunix.net/u1/51562/s

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

网站地图

Top