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.