Linux Kernel (v 0.11)源代码解读-setup.s

 

Study Linux Kernel Notes(v 0.11)          Shawn.Xie
                                          Shawshie@msn.com
                                                       

2  Setup.s

 

 2.1  Setup 程序读取并保留的参数

    ----------------------------------------------------------------------------
     内存地址 长度(字节) 名称描述
    ----------------------------------------------------------------------------
     0x90000   2       光标位置列号(0x00-最左端),行号(0x00-最顶端)
     0x90002   2       扩展内存数系统从1M 开始的扩展内存数值(KB)。
     0x90004   2       显示页面当前显示页面
     0x90006   1       显示模式
     0x90007   1       字符列数
     0x90008   2       ??
     0x9000A   1       显示内存显示内存(0x00-64k,0x01-128k,0x02-192k,0x03=256k)
     0x9000B   1       显示状态0x00-彩色,I/O=0x3dX;0x11-单色,I/O=0x3bX
     0x9000C   2       特性参数显示卡特性参数
     0x90080   16      硬盘参数表第1 个硬盘的参数表
     0x90090   16      硬盘参数表第2 个硬盘的参数表(如果没有,则清零)
     0x901FC   2       根设备号根文件系统所在的设备号(bootsec.s 中设置)
    ----------------------------------------------------------------------------

2.2  Setup Sequence

   1. Read and Save the above paremeters.

   2. Move the memory from 0x0001 0000 - 0x0009 0000 to 0x0000 0000 - 0x0008 0000

      RAM                                                        RAM
        ~ ~ ~ ~ ~ ~ ~ ~                                            ~ ~ ~ ~ ~ ~ ~ ~
      |                 |                                        |                 |
      +                 + 0x0009 ff00                            +                 + 0x0009 ff00
      |                 |                                        |                 |
      |                 |                                        |                 |
      |                 |                                        |                 |
      |                 |                                        |                 |
      +-----------------+                                        +-----------------+
      |     Setup       |                                        |     Setup       |
      |     Module      | ## (3) run here ##                     |     Module      | ## (3) run here ##
      +-----------------+ 0x0009 0200                            +-----------------+ 0x0009 0200
      |                 | ## (2) run here ##                     | Systerm Para    |
      +-----------------+ 0x0009 0000 (INITSEG 0x9000 576KB)-    +-----------------+ 0x0009 0000 (INITSEG 0x9000 576KB)
      |                 |                                    -   |                 |
      |                 |                                     -  |                 |
      +-----------------+ 0x0004 0000 (ENDSEG 0x4000 256KB)    - +-----------------+  0x0008 0000
      |    System       |                                        |                 |
      |    Module       |                                        |                 |
      +-----------------+ 0x0001 0000 (SYSSEG 0x1000 64KB) -     +-----------------+
      |                 |                                        |                 |
      +-----------------+ 0x0000 7E00                       -    +-----------------+
      |                 | ## (1) run here ##                     |                 |
      +-----------------+ 0x0000 7C00 (BOOTSEG 0x7C0 31KB)   -   +-----------------+  0x0003 0000
      |                 |                                        |     System      |
      |                 |                                     -  |     Module      |
      +-----------------+                                      - +-----------------+  0x0000 0000

   3. Load GDT and IDT

      GDTR
       47               16 15     0
      +-------------------+--------+
      | GDT base address  | Limit  |
      +-------------------+--------+

      GDT base address : 0x0009 0200 + &GDT
      Limit            : 0x800                 (2048Byte, total 256 GDT Entry)

      GDT Entry Format :
      63               48 47    40 39                    16 15               0
      +------------------+--------+------------------------+-----------------+
      |       Resv       |Seg Attr| Segment Base Address   |  Segment Length |
      +------------------+--------+------------------------+-----------------+

      address
  0x00090200+&GDT      0   0       0x0000                   0      (零描述符)
  0x00090208+&GDT     C0  9A       0x0000                   0x07FF
  0x00090210+&GDT     C0  92       0x0000                   0x07FF

       Text Segment:
       0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
       0      ! base address=0
       9A     ! code read/exec
       C0     ! granularity=4096, 386

       Data Segment:
       0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
       0      ! base address=0
       92     ! data read/write
       C0     ! granularity=4096, 386

       IDT
       0      ! idt limit=0
       0,0    ! idt base=0L


       RAM
         ~ ~ ~ ~ ~ ~ ~ ~
       |                 |
       +                 + 0x0009 ff00
       |                 |
       +-----------------+
       |   数据段描述符  |
       +-----------------+ 0x00090210+&GDT
       |   代码段描述符  |
       +-----------------+ 0x00090208+&GDT
       |   零描述符      |
       +-----------------+ 0x00090200+&GDT
       |     Setup       |
       |     Module      | ## (3) run here ##
       +-----------------+ 0x0009 0200
       | Systerm Para    |
       +-----------------+ 0x0009 0000 (INITSEG 0x9000 576KB)
       |                 |
       |                 |


   4. A20

      --------------------------------------------------------------------------
       由于在机器启动时,默认条件下,A20 地址线是禁止的,所以操作系统必须使用适
       当的方法来开启它。  但是由于各种兼容机所使用的芯片集不同,要做到这一点却
       是非常的麻烦。因此通常要在几种控制方法中对A20 信号线进行控制的常用方法是
       通过设置键盘控制器的端口值。

       这里的setup.s 程序(138-144 行)即使用了这种典型的控制方式。对于其它一些
       兼容微机还可以使用其它方式来做到对A20 线的控制。
      --------------------------------------------------------------------------

   5. Reprogram 8259-A and 8259-B to set interrupt.

      0x20 ~ 0x35  external interrupts
      0x00 ~ 0x1f  trap interrupts

   6. Set MSW.PE = 1, enter protected mode.

   7. Jump CS to execute the head procedure.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值