|
刚学习的同学,有些还不会,我这里贴点C和asm的代码。只供参考。
4 B& Z$ m4 m- b0 P3 ]
: J$ J6 D9 L( X% f这是C的- /********************************************************************
. y! j( K$ n0 C, t8 q' \ - * File: DOS4G.H *
3 |0 @9 ~' j+ s, Z8 [ - * Compile with BC 3.1 ( Editor: Tab size = 4 ) *
+ L+ D/ b1 @" w2 C6 o, Y - * *
1 U& e7 H- p/ \4 ~ - * ========================Title=============================== *
, r$ c+ y, b% X/ J$ m - * 这个函数是让系统进入DOS 4G模式 *
% y$ k5 s( j: `1 d - * 程序参考了:陈家琪《DOS实方式下直接访问4GB》 *7 x9 G% T/ i% ^
- * *) {+ Q/ Z1 q/ H8 Z, w8 S
- * 使用: openA20(); set4gb(); *
+ t1 l' o, f. Y* | - * *
* N. a8 I; n- @ - * ===========================History========================== *+ M- ^5 v: B. j9 B; Z
- * author: bini *6 ]- ?5 W! i& I1 ]
- * date: 2004-11-30 Frist version. *
; X/ n, \% A k - ********************************************************************/
{+ [. M h, j% y( y - . w! U& a0 ^! D5 C5 H
- #include <conio.h>2 Q- C3 }7 W8 N4 W! x; S# v9 F
- #pragma inline
/ l- k+ N" A y8 L/ H+ [. b
5 U9 n2 y7 F' G2 V0 F- /***********************************************
2 m; e' O" U: o# [ - * 两个GDT,第一个为系统使用,不管,默认为0 *
( R: I5 t, y6 b( s - * 第二个为一个数据段,没有代码段。 *8 H9 h' |* a# w) Q+ n- {& M
- ***********************************************/
1 r7 V2 v) o- F" j) J( |9 A: U4 _* L4 c - unsigned long GDT_def[ ]={0,0, /*系统使用*/
: s4 G4 M' q, N* w - 0x0000FFFF, /* hi16bit( 0~15 ) is base low=0,
/ k5 w$ H4 M& m V- T# ~ - low16bit( 0~15 ) is limit low=0xFFFF : P( j* _8 W! I1 W5 F5 l! [
- */$ Q9 h2 B) U9 s9 a
- 0x008F9200};/* 最低字节为 base( bit 16~23 )0 |/ v/ X& V J+ W
- 最高字节为 base( bit 24~31 )
5 C8 w0 U) i0 E5 T& M, ] {! @1 C7 ^# M - # Q X2 D9 A$ G% j
- 属性Attrib = 0x8F92
0 B1 I; ^! y5 `% m b% R2 Q - & d/ g: u6 g8 V: g3 z
- 属性位Hibyte低四位为 $ ]3 u! s' H/ ] m
- Limit( 16~19 )=F
6 k) U) w4 \' X, j& T" ` - 属性位Hibyte bit7 为粒度
, G: W$ |! {9 D3 F4 D- p/ K4 o - (值1=4KB粒度)
1 [% f9 q8 D0 n8 i - 8F & 0x80 = 14 q& ~7 u% N$ i( r& K
-
' T8 }3 U2 V1 S - 属性位Lowbyte低四位为段类型,值=2$ ]3 f5 S% c) z0 |, L( {* g
- 表示为可读/写段
6 @2 u+ C+ w- M/ ?+ B) @' ^ - 属性位Hibyte高四位=9,bit3=1表示:
. \1 D) Y: L0 {0 v2 q- ~8 h - 描述符对地址转换是有效的。% ?% ]$ \- w0 a( L
- bit0=1表示为:
( {; ?* a% m5 Y% H! I4 Y6 M6 L - 系统段描述符。而不是门描述符。
7 d* D/ d. G& v" y$ Q -
; `- C+ l' ?# M. R - */
- R' B8 O2 V) `3 i7 ^9 e" E$ ?
" X. Q8 t1 [- J0 i z- /****************************************, r: b3 @) b; a' A2 |& T Q
- * GDTR寄存器, 48bit=6bytes *( k( `/ ?/ k! z% u
- * +-------------------------------+ *) V$ _4 W8 j1 s- ]6 W
- * | 32bit基地址 |16bit界限| *
$ N% |, s) h4 c- g - * +-------------------------------+ *
% B1 i4 g8 \; B2 M; v1 s$ U - ****************************************/- a( H, K1 n( g$ V% m8 ^' ~. p
- unsigned char GDT_Addr[6]={0};
6 E S1 c) i: h, H. m* R
5 `' x: A9 a0 Y- S- /****************
3 Y$ Y4 c5 Z* G8 R. k! C - * 打开A20门 * U8 Q) g5 X, E& c
- ****************/# A* I( }0 I& w& A# [
- void openA20(void)* J. b! ~8 z7 ]7 A- D
- {
" u# Q; v' ~- y/ e3 p1 G - asm{1 M9 s6 T- d+ N% v& z
- pusha
" M. V: [6 o R4 {1 P - in al, 92H, ]' _( i! k9 R( m7 Z* n* O# _+ A
- or al, 0x02$ D! j A/ E4 k( b, Y7 k
- out 0x92, al% r5 A& t# x# H: J' r9 I( b5 F
- out 0xed, al
& s: b" f2 ?2 n - popa( ?: `2 v, X2 V3 s! M
- }
$ i) S- h4 L( z, _ - }
- _* z) S7 s# C; ]; J" n - 4 X- N% [; C+ G: W0 Z# J
- /***********************************************
# j) r' E! s* |! E/ ?/ _ - * 函数功能:进入DOS4G *# j* s1 q# F Q; r+ D l6 {. a
- * ==================== * J: w# J- V8 _/ ~1 b$ ^, |
- * *
5 s0 e2 p! x+ ?0 j; O( g - * GDT描述符界限计算方式:描述符个数*8-1 *1 S: L0 f* w/ m! x2 V4 n0 r
- * 如: *- @& @7 H$ k% u9 F! v$ Q- {
- * mov word ptr GDT_Addr[0], (2*8-1); *7 x* S3 F3 W4 |# p4 M
- * 表示为 2个GTD *
* _6 E3 ~$ |, O1 d - * *
6 |2 v3 O* `3 B5 x# e1 t - * 选择子为所在描述符内的字节偏移。 *
! c) {, g, w5 y: \/ w8 L, v - * *
- A$ b; E0 G: V& ?" U: N$ S - ***********************************************/
( A$ x2 U3 x3 Z$ k4 s! E - void set4gb(void)3 n, x* y' x. |
- {
. B6 h& t. R0 R3 k5 T3 E - asm{
t2 F. y8 Q4 n& ?: A* e: o- d - cli
1 J' x# B. @% j$ m( I0 ^0 ~ - /****************************************
- @. ^$ z8 O0 A8 D& E4 q+ o! H - * GDTR寄存器 *
6 g: |3 G9 P" U' E4 j3 d; g( ~8 z( ` - * +-------------------------------+ *% f+ t5 {$ o+ r4 O1 e! A5 J- D! A
- * | 32bit基地址 |16bit界限| *: i% p6 L5 U4 d* c5 u, ]& k$ y8 l
- * +-------------------------------+ *' I, z% y: @, M- l; K5 H& x$ e; {
- *****************************************/
) i/ U6 s4 \$ y3 i# G - /*********************& y) E0 ~- l9 w3 k4 T) N/ Z5 u
- * 得出段界限 *
# P! G% ^' n' n$ h/ \ - *********************/1 B2 u! G; T6 _! Y3 u4 R0 S; S& k
- mov word ptr GDT_Addr[0], (2*8-1);
/ M, q1 i. Z# M: o1 z - /********************************************
6 p% j7 G# O8 ~, m& {& O4 Q - * 计算GDT表的32位基地址,存入GDTR *! `% G) F% a) }% t) r
- ********************************************/3 _% x/ o( o1 l. {' l0 p3 G3 y7 T
- mov eax, ds
" I- _3 l2 y2 N! x4 m - shl eax, 4
. \1 p2 k4 f$ Z- k/ H0 ^ - xor ebx, ebx
7 m! w4 F# W2 J: u6 ` - mov bx, offset GDT_def
8 K8 y7 @ ~% y! M. l. ?& o* E/ {: i - add eax, ebx4 f2 W# {" T7 p, M, g$ j. q
- mov dword ptr GDT_Addr[2], eax [, W' j& \1 s- H
- lgdt fword ptr GDT_Addr
) `+ F3 X# p+ E7 M5 w - /********************/ Q# e! y+ x% Z7 [3 x
- * 选择子偏移 *. N6 C, S0 i# |# y- s
- ********************/
1 [: y' Y3 x- |, ? M9 G - mov bx, 8
( m4 o1 S, s; F) P& u1 \ - mov eax, cr01 Z |0 t: m& U- a" Z: Q* X' D% J! r
- or al, 1
5 O& ~( r$ k" Z% H - /**********************
E, l( y7 ?: V. H3 w i* f - * 进入保护模式 *
, w8 S! }* g. \ n1 K - **********************/
+ W" O' R) R! c( I- r - mov cr0, eax
* P' l$ J4 Q1 T - jmp pMod
/ O6 U9 Y2 v: Y' F/ \6 [$ @( u - }! k4 C. V8 g3 K: n: u+ o
- $ V: u3 z6 l; Z- I' k+ q& L6 n
- pMod: asm{
9 J" c9 v1 Z2 D& ], ` - /************************************************************
$ _' W+ `, d6 p7 d - * 让fs与gs加载选择子,使其能访问 0xFFFFF * 4K (4GB) 空间 *
0 E4 Y9 F$ i$ k* } - ************************************************************/
& I7 c" x+ d: t! B - mov fs, bx8 n8 {1 Q$ q9 u- T5 J- s
- mov gs, bx8 S3 [$ ^8 x5 f1 r( _( I- x( [
- and al, 0x0FE, {3 ~% p: S4 x
- /******************9 J. m7 E: W8 I1 _- l8 |8 b' y
- * 进入实模式 *
, e4 X; o' n( O& v8 \: _2 T - ******************/* B% a5 C0 }& z7 w* H
- mov cr0, eax' v5 |1 X! Y, m5 \4 ~
- jmp rMod3 {# i; H- Z2 l4 p% A; _
- }0 G9 }3 Q+ E m/ l5 }
- 1 c4 A0 P. R8 e! w- V1 M1 @
- rMod: asm{; K1 H. h: M8 e a! S" ]
- /* ******************************************************************
/ A0 o+ h' m1 O( q: ~# s/ e j - * 退出,fs、gs清0,访问系统内存可用: gs[32位,相对于0的偏移地址] *
: [: v) i0 E, ?& [4 R - ********************************************************************/+ P5 d1 W9 i6 ~1 B d
- mov ax, 0' L1 n5 F2 h/ ?; H
- mov fs, ax
9 Q, V# I% ?0 ]2 H) i' F( @; Y: z - mov gs, ax, J- e$ f0 I+ e; R! S1 N
- sti1 |; \8 @" V& N' n! I$ g2 f6 F2 M
- }
0 L! E3 [/ N2 h5 w- J. D9 n - }
复制代码 这是asm的- ;/********************************************************************
& {( A y; i: i - ;* File: DOS4G.asm *
6 O) g2 b5 ?: C, a1 c - ;* Compile with masm ( Editor: Tab size = 4 ) *
0 C' w5 s$ }: T: D% f8 G2 q/ ` `. b2 j - ;* *; q+ D' L6 ?& F* d) n! B
- ;* ========================Title=============================== *
4 e& o+ N! n2 G% k6 a- J, ? - ;* 这个demo是让系统进入DOS 4G模式,进行数据访问 *6 y. Y7 p+ ~9 C+ m
- ;* *
4 m: d9 p$ H( C/ i, `8 A - ;* ===========================History========================== *; J3 \! R4 \% E3 ^/ C6 U% t0 l
- ;* author: bini *: v; L- t" m) ]: `
- ;* date: 2008-10-08 Frist version. *& l- p' k+ U$ f3 d: H: g
- ;********************************************************************/
0 @5 x8 o2 {2 ?/ o8 w/ i/ p - .model small5 P! c2 D) `% K( M+ I
- .586p7 T; n7 Z1 O/ o
-
) Q" a( D# i& v" v' w. i - DSEG SEGMENT USE16 ;16位数据段
7 j; `8 y) J }$ s( M0 G; ^
% @5 R1 [; Z# z- ]- DESC STRUC
) `8 Q& n& {" b" s* B0 f# ` - LimitL DW 0 ;段界限(BIT0-15)$ ]! V* R- u% F$ s
- BaseL DW 0 ;段基地址(BIT0-15)9 [, i# d4 K3 a% A7 e e
- BaseM DB 0 ;段基地址(BIT16-23)$ K# q6 N# G0 J b% Z
- Attributes DB 0 ;段属性: z5 A6 d1 c9 w' ^; K
- LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
) R* [+ }! D! g0 W G! j' ~. j - BaseH DB 0 ;段基地址(BIT24-31)
) C* `% y! U. q) k! d - DESC ENDS0 q. E" E* a& r# l
- + m+ L F# Y. w: Q* l! x
- PDesc STRUC) ^. Z/ ?( I+ v6 i; }8 h
- Limit DW 0 ;16位界限& R0 q% W& W5 g9 O: o( i
- Base DD 0 ;32位基地址
3 R2 v! h! `' |7 W# p - PDesc ENDS( U' k6 v) k! U! h% x/ v! E2 X
- % h2 j4 ^7 {9 c6 B2 e. X
- GDT_def Label Fword# g/ g. c; E* U% Z" Q
- Null_Desc DESC < 0h, 0h, 00h, 00h, 000h, 0>8 \# R( l) @& b; S/ T7 C
- Data_Desc DESC < 0FFFFh, 0h, 00h, 92h, 08Fh, 0>
: o: Y- V" }; C' W - ' ` y& } e$ I9 U9 V
- GDT_Addr PDesc <$-GDT_def-1, >5 K+ p. m" g# _* b- ?
- DSEG ENDS ;数据段定义结束
6 Z7 [0 M2 |' {$ k( F. w - ! E( v9 K; T0 l& D% x6 J2 A7 J! B% `
- CSEG SEGMENT USE16 ;16位代码段
$ d) ^1 e6 Q: c0 _; }2 t - ASSUME CS:CSEG,DS:DSEG. p4 a# {0 {+ z
- .Startup* e7 q: d# s3 ?7 I* Q2 w1 P
- call Set4gb
: o4 f. J3 p1 `9 \ l - ;
: S( \, Q/ Q% } - ; fs, gs即能访问4GB空间
e6 Y' L! b: d- x" m - ; write your code in here.
: f x+ J3 i/ q+ E V - ;
3 X* @& `& v G, f0 v1 S - .exit
' Q& @4 D" I- ?% o1 j; _8 A& G9 I - 3 ]$ t, _7 h- E P- ^
- Set4gb PROC NEAR5 \* U8 w" ?3 ]) {& @* W6 c
- in al, 92h
- z: y, O$ }% ~1 A - or al, 002- h2 S3 C! I: g
- out 092h, al
: N% y0 V# l! d - out 0edh, al
. Q' K5 J% t- p* W& a* H+ q! E* ^9 V
8 X: J$ t Y+ c5 m8 F- cli
) g9 C+ y p1 o) C! w( E
( [) J( @% ~, e- ; mov word ptr GDT_Addr, (2*8-1);( Z" Y5 U1 W$ U3 w, I/ Y! x, Q
8 o) G+ A' c5 p! i# Z* {- mov eax, ds
: A1 Y8 P0 z8 l- C9 k5 G, } - shl eax, 41 Z+ e; w+ @: Z* P" g- J
- xor ebx, ebx
2 ?+ h, L. G, }* E - mov bx, offset GDT_def
; V% W- f; ^; t* \4 P$ } - add eax, ebx
5 c1 _) B& W/ ]4 p2 x2 u - mov dword ptr GDT_Addr.Base, eax
, N5 p7 A5 T( e4 p - lgdt fword ptr GDT_Addr! e; y+ S* _3 D+ q# p$ c2 f
- , A0 |. G7 z- K2 c9 u- r1 T+ L" {! a1 f
- mov bx, 8
, D0 J: ~& m) V9 W& T1 W9 R - mov eax, cr0
) u z& M$ @* G0 h - or al, 1
. m. X2 {9 w+ F5 C - mov cr0, eax$ ]7 P* T9 O1 j# u) g, \
- / y% B& u; }/ W6 m% d" ~
- jmp pMod3 P! T: c: C, h2 E& d( |
- pMod:
# w! M! ~( f' z
3 B; p' X/ G( O- mov fs, bx
/ |& |$ ^2 F3 K- {7 \7 f. n - mov gs, bx
8 n, n7 ? N, d - and al, 0FEh
, u [! b4 `. b$ j, E - mov cr0, eax* w, |1 u3 a( A) _' P9 P+ F3 j
-
- `. H4 O4 ~: B. f8 M1 {3 G! h+ E - jmp rMod/ k" Z7 [/ \% T% x3 ]
- rMod:
S* Y p+ M. S - / o/ i: k/ j( w2 {8 Y/ M
- mov ax, 0
2 C. L$ O" j. v% b4 @3 F, _ - mov fs, ax
4 I& e9 b8 ?. F/ I" o b& X - mov gs, ax
& S# r+ X' F# U4 L -
, F8 s1 s0 _2 N" ` - ; 在2M的位置测试写一下数据" ]$ S7 u4 d) K% U$ G
- mov esi, 200000h7 ?9 @ s7 O; P. M0 f
- mov dword ptr fs:[esi], 055aa55aah
' F5 I/ q0 f7 X7 T - ; 用RU去看看200000h的位置是否是此数据....
; |( K5 y- y$ m" z; | - & d% q; l- c2 x" y$ F' ~
- sti) e3 c! v6 }" m8 J+ g0 E* z
- ret1 j% |1 Y- W7 U! V4 g( F" B
- Set4gb ENDP. P0 F8 t$ R- E5 w& _
- 4 q1 `( w) t# S1 @0 C& J
- CSEG ENDS ;代码段定义结束
. q0 F6 B Q) X4 W9 {2 X5 z2 y - end
复制代码 |
|