init\main.c start_kernel()
来源:互联网 发布:slack windows 编辑:程序博客网 时间:2024/05/28 17:04
- * 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. 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.
- */
- //初始化控制台以显示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宏
- //则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/showart_1777937.html
- cpuset_init();
- ////进程状态初始化,实际上就是分配了一个存储线程状态的高速缓存
- taskstats_init_early();
- delayacct_init();
- //此处为一空函数
- imv_init_complete();
- //测试CPU的各种缺陷,记录检测到的缺陷,以便于内核的其他部分以后可以使用他们工作。
- check_bugs();
- //电源相关的初始化
- //http://blogold.chinaunix.net/u/548/showart.php?id=377952
- acpi_early_init(); /* before LAPIC and SMP init */
- //
- sfi_init_late();
- ftrace_init();
- /* Do the rest non-__init'ed, we're now alive */
- //创建1号进程,详细分析之
- rest_init();
- }
- init\main.c start_kernel()
- linux源码分析-/init/main.c/start_kernel
- per_cpu_pageset 之一(init/main.c start_kernel初始化)
- void start_kernel(void)分析 ! \linux-1.0\init\main.c
- kernel 启动过程之三, start_kernel()函数 概叙!init/main.c
- kernel 启动过程之三, start_kernel()函数 概叙!init/main.c
- kernel 启动过程之三, start_kernel()函数 概叙!init/main.c
- Linux启动过程中init/main.c中的start_kernel()函数中的lock_kernel()函数
- kernel 启动过程之三, start_kernel()函数 概叙!init/main.c
- kernel 启动过程之三, start_kernel()函数 概叙!init/main.c .
- kernel 启动过程之三, start_kernel()函数 概叙!init/main.c
- kernel 启动过程之三, start_kernel()函数 概叙!init/main.c
- linux/init/main.c
- linux/init/main.c 注释
- init/main.c源码分析
- 从start_kernel到init
- 从start_kernel到init
- 从start_kernel到init
- Delphi文本文件读写
- Delphi中的INI文件編程
- dota奶爸
- 第2章 Object Pascal语言基础
- 从零开始,教你如何破解WEP、WPA无线网络 密码
- init\main.c start_kernel()
- LAYOUTINFLATER的使用
- ODBC的SQLFetch处理的是第一个表的内容
- 年会感悟
- md5宏
- Python内建函数用法!
- gdb的编译及使用
- Oracle Resumable Space Allocation 特性 说明
- WebSphere