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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:/ j: r7 v5 ^1 C" n  `1 H
-s f000:0 ffff'SM'
7 F$ I. |5 h1 G, E; EF000:BFB1/ x* Y6 a/ o4 E" \( J( M
-d f000:bfb04 D# E: R# E; m1 S1 ~+ S) E
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............; g" J% y1 J; u8 U8 @
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...; O3 Y: E% i/ [9 }2 `- {
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................+ N% y+ e! |. Y5 M# U
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
: t1 X% B) N" N% V2 G2 mF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
5 T0 m2 i6 @' Z& A6 gF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
9 [0 p2 U1 D' U9 sF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
1 Y' D/ H7 T# |+ f- FF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..! f+ {# A$ k- G' _' T, d; c
-d f000:06f0
5 x& l  C* @; L0 ?F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................3 R! M' Q7 v: J8 z, D, ]
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
: ~3 I  ^( ]% g, [- K) v8 \, iF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
$ a0 d: V, [, n% x8 jF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
" R5 Z4 @# z& ]) R, u/ k/ j! Z9 d9 G3 kF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u* W1 ?) E  w, ^$ ~) b
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...$ N- r7 U( @# Q# L
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu9 U- J, G' W$ s3 {, S$ A$ ]
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ, I) n0 P) E6 P
8 x. z# e% H4 o2 h+ e1 I* \7 H

7 y" T; B8 z6 R  G  G& j我要读出这里的06f9:07
9 v' @3 Y) C, m7 P& L. ` 然后得到一个(07+1)*64=512 这样来获取BIOS大小-: [- t# ?7 Q% B7 e& S
0 y# A/ F' b! b2 D# T* U/ P
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
! H% O7 c1 P8 _# K3 j& s谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。' L5 n3 ~* q! o! d7 b9 s
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
6 f' x1 i  p' a' P9 o: v至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:% D0 D; v. l/ K
.model small1 Y  N4 ~0 d$ G# n  t: Q4 d/ j
.386
5 ^* B0 ]7 N6 ~% g.data
+ ]9 w* r  c6 O4 T    SMBIOS_Sign db '_SM_'4 w  D3 n+ [* L+ Z1 t) n- ?
.code
" k2 a. `. M5 @; p& H) Jstart:! t9 I- ~; Z- ~  l! i) d# k
    mov ax, seg SMBIOS_Sign
: b5 D' `% p5 @- ~2 \" f1 |    mov es, ax
5 ?0 S6 z6 A/ s  F: D- u    mov ax, 0f000h
* S- G% \  u5 w) i' d    mov ds, ax
& @2 P  {3 R6 @. m    mov si, 0
- }  u! {9 W0 k. m. U# e) L# A    mov cx, 04000h
4 e4 C' I* ]$ C% W* J2 j    cld" e9 [$ |: S6 d$ {3 v  P5 W
@@:
; e# f+ \% @9 ?3 [    lodsd) Q" v2 l4 k/ |/ s# ~& k
    dec cx4 p* h9 m) |, ]  y
    jz  short @F  C) n" M. ~! V" ~% g" U1 H
    cmp eax,dword ptr es:[SMBIOS_Sign]1 Q& u/ `  k- l; B
    jnz short @B( H* p$ K2 }6 J9 O
@@:" \8 R  [% @, p' _- ]
    or  cx, cx
, t3 k. F9 c, Y( U# l# w    jz  short @exit
8 q- W, T1 a; B3 y- y    add si, 14h
2 Q4 M3 t3 Q( s$ {' |- r/ B    mov ax, ds:[si]
) E( P  P) J; c7 r$ r# ]8 B    add ax, 09h4 @, F+ Q$ m" _) T: I. y% \$ w4 }
    mov di, ax
/ Z. `& i& V' K" V    xor bx, bx
0 U& B0 {- s( a( \    mov bl, ds:[di]( f# \/ `' p# p/ G: k
    inc bl8 U& u# ]/ U' h  C: ]
    shl bx,63 F4 {9 q8 [, {" Q1 ~
@exit:7 L9 [* n  p( F& ]: g
    mov ah,4ch
5 l$ q: i# p0 G9 \9 h    int 21h
3 z. X- X1 B) b. s) g+ L2 vend start
  b4 p0 m' d  h/ |' [1 e3 L8 Qcseg ends  k) h. h( |' K3 x
推测你的算法是:+ p' h5 I4 _& Q. N$ O& o5 Y! v, K
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2& Z- L- x9 J+ C8 Q/ D4 r5 R$ v
2.找到这个offset2+9的地方的值
/ s+ K' [% F, E' q0 S1 K3.此值加一,乘以64为BIOS Size,在bx中.* o; L- g( f; c9 S
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
% X  Q& _4 o- C" B+ e2 _+ ~    ;此处输入数据段代码  % j/ j% `: ?% O. z
DATAS ENDS1 R: {- p3 {+ i( u2 x0 t0 ~

$ B2 O- d/ I6 tSTACKS SEGMENT
. Y# b: |* b8 E9 ~    ;此处输入堆栈段代码
& n" g& J6 e  Y' r% T/ dSTACKS ENDS
9 a3 R6 s- v2 d( k  o
) q6 T4 H8 ]( U$ SCODES SEGMENT0 G* r; B! |* ^" j
    ASSUME CS:CODES,DSATAS,SS:STACKS
8 w* g4 ]0 ^7 T  ^* q8 P. `$ ~* C.4860 M; [( t) R! k! g
START:9 c, Z9 l6 ^; E, I
    MOV AX,0f000h4 K4 Q" m) |8 {. _( }$ C& W+ I
    MOV DS,AX* O( C( P- o/ A# L& a) D. {
    ;此处输入代码段代码
" e$ J  c" r; |0 F    mov si,0
8 d) @+ T2 P0 b& ~' ~5 G& M   last:
0 V5 a3 B, W! I( [: V4 ~    mov eax,[si]0 A$ t; P# E9 f; o; }  f
    cmp eax,5f4d535fh8 {# Q$ N1 F# Q! s1 k$ k
    je over
$ H  D( P9 Q# w( n8 k/ U/ x    add si,10h0 T! ^0 F- O. d  u3 E  _) A/ Q
    jmp last
4 `+ W6 }. m  j' z& b0 L8 G    $ _+ C( H2 X" i. w* w
    over:8 v% D$ K$ T( Y# Q" r1 W* \& k$ Z
    add si,18h3 }. i" `# U# w
    mov eax,[si]
4 F1 R5 {4 @1 V0 k( V+ E! k& _  ~    mov si,ax
+ f, D: _9 s# p7 Z8 ^    add si,9
1 ~/ i5 n" t# ]* q2 `    mov ax,[si]
! N! c0 \& M( q  K- p    add al,1
7 [) y" I+ N1 O8 I    mov bl,64$ c; {5 J% a9 S. V1 ~2 n
    mul bl0 V: b0 ?; a$ `  h
    mov bx,ax- k" {0 m8 h3 y1 z- L9 B4 y
   
+ D: {$ t+ T, X: E    call display4 l* t$ [, h( f4 d( ?
    MOV AH,4CH
. E' X- D; t: O. E9 x$ X    INT 21H  
3 k) W2 j7 K& ~    0 ?/ x- ^# e+ _6 i7 u6 [* J
    display proc near. @2 V3 f6 m6 v& W9 J+ X# q, |: y- `
   push ax' l3 J0 R% E4 M8 Q0 ?' D+ r2 E
   push bx
) C6 T3 n! u8 [# p4 N/ \- p- u7 d1 C   push cx! P5 ^5 L  Z# a( Z3 H: H
   mov ch,45 V* @( c: u8 g+ |, g# L1 ?7 {
  rotate:mov cl,41 d  ?" z$ g2 z
   rol bx,cl2 H* }. y. B; G' o# T! a
   mov al,bl& T' _' L1 E4 ?- f) w, H
   and al,0fh- D: [3 T% C; r& _+ p
   add al,30h
2 `8 z7 c. y- J8 ^9 D   cmp al,3ah
- D0 H0 J: A5 c  A9 N  A. m! j& U   jl printit
: R4 K! U. T7 N' ]5 m' Q# M   add al,7h
8 W1 N" B  ]0 J$ L1 O5 p0 f3 }& b; T  printit:
0 g: u, k+ B' w6 C. s# K  mov dl,al9 e/ o% |# {2 n2 h5 a8 m
  mov ah,2
. u* V7 R% r; v* ~1 h; B  int 21h
. \2 `' C0 c% `8 G1 E3 y  dec ch
* v) w! C5 n: o" F8 h) E, |  jnz rotate
7 s  p% d( _$ N7 U4 ?  d  mov dl,20h
) N" U# B0 C/ G- u- ?! l* A; u8 d  mov ah,2h
7 `% Q4 G7 S' ^& g. d2 z1 T  T  int 21h
: j& N  p" n9 g  pop cx- j3 \# o  A' s
  pop bx
, ]/ Y; @( L1 y& F# S# h7 I  pop ax1 T8 c8 i# G- ^- x3 ]; x8 B
  ret
. [' I4 K$ ?1 Z/ K6 y6 S, N  display endp6 V: X6 S: ^* \
% |# b; B) w7 C* T! Z8 }* J0 g& Y
CODES ENDS
: C, ?3 |' v3 O    END START  }) D- t3 F2 s$ e& d, L
0 r' x0 a$ E' w# ?$ T) F, L
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
$ b# E  j' P; J# W" ADATAS SEGMENT- L9 ^; g% n4 p1 F2 U
    ;此处输入数据段代码  4 o+ U) y; I0 C: m! a
DATAS ENDS6 ~/ L! U9 m* }  k$ s- k" F" R

8 e$ S9 F- c- M' z- Q" t) ]9 {4 e+ ZSTACKS SEGMENT  P1 L$ ^+ a' Z. \7 i6 Y
    ;此处输入堆栈段代码3 i: ^$ @9 i* @9 o0 V
STACKS ENDS% N4 x$ B: J; s* {% c$ e6 x
( Y5 Q4 a0 ]6 S  {6 A; c2 j
CODES SEGMENT
' z/ O/ v& M3 }    ASSUME CS:CODES,DSATAS,SS:STACKS# ~5 c9 G  n' p
.486
/ S9 m$ y/ w; L# H+ N& F: g% Y6 \( vSTART:* V# T, s: U. P0 t0 j  c2 L" I+ A5 ^9 g
    MOV AX,0f000h* ?' R2 W4 ]! g6 u6 f
    MOV DS,AX ...

, t2 z" V8 N6 c二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。" q' p* N- V5 z7 |
  X$ O' A+ E' E
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:09 , Processed in 0.054638 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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