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.