这个对基于PowerPC的Linux内核源码剖析的文章已经写了三篇了(见前三篇 与 还有 ),由于可以找到的关于PowerPC E300处理器的Linux文章基本没有,这些都是一点点摸索的,可能存在不少的错误,特别是第3篇,自我感觉很差,开始计划写这个系列的时候,自以为已经很了解PowerPC的内部体系了,现在回首,还是有很大的提升空间啊。这个系列到这里也算是一个中节点了,我打算先放一放,处理好工作上的琐事,然后再细细看一下E300内核的机制,再来开篇续集。
这里分享下一本很好的对PowerPC Linux做介绍的书---《Linux PowerPC详解-核心篇》,机械工业出版社,王齐编著。本书基于E500处理器,介绍了Linux PowerPC的组成;PowerPC的指令集、寄存器、内存体系结构等;还讲述了进程调度、中断处理、内存管理MMU等知识。对于想入手Linux+PowerPC的童鞋,是不可多得的好资料。希望大家共同学习,共同进步。详细见:
再总结一下在分析代码时碰到的疑问,算是备案,也算是求助,只要解决了,我都会留言说明的,如下:
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初始化那么复杂,花了很久都没能理清,是以后摸索的重点。