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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:) @5 n) y# c" Z! D# R/ F8 [
-s f000:0 ffff'SM'9 k& l7 @6 F  F" Y1 h$ O
F000:BFB12 |( R+ @) ~1 ^! J4 I/ f
-d f000:bfb0
1 }% u- r/ S3 r: ^F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
( X3 r7 m  q4 `: }F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...: C5 H. ^* n3 p/ E! _/ Q
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
! b. g' z* I/ n  I* W& ?" o' v! D7 _F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......% ]: y, f' `* @7 P* n
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
  \, e! v9 E7 m0 J: ]F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.' k. r8 d8 H0 j' f, f% T
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V2 {5 e! \8 w2 @4 g9 Z% f  }
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..5 [! b/ [- l- z6 b0 I7 P( }2 Y  m
-d f000:06f0
8 H' g% p4 u7 d1 x- u. hF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................7 f- P" Z9 q9 I! v& Z; w) @( ~
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American8 {2 G2 g, t. Q! {- A
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
# c) ?! F2 {0 c1 n: RF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2- h7 G/ L% z2 r, N' h
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u/ N5 M" E, G( V7 Q4 ?$ \
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
; i. M7 W# k2 oF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu+ L5 J# u( E: `; t& \' V
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
  j$ O7 s% f: d; c( i' G4 r$ t4 E6 T' C! o0 p8 p

4 }7 Y8 L. l! r8 R+ \  I我要读出这里的06f9:07
8 \$ Z! E2 S9 X; z. w' R5 h0 E) s/ a# ? 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
5 q) k$ P- v: o/ \
$ a9 M4 w- P/ c! m用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
* e' w% _6 ]0 x* n7 p- Z谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
- M4 H6 [2 P3 d5 r. w; E$ y9 A# g( N正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
* f! s* q/ S* Z# i$ R4 K至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
, k* A) s6 p# S5 G% M.model small7 k  y3 R: O" q
.386, h( A  v7 n8 F( O+ d
.data# e6 M/ m6 @1 G) {
    SMBIOS_Sign db '_SM_'2 ~# H0 F% H/ S* |# r
.code
) q+ U7 t" Q4 l( kstart:
& G0 t$ ]+ `* G, X, q6 Q$ Q    mov ax, seg SMBIOS_Sign# o- Y5 {: Z9 e' |3 K: S
    mov es, ax( A5 X' ^/ _( j) D, O5 M
    mov ax, 0f000h
4 J* Y  P5 l) w! p, V8 J2 y    mov ds, ax
4 s# q% Q2 d0 j- o5 C* T( Z    mov si, 0
+ b' X' c+ q1 y& ~  Q  O( |    mov cx, 04000h
- n& q2 I5 B: R& r: m    cld
! h- D; }- I2 x/ r( j@@:
8 N- q1 W% i; ~$ x- P- P1 ]* n    lodsd
. s9 D$ `+ F: Y9 C( \. Y8 O7 Y1 u    dec cx9 ~5 B" I* }) ^9 C1 |5 c! E& A
    jz  short @F
, C4 M0 m& b. |' b9 U) p( O    cmp eax,dword ptr es:[SMBIOS_Sign]& L. A8 {4 E$ Y* a5 Z0 J$ e, X' E
    jnz short @B
5 r( j! d* x' {@@:
" A! ^. z; K8 J    or  cx, cx( H) |- `0 d  ~; T3 b, @& b' \+ O3 \( n. U
    jz  short @exit- |% `% c. E& k+ |; i7 }  \
    add si, 14h
' I: d5 c$ i* j3 g4 I  D4 l# L    mov ax, ds:[si]
/ \; D9 q# ]5 f8 K1 S! j1 K    add ax, 09h! Q! v9 \. W8 C5 \) ^% O* h
    mov di, ax
0 c; x' `9 h/ w/ t    xor bx, bx3 Y% \' b) |, W7 E7 d0 j
    mov bl, ds:[di]+ i- P8 P& H, a" j  U- L% s( @+ O
    inc bl; n) K4 d# P/ B; a' c4 ~0 X
    shl bx,63 ?/ W( z: a, s# R, a# H
@exit:. M: \& z2 o- ^  b0 A
    mov ah,4ch
$ @+ r; W3 I1 h* {" n    int 21h
0 @4 X8 f6 g& ~2 Qend start
8 r! Q( `) N  B% Ecseg ends" A' Z) o5 ^: L5 ~4 X3 u
推测你的算法是:
' m1 h6 d: O( ^1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
+ j) f% O- d2 X3 Z2.找到这个offset2+9的地方的值
( c8 ]: }$ y% S1 i2 F3.此值加一,乘以64为BIOS Size,在bx中.* A2 s$ X! I+ o4 E: K& s
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
0 o  i7 N9 x$ U8 L    ;此处输入数据段代码  
5 y3 ]. \: p  H  I7 T/ yDATAS ENDS
% {$ F; V1 J+ x6 a2 Y
/ S/ W4 p8 K, A+ K+ KSTACKS SEGMENT# p. y- S: {5 g5 o1 C, c
    ;此处输入堆栈段代码
: E6 L) ~/ z; x: Q; T( tSTACKS ENDS
1 e; ~2 R/ b* @5 X, N0 L7 `! b  i8 b
CODES SEGMENT
8 }. ?3 X$ [6 ~3 Z1 h+ ~) z    ASSUME CS:CODES,DSATAS,SS:STACKS
- A; c6 A: t+ q8 [( O: Z3 [" I( s- j.486
. C& l. n' w" P/ N! kSTART:
0 M5 c2 N4 w7 L% d! k& W# C( b    MOV AX,0f000h
2 _! ]) `" u: y0 a0 u6 u    MOV DS,AX
4 c9 m7 r5 o7 n0 x* @+ i0 {    ;此处输入代码段代码' v8 ^. z8 l5 ~0 c+ |4 ]
    mov si,0
8 q2 I, V6 s9 f% B' A+ ^) u% D, y$ O& y   last:
# B& N( J- H3 h' c, x# [    mov eax,[si]
% U0 Q$ f! X; l8 g9 O+ F) C, F    cmp eax,5f4d535fh9 T& n9 P, i6 x+ Q8 c% L* k
    je over" x& D- t/ R% V+ I+ @' l  r
    add si,10h
7 w8 u( q+ P3 a/ e8 d    jmp last% E+ J- }2 y1 [
    ; I4 q+ q2 P/ i" O/ R( T
    over:
1 T: y3 a* N6 J2 H, v$ u    add si,18h+ |* \- T' _. k, q, G1 S
    mov eax,[si]
* d6 J% X7 e+ a4 s6 {    mov si,ax! W8 Z/ Z* n  d
    add si,9
4 g6 f% E( }' k+ m& i    mov ax,[si]( t* [3 d/ I: o( S. X
    add al,1: M( Q& I* o( g! R; q: [
    mov bl,64! y4 b9 m/ b: i1 j6 E
    mul bl4 _+ ?" C& s! ^2 F+ z5 c+ U1 n% ?
    mov bx,ax
- o. O" T& f& I6 o   
+ Q3 z1 l5 l9 x, t    call display
6 c1 b* G/ C% E5 n7 q2 Z    MOV AH,4CH
, f/ |3 @6 Z9 |5 }, c/ z4 L+ B! q    INT 21H  
' S5 M- i* E& f2 y% U# J2 L    5 g9 j: [8 Y( Z  s* E
    display proc near
, p5 I+ f% P4 H   push ax  X% I' t; ]8 C- ], n7 k! D
   push bx
) T7 Z5 i% n! @3 Y: M, s4 }7 U   push cx
9 i+ ~% ~" [  J# S   mov ch,4
2 l: |( Y& F- e+ ]  rotate:mov cl,47 k# `" k8 p/ ^
   rol bx,cl7 f' W$ z8 }2 Y, R: G5 z3 j
   mov al,bl
; E8 ~2 V# s% H, j- |9 Y   and al,0fh7 P: H" j: d, Q3 `8 V0 T. m& [
   add al,30h
% D8 [# E: g9 A/ b& v' Z" y  w   cmp al,3ah* A  B; r6 H, A: M% q; _/ `/ h) K
   jl printit
( O; U& j) R* F7 M  {/ E2 V. w   add al,7h
' X( R  }' W7 A  printit:
6 S/ e5 t/ c! c: P0 F7 N  mov dl,al$ l) a4 Z: \* C* I( l
  mov ah,27 j2 ]3 s! |) r0 s
  int 21h
0 t) t) O4 x" J* U3 x; r  dec ch
+ y* p3 `' K5 I$ Z& r" f  jnz rotate
1 s1 s! b  u. e6 [% {1 h, y; |' v- \* _9 a  mov dl,20h' c# ~7 o7 L. J- h, D
  mov ah,2h
9 U+ q' J* e7 ~4 b( d% [# F; F  int 21h( j( v0 O9 A2 K  Y: }
  pop cx
1 @4 f7 W! q9 I" w) r: |4 B8 N9 f  pop bx; T5 \6 ^4 W4 Y$ H0 H( {' {
  pop ax! w  M6 _" q. u: @2 b; Q9 t6 b* ?
  ret, l; Y) X, w" `/ f1 }
  display endp+ B5 K6 j9 J, q
* H' d- C# z: S0 P6 g( x
CODES ENDS
0 p% I  d0 n$ ~1 r- s5 b    END START% z7 u9 `1 c& z$ m: u) C
; ^/ W% J' C, j9 R$ a+ y; ^2 d
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
5 I  V2 Y- l  q5 l! M1 pDATAS SEGMENT
) U& l8 D1 B$ r/ d    ;此处输入数据段代码  
1 R7 P8 v6 q, O9 r( D0 WDATAS ENDS
3 b: L6 k4 T+ [* \" _% Y# F( ?
" A2 B) j  i1 P% o/ @STACKS SEGMENT( Q; w/ {- Q) N" N0 y1 [4 E! E
    ;此处输入堆栈段代码: ?/ D% e+ K0 n% B: }8 x, ]/ c
STACKS ENDS( u/ A& T: t( r7 r2 R8 |- u2 V# s

% q& ?* E- R( B( G4 hCODES SEGMENT
/ T! u. Z% p9 r+ V4 A    ASSUME CS:CODES,DSATAS,SS:STACKS" G0 F/ u$ B8 @' W, w" k7 @0 ^1 M7 c
.4867 M/ l; R2 _* O! y$ h+ A& b9 |3 T
START:' b$ V# @: X3 J1 U
    MOV AX,0f000h
; t2 |  f" [8 A) D9 T1 k    MOV DS,AX ...
# W& M6 _) }% w0 p' G' @
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
1 I0 _* r( x( x0 O0 Q( x% B- O/ ?$ c  `8 i0 _% `- @2 b
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 18:01 , Processed in 0.076625 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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