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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:  b6 E# }3 r0 z
-s f000:0 ffff'SM'
( R3 D0 |7 w9 O1 m- R) |F000:BFB1
) I6 g3 U( m  B) l# d2 [& z) Q-d f000:bfb0
& [2 ]# ]. z4 A2 G6 q3 TF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
9 P" [+ B8 ~3 y; L5 ]F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...% P4 |0 j: C! j% A! Z& Q3 x) t) ^
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
5 T( s/ N8 S( Z9 ]9 YF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......8 C4 f; A( g: R0 u3 e! c
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......3 N; O# a9 l1 |8 f# p0 T
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.& e! z. [- h- @
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
! e# |1 O' q- q3 h( fF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
6 m( W: k  [6 q+ K- m-d f000:06f0
1 @9 k0 `& X/ X! A+ HF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................+ z" J3 c  o# ^3 ~1 e" h
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American5 f# G( B! k7 s
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
5 I) F( Y5 `8 s/ |0 DF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2% L8 s8 k9 P) w1 r5 _  q& C
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
; m3 v) d3 i! J  |8 ^, ~F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...) x. q' [7 r% O( l: r
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu5 W; M( O7 ]7 I# k
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
+ q/ f$ M" z5 V; q$ y
7 c' J0 H9 w4 K1 M$ E; J
) y+ N& T1 G# s6 ~我要读出这里的06f9:07
# h" A* P" w* r; A 然后得到一个(07+1)*64=512 这样来获取BIOS大小-( q: ~* A3 J2 j& m& r% n

( T2 Y( J. d4 x# u2 w用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码7 i7 D8 R' m8 R+ B6 ~* \! z( |. I$ l
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
8 U6 D3 k' [9 ?( Y6 {8 S正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。& s* x6 I) N0 `# P0 m* t( Y
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:; N  U8 }) s4 ]2 r  Z/ m8 u
.model small
' L; h- N' z( q3 g.386/ G  S/ m" x+ W) y
.data
/ J" @! t+ P7 k    SMBIOS_Sign db '_SM_'
, ~0 k8 ]: D6 x.code
  v( ^8 m: I; h7 Sstart:
7 Q" w5 D) E( k& x+ i    mov ax, seg SMBIOS_Sign! U- t& B1 S% [  F# g+ ]0 ]* c2 x
    mov es, ax
. i7 X4 a. p1 k% ?* H5 [* z    mov ax, 0f000h
8 D8 V0 G, d- D4 x( b% `    mov ds, ax' y) ^/ ^$ s# V1 z8 [
    mov si, 07 V5 @' E* l) L1 L4 b3 L
    mov cx, 04000h
) J* F, P) f7 |+ F) X) m& j    cld
# T3 Q  ~/ b1 y9 C@@:' Y& x9 Z! T; b0 ?4 q0 e4 o$ u
    lodsd
6 x# p& W& V0 e! D) B. T* k    dec cx
$ K" N$ R# c) s( D    jz  short @F# m- r; v1 Z( s$ `
    cmp eax,dword ptr es:[SMBIOS_Sign]
0 g- n) W$ W7 h* L" f5 ?6 F    jnz short @B
3 p5 O& G: ]9 X' {! n& d' d@@:
" N" j/ v/ Z/ m4 a) S    or  cx, cx
9 U5 c% N# R1 v' V7 `: c    jz  short @exit. |$ Y, E* [0 j4 e; Q! ~- a' q
    add si, 14h/ S3 D. T8 s" T9 V
    mov ax, ds:[si]
' q  N, c2 \" T8 E( u! }. e/ b    add ax, 09h. Z  w3 c! c2 b: [* b  E
    mov di, ax
" T) b4 _/ ]' w$ j8 B    xor bx, bx
( }0 r& {, H* x- J    mov bl, ds:[di]8 q, }4 I4 ~8 O+ c' y! j6 p
    inc bl0 V( D& ]; x( D8 H* l/ i" D
    shl bx,66 l9 D9 r( _& L9 G' o8 n
@exit:( N; U; C% l8 ^1 |1 @, W
    mov ah,4ch
" }, A3 N- H, A& q, S    int 21h0 }* |/ z* a! |+ i3 V% ?
end start
' \# W& [9 V3 y1 Dcseg ends# w/ q8 C7 L3 e% b7 L) Y
推测你的算法是:
/ f* G' D2 \5 }/ e' f- a1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
8 |0 E& k8 h2 v+ {7 X" y2.找到这个offset2+9的地方的值- z/ |, k% z: b4 d1 e, s
3.此值加一,乘以64为BIOS Size,在bx中.! [- P' C# D7 Y2 U/ ^& F) b
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
1 D$ ~0 o! [6 q; q$ ~- `9 Z    ;此处输入数据段代码  
2 t  x; a0 }8 f- w, p( ~8 }DATAS ENDS
# m# j; k6 E2 d9 B7 {* l
; i: W# y! D, n, a8 N, G$ Y8 fSTACKS SEGMENT) c, [& I+ O% i. ~
    ;此处输入堆栈段代码7 p2 \) J+ l- |6 p" u' j8 J  |0 z
STACKS ENDS  ~4 I1 b! Z( {, o0 F9 v* }
5 U) Z* B$ x# S4 R
CODES SEGMENT
, e* t; n& Y' _+ ?    ASSUME CS:CODES,DSATAS,SS:STACKS+ X4 \- ?5 f& o  I( d+ k% P$ {, b
.486
5 x+ V% p( q/ A! |/ w9 ?' TSTART:7 D$ d' _# }3 z2 l4 u* A4 Z& |3 [
    MOV AX,0f000h
( u. w+ h7 v) Q  C( P    MOV DS,AX6 J7 S5 u- @2 o4 g3 S# ~
    ;此处输入代码段代码8 j3 S$ j$ k( ^; {
    mov si,0" r/ ]3 c1 d( ?, v' G# Z* ^
   last:
, ]1 D/ y5 ]4 r3 X    mov eax,[si]8 c: N9 j% S, h0 h# G
    cmp eax,5f4d535fh4 L. _& b8 h+ G: M* d" J8 b
    je over8 L  \7 q, }$ Y2 w0 I
    add si,10h8 @' o* B8 y( @) ~9 u9 _
    jmp last% p7 I$ q; Q! g8 P: w2 y
    1 k* o; }# ]  e3 Q) D& r1 n  |
    over:
! j5 u+ M5 N: G5 d* I, l* b    add si,18h
3 a( X! r7 c, u8 ^" h( q    mov eax,[si]; l# V; x4 ~4 E4 i# k
    mov si,ax
+ u  {0 m; g/ b* g    add si,9) }$ u5 k$ m6 v- A- H
    mov ax,[si]  X  _5 J. {: U
    add al,1! H! [& }0 q6 K' c3 G0 V
    mov bl,64
/ e. ~7 i, j; o5 \    mul bl( b- Z, t4 F, k
    mov bx,ax( o% I+ D7 U$ _. o! U
   , g% b' f# b; F% T5 I0 n
    call display- P; f' |3 X. I7 X: K% E
    MOV AH,4CH
" O7 r% C& o9 g    INT 21H  " L) K7 ?2 B% B4 {% }% |
    ; G( [7 i" M% M- I
    display proc near
( `, L1 e. V" ~. C6 n; C) g   push ax  @) a. ^+ T0 N7 Q% R
   push bx
  _* S8 H2 K* W% P, W: r   push cx
# o8 q) l5 r9 v" \& J% f* `   mov ch,4
8 N) F8 n9 m; J) V& k/ W9 B* z  rotate:mov cl,49 t8 D3 r) r0 L
   rol bx,cl& g* w- L' {4 e" j
   mov al,bl
/ @8 _. q$ b" i9 f! A6 E   and al,0fh& @# g" {! g2 n" Z
   add al,30h
4 v* r: \7 V  e+ U, |   cmp al,3ah  a6 C! |+ ?: N! ~0 ]
   jl printit  K- {5 j* j; q7 z8 `: p- Y- ?) O
   add al,7h+ [$ k. @/ V' p! s' v
  printit:
2 s! d2 |! F, _7 C  U! q  mov dl,al2 ^- p) E4 o8 m6 C$ @
  mov ah,2
1 E# O4 u0 I; o* \1 E  int 21h0 S& p+ T6 g+ W8 ~
  dec ch
* J( S) Y" x% c( n+ u  jnz rotate$ y/ P1 y$ ]; a, @7 H& _7 |
  mov dl,20h* ~  x. N+ R' D% r
  mov ah,2h
0 F7 b$ @7 X! C% S) d! |  int 21h
# }0 u0 s* s8 y& v$ H5 i6 ?  pop cx) E% }( V( N' b+ B
  pop bx" B* H4 G( E- i
  pop ax# T/ Q6 E0 G) P' j
  ret
- B; \! P4 C+ X1 O( C8 W  display endp9 E1 F( n% C: F& V
2 E/ `6 L! c5 g5 u( D
CODES ENDS- g. M/ ~6 K+ R4 D; U- e
    END START
) m7 w, e% v7 r! S7 \1 m  h
* H  m1 T6 T! w5 X+ q" E运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun- Q# z0 Y: J/ {: a* `
DATAS SEGMENT' D3 z* n! `9 p! z& X3 G* T
    ;此处输入数据段代码  
6 o8 [7 r- a- ]  TDATAS ENDS" A. w  U; R; O9 A

* h% q' R  S* U3 F6 i& z, TSTACKS SEGMENT
$ Z" D7 l/ U/ l' p! L, b8 |. G( u    ;此处输入堆栈段代码5 n4 @/ e4 |3 T2 `' C, D1 o2 R: u
STACKS ENDS
* _6 g! {, C9 N% e
  L% C, ^( \4 J# RCODES SEGMENT5 ^  J; C: ]! k8 _! Z" r0 b
    ASSUME CS:CODES,DSATAS,SS:STACKS
# Z8 V0 c/ P1 G9 e.486( \9 R/ w* v) h
START:
2 w$ {; \, m9 P) X3 d    MOV AX,0f000h2 T. O  S4 j  `4 S
    MOV DS,AX ...
1 L+ C! O5 }! c
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。: Z; S8 ^. P, n5 Y4 \

+ E* U# H6 y# F' i还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 04:47 , Processed in 0.038938 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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