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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:! \" @5 n5 ]  ~2 b4 \5 w1 V
-s f000:0 ffff'SM'$ a7 m, j8 e1 w( I: p' Y
F000:BFB1
) {2 N8 u3 ^% y# l-d f000:bfb00 }+ Y! a; m, |3 J2 S9 H3 [5 V
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
, s+ n1 G% y4 E- C& Y( YF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
; U  r" ]2 n5 x' N& BF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................" r: G" S3 |6 ]9 o. m9 H$ e6 e+ Z3 \, k/ t
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
% M1 S* ]! W# Z  x, r9 x1 A6 lF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
0 r  E+ i0 v. \+ X( u) N  b) pF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
. E9 m0 I& ~" {: k: [- VF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V7 z. {, V0 o  Z8 _- o: d
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
! ^* m$ |$ H9 v0 }/ s-d f000:06f0- q, Z0 i# l8 @: i3 T. ~3 O7 }
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
  `! U9 s  V* K2 ]4 x/ A6 CF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American" Y" u6 S8 Q$ F( [4 Q! M: g
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
& A+ V( p+ T5 E3 \; E) BF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
. K- s7 z6 O; X1 Z- K3 G# CF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u/ M- J% Q' K  D. F( `
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
( d" m5 G1 b0 Y$ BF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
/ e/ L* w5 [2 q7 m3 qF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
" d  e& R: K. \
, W$ B! H4 s4 U+ _
9 ?0 o2 o9 Q1 T  Y" s3 E我要读出这里的06f9:073 E1 v$ ~+ B5 V# G! }8 W% z8 D
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
; u- E: w7 p5 g) y
4 a6 }4 a5 G* C6 M- P用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
- p" f) {+ S) T5 ]谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
# Z  U+ y! ?( B: A' A正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
- I! k* x: C9 N  }( N1 m  B5 e至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:$ ^0 L( _* r* p, a# T6 w
.model small7 o: Q  |% u: e/ k; X
.386
3 l- o+ }- e, r' H& Q- t9 r: _.data
& a* }2 }4 v8 e$ K8 t    SMBIOS_Sign db '_SM_'
! B+ p8 p5 v4 O; W  i' B7 x! y.code4 X6 |0 o+ y# {% J0 |* j  H
start:
& }) \( ~: s: q8 Y1 e) B5 o0 [  J& ^$ f    mov ax, seg SMBIOS_Sign
+ |3 w) c# l& `: n) X- F/ u5 k    mov es, ax5 s; f2 m& M4 w6 }0 T$ N. _
    mov ax, 0f000h' l4 L) v" t, ~! H
    mov ds, ax
6 L+ B4 Z8 l: B+ e( r    mov si, 0* u0 D: F% O4 p. g1 t
    mov cx, 04000h
% _( F; W; h  d( p, R7 t    cld5 q$ _9 b8 g, r2 l) z
@@:
7 K. D) A& q9 U    lodsd
* u& Z% k% N) G2 j    dec cx# r2 q6 J/ b  f) z' u5 G4 P
    jz  short @F
2 `( ]$ b% T0 \2 J    cmp eax,dword ptr es:[SMBIOS_Sign]
- i- l1 D! Q: [- Z4 m5 r1 _    jnz short @B
: R9 V' k0 L8 G% u# f' H  M@@:" x# O( B- t" c( G+ l- m$ k
    or  cx, cx
/ W+ `% O0 G: S5 L/ A    jz  short @exit9 U6 o/ P- P: V
    add si, 14h9 Y: e  j' C0 j9 ^' F; r" ~( M9 `
    mov ax, ds:[si]
& w. m$ p: D2 m5 b: a* j: p# g; n    add ax, 09h
: G1 \2 }2 r9 R5 W9 P3 c5 p, j2 L    mov di, ax
$ `5 w0 q$ `) E# G# S2 G    xor bx, bx3 {# w1 e3 m! b) J2 d& X5 m
    mov bl, ds:[di]! {7 R; Y# m2 q7 e: s% R
    inc bl
+ Q0 W2 A' f* s* m    shl bx,64 [3 u- Y, H, Y/ y0 w; c
@exit:
- N2 @9 E7 d4 n    mov ah,4ch
. L2 }9 ^/ I* ?- U4 F# q* L    int 21h2 d, O; ~% Q$ [1 C3 n+ h3 Y
end start
' R3 V- N$ m7 n3 q% Xcseg ends
9 g8 G  w! |8 Z推测你的算法是:
: y( V3 b( l2 S7 g; Z- A$ z1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
5 ?5 t4 q8 w: z3 T1 d7 j- w0 A! V. B2.找到这个offset2+9的地方的值$ n8 u! o1 `: n; j' f5 j# {
3.此值加一,乘以64为BIOS Size,在bx中.3 ~2 S$ n5 n. m. ^& n( V
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT* o; U+ j* v1 C
    ;此处输入数据段代码  
1 ^* p- [1 r% @# ^DATAS ENDS1 _. n; o: Y0 I6 ~7 a' \# b5 S1 k

- K8 t3 k3 o9 r6 y7 FSTACKS SEGMENT
( e' `( I% |* a/ p. k# L    ;此处输入堆栈段代码( z0 t4 x; J! J* ~
STACKS ENDS2 C" m. P  k! q* M5 K- Z( q

) {# B7 E' C; D, Y: ECODES SEGMENT
# M* Z& v: d6 v$ t7 o$ |    ASSUME CS:CODES,DSATAS,SS:STACKS) b/ u) V* z4 S
.486  q0 y! v& Q. l, j7 U2 a& W9 |9 b
START:
# q8 \' n' K, g2 Q* x2 R  S! d    MOV AX,0f000h# U8 h. I3 F6 e. R9 @$ T) ?
    MOV DS,AX7 O+ k4 j% d4 C4 i! A. r. y' Q% T
    ;此处输入代码段代码3 X% {9 z/ `% T  O$ D! ?
    mov si,0
$ T, g' G( D2 ^$ c% Y9 i( _7 b   last:
5 t" f- q; `/ z) P# ]    mov eax,[si]
! ^1 w! ~1 J4 D% m1 C; n    cmp eax,5f4d535fh8 O" c* q6 A$ r2 o8 ~
    je over
9 v; e* M" Z, G& ]3 W  ?9 y    add si,10h
, y. ?( f5 ?# D. z, i5 e3 Y    jmp last0 V, C/ b; a( H) c! W: `# X( p
    ) f: s5 v6 E$ K
    over:
0 R) L8 H7 f" y5 @8 m3 z1 u    add si,18h
9 u2 P* r( h  @* D  _    mov eax,[si]$ F& w* D" L0 Q; K; \
    mov si,ax$ F( a7 l7 x% V- n9 p; _* |
    add si,9: @9 Z4 n$ ]' d" Z: J- c
    mov ax,[si]) B& w+ v/ j# J0 ]
    add al,1
* r9 M: p; o( e* M! y2 z# \$ K    mov bl,64
2 e! L6 a, i* g$ e    mul bl: _+ a& H8 R. B! }5 m
    mov bx,ax* e  F$ R- D. a" B9 s3 l* ]6 ?
   
7 o* {  @9 D) f8 w    call display
, Z9 V0 n; p! Z5 I9 A# m* D    MOV AH,4CH2 j, ?5 t( a$ O2 D# l) q( Y7 N
    INT 21H  
1 O+ [6 g2 ^  e0 L2 _& A$ M# t5 {    : i6 G( b2 r  f: t) w; |6 L
    display proc near
/ N6 K# ^6 r0 _   push ax
' Y0 H4 w* c, P; A   push bx, ]. x- {# w& ]5 C; l% b
   push cx
7 `2 c5 p/ h; f0 A: X) U   mov ch,4* Z, ~" I  j0 Q' S
  rotate:mov cl,4
0 D1 v0 n, u1 P5 {5 W8 s2 u& x   rol bx,cl
* P" H" H& M8 v: D7 K: Y; E, _   mov al,bl5 v& [  v( u0 T$ Y4 t6 U
   and al,0fh+ a3 r! J& j) W: K( L! W9 C
   add al,30h9 x5 h) G: {2 k# j0 G2 `
   cmp al,3ah
$ x& T4 u/ Y: X$ Q6 {   jl printit3 h- r" i; n! ?/ F8 e
   add al,7h
0 j# l% v' `) T7 ^6 `. j  printit:) Q* f# Q: i2 c& J$ H
  mov dl,al
$ ~0 l- M! f3 r( v9 R' \" x2 i7 N4 d  mov ah,2
" J! e# E% q2 {. e  \* _# }  ^  int 21h4 g3 V1 Y8 K+ t- t
  dec ch$ }2 u% _% ^, K
  jnz rotate3 z( N7 y5 x2 t; [4 m7 D
  mov dl,20h
/ M4 h6 q/ l& }  mov ah,2h0 W! C( o! F7 b( X8 Z# e& v9 Z; b
  int 21h
1 x5 y- Y6 C, t- p* [: G8 Q: y  pop cx
7 i) t9 q* [! d  pop bx
2 ~; h& U7 ]  i6 X  pop ax
0 M# T. m$ S4 A: d6 ]" I% q  ret/ }  @) f# q" C/ E9 q# B+ T
  display endp: h1 R$ [! k' y" A

( }8 ~: s7 g7 D% B) m# H! p5 JCODES ENDS
3 u* ?% J3 ?# M; M    END START" p- w* |# P4 ]1 j, g+ W
8 f( G4 x; g3 v- U
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
- [' ~8 Z# h' G6 s( XDATAS SEGMENT
; Z. k3 B3 T* E    ;此处输入数据段代码  
0 i6 E& ~) S, f7 b3 MDATAS ENDS3 Z2 o' i% C1 q& x6 H! x

/ L, a% O4 O( o0 `1 SSTACKS SEGMENT
% V2 i& I& ~- Z8 F    ;此处输入堆栈段代码
) K0 \" y/ e/ a) T+ ?9 iSTACKS ENDS! ?: n$ D$ B; [& U: b) n

, x( E# P  W& o2 S( |CODES SEGMENT
+ S4 Q1 G  I' ~* X* x& c! P    ASSUME CS:CODES,DSATAS,SS:STACKS
- l5 ^0 G9 I5 `1 t  D$ R3 e3 m2 o" ].486
' ]* _* e' d& n2 Z5 A: t& |START:
% T% W0 r3 Q; }9 [# c; N    MOV AX,0f000h$ K/ x1 g1 Z" }& y! t
    MOV DS,AX ...

3 n" G' Y. e9 s; |: J二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。& |0 X$ e5 E8 i; m: G& H

3 a+ L' }' G- M+ F还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 05:19 , Processed in 0.094089 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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