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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:7 p/ ]% v7 ?7 o5 @4 k8 e6 x
-s f000:0 ffff'SM'7 j$ k: E7 n. Z" h+ j
F000:BFB1% W, }' H' h* }: S. c
-d f000:bfb0/ A' z, _! D% z3 {; l
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
; L9 m* K  G3 q4 W: f% l  LF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1.../ S. g0 }" p; d& S# {3 C
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................. e4 L0 |9 ?; b8 z8 s; M. v
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......  a5 x' E8 d' V
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
1 G9 U$ j9 O1 N) XF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.8 t7 n0 c/ g* Y4 o. M, `5 |% [& h9 b
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V) W0 J, o1 N0 ~
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
8 I7 m$ w0 z$ F9 n9 o! ?: N-d f000:06f08 D& p7 G$ x& v, o+ R; r
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
9 I9 x8 M1 G6 A6 E6 RF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American+ z* j5 S. K  ~" c, h
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
. v! P* |& e: ]5 C' P3 e' v8 m5 f# BF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2& q- P4 Y( s! n. I% N( G) A+ d( M! a" ^
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
  x: l% [. f% L7 p$ g( DF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
; {. k* t- p# [# T' `F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu  g, n* m; F* o0 L7 Y
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
, g6 ~: V' b$ h$ |1 r
3 H- t* Z( [9 F3 ?) V9 B+ C& T2 F! X1 j/ p
我要读出这里的06f9:07* Q5 N4 Y" I1 M- x% x3 f
然后得到一个(07+1)*64=512 这样来获取BIOS大小-2 H! w( ^4 H% g

4 x$ Q, I# H( h, N# I& _用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码& b+ o5 i! b% z
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。2 [& D! z, @$ M0 b
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。( u2 m3 H1 ~2 G2 P" W# B; ]0 j
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
8 c- `5 s" w$ j- X  f/ U& |4 C% d.model small
6 B, B. s' J* q. N, f6 m) K0 B7 w- [.3866 M5 h9 l) w! G' f8 c0 Z
.data
, j( ^3 a: l; O% z    SMBIOS_Sign db '_SM_'
  i: H. e5 p# V+ l, f/ W.code
8 T: P0 i7 y  ]) _. ]start:0 B2 d$ Q$ ?: c( y& ^
    mov ax, seg SMBIOS_Sign0 m6 R0 K  _& T
    mov es, ax: o$ g' ]" w3 u; [* ]" j4 L
    mov ax, 0f000h
3 C! I6 z2 o! x    mov ds, ax
3 |6 P) m, C  h    mov si, 05 _9 s" c$ a, z% k
    mov cx, 04000h( u, H7 b. J6 s9 ~7 M% Z7 O$ `  {
    cld+ {; j8 z7 ~2 ?9 g
@@:
" t+ S  n: J8 b# k: W" w    lodsd
5 w; c. q8 b% @5 ~: b8 ^: B$ W    dec cx
8 |; R5 C5 h* i* V# r# T    jz  short @F5 h9 ~, @2 I( m  j9 H
    cmp eax,dword ptr es:[SMBIOS_Sign]3 }8 q3 G& J, |4 v
    jnz short @B
. Z' K* s' @4 p- d" b* s9 H* H* E@@:- }4 q. s' k# X
    or  cx, cx
( q; C% U3 b" u    jz  short @exit
  C. w: e1 ~. `/ r. ?5 t    add si, 14h: t2 A1 F3 O/ I, D3 z
    mov ax, ds:[si]
: d7 [# z2 W" F    add ax, 09h  D4 j! p: e! F  P  O7 U
    mov di, ax* N+ J- }/ F. U# {5 f% O0 F
    xor bx, bx7 u& S% _6 E7 t0 }
    mov bl, ds:[di]4 H& I8 S4 g9 f
    inc bl
: U' }$ k8 a! I7 R    shl bx,6
! R/ K0 ~; |) |; l' M8 p@exit:
7 K, ]: I9 c9 Y8 m8 y$ o: o    mov ah,4ch
9 S( X1 X2 r5 }  i: N' T' s    int 21h
2 Y1 L: Z/ e% u/ _( Rend start
# ]' a" Y$ N# }) Z) icseg ends
8 ^# T& o5 W+ P, V1 i; a推测你的算法是:- i/ v& h1 n3 t0 m) O: ?' ]# V
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
3 x0 m/ S& K: p8 i4 D2.找到这个offset2+9的地方的值
8 E( N) T# j' l2 X! g) Q3.此值加一,乘以64为BIOS Size,在bx中.
! h; l& U' y% [. h不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT- N6 {; o! ^5 I/ Q- o
    ;此处输入数据段代码  
6 a1 X. C$ ^' Z5 ?$ L% ^6 Z& oDATAS ENDS( \4 S: j8 O: b* q
# Z+ y/ s/ c, U
STACKS SEGMENT1 H( y! d  N6 a/ p/ L7 J1 I
    ;此处输入堆栈段代码
  d' {8 U/ ~* h# ]STACKS ENDS& c1 i: T) k7 ^: O. K

: w: p' q) q9 K; M; x1 j) S' t1 w! zCODES SEGMENT# v) b. d4 {6 X, I, B  w+ C% F& t
    ASSUME CS:CODES,DSATAS,SS:STACKS
5 z  [. v) Q0 o8 n; N9 {- u.486) d9 j2 t6 u# ]
START:/ h9 c) h; N: Q7 G- L
    MOV AX,0f000h
$ ~. j8 L; l. @' P# @    MOV DS,AX
9 |. t( u# D. P) m& [    ;此处输入代码段代码- U: y0 M7 x" p( {! r
    mov si,0
' d  V8 V8 D* X0 H2 H& o) x0 \. B   last: % z/ P7 Z: E9 i% ~5 S8 `0 I$ {
    mov eax,[si]
9 V# x- m5 [2 l; D' C" a: B4 A    cmp eax,5f4d535fh
- i1 x6 m9 \% G& G7 U& g    je over& A- |) T* M8 k9 b& K
    add si,10h. {, Q& q9 B7 x6 @4 T) c
    jmp last
1 e7 Y; y- I; b6 W% e4 d0 s& N    1 G1 d% q' o$ n( r  }
    over:2 h  e) c' Z! _1 z& I3 v+ @
    add si,18h0 [) L- I$ \: K9 H1 N& K
    mov eax,[si]
2 R  t* P7 L! b  \5 v; N    mov si,ax
& U- Y& p+ g" Z6 U( t3 e; k; L    add si,9
, a; o3 D/ F- M! p( T    mov ax,[si]$ L9 U2 e/ v4 W3 k5 A/ H$ y
    add al,15 D/ ]# B* `  }6 i: `7 v: D
    mov bl,64
4 h0 H; O6 u: F+ n    mul bl
$ @" @+ v7 [( Y% F# s) h  c8 o    mov bx,ax2 s; `. {& u4 F5 P% M
   * D7 V4 t5 a* r4 r# J5 t
    call display$ u1 r" I7 Z* {% l
    MOV AH,4CH
# Z  S3 A! P4 F8 ]7 v    INT 21H  
- D' ]/ {: ]2 h+ O. P8 v1 y    9 Y5 E. k' b# @: B( U6 z9 t- |
    display proc near
% j. w& e$ q9 `- p; P   push ax
! z" q2 Y; \# [4 c' K* g   push bx& B9 Y9 f  X$ F$ @) l, @
   push cx
# [+ f" E' R4 S   mov ch,4. K8 t5 d$ ?, p1 y& h. K
  rotate:mov cl,4$ `& y+ |/ Q8 y. j! Z/ i
   rol bx,cl
; y- ?/ ?+ D# j2 f  e   mov al,bl
6 G+ [6 k# f3 n- [$ x   and al,0fh
/ P1 P* U2 G2 C/ X. c) z) H7 j   add al,30h
: Y. U- ^) N2 M- o   cmp al,3ah2 Q* C: R! M+ F9 e# J2 g5 Z7 Y
   jl printit5 D; _) c8 ]/ [, E7 l
   add al,7h
" g( B: S. Y+ e$ D* P  v  printit:
% ?4 k) i- S8 g4 Z# x' [* R8 k  mov dl,al+ ?6 e  M: @, @! f7 k+ j0 v
  mov ah,2
: H- E& C$ V* r& A3 B  int 21h" Y: s# G. Y) F9 a+ l5 J. {8 J
  dec ch
8 Y# E0 O2 [& z* V  jnz rotate) |9 v( ^- s* R
  mov dl,20h
% g' Y- }* s: C* {# ^  mov ah,2h
( P# m; ^. v  U) K+ @- g  G  int 21h
9 N( w3 a, F! b5 e: C  pop cx
( x* X/ r! i  y/ i3 ^0 u  pop bx- [  z$ }9 X/ T2 e( W8 j2 }
  pop ax& \/ W3 E1 s/ j9 S5 ?, g
  ret
1 b, j# r& Y8 N4 x2 h& @# c  display endp
4 i. f$ b$ f3 ]* p7 `( i; D
1 K1 o+ d  n( FCODES ENDS
. f/ n3 W1 L+ s" d* D1 ?& e" ]# X    END START
, P! H8 o  _6 b3 n1 C( O$ a/ G  k$ q8 j
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun! j9 s: L! c+ ^5 p- q% U' c& ^( t: [. d
DATAS SEGMENT! T( v% @# W( \) R- K; j2 P2 b% Z
    ;此处输入数据段代码  . Z. i- O; B, w; k  t5 G
DATAS ENDS
+ r; @# d2 U2 g, ]- K! n
$ y1 Z1 V: o% B6 ASTACKS SEGMENT
% u/ H* K& l& _- S; @& J5 x    ;此处输入堆栈段代码; F+ N, z: |5 r
STACKS ENDS3 C. j- p/ A# F' e+ u
- F3 X+ C7 [' P! p
CODES SEGMENT
0 C: t% N% \2 m    ASSUME CS:CODES,DSATAS,SS:STACKS+ @$ h/ P- E# C* d( J
.486
' [' ~$ f/ h5 h) L  a0 _START:0 y6 b( Y( e* t# F3 A- e
    MOV AX,0f000h
. y; B5 ]5 Y, e) N" u& D# x0 H- a5 o    MOV DS,AX ...

. U& B4 f0 J6 t) `: L" i二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。& X5 B7 ^8 f0 o  G4 Y) \# q

; A2 f" z% m( V; ]还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:06 , Processed in 0.058524 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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