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空间是用来映射高端内存使用的。因此0到896M的内存空间,就叫做低端内存,而高于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里,这个函数为空。
分享到:
相关推荐
Linux内核函数Start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。这些动作有的是公共的,有的则是需要配置的才会执行的。本文介绍了在start_kernel()函数中的一些功能。
Daniel Jslin教授分析linux kernel 中的start_kernel详细过程。by the way.可以关注我在csdn上关于linux kernel的课程https://edu.csdn.net/course/detail/9089
arm linux 从入口到start_kernel 代码分析 第四部分
arm linux 从入口到start_kernel 代码分析
很好的linux启动代码分析 LINUX , start_kernel , 启动代码 linux kernel 从入口到start_kernel 的代码分析.rar 104.59 KB, 下载次数: 31 , 下载积分: 资产 -2 信元, 下载支出 2 信元
arm linux 从入口到start_kernel 代码详细分析.doc
该文档描述了linux 内核内存管理部分的相关分析,从start_kernel入手,注重代码分析。
start_kernel流程图 linux2.6 内核支持两种格式的 initrd,一种是 image-initrd,其核心文件就是 /linuxrc。另外一种是cpio-initrd,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init。尽管 linux2.6...
linux内核从start_kernel到init.pdf
arm linux 从入口到start_kernel 代码分析 第六部分
arm linux 从入口到start_kernel 代码分析 第5部分
打印机驱动 START_PLQ6_OKI5_Drvsky打印机驱动 START_PLQ6_OKI5_Drvsky打印机驱动 START_PLQ6_OKI5_Drvsky打印机驱动 START_PLQ6_OKI5_Drvsky打印机驱动 START_PLQ6_OKI5_Drvsky打印机驱动 START_PLQ6_OKI5_Drvsky...
arm linux 从入口到start_kernel 代码分析 第7部分
arm linux 从入口到start_kernel 代码分析第三部分
第一部分从Linux系统程序入口地址_start开始直到调用start_kernel函数;第二部分从start_kernel函数开始直到使用kernel_thread函数创建init进程。 本文件的代码分析将从第二次引导,即start_kernel()开始,直到mem_...