【MIPS CPU 体系结构概述2】连载3:

* 存储管理.
MIPS 是典型的RISC结构,它的存储管理单元做的事情比象x86这种机器少得多. 例如,它的tlb是软件管理的,cache常常是需要系统程序干预的.而且,过多的
CPU和主板变种使得这一部分非常复杂,容易出错.存储管理的代码主要在include/ asm-mips和arch/mips/mm/目录下.

* 其它.
如时间处理,r4k以上的MIPS CPU提供count/compare寄存器,每隔几拍count增加, 到和compare相等时发生时钟中断,这可以用来提供系统的时钟中断.但很多板子 自己也提供其它的可编程时钟源.具体用什么就取决于开发者了.

init_arch后是loadmmu,初始化cache/tlb.代码在arch/mips/mm里.有人可能会问, 在cache和tlb之前CPU怎么工作的?

在x86里有实模式,而MIPS没有,但它的地址空间是特殊的,分成几个不同的区域, 每个区域中的地址在CPU里的待遇是不一样的,系统刚上电时CPU从地址bfc00000 开始,那里的地址既不用tlb也不用cache,所以CPU能工作而不管cache和tlb是什么 样子.当然,这样子效率是很低的,所以CPU很快就开始进行loadmmu. 因为MIPS CPU 变种繁多,所以代码又臭又长. 主要不外是检测cache大小,选择相应的cache/tlb flush过程,还有一些memcpy/memset等的高效实现.这里还很容易出微妙的错误, 软件管理tlb或者cache都不简单,要保证效率又要保证正确.在开发初期常常先关掉CPU的cache以便排除cache问题.

MMU初始化后,系统就直接跳转到init/main.c中的start_kernel,很快吧? 不过别高兴,start_kernel虚晃一枪,又回到arch/mips/kernel/setup.c,调用 setup_arch,这回就是完成上面说的各平台相关的初始化了.

平台相关的初始化完成之后,mips内核和其它平台的内核区别就不大了,但也还有 不少问题需要关注.如许多驱动程序可能因为倚赖x86的特殊属性(如IO端口,自动 的cache一致性维护,显卡初始化等)而不能直接在MIPS下工作.

例如,能直接(用现有的内核驱动)在MIPS下工作的网卡不是很多,笔者知道的有inteleepro100,AMD pcnet32 ,Tulip. 3com的网卡好像大多不能用.显卡则由于vga bios 的问题,很少能直接使用.(常见的显卡都是为x86做的,它们常常带着一块rom,里面 含有vga bios,PC的BIOS的初始化过程中发现它们的化就会先去执行它们以初始化 显卡,然后才能很早地在屏幕上输出信息).而vga bios里面的代码一般是for x86, 不能直接在mips CPU上运行.而且这些代码里常常有一些厂家相关的特定初始化, 没有一个通用的代码可以替换.只有少数比较开放的厂家提供足够的资料使得内核 开发人员能够跳过vga bios的执行直接初始化他的显卡,如matrox.

除此之外,也可能有其它的内核代码由于种种原因(不对齐访问,unsigned/signed 等)不能使用,如一些文件系统(xfs?).

关于linux-mips内核的问题,在sgi的mailing list搜索或者提问比较有希望获得

解决.如果你足够有钱,可以购买 montivista 的服务 .http://www.mvista.com .

--电子创新网--
粤ICP备12070055号