找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 13784|回复: 6

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
$ ^: `9 u  K7 b# E$ M-s f000:0 ffff'SM', D/ |- f/ p; U
F000:BFB1' X5 q! Y( K- m" I6 z0 m3 U. W* X
-d f000:bfb0+ K2 Z: F. D. t) f8 `
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
4 e1 c$ [  w: I7 N+ c2 @F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
& k% @. s: x4 M6 h' KF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
% P  }* |7 E$ R1 [) C/ JF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
* `; `9 Q. `. R- d. [9 a2 PF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......$ Y8 o% f5 t, n9 |& ]: K
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.+ Q9 D( q/ w6 z5 M, ?7 @( _" @
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V" P: r- j0 U& S  _! _% b! W
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..: Y5 `) @4 n0 z0 d+ Z) `
-d f000:06f0
. Z! {4 R" a6 [F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................9 S2 u! q- Q6 |6 s0 R
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
) b3 \- _3 ^$ e8 t6 i3 {  }6 g3 n5 HF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
- z# Y% w1 S% s" YF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/20 R( J2 O) O! |; h9 c% p
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u  Q) x7 H/ T) P$ f& _& W
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...( r: _$ ]8 W( R
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu( h  F9 t* d# w4 A; @, z
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
- w. A* }5 {2 D4 y4 r. {
# @) X( j: |- G3 ?& o% U4 E5 u* ?0 h, v: K! i3 S% l! Y! T
我要读出这里的06f9:07, _: a8 ~$ R# H2 @6 q
然后得到一个(07+1)*64=512 这样来获取BIOS大小-! W( R. Q( n' z" }$ z1 n

1 l3 x( `, [: i; h0 M用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码  W  H% q9 Q# F. J
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。0 W1 b' m- L2 m$ l
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
6 M# v7 ^2 e+ ^至于如何实现,可以问google
回复

使用道具 举报

发表于 2008-4-1 13:23:53 | 显示全部楼层
楼主是做软件的么?
回复

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
' f- [$ Q, ~+ X( {0 o6 R.model small" S! {; j: y7 O% R2 z: a
.386
: H' n( z( ^* i' W  U, f.data
% y, h, U4 x) N0 g    SMBIOS_Sign db '_SM_', p7 w$ K; `- C' N( Q6 {
.code$ j+ E! Q* k. k. Y9 K9 _
start:/ P; g/ M- a0 g! n4 ]% ~' N+ t
    mov ax, seg SMBIOS_Sign2 T/ _3 K2 D3 C$ _) H( K- _# J. y0 O
    mov es, ax# e6 y; a) F* J9 }$ \
    mov ax, 0f000h& H" c1 J3 U$ q1 U' l7 A% b
    mov ds, ax; Y' x7 e4 {- k* R4 y/ q7 M1 R8 n
    mov si, 0
" t, u' G$ D4 d  O% @; |& A' _    mov cx, 04000h
, o, K  N7 c0 W$ a1 i; ^    cld
: K* k, {6 Y6 l' U@@:
8 c7 C) J- I0 \    lodsd; k7 V2 f6 }! V- e* L2 F6 s
    dec cx2 h. m3 I( M- }( f1 ?9 c" u! `
    jz  short @F: b  y$ N) A/ P6 O7 M* Q
    cmp eax,dword ptr es:[SMBIOS_Sign]
- x. H/ j7 t% O& g    jnz short @B
0 ?% C1 d" H& N! h; V0 [' R@@:( w& @$ s; ?) o9 v$ }# C; j
    or  cx, cx
1 }2 ~( o4 P9 h- Y. o( n) \    jz  short @exit  q/ B: Q8 j6 P( z
    add si, 14h
% [8 @) _  ^( n+ b% S    mov ax, ds:[si]+ B# O4 L9 C5 @% X9 q/ t% E' G
    add ax, 09h
- Z+ G; ?" Y: S) N6 _9 O( e2 I    mov di, ax
) C  s) _& k1 t1 }    xor bx, bx
. d9 }6 V0 m! o7 D( q    mov bl, ds:[di]
: o9 A3 N9 W2 d9 N; _" n    inc bl
- G- g8 }0 Z' ^3 h% B    shl bx,6
3 ?7 r8 ?" F- k$ e8 U. \% Z8 S* F@exit:9 a: Y9 V% u) J7 @
    mov ah,4ch
3 A3 O6 Y* v+ Q; z; ^& @    int 21h
  K9 Q& }: ?' D! ^- I. a+ {7 Oend start- V, L7 u- Y0 ]
cseg ends
/ U5 D# [/ [# \3 D% i- b  {+ f推测你的算法是:
6 t3 W6 T3 d6 Y5 t: N1 o" l) V; I7 g1.找'_SM_',然后在其后offset 18h的地方为下一个offset25 k% j5 x7 B1 R3 W: \
2.找到这个offset2+9的地方的值- ~/ O/ C( m& n6 Z
3.此值加一,乘以64为BIOS Size,在bx中.8 u7 e2 ^; I6 @8 [  i4 i" h- O% [
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT0 b( K: M' |0 [5 R* }
    ;此处输入数据段代码  . U" b- Y  u1 ^/ `
DATAS ENDS
: E8 `( x5 `/ f! D9 Q6 i" n7 ?; w3 M$ F; L
STACKS SEGMENT
  t9 e, p! t0 B, r# D, D  h$ p" ?    ;此处输入堆栈段代码9 R$ u: Q" a9 {2 C3 s/ r
STACKS ENDS8 v  b( i- K3 z1 |& y8 U; T5 f4 b) ~

2 D/ m; z7 V5 {5 K0 {CODES SEGMENT5 j0 P  W. M: ~8 E" w, d+ {
    ASSUME CS:CODES,DSATAS,SS:STACKS% ]3 u3 \5 }) T
.486
- V! S+ c5 N" USTART:
9 M8 [5 V7 E2 i+ H9 {' m    MOV AX,0f000h
" F, O6 @/ W4 v1 ^" d/ @- u3 d    MOV DS,AX
# ]5 l9 Y, r% X    ;此处输入代码段代码0 V. X* x, N! f* o
    mov si,0% i$ y* }" d* R" Y. x& L4 k
   last:
7 ?8 F/ p  I+ a% D' L    mov eax,[si]
# s6 s/ F4 i* [    cmp eax,5f4d535fh
2 ], w1 W! E% A0 q0 Y    je over
9 A. w- @' i$ K$ b9 J. n' k( z) u    add si,10h
* Q  a! s$ L. @. L1 f/ p% c    jmp last
* q7 [: k0 R: o   
: W- U- h) R& o; D    over:; u+ p6 A' q( k9 y+ F
    add si,18h( ^  W% G: E$ s# a$ O" n
    mov eax,[si]
3 s0 ]1 X; t& S1 E* j    mov si,ax6 f# k- t3 J% f9 x' h4 u7 u
    add si,9
7 @8 T, F9 I' I2 ?4 Q: t    mov ax,[si]
' A  E; m0 e* j! |# i% c5 o5 }    add al,1
9 C' O) Y% _/ m. l" @) S4 [4 o) T; v    mov bl,647 r) ^/ L+ {& A, p' I/ B, c
    mul bl
% O3 S/ f; \; V% p    mov bx,ax
# O4 O5 o( n- Q" F7 o   
8 W( [5 B9 S! V. F9 Q+ a0 P% x    call display8 c6 n. n' P% c( r, ?
    MOV AH,4CH
' O5 r# ^/ I: W$ }* R$ w0 ~    INT 21H  ) H3 p, r6 o1 t
   
1 l2 x( d- m! `2 b. N    display proc near. N% G7 a* x4 s
   push ax
: V# e, W  Y8 ?9 G0 z3 Q2 K0 g5 h1 H8 x   push bx0 O7 E) n7 i' c) ]' V; e
   push cx" ~& g2 x0 A6 {% R4 \4 [( \
   mov ch,4& y% `3 C' c/ d: X9 p* |
  rotate:mov cl,4( H3 x( {0 K$ T2 q/ r
   rol bx,cl
* E; L. m: I' z7 C8 [   mov al,bl. M$ s0 {, Y( u
   and al,0fh/ @; t" ^0 O) H* x( P9 d
   add al,30h
9 Z+ ~8 k4 R- z2 o  i& _   cmp al,3ah
4 z+ Z8 \/ J. v, V% E: q4 p   jl printit
5 Q# L- s8 w) {- _* b& v1 s   add al,7h
" N7 W# H  A5 C8 T; v  printit:6 p4 j$ ~8 \# Z% c
  mov dl,al
; L% |5 b/ |+ Q6 |* U  W  mov ah,2
9 X* q# p* y0 m! X, c. z) @! V  int 21h
( P, s- d) |7 u" F" A$ C/ D: x  dec ch! r  C7 p3 g$ {9 j' [8 m8 N
  jnz rotate
0 j4 b  m" c; C+ x; Z; j  I  mov dl,20h1 f/ l% N+ u7 R, l: Z
  mov ah,2h8 n5 H8 R  h; A# n9 X4 f
  int 21h+ C+ }" T% Y( x) E5 d1 w+ Q
  pop cx
. a" ]8 Y2 Q+ O  u$ M8 h4 q  pop bx' p& t# p/ o6 w  l8 y! n# v
  pop ax/ h5 q5 U; d0 l
  ret
+ ]* q  T0 K" i) }9 U# \  display endp
# J  e! O" F( }$ O  x; x. m$ Y6 n& e" y4 ^/ L
CODES ENDS9 l6 V- X5 b; N9 H* I/ Z$ N$ j/ |& x
    END START
* Y- @. U& N6 n7 W: l6 y" F& j1 T/ O* F5 _& \) }
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
( W% \! m+ X1 jDATAS SEGMENT
+ Z/ O! n$ l6 g8 @" f  l% ?& W  i    ;此处输入数据段代码  
) h4 U; c1 [6 q' i4 z2 B% ?DATAS ENDS5 M5 K7 X1 b$ `$ f, P" U6 y

$ k' F* Q: J9 b- q* gSTACKS SEGMENT- Q& {1 O  A: f7 ]
    ;此处输入堆栈段代码6 w% D, \* Z9 i' t+ N, h5 r
STACKS ENDS" d3 @8 x* z: i  ]1 h. J
" [9 ]  z9 K7 [8 D- I4 G
CODES SEGMENT9 {! l2 B/ \) Y4 n
    ASSUME CS:CODES,DSATAS,SS:STACKS
/ Z1 j  c& c$ C3 k3 `.486
1 G$ y4 j+ g2 w1 \: K+ fSTART:  l" l& O. j" e# B0 Q1 M
    MOV AX,0f000h; `! L0 {3 A, c8 D/ ?
    MOV DS,AX ...

% u, }1 C, {0 Q! M  z) }二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。* Y1 z' z; Q8 x1 w" A" j$ U$ m

2 p+ l2 a4 o5 V! l# a9 {% E! O还是直接读rom芯片参数最好
回复

使用道具 举报

发表于 2009-2-16 17:13:15 | 显示全部楼层
只是 在F0000h-FFFFFh搜索而已,这是smBios范围.而并未指定 其地址在F0000h处.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-5-16 07:34 , Processed in 0.068380 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表