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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:, x2 R" u6 Q5 |
-s f000:0 ffff'SM'( p% j7 b2 z$ E
F000:BFB1: [6 W! K' V9 X9 A: R& W# f
-d f000:bfb08 P1 Z  r; X7 d: v' V, E" V
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
" Z+ c. P1 A$ ]3 w- D0 {F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
9 Q' P( j5 N8 a3 C6 {: XF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................* @: u9 s' y$ F- ~* `
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P......." E; \" }% q2 x; f  Z
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
, S  z0 q: p2 ~# i, e# DF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
6 A- z6 q: a3 e- }F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V& c' K/ v& e  A* H# s
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..3 {9 x8 J% `- O, I4 `* C
-d f000:06f00 n6 A& i; Z  k4 l1 E7 [- |
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
! j" @- L4 v/ j2 B6 B( }; EF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American" J, s. Z: |' _
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.9 {* z: y" O7 w4 Q" f- J$ }% i  n6 F
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
( H* v& e. [6 i0 P* V" rF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u6 P+ \, o! `2 \! N: |7 V' y2 N& J
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
! @* e8 e  z- M  x0 f( T" X$ r0 QF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
1 ^/ f& v( }. x, u, o8 ZF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
5 U' M  V  A6 B- s* C6 N: {# N: m( g
$ ~5 u$ I6 [6 e! y' p
我要读出这里的06f9:07
$ j8 b( g+ {3 C 然后得到一个(07+1)*64=512 这样来获取BIOS大小-5 A% Q6 \+ Z4 p" l- b

, A% U' q. U! o" o用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
3 R/ c7 E5 }0 O7 i% i! r谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。- y; V! U8 b" G; Q( R
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
$ y( ?% ?" q4 _1 w; }2 m# Y3 ]* u至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:1 }% g4 |! T; ~! Y1 S. L+ q
.model small
1 k( N0 i9 Q: }9 L) m1 M, |7 O.386. D4 [& m( ~) S3 r, v6 a2 w& R. J2 o
.data
* }+ B/ p, ?( m, m5 L) Y    SMBIOS_Sign db '_SM_'
  x" t! V: ?2 ]" H: g# y.code
1 X$ Q* i, i/ Y6 {1 l* m" ostart:. O" n4 S6 b& y" j
    mov ax, seg SMBIOS_Sign
, @$ r# Z" D  g/ M    mov es, ax
; L. S7 Y3 n; L8 \! j5 D    mov ax, 0f000h
3 F( W& G, S! {. }- D; R    mov ds, ax4 o9 |8 q- h3 H9 O. a
    mov si, 00 k. K0 B4 y2 K  Y& |
    mov cx, 04000h% O, _( `$ k( a
    cld
6 ]$ ]! z* c% y3 P4 n@@:+ A' R9 A1 ]5 u, E3 m6 P
    lodsd! q+ j/ w4 H8 v
    dec cx- Z3 D) W# z& i* _
    jz  short @F9 m: h. Q% U4 n
    cmp eax,dword ptr es:[SMBIOS_Sign]7 H9 u: {/ S' I* l& ~2 N
    jnz short @B
" i/ c3 W9 }& t3 j/ T/ r@@:0 B# ~4 u/ T! B* M% ^
    or  cx, cx1 G, y( Q' m2 q2 u/ c) V$ k$ R' d
    jz  short @exit& v: E7 G8 ?$ d  N4 ?" g, R
    add si, 14h% X: I+ Y0 J2 Q: I' w4 }" A# {5 ^0 R4 I
    mov ax, ds:[si]
7 O) k( L7 n" s    add ax, 09h9 s0 V8 s2 b- T3 x1 l  w
    mov di, ax
, B8 Q2 T- \- p- m2 d    xor bx, bx
) {% r2 q: A: v$ M    mov bl, ds:[di]
3 a! {  Q; R6 N3 A4 n) V# l    inc bl
* ~) d1 N5 X, {: g2 s+ U2 ~    shl bx,6
) v" \/ W+ T8 M! E. d3 P+ }1 M- ^@exit:9 y4 \6 g8 ]  t9 |. v) r: b5 ?
    mov ah,4ch
& P4 N: n) |6 Q- Y    int 21h
- @7 _: u, I, A  x, bend start
- V% W% ~# ~7 O" K' b6 c. kcseg ends: |4 J; X6 ~7 N  G
推测你的算法是:& w3 M$ u& _7 {/ _1 C3 n% G
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
6 l8 a) t  I# h; ?, ~6 _  ]2.找到这个offset2+9的地方的值
) o( N9 D$ B0 G5 g4 d8 l3.此值加一,乘以64为BIOS Size,在bx中.3 |! ~: \  w8 V9 C, D
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
4 e2 }% [8 i: m% V: M3 f2 \0 _    ;此处输入数据段代码  
, |/ b* x5 f& ~7 r4 T( O1 iDATAS ENDS
  c2 J5 s  h3 g  M6 |
' ?- h; s! U5 y* H* B; V# T* ySTACKS SEGMENT
% N# _" k$ C. C  I" t    ;此处输入堆栈段代码! N- f; q9 Z' s2 L  x6 o8 S
STACKS ENDS
; a  W7 C( Y7 q+ W: W- c2 Z9 z+ C6 M, U( h
CODES SEGMENT! @& x* [" ~* \1 C2 Q1 x3 O! _
    ASSUME CS:CODES,DSATAS,SS:STACKS/ y& g  U5 ~9 y: P- K
.486
. i9 {3 [: ~+ t' ?: QSTART:
# @& w2 r; E9 @' \2 l7 A    MOV AX,0f000h
! z7 X+ ~4 `- B) O    MOV DS,AX
( f/ N% v' h5 N+ {/ s8 s    ;此处输入代码段代码* r. l; F  T+ G0 N" n
    mov si,0
" |; R. E: x6 L+ ^5 H2 m. M   last: 8 H0 \4 D1 y' c
    mov eax,[si]
& k9 L6 J, y1 a) i( n    cmp eax,5f4d535fh
; @+ A2 ~- j' Z2 ?) a% ?, u: J    je over) I0 \& C$ x! M9 _
    add si,10h
" r) H4 m) S0 l  L    jmp last. l# I: I- |6 ]/ g
    3 {* }) Q0 s' ^2 z4 v8 ^! `- u
    over:5 F1 ]/ M' x+ h  \7 M+ Q9 c
    add si,18h4 [* c, z$ G5 R  [
    mov eax,[si]% L& t9 k6 q$ }3 Z
    mov si,ax
" Z3 J& D7 U" c7 [    add si,9$ M" m5 z9 {- q; M
    mov ax,[si]
' a7 }: U0 S2 a; T4 \& o, Z    add al,1
2 g( x% @: V" Z    mov bl,64
) W! _) s- L: E; ~    mul bl
' H: {+ L8 t4 j" U$ b$ X1 t    mov bx,ax
3 t2 z; q6 w# \. }   
7 M5 J. K, z1 b" z5 |! M    call display
( ~: x: \; |" ~' j    MOV AH,4CH
) v  U7 w. A0 m    INT 21H  " R4 Z% n- ^4 w
    - T4 B# V. g4 x1 `7 V- j% T7 j
    display proc near- s7 p: R. r$ l8 k* `
   push ax
* K& G: {7 u, W   push bx
9 u  G* d* u3 H& v   push cx' C0 O4 B% V9 D0 b! l- n& p; C  n6 q
   mov ch,4
/ k# H  w% A  O0 W  rotate:mov cl,4% L* p* x7 @7 }* g
   rol bx,cl
* A0 ]" B4 n1 R6 B   mov al,bl. L) J8 i) @8 x
   and al,0fh& b0 x: B5 Y* v
   add al,30h
. |2 k. d$ D+ @) j6 |   cmp al,3ah
, u3 q; G) _  h1 b$ |3 [% i2 [   jl printit) ?9 q6 g- h) Z% @' a! N2 h
   add al,7h
4 @6 X- b% [6 I$ M: m  printit:
8 F/ g5 A4 r  E+ K* P1 l/ Y  mov dl,al
; I& u& m# y# C" C9 R; a+ u- K  mov ah,2
* u# Y6 \* i: N* A& ~, x  int 21h! \6 F( k2 {& W$ y
  dec ch
8 q3 H- T' A9 X  jnz rotate
4 `- U- f7 V, W' V* ?  mov dl,20h! N, ^# [. u) C
  mov ah,2h
- ]5 l, I- `- t2 q  int 21h
! c) [, ]$ ]+ m1 |% ?# q8 a) i  pop cx
- n8 F+ }$ |' r" J  pop bx
9 P  @3 g! `" P0 \9 h  pop ax1 T* c" s) \, i. Z. H) B
  ret$ j4 c1 v" O  g5 e
  display endp
' H0 h, A/ _, S/ U, B  P: C; Y4 i' j9 T  _2 i) V, W1 O2 @: i0 `
CODES ENDS
; e! q- N0 M4 R) w3 ?# ~+ i    END START  S- z$ g& [2 k1 ]

6 R6 z3 W! z$ j% f运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
9 o/ A/ r4 ]; J3 a& FDATAS SEGMENT, u* E" M0 D1 l+ Y# N" ^7 d* n
    ;此处输入数据段代码  
' \3 z/ @6 N4 T. A+ wDATAS ENDS
6 m1 y& H" _; e- p5 @) i% b  U$ G' |) w: X
STACKS SEGMENT
% K" q0 A1 U9 E1 Q    ;此处输入堆栈段代码' V# P+ S. I: X4 V4 a9 w  e
STACKS ENDS5 j7 F$ f* Y' Q7 d1 \

; g. E7 l/ M) P% N  UCODES SEGMENT
" \  }) E, T3 k9 j+ S4 e! u    ASSUME CS:CODES,DSATAS,SS:STACKS
2 S* E* H5 [" ^: b! h  N.486: |/ v! }2 ~( h4 Y
START:
, h. D( |7 e3 t    MOV AX,0f000h3 Z3 ]( f6 n0 r, \* d9 F
    MOV DS,AX ...

5 L4 S; A! N/ p% a二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
& X% P  `* {3 n: y+ W, K) j  s4 p. Q8 a
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 04:58 , Processed in 0.037227 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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