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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
. h( y# X" ?7 o9 U1 B. ~, B-s f000:0 ffff'SM', c. n  d  r6 F+ e: F# p1 g
F000:BFB1
) Q  K$ f# T: k/ V, r) m4 ]: r-d f000:bfb00 l9 K; H. C2 u1 i
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............0 X/ S. a3 z* S. ~; U
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
$ Q" e! F! y- GF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
- o2 F4 S% g$ @F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......% h. l( b! Z6 e& L
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......) [2 g; ^0 ]2 P9 |* H0 b0 ?
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.) s8 e& ~: y& y
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V/ D$ s! P/ E6 K$ {. E' C, c2 D
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
, B4 x. l+ _( V6 _, r% C/ y, i  U% [-d f000:06f0! |# c9 H; Q7 H' a8 x3 a
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
9 E2 b1 h, ]# H$ wF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American- s4 l: D) P3 E& ?
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
3 G+ A6 e3 B) C, e( iF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
6 L* @% k) Q/ ^; T( K5 g3 a. E; mF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u  N  Y: g3 i% p1 V4 p
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
9 i( Q8 x/ g. ~& O+ q7 S; n4 \F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu4 o9 e: z7 ]+ b. a$ D
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
1 o# a  g1 q0 l* w& G4 ~6 ~) }1 p4 B0 z# l) H2 W% x/ f1 K, Z6 l

+ g# `9 I1 c. Q0 k* H我要读出这里的06f9:07
" o; Q. L& x4 y 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
6 Y4 |4 ?; l# Q8 N- h+ C
  s8 R2 L. V7 X: X' |. o用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
- m2 S+ D$ l: s4 n谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
8 H+ L3 k% H% J- O: B$ g6 q& u2 R正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。5 Y- Q; }# n& n2 u- F$ M
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:* A5 e; a+ L: S6 I4 X! K
.model small6 C) o' C  o/ M8 ]' q
.386
( i5 A& ~( L% i.data* P0 `( r6 }5 \7 m
    SMBIOS_Sign db '_SM_'; k' f/ N/ o; u( t% y; P
.code$ t5 R- H0 I' k" ^) K6 ~; Q
start:1 e/ I; G6 R" Y. w0 P
    mov ax, seg SMBIOS_Sign- a9 I6 D& d( v3 b+ S& z
    mov es, ax9 W; h. }9 Y! |" h
    mov ax, 0f000h
0 o' V# E( {  \8 n1 h0 h5 q    mov ds, ax% k6 H4 M8 r7 m6 i4 k
    mov si, 0
" T8 I" C- O3 [/ K( e& G    mov cx, 04000h
, f' T5 u) L$ l    cld- @1 C! h/ T; b2 [. }
@@:
3 E1 a/ f+ f4 `6 U" t! `    lodsd7 k2 F8 Q6 B* Z- l, J+ D
    dec cx
( ~( m- i6 C8 e5 k  a) [2 |    jz  short @F& |) N6 ?: U( k1 ]) G
    cmp eax,dword ptr es:[SMBIOS_Sign]
" v3 z5 I( r  f( p! ~9 }8 {# ^    jnz short @B( Z: \2 L/ @+ _1 F
@@:
$ |  n5 z8 a1 |: O5 }& _% K    or  cx, cx) J) Q/ I# ^& O( w/ L8 n# `
    jz  short @exit4 X& h5 @& J' e4 m
    add si, 14h
/ z$ q7 ]2 H9 p( t- Z' n    mov ax, ds:[si]
6 V5 \- [( q. Z8 R9 j    add ax, 09h
& h6 b" T+ f- P8 z! A0 s) P+ e: P9 j    mov di, ax0 B& b5 V# P2 ~( Q2 ]2 Q+ J; x; ]
    xor bx, bx
# N1 Y5 F  i: T5 |- q" X    mov bl, ds:[di]
' Z# c+ j$ `2 m% J) B    inc bl
7 k; f3 C6 W- E% l& B* i% x    shl bx,6! G" ^) C# m3 q+ e
@exit:
, N( I0 p2 @# {7 e    mov ah,4ch1 \  S! I# W3 S( _
    int 21h3 l% Y$ b2 F4 R: Q3 V
end start8 P/ W! S! b) w/ W' |
cseg ends5 v" c# L9 a& N9 ?
推测你的算法是:
& ^6 V; a  |9 v* Q! m# M* J1.找'_SM_',然后在其后offset 18h的地方为下一个offset2& ?: ~* ?0 {' y3 q
2.找到这个offset2+9的地方的值
6 Y# R/ E0 C+ D: j1 Z/ y% `3.此值加一,乘以64为BIOS Size,在bx中.6 w) o4 c. a( P+ M( a% |
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
" b; n8 i% @/ u) Q- P/ E: n; b2 {/ ~    ;此处输入数据段代码  4 N5 m2 G  \6 g0 l
DATAS ENDS
9 [$ I6 _7 \; e0 V) {
- |5 A  J2 W, s0 k- }; gSTACKS SEGMENT! z4 G; K2 U& c' [. N/ u
    ;此处输入堆栈段代码
; C+ N" G$ @# l! t  c) P5 q: Z1 gSTACKS ENDS0 w6 T& R* q" W, `
4 t5 c$ Y4 V' n& t1 s4 R: W
CODES SEGMENT
9 ?0 P( c! ?  M/ ?9 j    ASSUME CS:CODES,DSATAS,SS:STACKS* D" _1 D8 d4 T- s# ^
.486
: O% l1 l6 C" D7 I  i4 VSTART:
5 f& F, q  f' L( f    MOV AX,0f000h
% @2 g3 ]6 O9 d& u9 a5 B( s( l) Z; b    MOV DS,AX/ _. N2 ~- j1 ~: V9 K! {9 R7 V6 b+ m
    ;此处输入代码段代码7 Y) M* c+ H# y9 b
    mov si,0# L* E* q4 z8 h* L
   last: , V5 ~, m' J1 o( z- C
    mov eax,[si]! t- w: \3 Z6 Q+ a1 ?, t
    cmp eax,5f4d535fh
+ Q$ w1 O, P$ z& V    je over& T5 X- _/ o- o* L& b
    add si,10h- ~/ ~0 j: z, L% f* [0 Z
    jmp last$ x8 |6 v+ z7 _, k' i# x  X
   
5 l( Q) U* V# M# b7 F    over:- S3 h7 T6 I. S$ V+ f+ K0 J# M
    add si,18h
; w9 s+ y0 M& z( c    mov eax,[si]  M; ?$ R/ o6 E- A$ B/ f( U9 Z4 t2 e
    mov si,ax% p8 y- o! M. Y' a  ?
    add si,98 G5 u3 v+ S9 q3 H$ |! Z
    mov ax,[si]
( c, x9 d1 ~& r) Q5 i    add al,1
6 ^+ _# z7 k) b& ?6 c( ?    mov bl,64
7 F) h! n; F4 f7 s" K2 e- m( D    mul bl$ H) |2 b3 J' t! z* a9 m: P' J
    mov bx,ax
3 ?- e, D# g5 H3 W5 y: @   
/ y3 |9 _- D" F3 `& T2 ~  l# i! ~    call display
. n# e, z/ V3 [* c" U    MOV AH,4CH
( e4 O+ k+ t0 M/ c0 o    INT 21H  6 O3 |0 r: j/ a2 p6 N& d
    . y8 y; r8 c  I: u( y
    display proc near: J! M8 N  k9 a& @8 x3 u
   push ax9 j8 d1 Q. L: u& @0 ~3 \5 i' a- v" r
   push bx
# j  N4 [+ u; T/ J5 v! C; T' K: m4 G, {1 C   push cx# o! X; g5 n  @8 P" `' S5 b* c: g
   mov ch,4& _& a  G$ s. ~, c% B/ P
  rotate:mov cl,4
. v8 Q! w$ U$ f" m4 l( J   rol bx,cl
" I$ Y; L! j& l! D% s# e   mov al,bl
4 ^; {! a/ ]" N3 {* ~( ]# _   and al,0fh
$ `5 d: {% t$ p5 r; c3 ?" m) W( A5 H   add al,30h! U. h; I- ]# D3 Z4 V1 ]$ S7 w  |
   cmp al,3ah
* L7 b5 m" N5 n3 d   jl printit
+ c1 V- F4 w# ^5 L: T- d# _   add al,7h4 I  P  d( ?4 O4 @. s
  printit:
' |. U" ]2 b* e  mov dl,al$ h. q+ w! H$ g3 O$ d4 X3 {
  mov ah,2# Y* I/ P5 s" D
  int 21h
: a, v" [3 V5 d3 R4 d  dec ch
1 v# s8 M3 A, n  jnz rotate" A- Z! V: @! B2 V
  mov dl,20h, @7 d; }) T/ u9 H: p! U
  mov ah,2h% ]' m  Y7 T6 k8 Y
  int 21h) M5 s4 o. c2 f5 Y* s7 E5 M
  pop cx
# @* H4 h' t, Y+ J6 H2 w9 x% S  pop bx4 o& I- f  }& N  g4 f6 O
  pop ax1 u4 w5 M' L7 D2 A3 D' `3 i
  ret
6 ~2 M; G9 `+ ?8 U( Q' L4 o, \2 p  display endp+ p. w( t7 N( Z) {

  W; _+ X/ M" {2 gCODES ENDS
! Y7 ~1 \2 ?% i7 n$ O) q; L    END START
$ e( K+ ?. J$ P& d% x, P
6 N, h% U, L2 ~/ B运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
7 A9 O4 H5 u; G* _" j+ A5 [9 E9 uDATAS SEGMENT
, B! t. k, j1 G; F% E! B9 v, u    ;此处输入数据段代码  " J- c& E8 a' j# a2 V! i9 u
DATAS ENDS# v. n4 Q9 r  K; D# q

; L' [6 }% V% c. {$ NSTACKS SEGMENT! A$ I& P4 S  Z" p3 ~9 `* H% c
    ;此处输入堆栈段代码
/ u! }8 }- l  R, e; B% W9 x5 OSTACKS ENDS0 F7 a7 t5 X/ j6 l
7 O7 ^8 H$ S9 E8 P6 H: y& _4 `2 L
CODES SEGMENT
/ U/ }  J# }6 m    ASSUME CS:CODES,DSATAS,SS:STACKS8 r% q1 |! D! \) w. N( Q$ A
.486
3 d3 z7 N# p. b. H& hSTART:' D8 i8 l- E5 h0 f! n. D5 |
    MOV AX,0f000h
1 H' Q7 q9 {- ~1 h. E& D    MOV DS,AX ...

1 K3 ~( ?5 Z6 d% b* i; r二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
* \. U- r5 O- f, Y5 ?
+ H+ m- `  L9 C! [还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 03:26 , Processed in 0.042646 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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