想问一个关于操作系统实时模式切换到保护模式的问题,在哪个版块问啊

ggw007 2010-03-07 07:33:32

.MODEL SMALL
.386P
.STACK 800H
0000 .DATA

0008 DESC STRUC ; define descriptor structure

0000 0000 LIM_L DW 0
0002 0000 BAS_L DW 0
0004 00 BAS_M DB 0
0005 00 ACCESS DB 0
0006 00 LIM_M DB 0
0007 00 BAS_H DB 0

DESC ENDS

0068 TSS STRUC ; define TSS structure

0000 0000 BACK_L DW 0
0002 0000 DW 0
0004 00000000 ESP0 DD 0
0008 0000 SS0 DW 0
000A 0000 DW 0
000C 00000000 ESP1 DD 0
0010 0000 SS1 DW 0
0012 0000 DW 0
0014 00000000 ESP2 DD 0
0018 0000 SS2 DW 0
001A 0000 DW 0
001C 00000000 CCR3 DD 0
0020 00000000 EIP DD 0
0024 00000000 TFLAGS DD 0
0028 00000000 EEAX DD 0
002C 00000000 EECX DD 0
0030 00000000 EEDX DD 0
0034 00000000 EEBX DD 0
0038 00000000 EESP DD 0
003C 00000000 EEBP DD 0
0040 00000000 EEST DD 0
0044 00000000 EEDI DD 0
0048 0020 EES DW 20H
004A 0000 DW 0
004C 0018 ECS DW 18H
004E 0000 DW 0
0050 0020 ESS DW 20H
0052 0000 DW 0
0054 0020 EDS DW 20H
0056 0000 DW 0
0058 0020 EFS DW 20H
005A 0000 DW 0
005C 0020 EGS DW 20H
005E 0000 DW 0
0060 0000 ELDT DW 0
0062 0000 DW 0
0064 0000 DW 0
0066 0000 BITM DW 0

TSS ENDS

0000 0000 0000 TSS1 TSS <> ; task state 1
00000000
0000 0000 00000000
0000 0000 00000000
0000 0000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
0020 0000 0018
0000 0020 0000
0020 0000 0020
0000 0020 0000
0000 0000 0000
0000

0068 0000 0000 TSS2 TSS <> ; task state 2
00000000
0000 0000 00000000
0000 0000 00000000
0000 0000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
0020 0000 0018
0000 0020 0000
0020 0000 0020
0000 0020 0000
0000 0000 0000
0000

00D0 0040 [ IDT1 DD 64 DUP(?) ; space for 32 interrupt vectors
00000000
]

;
; Global descriptor table
;

01D0 0000 0000 00 GDT0 DESC <> ; clear null descripor
00 00 00
01D8 0000 0028 00 TG1 DESC <0, 28H, 0, 85H, 0, 0> ; task gate 1
85 00 00
01E0 0000 0030 00 TG2 DESC <0, 30H, 0, 85H, 0, 0> ; task gate 2
85 00 00
01E8 FFFF 0000 00 TCS DESC <-1, 0, 0, 9AH, 0CFH, 0> ; code segment (4G)
9A CF 00
01F0 FFFF 0000 00 DS1 DESC <-1, 0, 0, 92H, 0CFH, 0> ; data segment (4G)
92 CF 00
01F8 FFFF 0000 00 TS1 DESC <-1, 0, 0, 89H, 0CFH, 0> ; TSS1 available
89 CF 00
0200 FFFF 0000 00 TS2 DESC <-1, 0, 0, 89H, 0CFH, 0> ; TSS2 availble
89 CF 00
0208 2000 [ IOBP DB 2000H DUP(0) ; enable all I/O
00
]

;
; IDT table data
;

2208 00FF IDT DW 0FFH ; set limit to FFH
220A 00000000 IDTA DD 0

;
; GDT table data
;

220E 0017 GDT DW 17H ; set limit to 17H
2210 00000000 GDTA DD 0


0000 .CODE

MAK32 MACRO SEG, OFF ; make a seg + off a linear address
MOV EAX, 0
MOV EBX, 0
MOV AX, SEG
MOV BX, OFF
SHL EAX, 4
ADD EAX, EBX
ENDM

MAKD MACRO TSS, DES ; save base address
PUSH EAX
MOV EBX, 0
MOV BX, OFFSET TSS
ADD EAX, EBX
MOV DES.BAS_L, AX
SHR EAX, 16
MOV DES.BAS_M, AL
MOV DES.BAS_H, AH
POP EAX
ENDM


.STARTUP

MAK32 DS, OFFSET IDT1
0028 66| A3 220A R MOV IDTA, EAX ; save IDT address
MAK32 DS, OFFSET GDT0
0044 66| A3 2210 R MOV GDTA, EAX ; save GDT address

0048 B9 0020 MOV CX, 32
004B BF 00D0 R MOV DI, OFFSET IDT1
004E BE 0000 MOV SI, 0
0051 B8 0000 MOV AX, 0
0054 8E C0 MOV ES, AX


.REPEAT ; setup first 32 interrupt

MAK32 ES:[SI+2], ES:[SI]
0070 89 05 MOV [DI], AX
0072 66| C1 E8 10 SHR EAX, 16
0076 89 45 06 MOV [DI+6], AX
0079 C7 45 02 0008 MOV WORD PTR [DI+2], 8
007E C7 45 04 8F00 MOV WORD PTR [DI+4], 8F00H
0083 83 C7 08 ADD DI, 8
0086 83 C6 04 ADD SI, 4

.UNTILCXZ


008B B8 0208 R MOV AX, OFFSET IOBP ; setup I/O bit map
008E A3 0066 R MOV TSS1.BITM, AX
0091 A3 00CE R MOV TSS2.BITM, AX
MAK32 CS, OFFSET TASK1 ; get task1 address
00AC 66| A3 0088 R MOV TSS2.EIP, EAX ; save it in task2
MAKD TSS1, TS1
MAKD TSS2, TS2
00EC 0F 01 1E 2208 R LIDT WORD PTR IDT ; load IDT
00F1 0F 01 16 220E R LGDT FWORD PTR GDT ; load GDT

00F6 0F 20 C0 MOV EAX, CR0 ; set PE
00F9 66| 83 C8 01 OR EAX, 1
00FD 0F 22 C0 MOV CR0, EAX

0100 EB 00 JMP START ; near jump

0102 START:

0102 B8 0008 MOV AX, 8 ; address TSS1
0105 0F 00 D8 LTR AX
0108 B8 0010 MOV AX, 10H
010B FF E0 JMP AX


; now in protected mode at task1.

010D TASK1:


END


...全文
116 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggw007 2010-03-10
  • 打赏
  • 举报
回复
谢谢!
引用 10 楼 cnzdgs 的回复:
我已经很多年没写保护模式程序了,现在没有这方面的代码,你还是在网上搜索吧。
cnzdgs 2010-03-10
  • 打赏
  • 举报
回复
我已经很多年没写保护模式程序了,现在没有这方面的代码,你还是在网上搜索吧。
ggw007 2010-03-09
  • 打赏
  • 举报
回复
这是书上的代码,您那里有和这种方式类似的代码吗?正确的,贴出来我看看,刚看操作系统部分,想找点绝对正确的看一看

引用 6 楼 cnzdgs 的回复:
是不对,应该让eax=cs*10H。

这样用宏会降低代码的可读性,看起来比较累。
ggw007 2010-03-09
  • 打赏
  • 举报
回复
这个是操作系统的,不好调试
引用 7 楼 coding_hello 的回复:
感觉不是cs要不要左移的问题,MAKD之前EAX是task1的SEG:OFFSET,再加上TSS1的基地址,有点乱。

lz贴个全的代码吧,调试一下看看是咋弄的。
野男孩 2010-03-09
  • 打赏
  • 举报
回复
感觉不是cs要不要左移的问题,MAKD之前EAX是task1的SEG:OFFSET,再加上TSS1的基地址,有点乱。

lz贴个全的代码吧,调试一下看看是咋弄的。
cnzdgs 2010-03-09
  • 打赏
  • 举报
回复
是不对,应该让eax=cs*10H。

这样用宏会降低代码的可读性,看起来比较累。
ggw007 2010-03-08
  • 打赏
  • 举报
回复
你说的我也知道,不过我看代码有点问题,麻烦您再给看看

MAK32 CS, OFFSET TASK1 ; get task1 address
00AC 66| A3 0088 R MOV TSS2.EIP, EAX ; save it in task2

此时,EAX保存了任务TASK1的指令执行地址,可下面的代码中,MAKD宏把 EAX 和 TSS 的偏移地址相加做为 TSS 的基址,这样子正确吗?

MAKD TSS1, TS1
MAKD TSS2, TS2



引用 4 楼 cnzdgs 的回复:
前者是该任务的eip,告诉处理器该任务从哪里开始执行。后者是TSS对应的描述符,处理器要根据这个描述符来找到TSS。
cnzdgs 2010-03-07
  • 打赏
  • 举报
回复
前者是该任务的eip,告诉处理器该任务从哪里开始执行。后者是TSS对应的描述符,处理器要根据这个描述符来找到TSS。
WizardK 2010-03-07
  • 打赏
  • 举报
回复
开发语言->汇编语言
Abcix 2010-03-07
  • 打赏
  • 举报
回复
wo cao
ggw007 2010-03-07
  • 打赏
  • 举报
回复
上面的代码是实时模式转保护模式的代码,有个地方看不明白,请大虾们赐教

MAK32 CS, OFFSET TASK1 ; get task1 address
00AC 66| A3 0088 R MOV TSS2.EIP, EAX ; save it in task2
MAKD TSS1, TS1
MAKD TSS2, TS2

上面的代码有点看不懂,
MAK32 CS, OFFSET TASK1
取得了TASK1的开始地址,保存在TSS2.EIP了,可下面的代码
MAKD TSS1, TS1 又把这个地址与TSS的起始地址相加,做为基址,这是什么意思啊?!

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧