際際滷

際際滷Share a Scribd company logo
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
1
竜旅劉侶竜 僚龍侶流両侶亮竜凌 虜竜留了侶龍虜ホ
留龍慮略旅竜侶留凌 Protected Mode 龍侶僚 DosBox
龍侶僚 虜略龍竜虜留
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留龍侶劉
裡亮亮竜侶劉凌僚侶竜:
 裡慮両竜竜侶凌 竜虜流侶両侶僚凌, 7380
 留留隆僚旅僚凌 竜ホ称確稽塾 略両侶僚凌, 7356
両略亮侶僚凌: 9o
虜留隆侶亮留旅虜 侶凌: 2013-2014
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
2
裡虜凌
 隆僚慮侶虜流 侶了 留両留慮略侶 竜両侶竜虜略侶了 龍侶僚 DOSBOX:
1. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 侶凌 溜隆旅凌 privilege level (龍侶凌 留略隆竜旅粒亮留
虜留旅 侶留 隆凌 亮侶隆劉僚).
2. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 侶了侶竜凌 privilege level (龍侶凌
留略隆竜旅粒亮留 留 亮侶隆劉僚 龍竜 侶溜留).
3. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 留亮侶了侶竜凌 privilege level (龍侶凌
留略隆竜旅粒亮留 留 侶溜留 龍竜 亮侶隆劉僚).
4. 竜侶留慮凌略 Data Segment 龍竜 Code Segment.
5. 竜侶留慮凌略 Code Segment 龍竜 Data Segment.
6. 竜侶留慮凌略 龍竜 龍侶亮竜溜凌 凌 竜硫留溜僚竜旅 侶凌 limit 竜僚 Code Segment.
7. 竜侶留慮凌略 龍竜 龍侶亮竜溜凌 凌 竜硫留溜僚竜旅 侶凌 limit 竜僚 Data Segment.
8. 竜侶略硫留龍侶 亮劉龍 Call Gate 龍竜 留亮侶了侶竜凌 privilege level.
9. 了竜粒凌 隆僚留侶侶侶侶留 竜虜侶劉了竜龍侶 凌龍侶留侶竜亮劉僚僚 竜僚侶凌了ホ 留 privilege level 3.
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
3
律侶龍旅亮凌凌旅凌亮竜僚留 粒留了竜溜留
 DOSBOX
 Notepad ++
 Intel Manual 386
1. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 侶凌 溜隆旅凌 privilege level (龍侶凌
留略隆竜旅粒亮留 虜留旅 侶留 隆凌 亮侶隆劉僚).
竜虜侶僚両粒流龍留虜竜 劉了留 Code Selector Test (CODE_SEL_TEST) 慮留侶 侶僚了 留了侶溜龍侶僚侶僚
Descriptor 僚侶 僚僚溜僚侶 竜溜了留侶 慮旅ホ士塾 侶僚 CODE_SEL 慮留侶 侶僚 code_sel_descr 劉侶龍侶 ホ粁稽 了留
虜竜侶留硫僚虜竜 留 privilege level 0 侶僚 CODE_SEL 龍侶僚 僚僚溜僚 竜溜虜留龍侶竜 龍侶僚 privilege level 0
侶僚 CODE_SEL_TEST. 侶留 了留 竜慮侶竜旅劉龍僚虜竜 留侶 侶僚 竜両ホ稽砧採 硫略旅留虜竜 侶竜了 竜了侶僚旅流:
call CODE_SEL_TEST:task2
裡虜慮了留 虜竜 侶僚 6.3.3 侶僚 manual 竜 虜竜侶留慮僚両略 竜旅劉粒僚 虜竜侶留亮 2 code segment 虜竜 溜隆侶僚
privilege level 竜溜了留侶 竜侶侶両竜侶流 慮留侶 侶僚 両粒両留虜虜留 劉侶両竜亮竜 慮留了僚了侶慮略 凌 留了留虜竜了侶留了.
里留 CODE_SEL_TEST 慮留侶 code_descr_test 僚両溜隆僚了侶留侶 龍侶僚 留両竜溜僚 gdt.asm 凌
竜亮流凌:
CODE_SEL_TEST equ $-gdt_start
code_descr_test: istruc seg_descriptor
at limit0_15, dw 0xFFFF ; limit 0:15
at base0_15, dw 0 ; base 0:15
at base16_23, db 0 ; base 16:23
at type_dpl, db 0x9B ; 1 00 1 001 1 = present + DPL=0 +
code_segment_descr + C=0 + Read + not_active
at limit16_19,db 0xCF ; 1 1 00 1111 = Granularity + 32bit code + limit
16:19
at base24_31, db 0 ; base 24:31
; base = 0x0, limit = 0xFFFFFFFF
iend
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
4
陸侶侶略了僚虜竜 侶僚 base address 龍侶僚 留両竜溜僚 stdlib.asm 凌 竜亮流凌:
; Update Code Descriptor base address field
push eax
push word code_descr_test
call initialize_descriptor_base
add sp, 6
2. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 侶了侶竜凌 privilege level (龍侶凌
留略隆竜旅粒亮留 留 亮侶隆劉僚 龍竜 侶溜留).
竜虜侶僚両粒流龍留虜竜 劉了留 CODE_SEL_TS1 慮留侶 侶僚了 留了侶溜龍侶僚侶僚 Descriptor 僚侶 僚僚溜僚侶
竜溜了留侶 慮旅ホ士塾 侶僚 CODE_SEL 慮留侶 侶僚 code_sel_descr 虜竜 privilege level 3 劉侶龍侶 ホ粁稽 了留
虜竜侶留硫僚虜竜 留 privilege level 0 侶僚 CODE_SEL 龍侶僚 僚僚溜僚 竜溜虜留龍侶竜 龍侶僚 privilege level 3
侶僚 CODE_SEL_TS1. 侶留 了留 竜慮侶竜旅劉龍僚虜竜 留侶 侶僚 竜両ホ稽砧採 硫略旅留虜竜 侶竜了 竜了侶僚旅流:
call CODE_SEL_TS1:task2
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.3 粒侶留 Conforming Bit 0, 竜竜侶隆流 侶僚 DPL (3) 隆竜了 竜溜了留侶
溜龍僚 虜竜 侶僚 CPL (0), 慮留了僚了侶慮略 劉両竜竜 侶僚 両粒両留虜虜留 了留 虜竜了 侶両劉亮竜侶. 立龍侶龍僚 侶僚 DOSBOX
両僚慮留了ホ 隆竜了 慮略了竜侶 Privilege Level Checking 僚侶竜 侶僚 両粒両留虜虜留 劉侶両竜亮竜.
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.3 粒侶留 Conforming Bit 1, 竜竜侶隆流 侶僚 DPL (3) 隆竜了 竜溜了留侶
虜侶慮両侶竜両僚 流 溜龍僚 侶僚 CPL (0), 慮留了僚了侶慮略 劉両竜竜 侶僚 両粒両留虜虜留 了留 虜竜了 侶両劉亮竜侶. 立龍侶龍僚 侶僚
DOSBOX 両僚慮留了ホ 隆竜了 慮略了竜侶 Privilege Level Checking 僚侶竜 侶僚 両粒両留虜虜留 劉侶両竜亮竜.
里留 CODE_SEL_T1 慮留侶 code_descr_TS1 僚両溜隆僚了侶留侶 龍侶僚 留両竜溜僚 gdt.asm 凌 竜亮流凌:
; The code selector and code descriptor of the task1 with privilege level 3
CODE_SEL_TS1 equ $-gdt_start
code_descr_TS1: istruc seg_descriptor
at limit0_15, dw 0xFFFF ; limit 0:15
at base0_15, dw 0 ; base 0:15
at base16_23, db 0 ; base 16:23
at type_dpl, db 0xFB ; 1 11 1 101 1 = present + DPL=3 +
code_segment_descr + C=0 + Read + not_active
at limit16_19,db 0xCF ; 1 1 00 1111 = Granularity + 32bit code + limit
16:19
at base24_31, db 0 ; base 24:31
; base = 0x0, limit = 0xFFFFFFFF
iend
; Update Code Descriptor base address field
; Update Code Descriptor TS1 base address field
push eax
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
5
push word code_descr_TS1
call initialize_descriptor_base
add sp, 6
3. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 留亮侶了侶竜凌 privilege level (龍侶凌
留略隆竜旅粒亮留 留 侶溜留 龍竜 亮侶隆劉僚).
両侶慮略, 竜粒留溜了僚虜竜 虜劉龍 iret 龍侶僚 task1, 侶僚 僚僚溜僚 竜慮侶竜旅竜溜 侶僚 CODE_SEL_TS1 侶僚
僚僚溜僚 劉竜侶 Privilege Level 3.  竜慮竜溜 龍劉旅僚虜竜 了留 略虜竜 龍侶僚 CODE_SEL 虜竜 Privilege
Level 0 虜劉龍 侶竜凌 竜了侶僚旅流凌:
call CODE_SEL:task2
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.3 侶僚 manual 粒侶留 Conforming Bit 0, 竜竜侶隆流 侶僚 DPL
(0) 隆竜了 竜溜了留侶 溜龍僚 虜竜 侶僚 CPL (3), 慮留了僚了侶慮略 劉両竜竜 侶僚 両粒両留虜虜留 了留 虜竜了 侶両劉亮竜侶. 立龍侶龍僚
侶僚 DOSBOX 両僚慮留了ホ 隆竜了 慮略了竜侶 Privilege Level Checking 僚侶竜 侶僚 両粒両留虜虜留
劉侶両竜亮竜.
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.3 侶僚 manual 粒侶留 Conforming Bit 1, 竜竜侶隆流 侶僚 DPL
(0) 竜溜了留侶 虜侶慮両侶竜両僚 流 溜龍僚 侶僚 CPL (3), 慮留了僚了侶慮略 劉両竜竜 侶僚 両粒両留虜虜留 了留 侶両劉亮竜侶, 凌
慮留侶 劉粒侶了竜.
4. 竜侶留慮凌略 Data Segment 龍竜 Code Segment.
両僚龍留龍僚虜竜 了留 虜竜侶留慮侶了流龍僚虜竜 侶僚 DATA_SEL 龍侶僚了 CS 侶僚 両僚粒両略虜虜留侶僚凌
虜劉龍 侶了 竜了侶僚旅ホ:
call DATA_SEL:0
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.1.1 侶僚 manual 竜 虜竜侶留慮溜了竜龍竜 留侶流 竜溜了留侶 虜竜
竜侶侶両竜侶流 隆侶侶侶 隆竜了 虜僚両僚虜竜 了留 硫略旅僚虜竜 Data Selector 龍侶僚 CS. 里僚 DOSBOX 硫粒略隆竜侶
虜流了虜留: CALL:Descriptor type b unsupported.
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
6
5. 竜侶留慮凌略 Code Segment 龍竜 Data Segment.
両僚龍留龍僚虜竜 了留 虜竜侶留慮侶了流龍僚虜竜 侶僚 CODE_SEL 龍侶僚了 DS 侶僚 両僚粒両略虜虜留侶僚凌
虜劉龍 侶了 竜了侶僚旅ホ:
mov ax, CODE_SEL
mov ds, ax
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.1.1 侶僚 manual 虜侶留 侶劉侶僚侶留 虜竜侶留慮溜了竜龍竜 隆竜了
留留粒僚両竜竜侶留侶 粒侶 留侶 慮留侶 侶僚 DOSBOX 隆竜了 虜留凌 劉硫粒留旅竜 侶劉侶僚侶僚 両硫旅竜虜留.
6. 竜侶留慮凌略 龍竜 龍侶亮竜溜凌 凌 竜硫留溜僚竜旅 侶凌 limit 竜僚 Code Segment.
陸侶侶略亮留虜竜 侶僚 CODE_SEL_LIMIT 凌 慮旅了僚 侶僚 CODE_SEL 慮留侶 侶僚 call_descr_limit
凌 慮旅了僚 侶僚 call_descr 虜竜 虜了竜 隆侶留慮僚両略 侶侶 侶僚 call_descr_limit 劉竜侶 limit 0 粒侶留 了留
隆僚慮侶虜略龍僚虜竜 侶僚 Limit Checking 虜劉龍 侶了 竜了侶僚旅ホ:
call CODE_SEL_LIMIT:0xffff
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.1.2 侶僚 manual 虜侶留 侶劉侶僚侶留 虜竜侶留慮僚両略 竜旅劉粒僚 隆竜了
竜溜了留侶 竜侶侶両竜侶流 隆侶侶侶 侶僚 limit 虜留凌 竜溜了留侶 虜竜隆劉了 慮留侶 侶僚 offset 隆侶略慮僚両僚 侶僚 虜竜隆竜了凌. 立龍侶龍僚
侶僚 DOSBOX 隆竜 隆劉龍竜慮竜 慮留了 侶竜 虜竜侶留慮溜了竜龍竜 硫粒略隆僚了侶留凌 侶僚 虜流了虜留: CALL:Descriptor type
b unsupported.
里留 CODE_SEL_LIMIT 慮留侶 code_descr_limit 僚両溜隆僚了侶留侶 龍侶僚 留両竜溜僚 gdt.asm 凌
竜亮流凌:
CODE_SEL_LIMIT equ $-gdt_start
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
7
code_descr_limit: istruc seg_descriptor
at limit0_15, dw 0x0 ; limit 0:15
at base0_15, dw 0 ; base 0:15
at base16_23, db 0 ; base 16:23
at type_dpl, db 0x9B ; 1 00 1 001 1 = present + DPL=0 +
code_segment_descr + C=0 + Read + not_active
at limit16_19,db 0x0 ; 1 1 00 1111 = Granularity + 32bit code + limit
16:19
at base24_31, db 0 ; base 24:31
; base = 0x0, limit = 0x0
iend
7. 竜侶留慮凌略 龍竜 龍侶亮竜溜凌 凌 竜硫留溜僚竜旅 侶凌 limit 竜僚 Data Segment.
陸侶侶略亮留虜竜 侶僚 DATA_SEL_LIMIT 凌 慮旅了僚 侶僚 DATA_SEL 慮留侶 侶僚 data_descr_limit
凌 慮旅了僚 侶僚 data_descr 虜竜 虜了竜 隆侶留慮僚両略 侶侶 侶僚 data_descr_limit 劉竜侶 limit 0, 劉侶龍侶 ホ粁稽
了留 隆僚慮侶虜略龍僚虜竜 侶僚 Limit Checking 虜劉龍 侶了 竜了侶僚旅ホ:
mov word ax, DATA_SEL_LIMIT
mov ds, ax
mov ax, vidmem_start
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.1.2 侶僚 manual 虜侶留 侶劉侶僚侶留 虜竜侶留慮僚両略 竜旅劉粒僚 隆竜了
竜溜了留侶 竜侶侶両竜侶流 隆侶侶侶 侶僚 limit 虜留凌 竜溜了留侶 虜竜隆劉了 慮留侶 侶僚 offset 隆侶略慮僚両僚 侶僚 虜竜隆竜了凌. 立龍侶龍僚
侶僚 両粒両留虜虜留 劉侶両竜亮竜 慮留了僚了侶慮略 略両留 両僚慮留了ホ 侶僚 DOSBOX 隆竜了 慮略了竜侶 Limit Checking.
里留 CODE_SEL_LIMIT 慮留侶 code_descr_limit 僚両溜隆僚了侶留侶 龍侶僚 留両竜溜僚 gdt.asm 凌
竜亮流凌:
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
8
DATA_SEL_LIMIT equ $-gdt_start
data_descr_limit: istruc seg_descriptor
at limit0_15, dw 0x0 ; limit 0:15
at base0_15, dw 0 ; base 0:15
at base16_23, db 0 ; base 16:23
at type_dpl, db 0x92 ; 1 00 1 101 0 = present + DPL=0 +
data_segment_descr + E=0 + RW + not_active
at limit16_19,db 0x0 ; 1 1 00 1111 = Granularity + Big + limit 16:19
at base24_31, db 0 ; base 24:31
; base = 0x0, limit = 0xFFFFFFFF
iend
8. 竜侶略硫留龍侶 亮劉龍 Call Gate 龍竜 留亮侶了侶竜凌 privilege level.
陸侶侶略亮留虜竜 劉了留 Call gate 虜竜 DPL 3 ホ粁稽 了留 虜竜侶留硫僚虜竜 留 Privilege Level 3 龍竜
Privilege Level 0. 竜侶留硫流慮留虜竜 龍侶僚 task1 虜劉龍 iret 慮留侶 虜竜侶略 龍劉旅留虜竜 了留 慮略了僚虜竜 侶竜
虜竜侶留慮僚両略 虜劉龍 侶竜凌 竜了侶僚旅流凌:
call CALL_GATE_SEL:0
裡虜慮了留 虜竜 侶僚 6.3.4 侶慮留了僚僚侶僚了侶留侶 僚侶 両僚僚龍劉龍竜侶凌, 龍侶龍僚 侶僚 両粒両留虜虜留 隆竜了
劉侶両竜亮竜 龍侶僚 DOSBOX 慮留侶 劉硫粒留旅竜 虜流了虜留: CALL:GATE:SS: no writable data segment.
To Call Gate 侶僚 僚両溜隆僚虜竜 龍侶僚 留両竜溜僚 gdt.asm 凌 竜亮流凌:
; The call gate selector and descriptor
CALL_GATE_SEL equ $-gdt_start
call_gate_descr: istruc call_gate_descriptor
at offset0_15, dw 0
at selector, dw 0
at dword_count, db 0
at p_type_dpl, db 0xEC ; 隆 僚両溜龍留虜竜 DPL=3
at offset16_31, dw 0
iend
里僚 selector 慮留侶 侶僚 offset 侶僚 call gate descriptor 侶留 慮侶侶略了僚虜竜 龍侶僚 留両竜溜僚
stdlib.asm 凌 竜亮流凌:
; Update the selector of the call gate with the CODE_SEL
mov word [call_gate_descr+2], CODE_SEL;
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
9
; Update the offsets of the call gate with the address of task2
push eax
mov eax, task1
mov word [call_gate_descr], ax;
shr eax, 16
mov word [call_gate_descr+6], ax;
9. 了竜粒凌 隆僚留侶侶侶侶留 竜虜侶劉了竜龍侶 凌龍侶留侶竜亮劉僚僚 竜僚侶凌了ホ 留 privilege
level 3.
竜侶留硫留溜了僚虜竜 虜竜 iret 龍侶僚 task1 慮留侶 留 竜慮竜溜 (竜了 竜溜虜留龍侶竜 龍竜 CPL 3)
両僚龍留龍僚虜竜 了留 竜慮侶竜旅劉龍僚虜竜 侶竜了 両僚龍侶留侶竜虜劉了竜 竜了侶僚旅流:
hlt
裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.5.1 竜 竜了侶僚旅流 留侶流 隆竜了 虜僚両竜溜 了留 竜慮侶竜旅竜龍侶竜溜 隆侶侶侶
留留侶侶竜溜 侶僚 CPL 了留 竜溜了留侶 虜竜隆劉了. 里僚 DOSBOX 慮両留龍略両竜侶 留慮僚 硫粒略旅竜侶 侶僚 虜流了虜留 Exit to
error: INT: Inner level: Stack segment not writable.
留僚竜旅流亮旅凌 留ホ
里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ
里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ
凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉
10

More Related Content

Protected Mode security mechanisms support in DosBox

  • 1. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 1 竜旅劉侶竜 僚龍侶流両侶亮竜凌 虜竜留了侶龍虜ホ 留龍慮略旅竜侶留凌 Protected Mode 龍侶僚 DosBox 龍侶僚 虜略龍竜虜留 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留龍侶劉 裡亮亮竜侶劉凌僚侶竜: 裡慮両竜竜侶凌 竜虜流侶両侶僚凌, 7380 留留隆僚旅僚凌 竜ホ称確稽塾 略両侶僚凌, 7356 両略亮侶僚凌: 9o 虜留隆侶亮留旅虜 侶凌: 2013-2014
  • 2. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 2 裡虜凌 隆僚慮侶虜流 侶了 留両留慮略侶 竜両侶竜虜略侶了 龍侶僚 DOSBOX: 1. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 侶凌 溜隆旅凌 privilege level (龍侶凌 留略隆竜旅粒亮留 虜留旅 侶留 隆凌 亮侶隆劉僚). 2. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 侶了侶竜凌 privilege level (龍侶凌 留略隆竜旅粒亮留 留 亮侶隆劉僚 龍竜 侶溜留). 3. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 留亮侶了侶竜凌 privilege level (龍侶凌 留略隆竜旅粒亮留 留 侶溜留 龍竜 亮侶隆劉僚). 4. 竜侶留慮凌略 Data Segment 龍竜 Code Segment. 5. 竜侶留慮凌略 Code Segment 龍竜 Data Segment. 6. 竜侶留慮凌略 龍竜 龍侶亮竜溜凌 凌 竜硫留溜僚竜旅 侶凌 limit 竜僚 Code Segment. 7. 竜侶留慮凌略 龍竜 龍侶亮竜溜凌 凌 竜硫留溜僚竜旅 侶凌 limit 竜僚 Data Segment. 8. 竜侶略硫留龍侶 亮劉龍 Call Gate 龍竜 留亮侶了侶竜凌 privilege level. 9. 了竜粒凌 隆僚留侶侶侶侶留 竜虜侶劉了竜龍侶 凌龍侶留侶竜亮劉僚僚 竜僚侶凌了ホ 留 privilege level 3.
  • 3. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 3 律侶龍旅亮凌凌旅凌亮竜僚留 粒留了竜溜留 DOSBOX Notepad ++ Intel Manual 386 1. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 侶凌 溜隆旅凌 privilege level (龍侶凌 留略隆竜旅粒亮留 虜留旅 侶留 隆凌 亮侶隆劉僚). 竜虜侶僚両粒流龍留虜竜 劉了留 Code Selector Test (CODE_SEL_TEST) 慮留侶 侶僚了 留了侶溜龍侶僚侶僚 Descriptor 僚侶 僚僚溜僚侶 竜溜了留侶 慮旅ホ士塾 侶僚 CODE_SEL 慮留侶 侶僚 code_sel_descr 劉侶龍侶 ホ粁稽 了留 虜竜侶留硫僚虜竜 留 privilege level 0 侶僚 CODE_SEL 龍侶僚 僚僚溜僚 竜溜虜留龍侶竜 龍侶僚 privilege level 0 侶僚 CODE_SEL_TEST. 侶留 了留 竜慮侶竜旅劉龍僚虜竜 留侶 侶僚 竜両ホ稽砧採 硫略旅留虜竜 侶竜了 竜了侶僚旅流: call CODE_SEL_TEST:task2 裡虜慮了留 虜竜 侶僚 6.3.3 侶僚 manual 竜 虜竜侶留慮僚両略 竜旅劉粒僚 虜竜侶留亮 2 code segment 虜竜 溜隆侶僚 privilege level 竜溜了留侶 竜侶侶両竜侶流 慮留侶 侶僚 両粒両留虜虜留 劉侶両竜亮竜 慮留了僚了侶慮略 凌 留了留虜竜了侶留了. 里留 CODE_SEL_TEST 慮留侶 code_descr_test 僚両溜隆僚了侶留侶 龍侶僚 留両竜溜僚 gdt.asm 凌 竜亮流凌: CODE_SEL_TEST equ $-gdt_start code_descr_test: istruc seg_descriptor at limit0_15, dw 0xFFFF ; limit 0:15 at base0_15, dw 0 ; base 0:15 at base16_23, db 0 ; base 16:23 at type_dpl, db 0x9B ; 1 00 1 001 1 = present + DPL=0 + code_segment_descr + C=0 + Read + not_active at limit16_19,db 0xCF ; 1 1 00 1111 = Granularity + 32bit code + limit 16:19 at base24_31, db 0 ; base 24:31 ; base = 0x0, limit = 0xFFFFFFFF iend
  • 4. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 4 陸侶侶略了僚虜竜 侶僚 base address 龍侶僚 留両竜溜僚 stdlib.asm 凌 竜亮流凌: ; Update Code Descriptor base address field push eax push word code_descr_test call initialize_descriptor_base add sp, 6 2. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 侶了侶竜凌 privilege level (龍侶凌 留略隆竜旅粒亮留 留 亮侶隆劉僚 龍竜 侶溜留). 竜虜侶僚両粒流龍留虜竜 劉了留 CODE_SEL_TS1 慮留侶 侶僚了 留了侶溜龍侶僚侶僚 Descriptor 僚侶 僚僚溜僚侶 竜溜了留侶 慮旅ホ士塾 侶僚 CODE_SEL 慮留侶 侶僚 code_sel_descr 虜竜 privilege level 3 劉侶龍侶 ホ粁稽 了留 虜竜侶留硫僚虜竜 留 privilege level 0 侶僚 CODE_SEL 龍侶僚 僚僚溜僚 竜溜虜留龍侶竜 龍侶僚 privilege level 3 侶僚 CODE_SEL_TS1. 侶留 了留 竜慮侶竜旅劉龍僚虜竜 留侶 侶僚 竜両ホ稽砧採 硫略旅留虜竜 侶竜了 竜了侶僚旅流: call CODE_SEL_TS1:task2 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.3 粒侶留 Conforming Bit 0, 竜竜侶隆流 侶僚 DPL (3) 隆竜了 竜溜了留侶 溜龍僚 虜竜 侶僚 CPL (0), 慮留了僚了侶慮略 劉両竜竜 侶僚 両粒両留虜虜留 了留 虜竜了 侶両劉亮竜侶. 立龍侶龍僚 侶僚 DOSBOX 両僚慮留了ホ 隆竜了 慮略了竜侶 Privilege Level Checking 僚侶竜 侶僚 両粒両留虜虜留 劉侶両竜亮竜. 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.3 粒侶留 Conforming Bit 1, 竜竜侶隆流 侶僚 DPL (3) 隆竜了 竜溜了留侶 虜侶慮両侶竜両僚 流 溜龍僚 侶僚 CPL (0), 慮留了僚了侶慮略 劉両竜竜 侶僚 両粒両留虜虜留 了留 虜竜了 侶両劉亮竜侶. 立龍侶龍僚 侶僚 DOSBOX 両僚慮留了ホ 隆竜了 慮略了竜侶 Privilege Level Checking 僚侶竜 侶僚 両粒両留虜虜留 劉侶両竜亮竜. 里留 CODE_SEL_T1 慮留侶 code_descr_TS1 僚両溜隆僚了侶留侶 龍侶僚 留両竜溜僚 gdt.asm 凌 竜亮流凌: ; The code selector and code descriptor of the task1 with privilege level 3 CODE_SEL_TS1 equ $-gdt_start code_descr_TS1: istruc seg_descriptor at limit0_15, dw 0xFFFF ; limit 0:15 at base0_15, dw 0 ; base 0:15 at base16_23, db 0 ; base 16:23 at type_dpl, db 0xFB ; 1 11 1 101 1 = present + DPL=3 + code_segment_descr + C=0 + Read + not_active at limit16_19,db 0xCF ; 1 1 00 1111 = Granularity + 32bit code + limit 16:19 at base24_31, db 0 ; base 24:31 ; base = 0x0, limit = 0xFFFFFFFF iend ; Update Code Descriptor base address field ; Update Code Descriptor TS1 base address field push eax
  • 5. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 5 push word code_descr_TS1 call initialize_descriptor_base add sp, 6 3. 竜侶略硫留龍侶 留 Code Segment 龍竜 略了了凌 亮竜 留亮侶了侶竜凌 privilege level (龍侶凌 留略隆竜旅粒亮留 留 侶溜留 龍竜 亮侶隆劉僚). 両侶慮略, 竜粒留溜了僚虜竜 虜劉龍 iret 龍侶僚 task1, 侶僚 僚僚溜僚 竜慮侶竜旅竜溜 侶僚 CODE_SEL_TS1 侶僚 僚僚溜僚 劉竜侶 Privilege Level 3. 竜慮竜溜 龍劉旅僚虜竜 了留 略虜竜 龍侶僚 CODE_SEL 虜竜 Privilege Level 0 虜劉龍 侶竜凌 竜了侶僚旅流凌: call CODE_SEL:task2 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.3 侶僚 manual 粒侶留 Conforming Bit 0, 竜竜侶隆流 侶僚 DPL (0) 隆竜了 竜溜了留侶 溜龍僚 虜竜 侶僚 CPL (3), 慮留了僚了侶慮略 劉両竜竜 侶僚 両粒両留虜虜留 了留 虜竜了 侶両劉亮竜侶. 立龍侶龍僚 侶僚 DOSBOX 両僚慮留了ホ 隆竜了 慮略了竜侶 Privilege Level Checking 僚侶竜 侶僚 両粒両留虜虜留 劉侶両竜亮竜. 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.3 侶僚 manual 粒侶留 Conforming Bit 1, 竜竜侶隆流 侶僚 DPL (0) 竜溜了留侶 虜侶慮両侶竜両僚 流 溜龍僚 侶僚 CPL (3), 慮留了僚了侶慮略 劉両竜竜 侶僚 両粒両留虜虜留 了留 侶両劉亮竜侶, 凌 慮留侶 劉粒侶了竜. 4. 竜侶留慮凌略 Data Segment 龍竜 Code Segment. 両僚龍留龍僚虜竜 了留 虜竜侶留慮侶了流龍僚虜竜 侶僚 DATA_SEL 龍侶僚了 CS 侶僚 両僚粒両略虜虜留侶僚凌 虜劉龍 侶了 竜了侶僚旅ホ: call DATA_SEL:0 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.1.1 侶僚 manual 竜 虜竜侶留慮溜了竜龍竜 留侶流 竜溜了留侶 虜竜 竜侶侶両竜侶流 隆侶侶侶 隆竜了 虜僚両僚虜竜 了留 硫略旅僚虜竜 Data Selector 龍侶僚 CS. 里僚 DOSBOX 硫粒略隆竜侶 虜流了虜留: CALL:Descriptor type b unsupported.
  • 6. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 6 5. 竜侶留慮凌略 Code Segment 龍竜 Data Segment. 両僚龍留龍僚虜竜 了留 虜竜侶留慮侶了流龍僚虜竜 侶僚 CODE_SEL 龍侶僚了 DS 侶僚 両僚粒両略虜虜留侶僚凌 虜劉龍 侶了 竜了侶僚旅ホ: mov ax, CODE_SEL mov ds, ax 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.1.1 侶僚 manual 虜侶留 侶劉侶僚侶留 虜竜侶留慮溜了竜龍竜 隆竜了 留留粒僚両竜竜侶留侶 粒侶 留侶 慮留侶 侶僚 DOSBOX 隆竜了 虜留凌 劉硫粒留旅竜 侶劉侶僚侶僚 両硫旅竜虜留. 6. 竜侶留慮凌略 龍竜 龍侶亮竜溜凌 凌 竜硫留溜僚竜旅 侶凌 limit 竜僚 Code Segment. 陸侶侶略亮留虜竜 侶僚 CODE_SEL_LIMIT 凌 慮旅了僚 侶僚 CODE_SEL 慮留侶 侶僚 call_descr_limit 凌 慮旅了僚 侶僚 call_descr 虜竜 虜了竜 隆侶留慮僚両略 侶侶 侶僚 call_descr_limit 劉竜侶 limit 0 粒侶留 了留 隆僚慮侶虜略龍僚虜竜 侶僚 Limit Checking 虜劉龍 侶了 竜了侶僚旅ホ: call CODE_SEL_LIMIT:0xffff 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.1.2 侶僚 manual 虜侶留 侶劉侶僚侶留 虜竜侶留慮僚両略 竜旅劉粒僚 隆竜了 竜溜了留侶 竜侶侶両竜侶流 隆侶侶侶 侶僚 limit 虜留凌 竜溜了留侶 虜竜隆劉了 慮留侶 侶僚 offset 隆侶略慮僚両僚 侶僚 虜竜隆竜了凌. 立龍侶龍僚 侶僚 DOSBOX 隆竜 隆劉龍竜慮竜 慮留了 侶竜 虜竜侶留慮溜了竜龍竜 硫粒略隆僚了侶留凌 侶僚 虜流了虜留: CALL:Descriptor type b unsupported. 里留 CODE_SEL_LIMIT 慮留侶 code_descr_limit 僚両溜隆僚了侶留侶 龍侶僚 留両竜溜僚 gdt.asm 凌 竜亮流凌: CODE_SEL_LIMIT equ $-gdt_start
  • 7. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 7 code_descr_limit: istruc seg_descriptor at limit0_15, dw 0x0 ; limit 0:15 at base0_15, dw 0 ; base 0:15 at base16_23, db 0 ; base 16:23 at type_dpl, db 0x9B ; 1 00 1 001 1 = present + DPL=0 + code_segment_descr + C=0 + Read + not_active at limit16_19,db 0x0 ; 1 1 00 1111 = Granularity + 32bit code + limit 16:19 at base24_31, db 0 ; base 24:31 ; base = 0x0, limit = 0x0 iend 7. 竜侶留慮凌略 龍竜 龍侶亮竜溜凌 凌 竜硫留溜僚竜旅 侶凌 limit 竜僚 Data Segment. 陸侶侶略亮留虜竜 侶僚 DATA_SEL_LIMIT 凌 慮旅了僚 侶僚 DATA_SEL 慮留侶 侶僚 data_descr_limit 凌 慮旅了僚 侶僚 data_descr 虜竜 虜了竜 隆侶留慮僚両略 侶侶 侶僚 data_descr_limit 劉竜侶 limit 0, 劉侶龍侶 ホ粁稽 了留 隆僚慮侶虜略龍僚虜竜 侶僚 Limit Checking 虜劉龍 侶了 竜了侶僚旅ホ: mov word ax, DATA_SEL_LIMIT mov ds, ax mov ax, vidmem_start 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.1.2 侶僚 manual 虜侶留 侶劉侶僚侶留 虜竜侶留慮僚両略 竜旅劉粒僚 隆竜了 竜溜了留侶 竜侶侶両竜侶流 隆侶侶侶 侶僚 limit 虜留凌 竜溜了留侶 虜竜隆劉了 慮留侶 侶僚 offset 隆侶略慮僚両僚 侶僚 虜竜隆竜了凌. 立龍侶龍僚 侶僚 両粒両留虜虜留 劉侶両竜亮竜 慮留了僚了侶慮略 略両留 両僚慮留了ホ 侶僚 DOSBOX 隆竜了 慮略了竜侶 Limit Checking. 里留 CODE_SEL_LIMIT 慮留侶 code_descr_limit 僚両溜隆僚了侶留侶 龍侶僚 留両竜溜僚 gdt.asm 凌 竜亮流凌:
  • 8. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 8 DATA_SEL_LIMIT equ $-gdt_start data_descr_limit: istruc seg_descriptor at limit0_15, dw 0x0 ; limit 0:15 at base0_15, dw 0 ; base 0:15 at base16_23, db 0 ; base 16:23 at type_dpl, db 0x92 ; 1 00 1 101 0 = present + DPL=0 + data_segment_descr + E=0 + RW + not_active at limit16_19,db 0x0 ; 1 1 00 1111 = Granularity + Big + limit 16:19 at base24_31, db 0 ; base 24:31 ; base = 0x0, limit = 0xFFFFFFFF iend 8. 竜侶略硫留龍侶 亮劉龍 Call Gate 龍竜 留亮侶了侶竜凌 privilege level. 陸侶侶略亮留虜竜 劉了留 Call gate 虜竜 DPL 3 ホ粁稽 了留 虜竜侶留硫僚虜竜 留 Privilege Level 3 龍竜 Privilege Level 0. 竜侶留硫流慮留虜竜 龍侶僚 task1 虜劉龍 iret 慮留侶 虜竜侶略 龍劉旅留虜竜 了留 慮略了僚虜竜 侶竜 虜竜侶留慮僚両略 虜劉龍 侶竜凌 竜了侶僚旅流凌: call CALL_GATE_SEL:0 裡虜慮了留 虜竜 侶僚 6.3.4 侶慮留了僚僚侶僚了侶留侶 僚侶 両僚僚龍劉龍竜侶凌, 龍侶龍僚 侶僚 両粒両留虜虜留 隆竜了 劉侶両竜亮竜 龍侶僚 DOSBOX 慮留侶 劉硫粒留旅竜 虜流了虜留: CALL:GATE:SS: no writable data segment. To Call Gate 侶僚 僚両溜隆僚虜竜 龍侶僚 留両竜溜僚 gdt.asm 凌 竜亮流凌: ; The call gate selector and descriptor CALL_GATE_SEL equ $-gdt_start call_gate_descr: istruc call_gate_descriptor at offset0_15, dw 0 at selector, dw 0 at dword_count, db 0 at p_type_dpl, db 0xEC ; 隆 僚両溜龍留虜竜 DPL=3 at offset16_31, dw 0 iend 里僚 selector 慮留侶 侶僚 offset 侶僚 call gate descriptor 侶留 慮侶侶略了僚虜竜 龍侶僚 留両竜溜僚 stdlib.asm 凌 竜亮流凌: ; Update the selector of the call gate with the CODE_SEL mov word [call_gate_descr+2], CODE_SEL;
  • 9. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 9 ; Update the offsets of the call gate with the address of task2 push eax mov eax, task1 mov word [call_gate_descr], ax; shr eax, 16 mov word [call_gate_descr+6], ax; 9. 了竜粒凌 隆僚留侶侶侶侶留 竜虜侶劉了竜龍侶 凌龍侶留侶竜亮劉僚僚 竜僚侶凌了ホ 留 privilege level 3. 竜侶留硫留溜了僚虜竜 虜竜 iret 龍侶僚 task1 慮留侶 留 竜慮竜溜 (竜了 竜溜虜留龍侶竜 龍竜 CPL 3) 両僚龍留龍僚虜竜 了留 竜慮侶竜旅劉龍僚虜竜 侶竜了 両僚龍侶留侶竜虜劉了竜 竜了侶僚旅流: hlt 裡虜慮了留 虜竜 侶僚 慮竜慮略旅留侶僚 6.3.5.1 竜 竜了侶僚旅流 留侶流 隆竜了 虜僚両竜溜 了留 竜慮侶竜旅竜龍侶竜溜 隆侶侶侶 留留侶侶竜溜 侶僚 CPL 了留 竜溜了留侶 虜竜隆劉了. 里僚 DOSBOX 慮両留龍略両竜侶 留慮僚 硫粒略旅竜侶 侶僚 虜流了虜留 Exit to error: INT: Inner level: Stack segment not writable.
  • 10. 留僚竜旅流亮旅凌 留ホ 里亮流亮留 了竜虜凌了粒僚 侶留僚旅虜ホ 虜留旅 里竜僚凌了凌粒溜留 離凌了凌粒旅ホ 里凌亮劉留 了竜虜凌僚旅虜流 虜留旅 離凌了凌粒旅ホ 凌侶粒亮劉僚凌旅 旅虜凌竜竜両竜粒留劉 10