|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。- h2 r. C: [7 z
2 y o# z9 }3 K" B3 I
这是C的- /********************************************************************
9 I+ s- h7 }; t8 W - * File: DOS4G.H *# G) E& D/ g$ }; U2 ^8 s! c6 j% B' o
- * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
% E% `: a7 J& z$ g - * *
: m y6 p9 a6 ?2 k - * ========================Title=============================== *6 I3 x' t/ n7 m, U
- * 这个函数是让系统进入DOS 4G模式 *
+ f# a' O L" T6 b, D - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
! p/ k8 ~9 e# i, n# E4 G - * *- m: i' n0 L3 ]+ D4 \" `
- * 使用: openA20(); set4gb(); *
% }( w1 b: x8 `; f4 z' J - * *
, g0 w) p: O! A( t/ K# J - * ===========================History========================== *
$ Z+ }* r3 }/ z7 g$ S - * author: bini *
1 S) K I) E7 l' @ w - * date: 2004-11-30 Frist version. *
_- M& P( b7 ` - ********************************************************************/1 y, K, e# K5 k7 x
- ( R$ T: K% Y1 m4 z; G/ B
- #include <conio.h>
3 k K: t- m1 Z0 ~8 _ s - #pragma inline
( G r; X' V+ W, p2 o9 _$ _3 _. V - ! ?. J+ k1 \; @
- /***********************************************
3 L8 L5 d0 G% b6 t - * 两个GDT,第一个为系统使用,不管,默认为0 *
9 B8 r2 A) _* z# w - * 第二个为一个数据段,没有代码段。 *- s3 \9 A5 C! W# X) F% [
- ***********************************************/
! ~! ]" o0 ^7 p' K. O - unsigned long GDT_def[ ]={0,0, /*系统使用*/
; v- }! M+ s+ q5 r) {6 j5 s - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
* p- n. Z1 k+ O! I - low16bit( 0~15 ) is limit low=0xFFFF
* M4 {" K, [& F: {! G - */
]9 K- e6 Q2 Y2 b: V6 S) d6 j0 Y) ? - 0x008F9200};/* 最低字节为 base( bit 16~23 )
5 r$ t( a+ L# _ - 最高字节为 base( bit 24~31 )' c' v9 D) q! X/ `' f0 D
-
( u F& T5 h4 Z T. d$ l - 属性Attrib = 0x8F92
6 _; g* }8 A! s/ ?' _1 s -
, `- m4 s- L$ O f2 x& B - 属性位Hibyte低四位为
8 J6 z1 `* U" n) q5 M - Limit( 16~19 )=F
$ [: m5 y& r% f! { - 属性位Hibyte bit7 为粒度
" `# k7 m8 S5 X- e/ L% ? - (值1=4KB粒度)
& l# O# K4 v! W" ` - 8F & 0x80 = 15 V' l) s3 }9 \
-
0 ]4 p1 ?/ l; H/ p5 N" s - 属性位Lowbyte低四位为段类型,值=2
( N7 A/ {2 a4 z) Q- x- w7 k - 表示为可读/写段9 j, h# T; B9 M: Q
- 属性位Hibyte高四位=9,bit3=1表示:4 l: }( d6 @& Q2 H! s) s
- 描述符对地址转换是有效的。0 h6 P& f1 K; ~
- bit0=1表示为:
o1 ?% G8 o8 Z# g+ w - 系统段描述符。而不是门描述符。
j9 O8 C2 p$ b5 l) Z8 Q8 j7 ^ - 9 X, n0 Y0 I$ I* J6 T3 h
- */
& z& }/ q# H# z% f - & Y( y( U9 S, z# L6 b! T6 z
- /****************************************
3 c- E G7 v6 @7 }6 F2 W - * GDTR寄存器, 48bit=6bytes *; M) @+ G- P6 X' u& B# H& V1 L
- * +-------------------------------+ *! J& }- h, w5 v, n9 P
- * | 32bit基地址 |16bit界限| *3 P4 j9 K5 q( m2 g9 g
- * +-------------------------------+ *
6 p f9 P$ F! t) C/ ~ o - ****************************************/
2 m" S) M3 d3 ]. T: U - unsigned char GDT_Addr[6]={0};, g5 ?7 n( V' z1 H+ |+ o
! y$ v2 Y: I% Y+ E" Z' \- /****************
1 u: R4 q3 |& E1 t6 D; j8 \1 e f - * 打开A20门 *$ y& |8 T) W1 z3 [
- ****************/
# ~% R" e. R5 S z/ _/ w - void openA20(void)! Q/ G% E8 N( j' N
- {, J' p5 p7 y. B& Z3 P5 q K0 S3 [
- asm{0 I, j) P% q4 r% q
- pusha, Y& R) _" ]0 R% c7 s5 U
- in al, 92H. F- f& O4 I+ c: d3 P. T
- or al, 0x02
0 h5 h( G8 S+ s0 a7 v - out 0x92, al' m. v2 ?0 a1 a" G' c+ ^
- out 0xed, al
6 m* } d2 m+ L% `5 ? - popa: c1 E! c) n# q
- }
) O; Q6 S1 r) w - }
6 K* r$ n6 f% f" V/ e
& _; z1 e: j9 V8 l- /***********************************************: i! F/ }( `1 H. f; Y! ~' l
- * 函数功能:进入DOS4G *
) b* N9 A( ?5 [5 O( j - * ==================== *
$ l6 p+ k/ a7 c# _! q$ c% j - * *( V! A! u1 [6 Y, C) y
- * GDT描述符界限计算方式:描述符个数*8-1 *3 h T; }& W" l4 ?
- * 如: *5 G6 N$ V3 m. L$ X- ^8 |8 y
- * mov word ptr GDT_Addr[0], (2*8-1); *- T) y' R, H2 e) T0 c% e
- * 表示为 2个GTD ** a5 q" R+ O8 Y4 w
- * *( `) f" z; i: `
- * 选择子为所在描述符内的字节偏移。 *
. ?" F. C$ s* f$ i& c7 J6 A' R - * *9 K' e0 ^! t x4 q3 g2 }4 E9 J
- ***********************************************/! Y: p: ?/ j4 F, S" u
- void set4gb(void)
) R2 t; O* X/ X5 ~ - {
{5 P6 }: A3 y$ F7 F - asm{
, ~+ Z1 \! Z- A! Q' x0 \ - cli
# T2 r8 ~; p: H( c" S& Z' d6 d, ~ - /****************************************
8 o5 [9 k/ U! }9 [# f1 O8 a - * GDTR寄存器 *
7 m& Z" z9 m) L# t: `3 f* Q$ N - * +-------------------------------+ ** M1 y O0 |* ]$ s" f
- * | 32bit基地址 |16bit界限| *
2 ~9 c$ N( z3 S8 A - * +-------------------------------+ *
0 T0 {- |6 n+ b1 B8 n: ^ - *****************************************/
. O& C; Q9 u3 a4 w5 `8 M0 V# c. p% P - /*********************: T* O5 |, Z& W' I( C3 g
- * 得出段界限 *
+ s" s0 \+ \# {& \0 K - *********************/
0 T- S7 f4 H: j! |7 v( Y - mov word ptr GDT_Addr[0], (2*8-1);
2 D4 D4 r1 H# i; b: f# a* P - /********************************************: F* E1 K4 K( l- L7 O* D+ c$ ~3 ~
- * 计算GDT表的32位基地址,存入GDTR *
$ {) k$ z$ K/ b9 @% K3 Q( B# P - ********************************************/: l _6 ]' ]9 ~( h6 G
- mov eax, ds
1 y) n% t% Q3 Q9 Y# t- a6 S - shl eax, 4
4 w- J6 v: v( _5 U& d, q - xor ebx, ebx, ]9 `6 I1 F, [0 y/ f( t: \: k
- mov bx, offset GDT_def1 Z. j/ l- n0 }0 G) }' o" Z
- add eax, ebx
, A! h: V& M# q8 _/ T/ Q# n; D, e - mov dword ptr GDT_Addr[2], eax
/ y& z( ?4 b, N, j$ j. b4 `" ] - lgdt fword ptr GDT_Addr. r$ _0 H5 w" R# l0 G, n
- /********************
; ^+ Y) D6 B5 q& j+ | - * 选择子偏移 *
. ?" ?5 o3 f" E* _. P - ********************/7 I& a9 t- A# x$ Z6 ^9 q$ g
- mov bx, 83 Q6 [4 T% s( X- K/ F% }
- mov eax, cr0
) S3 k# [1 j8 C; i7 t% i. T - or al, 1
6 M# c6 {: u, f4 V8 M" h - /**********************
/ \* V/ W/ R. x - * 进入保护模式 *! l! P7 q: A- k$ A) r
- **********************/9 O, g8 ?$ n4 w, e/ ]$ } j
- mov cr0, eax
: Q& `- Z2 A* D! Y8 g - jmp pMod" ?" K' L$ o6 V8 c
- }' O* W" M" \, g
- ' s2 J/ ?; `2 q4 K% N9 ^
- pMod: asm{
2 ]/ K, ~; T- o9 |* s+ M4 {+ A. v - /************************************************************ o8 t/ Y7 s4 \1 a; X% j$ M
- * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
6 N# C P$ C+ M& C+ R% x( A - ************************************************************/- Y: k, ~( q" B7 s H7 ~1 m! n
- mov fs, bx. x8 ?; W. d7 Z/ j. t2 N
- mov gs, bx& S4 @+ p; S! a6 w2 \+ I
- and al, 0x0FE
, Z5 V; U* k. L# I6 O/ x - /******************% i |/ H% J8 x# P& `( x1 P& |
- * 进入实模式 *
: y3 t4 Z# [. h* Q5 _2 V - ******************/6 @1 b& B9 K# D C' D% d$ T
- mov cr0, eax
' b7 S0 I" X0 a( T. `' ?; j) U - jmp rMod7 Z6 v3 `* W+ H% }5 i3 v
- }
: A* c0 o: p7 L; M
5 X# S; b3 a5 J7 y- rMod: asm{, V' |( I; z( ?1 V* u: N
- /* ******************************************************************
' e% \# z7 ~8 @1 u - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *% m# T9 [2 y6 Q! A; H& U
- ********************************************************************/9 w; V4 ]7 L+ x: N7 w4 w8 G
- mov ax, 0
, P$ n: J. y5 |+ b - mov fs, ax
" ^* f' R1 h/ @! s, Z - mov gs, ax
7 \/ U. Y" S8 r# J9 Y - sti
3 j( ?* @% x+ x0 d8 F - }; T$ r. i0 k8 C5 J8 u
- }
复制代码 这是asm的- ;/********************************************************************% l+ R% r6 b( d, g5 L9 x
- ;* File: DOS4G.asm *
% o( F2 R) L' `/ J+ }+ q - ;* Compile with masm ( Editor: Tab size = 4 ) *
: a/ o( {7 e# Y4 ? - ;* *
" j( { E2 K1 t2 A/ Z - ;* ========================Title=============================== *6 e, N/ b | C# a. q
- ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *' H t' {+ m0 J( @9 Z
- ;* *
2 M7 n1 T0 o' w( |3 s( ? - ;* ===========================History========================== *, b* c t8 x/ O* N y: X" i
- ;* author: bini *
- L) A" m9 W4 G6 s9 x, b - ;* date: 2008-10-08 Frist version. *7 g) |6 S4 g- ^/ d7 B2 @5 ]
- ;********************************************************************/
9 c* ]) }6 U! [3 Q, j! i - .model small
* W5 Q; z1 n) h+ F% F5 V - .586p5 I2 I+ W8 V& e2 b( E, q+ ^
-
3 i# S/ @8 Y, s0 A% U* p - DSEG SEGMENT USE16 ;16位数据段, ?, A [* I) X9 j+ j0 w- u5 S1 |
0 f3 j4 R+ h+ e1 w9 J1 X4 P' q- DESC STRUC
# y; y T6 o* M - LimitL DW 0 ;段界限(BIT0-15)
/ X. ^0 O: M8 Z R - BaseL DW 0 ;段基地址(BIT0-15)
6 A2 |3 |$ N& Y( q) X+ h0 t - BaseM DB 0 ;段基地址(BIT16-23)# f. j/ }5 @' ^. p2 r
- Attributes DB 0 ;段属性% {7 {( ~9 m& C* Y: f
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
' f, s! _4 @- w* B) R - BaseH DB 0 ;段基地址(BIT24-31)
) s& E- y( a& c3 p% S. M, q, H - DESC ENDS
; z$ u1 K! K6 Z& H7 ]
1 T" S7 Z1 ?4 U* x5 C- PDesc STRUC
0 {3 [/ W" I( J2 M$ }5 f% W - Limit DW 0 ;16位界限* a" F9 w3 J( i4 I8 F, ^
- Base DD 0 ;32位基地址
, v7 R& q; W6 q d4 e3 l4 o) [ - PDesc ENDS
$ [) [# L, d7 x/ g# M: L- B4 ] - / g( Z* P( d, o9 ~/ R, f1 A
- GDT_def Label Fword
8 L' d/ E1 ^/ _! B4 O5 @ - Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>
0 ]# S8 R; C; o9 I3 Y( @ - Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
! ^/ O9 U$ N5 L/ ] x2 ]; h - 7 X* @' H+ i" m+ o# d. T$ d
- GDT_Addr PDesc <$-GDT_def-1, >
5 N4 R) q1 V5 F2 o% w - DSEG ENDS ;数据段定义结束
% N. W% ^$ V1 e8 M+ q/ A: m1 }
9 j6 A& x1 T5 V- Y- CSEG SEGMENT USE16 ;16位代码段1 @$ b$ Y) m! i
- ASSUME CS:CSEG,DS:DSEG
8 g- s' b, ?3 K$ \ - .Startup. P" R6 Q7 g4 q5 S
- call Set4gb
+ O9 j8 L' S' y! e, C8 b! p - ;
: ^& a/ s. x9 U# W8 |/ Z7 J - ; fs, gs即能访问4GB空间
2 M( [2 p) [9 U4 a& b! s) \+ S - ; write your code in here.8 c5 w4 `6 u$ f$ p8 p9 E
- ;
# B4 y' K& I/ A, K. c' Z/ O - .exit" W- |7 v1 H) j3 Z6 v
- 9 \0 R. G: ~: e8 P
- Set4gb PROC NEAR
3 l* o* B f, o4 z" v& S- b - in al, 92h
0 K: O, L, ?8 E3 r( F9 d7 H - or al, 002 J8 Y. ~7 @2 a! L
- out 092h, al
: ]: ^+ N5 D+ a; @- M. t7 x - out 0edh, al
( P8 Q. m" X5 z4 f! y4 @
, O5 t3 i% `# {: t- cli
4 R" @6 Y, n( `- b2 b - : q5 O% T: _" U/ ^$ f8 R1 m* w
- ; mov word ptr GDT_Addr, (2*8-1); M5 I) `) e2 e4 B( _+ r6 H/ }' y
2 n6 [3 ]+ l; `7 }7 l4 s$ @) _- mov eax, ds5 H: R% {( ^4 U; f. }, Y8 S# R/ j1 h
- shl eax, 4
9 U$ O( y2 @( W6 a - xor ebx, ebx* |* r# Q% U0 c2 a
- mov bx, offset GDT_def7 }4 n- r: k: H" B- O$ z
- add eax, ebx
8 F0 Y# T* `3 ] - mov dword ptr GDT_Addr.Base, eax
6 D- o, I: l1 @- k- u0 s - lgdt fword ptr GDT_Addr
9 M, w8 [; T2 `, \5 _ - 7 Y5 h; K1 `* Y( q( Q/ F; \: F
- mov bx, 8( P: R. }6 g; l, s7 u( M+ E: c
- mov eax, cr0$ P0 r% i. I, s V3 |3 w
- or al, 1# x4 Q S# Y; u
- mov cr0, eax) C, k' q A n7 G& x- J
- " @7 |6 A' {/ X+ X# Z
- jmp pMod* Q6 Z% T/ m2 F% T* b+ B7 a
- pMod:& g3 C, M* L {1 J% Q: \4 N, P
, x3 M+ ^0 K; a9 f) m- mov fs, bx, E- `4 M( m) t8 q8 M3 Y/ i
- mov gs, bx
`: ?5 N, O6 ^. @& R1 _4 n6 T% q5 T - and al, 0FEh8 h/ o3 V$ s0 X" D+ B+ A
- mov cr0, eax3 w' c1 t3 i% r& U0 c
-
4 @5 |1 M: o1 G; I. [7 k* f1 f+ B - jmp rMod: u) a) d1 u2 X4 B
- rMod:
7 m+ ~8 ]- U8 m( x9 G' u+ ]6 @( u - 9 I# D7 h3 @/ T1 c5 n5 {6 \ ^
- mov ax, 03 b% J4 F m8 A) b
- mov fs, ax7 H/ }, Z: m% N0 g9 {- c$ u
- mov gs, ax
9 T" u+ q: K' R6 r: ~+ X - ) t7 F( k$ p8 t; w0 U
- ; 在2M的位置测试写一下数据7 ^$ t3 B% g% V3 I B7 { Y
- mov esi, 200000h
; c6 A; |5 U- g! y - mov dword ptr fs:[esi], 055aa55aah6 O+ f$ i/ m. q1 s, V" j
- ; 用RU去看看200000h的位置是否是此数据....
. T0 y% f) L4 Q9 C$ o" B7 H - & A+ h3 w* V% N. b
- sti
3 S5 I* R1 D. E: t! r; @0 ~* s: l0 U/ M - ret5 I: o, P/ c' ~8 ?1 V9 J; {
- Set4gb ENDP, e+ c# ]1 L: J$ A U9 N
-
$ z8 F% y/ y w - CSEG ENDS ;代码段定义结束
% h; X1 R4 ^) r- p - end
复制代码 |
|