`

Android培训班(108)start_kernel函数5

 
阅读更多

tick_init()

这个函数主要作用是初始化时钟事件管理器的回调函数,比如当时钟设备添加时处理。在内核里定义了时钟事件管理器,主要用来管理所有需要周期性地执行任务的设备。



boot_cpu_init()

这个函数主要作用是设置当前引导系统的CPU在物理上存在,在逻辑上可以使用,并且初始化准备好。在多CPU的系统里,内核需要管理多个CPU,那么就需要知道系统有多少个CPU,在内核里使用cpu_present_map位图表达有多少个CPU,每一位表示一个CPU的存在。如果是单个CPU,就是第0位设置为1。虽然系统里有多个CPU存在,但是每个CPU不一定可以使用,或者没有初始化,在内核使用cpu_online_map位图来表示那些CPU可以运行内核代码和接受中断处理。随着移动系统的节能需求,需要对CPU进行节能处理,比如有多个CPU运行时可以提高性能,但花费太多电能,导致电池不耐用,需要减少运行的CPU个数,或者只需要一个CPU运行。这样内核又引入了一个cpu_possible_map位图,表示最多可以使用多少个CPU。在本函数里就是依次设置这三个位图的标志,让引导的CPU物理上存在,已经初始化好,最少需要运行的CPU



page_address_init()

这个函数主要作用是初始化高端内存的映射表。在这里引入了高端内存的概念,那么什么叫做高端内存呢?为什么要使用高端内存呢?其实高端内存是相对于低端内存而存在的,那么先要理解一下低端内存了。在32位的系统里,最多能访问的总内存是4G,其中3G空间给应用程序,而内核只占用1G的空间。因此,内核能映射的内存空间,只有1G大小,但实际上比这个还要小一些,大概是896M,另外128M空间是用来映射高端内存使用的。因此0896M的内存空间,就叫做低端内存,而高于896M的内存,就叫高端内存了。如果系统是64位系统,当然就没未必要有高端内存存在了,因为64位有足够多的地址空间给内核使用,访问的内存可以达到10G都没有问题。在32位系统里,内核为了访问超过1G的物理内存空间,需要使用高端内存映射表。比如当内核需要读取1G的缓存数据时,就需要分配高端内存来使用,这样才可以管理起来。使用高端内存之后,32位的系统也可以访问达到64G内存。在移动操作系统里,目前还没有这个必要,最多才1G多内存。



printk(KERN_NOTICE)

这行代码主要作用是在输出终端上显示注意信息。printk是内核格式化输出函数,宏KERN_NOTICE定义如下:

#define KERN_NOTICE "<5>"

因此在调试输出窗口上就会显示"<5>"字符串。



printk(linux_banner)

这行代码主要作用是在输出终端上显示版本信息、编译的电脑用户名称、编译器版本、编译时间。如下所示:

Linuxversion 2.6.37+ (tony@tony-desktop) (gcc version 4.3.3 (Sourcery G++Lite 2009q1-203) ) #40 Tue Mar 20 17:49:58 CST 2012

linux_banner是在文件kernel/init/version.c里定义,这个字符串是由编译脚本自动生成。



setup_arch(&command_line)

这个函数主要作用是对内核架构进行初始化。再次获取CPU类型和系统架构,分析引导程序传入的命令行参数,进行页面内存初始化,处理器初始化,中断早期初始化等等。



mm_init_owner(&init_mm,&init_task)

这个函数主要作用是设置最开始的初始化任务属于init_mm内存。在ARM里,这个函数为空。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics