|
|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
) h" ^" O+ V" r& r1 g+ }# y3 z) v' {' }8 y# i7 P
这是C的- /********************************************************************6 m2 T! w. O* k1 A# H9 M' k5 W
- * File: DOS4G.H *
' X1 j/ [ G) _' a - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
7 O" g5 ]2 R* A# C - * *
: B! v1 V2 `" Q) H) B; }2 y - * ========================Title=============================== *
+ u& @, `9 v* G4 z3 ^( t6 d4 m - * 这个函数是让系统进入DOS 4G模式 *' r% _) o1 J8 C6 R. A, T
- * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *
6 l4 }2 b( \7 } - * *
& ~- \6 w* n N# y: h4 d3 v1 R - * 使用: openA20(); set4gb(); *
. o; F2 W( C& x9 d. Q) e5 r. B$ x - * *( Z0 v! R# N2 g% w
- * ===========================History========================== *- w. _5 L. Y- F7 }5 ?8 M# I
- * author: bini *
: H1 E b2 k- y: ^4 `) K - * date: 2004-11-30 Frist version. *
7 W4 }5 i1 }/ O8 M0 k0 [: ] - ********************************************************************/
2 W+ ^6 u3 q+ S9 Y& Q - 8 q! G- c! ]; k" c
- #include <conio.h>' Z( k9 O0 [9 h; P
- #pragma inline+ K0 b l, m- N$ ^% b+ p' s' M
u7 q$ I8 {4 ]% i, r- /***********************************************
& {' B) E: L" k0 o - * 两个GDT,第一个为系统使用,不管,默认为0 *
$ V& G" C9 G, K1 m7 _, b6 `8 Z - * 第二个为一个数据段,没有代码段。 *' g) W# _& M0 Q
- ***********************************************/
. \8 e8 S( p/ T4 d: y - unsigned long GDT_def[ ]={0,0, /*系统使用*/
4 L% J7 w1 J! {' s$ d' H - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
0 J( x1 O# y3 z4 \ S - low16bit( 0~15 ) is limit low=0xFFFF
9 \2 a/ c! I9 C2 @( Z - */9 O% G7 l6 b, ?% S- W# g& O, v' V
- 0x008F9200};/* 最低字节为 base( bit 16~23 )
* @2 E6 A! N* v$ p+ `# B2 q, i - 最高字节为 base( bit 24~31 )
% ?; b8 B# j2 g -
, R- P# z* {3 u - 属性Attrib = 0x8F92
& J8 W0 a3 n5 R, m; T' l, o, y -
0 m7 J1 `+ E* y4 K1 k6 l7 N* o# j9 s, W - 属性位Hibyte低四位为 * R' z' w. U; m2 s; N
- Limit( 16~19 )=F l4 e5 k$ Z( r
- 属性位Hibyte bit7 为粒度
/ w% n! Q4 J& M - (值1=4KB粒度)$ o+ H1 W- I# V
- 8F & 0x80 = 1: L" j, P4 ~2 r" W+ K
- 3 G' J7 C& J, J. F# h" G% v
- 属性位Lowbyte低四位为段类型,值=22 t7 o! N$ o P: x* p9 H
- 表示为可读/写段
Y2 a, U4 ^* W - 属性位Hibyte高四位=9,bit3=1表示:
4 f/ h! J3 e: y& A9 W1 P. S - 描述符对地址转换是有效的。
4 L7 m' c9 ^( R7 M - bit0=1表示为:
* O2 G' E5 y5 K - 系统段描述符。而不是门描述符。- M( _# f0 a$ j
- # J2 O! L) l/ ^% g1 v+ v0 M3 X' H
- */6 L u# M& H$ B6 z& q& M
- : h. ~' d- ]1 N
- /****************************************
6 ?3 j4 G& @5 e2 q2 M* B - * GDTR寄存器, 48bit=6bytes *5 x: `( C, D' [ u/ L# z' w
- * +-------------------------------+ *+ e* \ p4 ?2 M9 |1 _8 B! p
- * | 32bit基地址 |16bit界限| *& ^+ R2 G3 s3 n) `) ?' d( n4 }
- * +-------------------------------+ *
: Z" S2 h, z F% C: Q - ****************************************/
+ S2 h- U; F7 u( h1 r+ D" u/ B1 r - unsigned char GDT_Addr[6]={0};) M0 t( }- R# w/ s4 K; B, G
' C/ l; J y5 U4 k- /****************& ]7 a* Z0 b# o G
- * 打开A20门 *" [8 I! m7 a B5 R& u& v; i
- ****************/0 q9 [8 e- V) n' n. y$ \- |9 ~+ h* {
- void openA20(void)" a- T- g5 w9 S; E' v1 z3 G
- {
0 a$ j6 d4 R; G8 T9 a - asm{
2 n2 Q6 h5 S) u5 K% |% Q - pusha
~( r/ y4 n( V4 U# H - in al, 92H# s+ y; ?6 J: x' r) ]
- or al, 0x02: t4 S' Z: ]9 K% h. P
- out 0x92, al9 z9 j! E3 x5 H; ?( {5 ~
- out 0xed, al' X% w2 }/ d8 ~
- popa
6 k. i0 A l+ x* l* D" M1 O( ]1 I - }8 Z* v+ h% B/ {9 c3 Q) l- x
- }
. S) i# h% h3 q6 s - H6 i6 f- e, h
- /***********************************************
2 _/ }* u& z- _' L - * 函数功能:进入DOS4G *2 V* g _7 I) E( I
- * ==================== *
; Q2 {) o7 c' N" O - * *( e1 x$ f9 X( r- D c' u
- * GDT描述符界限计算方式:描述符个数*8-1 *1 c- x! O- t1 ~) k) l
- * 如: *( f' r) [ L# t% B0 }3 d
- * mov word ptr GDT_Addr[0], (2*8-1); *
B2 k' [" o) Z2 M4 Z$ k0 I3 t: F' m1 w) P+ R - * 表示为 2个GTD *
8 R6 T2 P$ F& {9 q! J& ~ Q' x - * *+ |, ^% Z6 A" A w s
- * 选择子为所在描述符内的字节偏移。 *! ` @+ s4 f! x8 V" N2 d
- * *% L' \8 g& g$ g/ k5 u4 T# D
- ***********************************************/" k5 I3 f! y& ^ @( s5 |* k
- void set4gb(void)9 a: `9 w' s9 v+ K6 d+ g+ v; O! c
- {( O6 ^" @! K! A6 k
- asm{
* g$ M) X/ \) \; { d' P - cli
% w+ k, A% L) Z b - /****************************************
; r! N+ Q& N) i% [( {, @& S - * GDTR寄存器 *
- c9 J! d! l* Y - * +-------------------------------+ *
1 e: ~2 X/ \9 U( m, F2 g# I# ?- l - * | 32bit基地址 |16bit界限| ** w: }. q. d% {) G
- * +-------------------------------+ *
2 _2 W7 e5 }7 Z# o: h* F4 j: ~ - *****************************************/4 V! O5 p+ c3 [3 k$ m1 t+ [
- /*********************
) b6 f$ A8 c# `1 l9 G6 J - * 得出段界限 *& R- U5 W: F$ m$ ^1 ^. y
- *********************/" Y7 C+ U3 L- o( ~* S
- mov word ptr GDT_Addr[0], (2*8-1);: m& `/ t# Z) o% |: d% C5 S3 i! a
- /********************************************5 i$ ]4 l! p7 g. A5 j$ l
- * 计算GDT表的32位基地址,存入GDTR *
6 J9 h* H5 z0 N! C6 ^ - ********************************************/& L/ J. W2 \; O* Q6 }$ c% T
- mov eax, ds
+ g8 t0 N. d+ \: X" L" v: T - shl eax, 4
% b' {3 `$ T* `5 `% m8 ] - xor ebx, ebx
% M/ G5 T$ {. j8 p - mov bx, offset GDT_def
# L. V4 ]9 y5 N - add eax, ebx; N; Q8 O) T3 j
- mov dword ptr GDT_Addr[2], eax$ t# ]9 G& s1 C8 p& ~6 z
- lgdt fword ptr GDT_Addr, b$ h" c$ l8 G8 i& B3 k% b
- /********************% \' G- F/ a( }4 J9 \* D# ~4 {
- * 选择子偏移 *' s, Q& W) m. }* O
- ********************/# q. P% Z: {/ t
- mov bx, 8
8 k; t+ I n! F* q7 _- T+ j - mov eax, cr03 f. F! q* t8 x+ d# Z) e2 d" @
- or al, 1" ~+ r2 y% {6 m
- /**********************1 A' R" h9 [! {
- * 进入保护模式 *1 x& I% G) m, b6 \- K: D
- **********************/
* {& }* D& T5 O& R4 N7 w - mov cr0, eax
" G; U& Q8 B' Y) `/ P! o: A, ] - jmp pMod
0 U$ H' ~9 O- i$ e% P) I/ G3 G( h - }5 V( ?- I0 m; u' V: w0 j: K
- # Q" V5 ^6 s* @
- pMod: asm{
$ l( [7 s" R+ P8 L7 e2 I) w: T) x - /************************************************************
5 E) K4 `) j* c, x* v, ? - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
- z' L/ K1 e( l$ D- i1 `; l7 v* S - ************************************************************/9 p! R4 j9 j4 ^( l
- mov fs, bx. h; x; F9 l( W8 @+ W% Y L( Y; x
- mov gs, bx
1 [9 c& C" o) ?8 Q" ? - and al, 0x0FE
- K- i/ |4 r/ Y: D8 ^ - /******************% l; @0 U. r; d$ }
- * 进入实模式 *# x5 z) D3 P1 `$ F5 x. k) m1 D; G
- ******************/
5 ^3 Y& p% {+ y, a - mov cr0, eax4 g- z$ @# b3 n: A0 d& K1 i8 T7 |, a
- jmp rMod; y/ I) f1 Y: A; w
- }5 z9 V1 e, P$ L1 ^: b1 h$ }* J* B
2 `. Z9 V$ a$ \+ v$ }' i d7 K$ ?- rMod: asm{
+ i3 D: I# @& I ? - /* ******************************************************************# ~" |) o6 D. @2 S% m
- * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
# g! [. `# k8 T" A3 q4 w - ********************************************************************/
. j1 }& X# m8 ? i. c/ f - mov ax, 0
& {! r7 _9 h: S' ?5 I1 i - mov fs, ax0 b! c( d: k7 j$ e2 w/ G
- mov gs, ax
( h7 K! R! q8 v2 M6 K7 } - sti: c' E8 \, p8 e
- }0 I' f8 K. ^& Y- ]
- }
复制代码 这是asm的- ;/********************************************************************
8 c5 M; D% p- v! q - ;* File: DOS4G.asm *
* N4 |. l3 {: Q, G6 V2 ^! g - ;* Compile with masm ( Editor: Tab size = 4 ) *
) G. t7 o9 w$ P" _% i: x8 I0 F4 } - ;* *
* E1 I2 W$ n/ z- q- [ - ;* ========================Title=============================== *
4 u# ? W* i3 ^, E" n1 g - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *
, S# X) R R' }2 P/ w' ]* E8 M - ;* *) u# ]. |, L4 F% b. Z2 B7 B' l
- ;* ===========================History========================== *) y- d. e7 x% {0 d
- ;* author: bini *7 Z6 U: S2 W! p% U
- ;* date: 2008-10-08 Frist version. *9 C9 S' y3 n/ r1 A/ K7 k3 P6 B
- ;********************************************************************/ 0 {+ B1 S. v3 j$ w
- .model small
7 T: O( K$ v" H8 Y0 n5 h6 l! O. q - .586p
$ U8 ?/ g2 x# q& Z -
' Q& Z5 f: ]2 m2 Z( }/ G/ z& n0 j3 J3 \ - DSEG SEGMENT USE16 ;16位数据段" C T# @0 B! v# J4 C5 t9 _
0 d" O1 _; W y! Z. F- DESC STRUC X2 \$ D; |* L& ^7 A" _
- LimitL DW 0 ;段界限(BIT0-15)$ K, t+ E( P" W7 I. M
- BaseL DW 0 ;段基地址(BIT0-15)4 o1 G, K m0 L8 |4 ` p' d3 d
- BaseM DB 0 ;段基地址(BIT16-23)
" _$ l ]% j5 W3 }$ E - Attributes DB 0 ;段属性. a: w. z* D; ~
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)# V. f: ^) ^4 Q9 R1 {
- BaseH DB 0 ;段基地址(BIT24-31): J* u f$ L, A5 z! ^) U. ^
- DESC ENDS
9 A c O, U) G _* ~5 X7 _
' I, k* d1 O2 n; |- PDesc STRUC
# k6 F& ?8 B+ @/ K - Limit DW 0 ;16位界限* X3 O- ]6 L, ^6 x( b
- Base DD 0 ;32位基地址
2 K: `3 T* n- h8 v9 ~! I; X5 ~% |* Q - PDesc ENDS
0 _6 w% d3 I- D! S' a a - 8 H! S! q! |: ~- S* Y4 d Q' V$ ?5 |
- GDT_def Label Fword9 G1 d6 h6 w9 e- X/ w8 X
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>7 O# o; Y, M3 n# W0 F4 I
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
9 v/ v$ w/ T' `9 y- w; D - ; {7 p7 \7 p& u/ V- A, T
- GDT_Addr PDesc <$-GDT_def-1, >
2 A& Z, w2 }* P5 `5 S - DSEG ENDS ;数据段定义结束
+ X7 p" W: u" ] U# M6 b) I) g# P) [
6 d3 P# D: _- u" T4 e9 D- CSEG SEGMENT USE16 ;16位代码段
5 q% {) {( W* N - ASSUME CS:CSEG,DS:DSEG/ g2 Q( m6 z: w- m/ d- S
- .Startup3 `/ \* x' s, r7 V* w5 [* C3 E
- call Set4gb% a1 C" o$ R' I6 t4 {4 r
- ;3 E) y& E0 Q. ^7 g/ @
- ; fs, gs即能访问4GB空间2 J, v2 P1 K, i7 Q
- ; write your code in here.
; w3 G& p! B% p4 |$ z& E2 y7 P - ;+ M" Z( d) y4 B
- .exit1 U5 \. a' g1 T- r: W
- * x' a6 N0 A6 d0 o: p* c
- Set4gb PROC NEAR
. [! S! s' c2 ^7 X - in al, 92h
. c: D% N3 Q& M. m8 L5 \7 P; {( ~ - or al, 002
) d6 l7 P# f* H- r5 }3 d: [ - out 092h, al! M0 z2 F/ g* I( M
- out 0edh, al) g+ i: C" O' g# _
5 ~: Y( ^6 [8 E! N- cli% e9 P$ m8 F* S, q6 S% W" Y
- : \' \; m" ] L& q3 A
- ; mov word ptr GDT_Addr, (2*8-1);9 |+ r8 O0 w9 k2 m1 p
- y3 m" e# U8 c8 z- mov eax, ds
- K' V5 J" _/ P3 m$ T - shl eax, 4
* m% H9 u6 y: y& _' G& k - xor ebx, ebx
3 P& e6 d: J2 O: i3 Z' k - mov bx, offset GDT_def
5 o. [' n7 q3 Z5 J! I; f - add eax, ebx
5 A1 C; Y4 r( c9 ~8 _ t5 [, w$ r1 T0 m - mov dword ptr GDT_Addr.Base, eax8 |: u! J. A' w
- lgdt fword ptr GDT_Addr, |! { B B, y! M9 k! I9 A% Z0 Y8 A
2 q+ `6 Y* G* K# z& C- mov bx, 8
1 j+ T2 n$ `' ~- A* q- o - mov eax, cr05 j- n9 ]& D) T. y1 K) x0 R
- or al, 1 E, T$ ?: K) E1 O
- mov cr0, eax0 W/ y! R& C5 N& k& X
. B% f& R# C. g$ _) B- jmp pMod
2 d- U; h; ^3 E5 X" M3 e o4 T - pMod:
# M4 \4 F; S" J9 f- s0 W% E& K
" r' `- [ h% j4 r. h9 @- mov fs, bx
( a- k& H, M4 A - mov gs, bx7 `! k _8 i5 `9 y* r3 Q
- and al, 0FEh
+ g- n3 F7 d/ n: i4 H# w9 Z - mov cr0, eax
: q& [4 C! ^4 B/ X4 a3 M9 r3 i -
/ n2 D0 Y; q3 U/ `* H1 D$ r - jmp rMod- {; ]# q" r* m& q o$ X! m
- rMod:
% ~& n1 m2 h' H3 B" Z
: `- |- p! z ~, e( r3 F- mov ax, 08 k7 [% F% C1 J
- mov fs, ax
6 l4 I) N' O7 t& E: X/ k. c - mov gs, ax
/ q; D, v+ |4 {$ m" A% _% b - 5 G# p% _; u/ S
- ; 在2M的位置测试写一下数据
& S& k6 k9 V P; J9 X - mov esi, 200000h. P% x7 b2 @2 X' E [1 |" u1 \ V8 q
- mov dword ptr fs:[esi], 055aa55aah( S0 S! k4 w4 j) D4 j) m, q
- ; 用RU去看看200000h的位置是否是此数据....7 |% n: @+ r/ f0 h2 x3 ?
7 p* l3 a. v8 F( j0 h- sti
# h; t, V; u. ]+ U/ d - ret( Y, E, R) T7 u+ i8 R
- Set4gb ENDP% ]! Y3 {8 `; R
-
2 Y/ Q" V- W$ h q - CSEG ENDS ;代码段定义结束
$ T; o/ r2 F4 r6 A - end
复制代码 |
|