第5章MIPS-Linux Kernel分析(1)

来源:http://blog.21ic.com/user1/3368/archives/2007/33724.html
Mips kernel Introduction
  
  
 
  
  
1.硬件知识
  
  
 * CPU 手册: http://www.mips.com.
  
  
 * 主板资料,找你的卖家.
  
  
 * 背景知识:PCI协议,中断概念等.
  
  
 
  
  
2.软件资源
  
  
 
  
  
 * http://oss.sgi.com/linux,ftp://oss.sgi.com
  
  
 * http://www.mips.com
  
  
 * mailing lists: 
  
  
    linux-mips@oss.sgi.com
  
  
    debian-mips@oss.sgi.com
  
  
 * kernel cvs
  
  
   sgi:
  
  
     cvs -d :pserver:cvs@oss.sgi.com:/cvs login 
  
  
    (Only needed the first time you use anonymous CVS, the password is "cvs") 
  
  
     cvs -d :pserver:cvs@oss.sgi.com:/cvs co linux
  
  
   另外sourceforge.net也有另一个内核树,似乎不如sgi的版本有影响.
  
  
 * 经典书籍: 
  
  
      * "Mips R4000 Microprocessor User's Manual",by Joe Heinrich
  
  
      * "See Mips Run",by Dominic Sweetman
  
  
 * Jun Sun's mips porting guide: http://linux.junsun.net/porting-howto/
  
  
 * 交叉编译指南:http://www.ltc.com/~brad/mips/mips-cross-toolchain.html
  
  
 * Debian Mips port: http://www.debian.org/ports/mips
  
  
 * 系统杂志网站: http://www.xtrj.org
  
  
 
  
  
3. mips kernel的一般介绍
  
  
 
  
  
  (下面一些具体代码基于2.4.8的内核)
  
  
   我们来跟随内核启动运行的过程看看mips内核有什么特别之处.
  
  
 
  
  
   加电后,mips kernel从系统固件程序(类似bios,可能烧在eprom,flash)得到控制
  
  
   之后(head.S),初始化内核栈,调用init_arch初始化硬件平台相关的代码.
  
  
 
  
  
   init_arch(setup.c)首先监测使用的CPU(通过MIPS CPUCP0控制寄存器PRID)
  
  
  确定使用的指令集和一些CPU参数,TLB大小等.然后调用prom_init做一些底层
  
  
  参数初始化. prom_init是和具体的硬件相关的.
  
  
 
  
  
   使用MIPS CPU的平台多如牛毛, 所以大家在arch/mips下面可以看到很多的子目录,
  
  
   每个子目录是一个或者一系列相似的平台.这里的平台差不多可以理解成一块主板
  
  
   加上它的系统固件,其中很多还包括一些专用的显卡什么的硬件(比如一些工作站).
  
  
   这些目录的主要任务是:
  
  
     1. 提供底层板子上的一些重要信息,包括系统固件传递的参数,io的映射基地址
  
  
       ,内存的大小的分布等.多数还包括提供早期的信息输入输出接口(通常是一个
  
  
       简单的串口驱动)以方便调试,因为pmon往往不提供键盘和显示卡的支持.?
  
  
     2. 底层中断代码,包括中断控制器编程和中断的分派,应答等
  
  
     3. pci子系统底层代码. 实现pci配置空间的读写,以及pci设备的中断,IO/Mem
  
  
        空间的分配
  
  
     4. 其它,特定的硬件.常见的有实时时钟等
  
  
     
  
  
 
  
  
   这里关键是要理解这些硬件平台和熟悉的x86不同之处.我印象较深的有几个:
  
  
      * item MIPS不象X86有很标准的硬件软件接口,而是五花八门,每个厂家
  
  
        有一套,因为它们很多是嵌入式系统或者专门的工作站.不象PC,有了
  
  
        BIOS后用同一套的程序,就可以使用很多不同的主板和CPU.
  
  
 
  
  
          MIPS中的'bios'常用的有pmonyamon,都是开放源代码的软件。
  
  
        很多开发板带的固件功能和PC BIOS很不一样,它们多数支持串口显示,
  
  
        或者网络下载和启动,以及类DEBUG的调试界面,但可能根本不支持显卡和
  
  
        硬盘,没有一般的基本'输入输出'功能.
  
  
      * PCI系统和地址空间,总线等问题.
  
  
          x86,IO空间用专门的指令访问,PCI设备的内存空间和物理内存
  
  
        空间是相同的,也就是说,CPU看来物理内存从地址0开始的话,PCI设备
  
  
        看来也是一样的.反之,PCI设备的基地址寄存器设定的PCI存储地址,CPU
  
  
        相同的物理地址访问就行了.
  
  
 
  
  
          而在MIPS中就很不一样了,IO一般是memory map,map到哪里就倚赖具体
  
  
        平台了.PCI设备的地址空间和CPU所见的物理内存地址空间往往也不一样
  
  
        (bus address & physical address).所以mips kerneliob/outb,以及
  
  
        bus_to_virt/virt_to_bus,phys_to_virt/virt_to_phys,ioremap等就
  
  
        要小心考虑.这些问题有时间我会对这些问题做专门的说明.
  
  
 
  
  
        PCI配置空间的读写和地址空间映射的处理通常都是每个平台不一样的.
  
  
        因为缺乏统一接口的BIOS,内核经常要自己做PCI设备的枚举,空间分配,
  
  
        中断分配.
  
  
 
  
  
      * 中断系统.
  
  
         PC中中断控制器先是有8259,后来是apic,cpu的中断处理386之后好像
  
  
         也变化不大,相对统一.
  
  
         mips CPU的中断处理方式倒是比较一致,但是主板上的控制器就乱七八糟了
  
  
         怎么鉴别中断源,怎么编程控制器等任务就得各自实现了.
  
  
         总的说来,MIPS CPU的中断处理方式体现了RISC的特点:软件做事多,硬件尽量
  
  
         精简. 编程控制器,提供中断控制接口,dispatch中系?这一部分原来很混乱,
  
  
         大家各写各的,现在有人试图写一些比较统一的代码(实际上就是原来x86
  
  
         用的controller/handler 抽象).
  
  
 
  
  
      * 存储管理.
  
  
         MIPS 是典型的RISC结构,它的存储管理单元做的事情比象x86这种机器少得多.
  
  
         例如,它的tlb是软件管理的,cache常常是需要系统程序干预的.而且,过多的
  
  
         CPU和主板变种使得这一部分非常复杂,容易出错.存储管理的代码主要在include/
  
  
         asm-mipsarch/mips/mm/目录下.
  
  
      * 其它.
  
  
          如时间处理,r4k以上的MIPS CPU提供count/compare寄存器,每隔几拍count增加,          到和compare相等时发生时钟中断,这可以用来提供系统的时钟中断.但很多板子
  
  
          自己也提供其它的可编程时钟源.具体用什么就取决于开发者了.
  
  
 
  
  
    init_arch后是loadmmu,初始化cache/tlb.代码在arch/mips/mm.有人可能会问,
  
  
    cachetlb之前CPU怎么工作的?
  
  
      x86里有实模式,MIPS没有,但它的地址空间是特殊的,分成几个不同的区域,
  
  
      每个区域中的地址在CPU里的待遇是不一样的,系统刚上电时CPU从地址bfc00000
  
  
      开始,那里的地址既不用tlb<span lang=ZH-CN style='font-family:SimSun;
mso-ascii-font-family:"Courier New";mso-hansi-font-fa
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值