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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
4 ?. l  t1 U% I" G4 B-s f000:0 ffff'SM'
# F8 H8 p/ O, }3 s/ a/ M  AF000:BFB1
* q5 I  b9 }: u) R# [/ I-d f000:bfb0" {# G- ^) X$ D& M4 t$ B$ |6 V" `
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............! l! J0 U$ ~& K
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...' _' ^% K1 i( I  @1 n  m
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................/ q' {% C* ]1 J% X) P
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
/ o: ]; W. l0 i' [9 r  kF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......5 ^! R8 v. r. w# A6 Y# R
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.$ g1 d7 v6 Z7 J5 e( h# _5 _
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
0 t/ M0 U$ r' v+ `$ jF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
/ f# }- ?# }+ t9 o, i6 F/ X2 F( x-d f000:06f0# m2 P+ B( }& k. f2 H
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
& \. j& Y9 q- ~1 SF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American' F4 R; |1 L8 t3 X; T
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.- d) V! m% Z5 E4 V8 _: O8 ?
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2/ {1 n/ U7 h/ A! v6 u
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
( ]# w; a5 w4 F9 G! }; q4 v8 eF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
. t, {' j4 p0 p3 c/ NF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
: E* o7 Q. K- f! Y# m6 a$ uF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ: \  ]  }! g4 H8 N6 f" p
9 w. z; U# E- n/ A% _7 H1 d

& `" V, d; A/ A我要读出这里的06f9:07* c% C" X* P8 v8 i
然后得到一个(07+1)*64=512 这样来获取BIOS大小-6 g6 Z' _% X! K1 y4 Z, Z6 z4 B) E

1 @0 k) Q2 i* w( a: v% @1 @用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
! ?1 `; m) J5 j谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
0 e) s0 Y# Z" R6 U, F- k$ A9 p' u/ M6 r正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
8 @4 m( l4 V" p3 D' [至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:: c$ o4 W3 S, H, N! Y' F1 j. ]0 m
.model small
8 A2 d+ t' U% o4 e) l.386
3 x0 x& k4 v8 R  _0 \; }0 ~3 Q1 h# R.data0 V2 {4 A+ P" q. M  f
    SMBIOS_Sign db '_SM_'
, j( L/ ?7 r5 j- r4 U4 x% l1 d.code
. l# ~8 a+ ]) Z0 q; |start:& h$ N+ H" ?# R* P
    mov ax, seg SMBIOS_Sign
# ^: Q- M% |  G5 |- A: A- @    mov es, ax: G: Z) q1 N: k4 I! R/ D2 B
    mov ax, 0f000h
. H9 v8 o' B; u9 M4 D$ }    mov ds, ax
9 K% X6 r* q4 o0 q1 A# Y: E    mov si, 0
8 O4 N" I2 @. a+ S0 @    mov cx, 04000h
2 J9 K3 L" n/ H) D! @/ g    cld
5 U" [) r' o" m2 v5 o/ }4 R@@:- f; A( }6 p6 Y" Z* y6 z- h+ |- [
    lodsd
, s5 f* ^) E% W0 N  n' p) @    dec cx
8 `) ~; N5 @+ n+ m0 ?2 ?7 e    jz  short @F' O$ z4 X, T) o1 f0 S
    cmp eax,dword ptr es:[SMBIOS_Sign]
* D6 l+ o. f9 [* F    jnz short @B2 B) w# O1 X* U1 c- O0 {
@@:
9 t8 w$ I- Z( H1 q; n& |; d    or  cx, cx0 V& k8 A; J3 O
    jz  short @exit
' ~1 E, {- v$ l    add si, 14h& l2 \6 A0 ]4 Y) Z
    mov ax, ds:[si]
8 L- L; e/ e5 b, I' p    add ax, 09h
7 h/ b  L6 }" }! s    mov di, ax+ Q" e, |2 w/ N4 M# T
    xor bx, bx
% j# m! v9 {3 o( L# Y9 f) k- v# i    mov bl, ds:[di]
- c, v& }* w, ^% j7 f# b* L0 j    inc bl
+ J$ u2 I7 \% l/ ~1 k& ^, C; o    shl bx,6" Z  P1 E, R) k4 c' X
@exit:7 R3 x5 Q7 I9 ]: m8 U+ @
    mov ah,4ch+ W% A5 w9 v1 W( ^: c7 S1 d5 _
    int 21h6 I9 i+ p4 l7 D5 b5 k  S  y& ~, r
end start
+ v( Y* c3 V/ z1 x! F2 Y1 wcseg ends- m: k4 ]! Y. M( V) m8 i
推测你的算法是:
. T  z" g( `9 B# f9 o1.找'_SM_',然后在其后offset 18h的地方为下一个offset2% W  _* W% @4 j  \: ]" J- _
2.找到这个offset2+9的地方的值
# S) N1 L: i: k( y7 ^3 K+ R3.此值加一,乘以64为BIOS Size,在bx中.1 v, Z& o8 J9 i9 _4 f
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT, |: {8 C- I" Q- j: `4 G
    ;此处输入数据段代码  
  K" H2 W9 f% o( xDATAS ENDS3 P) [5 D! q8 N+ E- g7 q6 W8 K4 h
7 w+ t' `& O- F; s! \
STACKS SEGMENT( r5 u6 n$ L9 ^  v. D4 ~
    ;此处输入堆栈段代码
. l) G) ^2 u& M4 G2 z/ e0 h( r$ t7 zSTACKS ENDS* ^) C4 m) Q, B! M

- X8 K, g& V) w0 g, g8 UCODES SEGMENT
/ @& m. Q+ z$ J( j- {    ASSUME CS:CODES,DSATAS,SS:STACKS9 e5 Z8 k; e3 k! l3 \  x
.486' u9 x# [; k* Z* U& c  z) @9 `
START:
/ R! J; A. c0 ~& e: I3 k    MOV AX,0f000h1 Q9 ]4 r8 {0 J
    MOV DS,AX  p7 H3 `. W% {) R
    ;此处输入代码段代码
* L7 L6 e0 s& z! ]- h+ v7 k    mov si,0
- n( f% n8 S! c5 G   last:
- a$ V6 ~1 T, U: H) X/ E! t. ]; B    mov eax,[si]
5 O6 F9 ], \, ~+ ]0 S    cmp eax,5f4d535fh* _& Z3 F! I9 b9 F  T
    je over! x* {# ], H  y: @% i. s
    add si,10h
) W$ H( I1 N* f8 E/ L/ k" b    jmp last
1 Y1 A6 O9 j& R# r   
# a5 q. P) H/ [) I, J  W    over:
1 v0 F. m7 t/ z5 P! u7 J8 r- {5 h6 f    add si,18h, i' U4 B) P& J* _
    mov eax,[si]6 _2 K$ ~' k. V/ B
    mov si,ax8 [4 ?5 u. c4 `0 @. i- P
    add si,97 V- E9 f. t* C# P& u! M- u4 N
    mov ax,[si]
4 E  I- X+ G$ c8 N- N    add al,1
$ K  N0 g: {. i4 }2 k5 j    mov bl,642 w: n/ o# A, ~: C+ S
    mul bl
2 v  ^8 }8 Q7 g* M/ x    mov bx,ax- {( K3 J2 B$ G* ~  a% M5 g+ K
   2 N+ R' K% Z. n& s; D* F6 |
    call display
* }5 M- |* L1 R! w    MOV AH,4CH
$ T0 k* U/ @4 y3 o$ U7 h    INT 21H  
) Q( Z+ U5 j! o3 c+ I   
4 F) M( b6 T4 r# v9 G8 E    display proc near
# q( N3 p+ ]! m9 p   push ax
* q" |  a3 r$ p3 d7 B   push bx" R* k2 X6 s& g& K3 z
   push cx
; U  }. `6 \, `; a6 b: O/ J8 j( Z   mov ch,4  t! T8 v7 m1 @7 Y: T
  rotate:mov cl,4
/ g4 v" a+ m4 j- I$ d3 Y   rol bx,cl$ C+ `" E/ |# t) h" _
   mov al,bl
+ {2 J# I7 L4 s2 I: z8 Y; |8 V! y   and al,0fh9 s& I( C& Q; G2 U
   add al,30h
1 Q. ^" H0 Y. ]9 C# b" f# k   cmp al,3ah
. Q* F. |5 s( a& V   jl printit" z& B) A$ @; s5 v0 Q
   add al,7h8 J& i% V6 O. G2 ?6 J, I
  printit:' F, o2 Q$ V% X- S
  mov dl,al
, v  R& @5 Y' K9 y5 F+ r3 j# `; f  mov ah,22 N5 F) X  d6 T% F6 w( ?/ i
  int 21h; O3 `5 u: M+ d+ I# |" _- U4 P
  dec ch
4 E, D6 e0 }/ J% ^6 ^& Q; f  jnz rotate( X7 u3 H  N! V% ]/ z7 v7 w
  mov dl,20h
- y3 S: }. o" B7 H' R  mov ah,2h) p1 L6 K$ H! ^% n8 O( N% R5 \
  int 21h7 `% D% d* E/ \) i" W
  pop cx
" \5 i. e6 z+ Z! Y  pop bx
7 Y2 i$ I! n/ R: [3 B" j0 Q  pop ax$ [* L0 m! p6 K0 \' o2 J
  ret
, `. ?- C0 c; T6 h  display endp3 Q) A( ?9 ?, ]+ R
. W' t2 J0 E: K( B, F
CODES ENDS6 n9 @) b4 r% g
    END START4 L) Q/ q- [8 i- B8 [% I, Q2 w$ ~

# W; F, ?# e- P" h$ C运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
6 i/ {' N' [, qDATAS SEGMENT. K+ X, y0 W; v! v% \- j. D
    ;此处输入数据段代码  + ]3 z5 a. e$ p4 x
DATAS ENDS8 M# i  k! z( Z. @0 j

$ |0 M+ y  v. vSTACKS SEGMENT
# G+ D7 ~3 t' z4 S' f% p! V    ;此处输入堆栈段代码% C, s, F& m) v
STACKS ENDS
/ |: i: }) ^/ A4 I+ j2 c
8 b3 k1 e: }2 @+ D: J! C" A: \3 ECODES SEGMENT
0 x1 [3 x3 T' ~7 L( i) g0 q' ~% p    ASSUME CS:CODES,DSATAS,SS:STACKS
2 e3 o. p- W& s4 c.486  P4 d1 L) n1 Q7 J3 m% M- r
START:
: P& E* H; _  z3 n+ Y    MOV AX,0f000h
; |3 e1 Z5 |2 Y    MOV DS,AX ...
" y8 y6 w8 i( S3 `- L
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
) x& S& Z' I+ d9 ~8 ?0 o+ R, G1 y( Y! i8 p7 B1 A7 j
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 09:59 , Processed in 0.082252 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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