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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
0 a, ^7 M. S! d$ h9 k* U-s f000:0 ffff'SM'( H5 O$ K" g; d# V/ p3 \; i
F000:BFB1, ^2 {. h7 x% N: Y
-d f000:bfb0
. x9 Y" I) J5 t# AF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
( C" w" y* h3 l, \  @* fF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...$ f$ s) }5 x: i" ]
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
5 x# ^) {5 I0 Y" ZF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
' G8 a6 @9 a% t/ U1 r$ vF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
& ^/ Y, _; h" u6 X- V9 nF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
. s9 H8 n( J: a( j* H! \! X9 oF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V; w6 ^* V4 g5 s4 r' J% S
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
, m5 Y+ D% \, y. A% Z( \-d f000:06f0
4 _( S* b+ v: V( F4 dF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
" u8 R+ ?8 B3 y+ n; rF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
$ B0 Z' P8 k5 ]6 c5 c* pF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
* N4 Q3 b, Z. @  R; yF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
4 P: V2 G* u& X9 V7 X* XF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u. J; I0 u) E8 y' n% E' T
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
3 e+ M/ E" o7 h+ [0 oF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu2 l% l" @4 E# T* H: ^
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ5 T* y: k9 C* J/ v2 F. F+ R' r6 {" r

3 H2 g7 O$ T5 T1 E2 D* x  T; G. y+ u
0 J$ n! q. h6 d$ e9 L我要读出这里的06f9:07
1 [- S  {% v5 s' _+ w! b* B% Q 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
: k. i  m: ~0 u$ K7 e: K5 T
' g. b! ^, v5 U用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码' p) T9 k" b" Y/ Y4 ^8 D( E
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。1 n* v( C3 Y) j+ Y
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
1 ~! f9 Q1 \4 v. ]至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
) r  Y  T+ ^6 f$ w& s7 K.model small
5 F" n. I( M9 `.386
0 G+ Y! j' T9 p4 G2 Q, ~6 \0 t.data) a  O0 W+ O1 |+ C  p6 [2 d* K4 y2 J
    SMBIOS_Sign db '_SM_'7 A8 U. D  k8 v/ H
.code
' O. y  J$ e, |/ c4 ]* N, Ustart:
5 z% ?( Q0 T" @3 n/ `# y- _& e    mov ax, seg SMBIOS_Sign
8 v( O. K$ e8 \$ H    mov es, ax/ W6 x5 I7 P7 x, V5 f
    mov ax, 0f000h
; L, T/ \% ]$ [    mov ds, ax! D& j, N- w) t  t1 j/ {4 n# J
    mov si, 00 S% s2 c1 d% {# A* n
    mov cx, 04000h
  |, H! h7 V, M8 g9 A' h/ C    cld
/ U- N0 [1 |* ~7 [1 \3 C@@:1 D( r. Q! P; S9 o
    lodsd
6 W  c7 y( o, S# K    dec cx" b5 i/ r, w. f7 K7 p( f
    jz  short @F
5 p# h- d) l( o- ~, j# v' ^: `7 N2 V    cmp eax,dword ptr es:[SMBIOS_Sign]) g+ X! T, m3 M  n! d4 x
    jnz short @B
+ S  Y6 V, O$ I, b* j/ D  o4 ^@@:
5 _- F% `2 j" V" @    or  cx, cx, I( |" i) Z: o# N
    jz  short @exit
6 O5 ]% s; I, k9 @( l' G  E# K    add si, 14h
" g1 A/ K. Q" b# R    mov ax, ds:[si]
! H3 W$ d, N1 j3 F! n    add ax, 09h: Y; @8 b+ U* D( {& W/ I
    mov di, ax
) T, i2 M+ O" ^  a) b4 P    xor bx, bx% j( \" D3 k* E2 @' \5 l
    mov bl, ds:[di]" Y( z8 H/ I! x) d' o3 T
    inc bl
0 K# \4 I  k, w    shl bx,6
7 E( ?* p# ^! ]3 B9 q@exit:
9 e2 W6 L2 A1 E% m6 b    mov ah,4ch
  j" f& W' q8 u6 p    int 21h
& \5 Y/ [) f: x, @7 O" v  J8 ~end start7 c# Q. o7 Q1 b7 I
cseg ends
; M" `5 a4 m$ A推测你的算法是:) g6 Q1 K2 d; L9 k; ^) f  `2 \
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
; g$ ?* s0 t$ B2 V2.找到这个offset2+9的地方的值0 l* u4 x4 i2 L
3.此值加一,乘以64为BIOS Size,在bx中.# u6 W6 P2 c3 B$ B
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT" W& }$ }. G2 o3 q) j8 z, A
    ;此处输入数据段代码  
( H( F: t: ?: o' S. \% oDATAS ENDS0 L4 H) Y- ?- G  `
% L5 K' z, {+ j  g& q
STACKS SEGMENT
& N4 a( O9 z- r. |0 S    ;此处输入堆栈段代码
1 D9 t" Z( z) ?4 |$ O3 K1 i" ~, DSTACKS ENDS
! h3 c' i, l9 I. o8 ^6 Q" h8 ]1 F4 ^6 z) J6 V
CODES SEGMENT
& b6 W. ]3 J) k  ^, l    ASSUME CS:CODES,DSATAS,SS:STACKS
* A4 _/ R- R$ V: O- e% r.486
% b- ^, o  U5 L& nSTART:2 ^, [9 A7 a# R- u( ~
    MOV AX,0f000h
$ S) g8 J9 a8 K# v3 ~    MOV DS,AX! t, h, a( r2 c$ j. f" z
    ;此处输入代码段代码
. l1 d# x! J3 Y5 ~* v: u) L    mov si,0
3 j# `7 v, X8 Z* i   last: ) Z, o" X( r* k7 H" |- H8 ]
    mov eax,[si]. F5 j/ W+ G+ D8 P
    cmp eax,5f4d535fh6 `" F/ ^1 R$ Y& P- P
    je over
$ K3 }# u( p1 x7 Z' e# R& f    add si,10h
5 `( A* V0 z3 X7 D    jmp last% ^; M, k; D% }* U) G: X
    & B8 ]- H( e% e
    over:
9 S! j1 W1 v  \; h    add si,18h
/ p: s- Q3 x4 M+ J: W$ n2 ]6 l    mov eax,[si]0 s6 F$ n, i# Y1 ?4 t% Y$ e1 N
    mov si,ax
+ a* w" ?; }7 C9 H1 X: k4 M    add si,9
: H# v5 t8 A! {# z' D. }* |8 L    mov ax,[si]* P& Z1 n' r8 C/ }3 B" A
    add al,1
1 J( N* {5 q3 W8 a+ T2 K: K    mov bl,64! K' {* {7 U: |0 f
    mul bl3 z! b5 c" m) Y: K; u
    mov bx,ax* N/ C) q) f% u: F5 k" X. G- z2 ~
   5 @- y5 I4 X  B. V
    call display5 T8 B- q9 m* s( V. r
    MOV AH,4CH* n. }1 C4 v' d' A: e: N
    INT 21H  
! U+ r7 o7 A8 f4 [: q: W' j% Y# r3 r   
( v& \3 C! k+ |% @, @" A! m% a    display proc near' x* P6 S. l0 E7 K9 M9 u/ Z: V2 t, b
   push ax
0 H1 R2 W( C3 p2 t4 d   push bx2 ], w/ L9 T" [& m% u; s# x
   push cx* x7 ]: R2 }& Y* C+ K
   mov ch,4& b$ ?) z. \# ~
  rotate:mov cl,4
6 @$ g- \8 K. `( W   rol bx,cl4 v2 p5 U: Q3 U% g1 p3 J' q
   mov al,bl. E2 N5 Z4 c  N( p- z' Q6 o
   and al,0fh
# Z1 O& ]# ?) \9 o+ @! B. h, A   add al,30h. k1 Q: P5 n  l
   cmp al,3ah
3 H; B; u0 K7 f   jl printit3 f. ?3 _' d5 c. ?% x' ^: Q
   add al,7h! H: _3 U1 U  C( l
  printit:
  U! r( g/ l( |, O( W6 A1 z& L  mov dl,al' m3 M( r8 k( X' L9 l* ]4 r5 S7 i
  mov ah,2
+ n# |6 M" d, \( s. M0 S  int 21h
5 p7 H4 }8 L1 [8 T2 f  dec ch
1 L& g4 H" ^# [; G  jnz rotate/ ~+ p: A4 v5 m" \8 C
  mov dl,20h
8 A' J2 [+ C: o( R  mov ah,2h
8 D2 j" M2 H2 K& r: z( W, O  int 21h) G% p' @8 ?3 f3 Z, W
  pop cx9 p8 Y8 z) W2 ^6 R0 z/ K
  pop bx
+ D8 X) o0 ]5 `% D2 \9 N$ ?  pop ax
; u: R! H5 h0 g9 _$ N  ret
; w  \8 ~  g# H- t  display endp
- j( k/ o/ ^* }
9 L! u4 Q. F, I3 t' t6 uCODES ENDS! o" M5 d2 k- p
    END START- v2 [) |5 Z+ b6 ?
0 F. h4 k: A& T  q/ z* M- s/ ~
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun1 ^0 h" A" u' j' g0 U1 ^" K* O+ Y
DATAS SEGMENT6 [5 @& ^+ D" D) @2 A
    ;此处输入数据段代码  
% f3 {0 |! |& k. k1 QDATAS ENDS
8 _* V- o6 N1 J6 D
8 ?7 f. ?! ?! v% n0 FSTACKS SEGMENT% g9 ^5 t; }. b( B* v
    ;此处输入堆栈段代码! ?+ ]/ c  [9 S
STACKS ENDS: t* L( l  ~) c2 l2 z+ A

0 S/ ]0 j- n& s. m0 P6 eCODES SEGMENT/ M0 D" T  s! e* C
    ASSUME CS:CODES,DSATAS,SS:STACKS
( K0 B" {8 I8 q1 W# ]6 N$ e.486
) a% P3 U5 l- Y: ~START:) X; e$ o9 ~4 L
    MOV AX,0f000h8 P0 i  `; o* {, ?
    MOV DS,AX ...
$ A; U. r! |8 T7 Y' Q) g: i3 D
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。# ^3 R* ]+ |! G  i3 x
* W1 |6 o* l: \% x
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:21 , Processed in 0.254086 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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