Linux内核初始化过程的源码分析疑点记录
再总结一下在分析代码时碰到的疑问,算是备案,也算是求助,只要解决了,我都会留言说明的,如下:
1、head.s开始时,首先根据PowerPC ABI规范,保存r3、r4、r5、r6和r7,然后调用early_init,现在只知道r3保存函数返回值,其余未知。__start一开始就cmpwi 0,r5,0,是判断什么?
2、在early_init阶段,内核会为CPU特性做fixup处理,调用的几个do_feature_fixup函数,虽然勉强知道是用于代码复用的处理器特性处理,但具体机制不清楚,输入参数__start___ftr_fixup、__stop___ftr_fixup都不清楚含义。
3、在__init_fpu_registers中,有一个REST_32FPRS(0,r9),r9为空数组,宏定义如下:
#define REST_FPR(n, base) lfd n,THREAD_FPR0+8*TS_FPRWIDTH*(n)(base) /*THREAD_FPR0为double fpr[32][TS_FPRWIDTH]在结构体thread_struct中的偏移*/
这句也一直不清楚,是不是清FPR的操作?
4、Linux有一个Oops机制,用于处理内核的异常,处理Oops异常的入口位于head_32.S中的trun_on_mmu函数后面的一大段代码,其中还和arch/powerpc/kvm文件夹下的程序有关。(Sailor的CSDN博客有相关介绍)
5、接上面,Linux中的异常处理,在head_32.S中有一大段的代码,一直没敢去碰它,初始化时碰到的DSI异常和PTE中的IMISS和DMISS也都是一笔带过,要找时间和资料细细分析下。
6、函数lockdep_init是什么意思? 虽然知道是用于启动Lock Dependency Validator(内核依赖的关系表),本质上就是建立两个散列表calsshash_table和chainhash_table,并初始化全局变量lockdep_initialized,标志已初始化完成。但还是不清楚,有没有更直白点的解释?
7、Linux内核在启动早期就会在屏幕打印输出(BTEXT),以及后来的machin_init中的调试使能函数,对于PowerPC就是NS16550的串口,具体的初始化方法和机制都不是很清楚。
8、MMU硬件初始化的流程,可能是心里太乱了,又正好E300的MMU初始化那么复杂,花了很久都没能理清,是以后摸索的重点。