Linux Kernel (v 0.11)源代碼解讀-setup.s

 

Study Linux Kernel Notes(v 0.11)          Shawn.Xie
                                          [email protected]
                                                       

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章