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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:& P8 x9 O" P$ u: [. ^
-s f000:0 ffff'SM'2 d6 C! J) E, _- J! M: S  B( p
F000:BFB1
0 c# u: C# X( d6 d/ Y2 Y: `-d f000:bfb0
" `! G" w5 S6 B5 F+ R$ AF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............$ x8 R1 \" `2 d, w
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
6 x& H8 {4 c2 l( Q8 eF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
# ]" j7 v0 V- J+ O+ c" E6 a! hF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
+ c/ h& M. z# y2 c  oF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......7 {% Z+ h* _; e+ U5 ^
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.2 O" ?  H! |) y) }: }
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V; O1 K( E8 V& n/ x# X
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
& x: J- `- N/ w- |$ J-d f000:06f0
# i0 x, W& \2 }2 N) g) A; ^F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
, o# a7 L6 k- ]0 c6 `/ UF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American8 X. G. x/ x- s* i4 ^
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
1 I9 Y3 Z* E+ F0 r& aF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2) w5 k- E  h/ b: \/ X6 h# s
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u5 M7 x! a( \% C' y
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...& A% ^3 c/ A+ f. ^: I
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
" r$ v6 A0 k' H  w" o7 v. fF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
# |# R  ?" s& f$ T9 j, z: N
  K3 H6 E+ ~5 }! e3 ?! R( t, ^+ B) ^% n) z. h
我要读出这里的06f9:07* G) q+ A" ?" g0 T9 c
然后得到一个(07+1)*64=512 这样来获取BIOS大小-3 q5 s) ]2 g* N! s6 A

5 K$ p' \9 Y% u, W用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
+ l' `9 v; ~+ C& j) i谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。& S) ?9 y" T  e6 v* d- v9 H" f
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
% }. K3 S5 x" h: |至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
4 i$ K# b9 q4 M2 V& n) S+ c+ g( k.model small( `8 f1 u( _- v" ?. q
.386
. p* _4 Y9 k2 r  \8 y: h.data% w5 Q  y, Y, T$ }: w4 w
    SMBIOS_Sign db '_SM_'
: S* X5 N/ F" s1 Q3 X& q.code
: w( `2 z( p7 Q( Q) M% r0 f# J' I( bstart:
! \& c7 Q) B+ E. w9 H0 _2 p    mov ax, seg SMBIOS_Sign  l. C/ ~0 X/ H2 `% D
    mov es, ax- ?# f6 Q+ g2 ?2 n/ M& H: D
    mov ax, 0f000h
6 Z# r# M0 Z) ~  y7 F3 u    mov ds, ax% E9 U$ `, E3 _( x1 w1 S6 y
    mov si, 0- x% E; x: l+ o- v1 \5 B
    mov cx, 04000h! \, i1 l( c) a( u9 p! X
    cld4 m: s# V: S* m" L
@@:
8 T; j5 r& G% ]& u3 r/ U    lodsd+ T: M7 z( H+ {. C1 F
    dec cx  }4 B# e. j( U+ e) A$ U* f
    jz  short @F! m2 k1 f  z' c: Q
    cmp eax,dword ptr es:[SMBIOS_Sign]. x# q* G% \" }! T% y4 h
    jnz short @B; E& x" r0 g" C: r
@@:  f$ l8 M7 H+ J2 t) U  o' J
    or  cx, cx" W5 H' e8 i3 i! _* F1 l# {. L
    jz  short @exit
' j& e' t1 Z' _: z! p    add si, 14h+ B6 @( ~, c: O
    mov ax, ds:[si]: F, F& w( D5 p
    add ax, 09h
$ C2 G/ J- L' H+ H: U    mov di, ax
9 f* E) m' ]+ n  Q$ A    xor bx, bx& q  C0 W, g! x9 w
    mov bl, ds:[di]
+ X# n6 J  L! f! A/ X    inc bl- |" S- K7 B  W
    shl bx,6
! G% p2 ~0 S1 g6 V  L- Y/ G8 C3 Y" u@exit:$ L) G( x* P" m% A! `/ ~
    mov ah,4ch1 q3 {4 A  E! d# ~! B$ ^) j
    int 21h
6 o0 M$ O8 l3 ], f, |# y8 Pend start
" G; S' K: V; [( Vcseg ends
! ~, z( H7 b: h% u+ m  |" h! j推测你的算法是:
0 }* ^4 L, B# @' {9 E2 Q/ J5 ]1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
: W% n. M) P. T6 Y- h. F2.找到这个offset2+9的地方的值3 t( ?# B& ]1 t3 w. @2 n
3.此值加一,乘以64为BIOS Size,在bx中.
4 b0 ^" U1 K2 W4 V# A+ n# J; p不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT: z+ v- w& O1 X' J' S
    ;此处输入数据段代码  
( r( r6 n; |1 ?! D2 Z( A0 \& CDATAS ENDS5 _; N9 A' n$ p" w% T. ~# B
, h, \' X/ W( a
STACKS SEGMENT
7 _: M) k% y" u( G    ;此处输入堆栈段代码
4 ^0 X% q5 G6 Z4 r) w) h. a5 xSTACKS ENDS+ ?  M" H: J- K9 M% G: K

9 R* P- }% D6 c+ s7 j' j2 D% MCODES SEGMENT9 D; G. ?, o, M2 @/ J' X. M
    ASSUME CS:CODES,DSATAS,SS:STACKS& [% H1 o# d2 m! a5 F) D  d
.486! s. l% z4 l* i( v
START:
% b9 R0 U- i. _6 c; y    MOV AX,0f000h: _$ H$ L  ~  P
    MOV DS,AX6 ]2 t9 B* [, x& l
    ;此处输入代码段代码' C3 j3 l# f/ w6 c
    mov si,0
8 d1 g+ d" l0 y6 O( q  S   last: % `7 y5 }2 D3 P+ w( g+ v9 V
    mov eax,[si]& x, M& K( ]( Z6 C$ L2 Q# o
    cmp eax,5f4d535fh* I7 o$ ?, @. K7 |" G
    je over
# _+ b+ l* N7 ~7 G9 I    add si,10h
+ g% [! p: }" I$ g; B" r. w    jmp last
1 o- ~# y# o, F( J: K0 y/ G& T   
3 L3 N: F9 Z1 ]- n% b8 J; C& u4 m    over:$ `6 W  f( E- T7 {+ P
    add si,18h
+ a: \- Z1 D) ~  R; d    mov eax,[si]
( s  v* c0 |3 q! l% \1 ^: R    mov si,ax
  g& Z/ E3 W5 V; A/ C+ A; x    add si,9
/ S5 f, f3 \" c! i# K# l    mov ax,[si]
/ L4 n/ M% s7 t2 K    add al,1
) B# i  ~5 A  E8 p( X    mov bl,647 h, Y* z$ \7 [: c$ H9 y- z0 @  m
    mul bl
/ N7 [. u2 ]/ n' P, w7 Q    mov bx,ax
8 s* T* Z: @: Z5 K   
0 ^: L2 ~. B# Z* i- P& W' h9 F. y    call display- T' h0 U% P' s4 G, N* [' v+ Q4 Q
    MOV AH,4CH
/ |+ l/ R( W* Q9 s7 g    INT 21H  ' R. B; x+ B" g2 y- r
    " V0 Z1 M* z8 |* ?/ h
    display proc near
1 \2 ~# l  d& }# g/ {# o# W   push ax
" I2 T& z4 K- ]1 X! m3 N; l   push bx
; M  Z6 Z4 I. w- V' j   push cx: B8 z& L5 ^( t( x. ?* O9 r
   mov ch,4/ Y6 M; {8 c; Z
  rotate:mov cl,4
" R7 v  `/ c* X7 d7 Z/ P" k   rol bx,cl7 D3 C+ B. h3 W
   mov al,bl
  V2 b! _* o2 l: p: \1 Q6 |   and al,0fh  f8 f; h/ x1 [- A/ b1 E/ g+ X" d' t
   add al,30h
% W# a3 S/ l6 x   cmp al,3ah2 v$ C2 U! y: \, c
   jl printit. O5 [3 d) c( [& b
   add al,7h
9 @5 B6 T8 j$ h* ~; a  printit:
" I" r( W3 n5 [) r3 O7 G  mov dl,al9 a) J- v- Q# O
  mov ah,28 O3 ~7 h; ~% c6 T7 O) U  H
  int 21h2 N/ h0 @9 V# r0 D# G, P0 I, R8 f
  dec ch2 C# ]* h% U! Y+ Z7 E8 n% ~
  jnz rotate
; ?7 P4 G5 v' X  mov dl,20h
- }5 D+ W# \  Q$ e. n  mov ah,2h  X( H$ \0 a5 O" _9 U- N
  int 21h
3 y2 K$ g& p2 v8 k: u1 e  pop cx6 ^# T" L/ {4 }7 b! e& l  y. f. ]1 E
  pop bx
% s! {, W! e( }8 p0 @  pop ax! @! R8 g3 I( E
  ret0 z' X' c: `1 n! C; z! B8 T
  display endp
& h" E. z" l3 B) Y9 T. M1 l5 E( k1 |4 D3 J2 t9 ~) R( a5 f
CODES ENDS
# |+ w7 R( U# ]5 p' V    END START* n  c2 H, _6 B8 o: b
/ J+ W: L! {/ u
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
9 Q5 g9 w9 F/ n0 E+ m: ^DATAS SEGMENT4 d7 V  W) t! ~: M
    ;此处输入数据段代码  
( N6 s+ k1 j& _7 p- S8 y$ |DATAS ENDS
/ a2 q3 I. S0 P. x: g
# |2 v2 E& ~& B+ g- }7 FSTACKS SEGMENT
( P0 T# M' K/ s, \    ;此处输入堆栈段代码
% u1 F# n- a9 \STACKS ENDS
' `  W0 b+ ]% F1 `4 T  J' D5 I7 ^. y7 g$ u
CODES SEGMENT
3 \6 S# Z: I* \, I6 g& v    ASSUME CS:CODES,DSATAS,SS:STACKS
! A+ ]4 J5 n( N+ m' l.4863 [3 r2 M* F7 Y& w2 N" x
START:6 C0 y0 m5 S- z/ w( f- Y
    MOV AX,0f000h
! M" U2 e2 ^* ~, }' i7 t    MOV DS,AX ...

& ]4 X' e; ~. K  T4 E1 u  m. g5 C二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。( b4 _2 t4 U1 U8 x6 e4 I

0 u/ [% [1 `& V! J还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 17:47 , Processed in 0.955789 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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