欢迎来到天天文库
浏览记录
ID:40495677
大小:35.03 KB
页数:8页
时间:2019-08-03
《Start_kernel函数分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、char*command_line;//命令行,用来存放bootloader传递过来的参数externconststructkernel_param__start___param[],__stop___param[];//这两个变量为地址指针,指向内核启动参数处理相关结构体在内存的位置,ARM平台定义的位置在kernel/include/asm-generic/Vmlinux.lds.h/*Needtorunasearlyaspossible,toinitializethelockdephash:*/lockdep_ini
2、t();//建立一个哈希表(hashtables),就是一个前后指向的指针结构体数组。【函数的主要作用是初始化锁的状态跟踪模块。由于内核大量使用锁来进行多进程多处理器的同步操作,死锁就会在代码不合理的时候出现,但是要定位哪个锁比较困难,用哈希表可以跟踪锁的使用状态。死锁情况:一个进程递归加锁同一把锁;同一把锁在两次中断中加锁;几把锁形成闭环死锁】smp_setup_processor_id();//针对SMP处理器,用于获取当前CPU的硬件ID,如果不是多核,函数为空【判断是否定义了CONFIG_SMP,如果定义了调用re
3、ad_cpuid_mpidr读取寄存器CPUID_MPIDR的值,就是当前正在执行初始化的CPUID,为了在初始化时做个区分,初始化完成后,所有处理器都是平等的,没有主从】debug_objects_early_init();//初始化哈希桶(hashbuckets)并将staticobject和poolobject放入poll列表,这样堆栈就可以完全操作了【这个函数的主要作用就是对调试对象进行早期的初始化,就是HASH锁和静态对象池进行初始化,执行完后,objecttracker已经开始完全运作了】/*Setupthet
4、heinitialcanaryASAP:*/boot_init_stack_canary();//初始化堆栈保护的加纳利值,防止栈溢出攻击的堆栈保护关键字cgroup_init_early();//在系统启动时初始化cgroups,同时初始化需要early_init的子系统【这个函数作用是控制组(controlgroups)早期的初始化,控制组就是定义一组进程具有相同资源的占有程度,比如,可以指定一组进程使用CPU为30%,磁盘IO为40%,网络带宽为50%。目的就是为了把所有进程分配不同的资源】local_irq_dis
5、able();//关闭当前CPU的所有中断响应,操作CPSR寄存器。对应后面的early_boot_irqs_disabled=true;//系统中断关闭标志,当early_init完毕后,会恢复中断设置标志为false。/*Interruptsarestilldisabled.Donecessarysetups,thenenablethem*/tick_init();//初始化内核时钟系统,tickcontrol,调用clockevents_register_notifier,就是监听时钟变化事件【这个函数主要作用是初始
6、化时钟事件管理器的回调函数,比如当时钟设备添加时处理。在内核里定义了时钟事件管理器,主要用来管理所有需要周期性地执行任务的设备】boot_cpu_init();//设置当前引导系统的CPU在物理上存在,在逻辑上可以使用,并且初始化准备好,即激活当前CPU【在多CPU的系统里,内核需要管理多个CPU,那么就需要知道系统有多少个CPU,在内核里使用cpu_present_map位图表达有多少个CPU,每一位表示一个CPU的存在。如果是单个CPU,就是第0位设置为1。虽然系统里有多个CPU存在,但是每个CPU不一定可以使用,或者
7、没有初始化,在内核使用cpu_online_map位图来表示那些CPU可以运行内核代码和接受中断处理。随着移动系统的节能需求,需要对CPU进行节能处理,比如有多个CPU运行时可以提高性能,但花费太多电能,导致电池不耐用,需要减少运行的CPU个数,或者只需要一个CPU运行。这样内核又引入了一个cpu_possible_map位图,表示最多可以使用多少个CPU。在本函数里就是依次设置这三个位图的标志,让引导的CPU物理上存在,已经初始化好,最少需要运行的CPU。】page_address_init();//初始化高端内存的映射
8、表【在这里引入了高端内存的概念,那么什么叫做高端内存呢?为什么要使用高端内存呢?其实高端内存是相对于低端内存而存在的,那么先要理解一下低端内存了。在32位的系统里,最多能访问的总内存是4G,其中3G空间给应用程序,而内核只占用1G的空间。因此,内核能映射的内存空间,只有1G大小,但实际上比这个还要小一些
此文档下载收益归作者所有