对于X86系列CPU(也就是现在人们常用的什么奔XX、赛XX系列),它的复位地址是FFFF0,如果表示成逻辑地址则是:FFFF:0000。对DEBUG比较熟悉的朋友或者会在一些高级语言中嵌入汇编语言的朋友可以这样做一个试验: % i! e2 L, K. N3 o+ h
1 M4 h" l4 }+ v打造最好的电脑自学交流论坛 用DEBUG执行一条指令(这是一条无条件跳转指令):jmp FFFF:0000,或者在高级语言中嵌入这条汇编指令,执行后,你就会发现,计算机重新启动了。其实,用程序控制计算机重启的最本质的操作就是这样的。
5 Z" N8 @( h& [2 l) ^) t, V: I我爱电脑技术论坛* Z: g+ q- W" i8 o
2.给各种指令规定了相应的长度和格式。比如:某数+某数这条指令就规定:这条指令的长度是3个字节,其中第一个字节表示“+”,后面两个字节表示被加数和加数。于是,当CPU到达这个指令后,就自动把第一个代码作为指令,后面两个代码作为数据,依次类推,第4个代码就必然是指令..... - k Q9 g: _0 l9 d! q
2 b+ ? R, H8 I打造最好的电脑自学交流论坛 现在假设,CPU在执行指令的时候因某种原因,误把本来是数据的代码当成了指令,结果除了是计算结果出错外死机也就是必然的了。
- ]! D/ c0 r5 {5 a% T
% Q# G* }5 K3 A* I8 W 还是以前面那个加法程序为例:当CPU把第三个代码(也就是00000010)当成了指令,而恰好这个代码是一跳转指令,CPU的执行结果将是:XXXX3--跳转--执行--跳转--执行........进入周而复始的乱条,不过注意,虽然是在乱跳,CPU却始终是在不停的正常地执行指令,所谓的“乱”是对用户而言,对CPU来说却是正常的。 # _2 Z+ u* _: Y3 P0 n% n& a% ^" j% c
打造最好的电脑自学交流论坛1 [: S4 ?4 ~" [! y' H. b
还有一种情况就是,如果恰好跳转到了FFFF:0000这个地址,计算机便重新启动了。呵呵,,这下搞清楚了为什么计算机有时会“莫名其妙地重启”了把。
! `6 P7 n! ?' l3 o
$ @& Z+ ? m# Fwww.520diannao.com 有朋友可能会问,内存中怎么可能有如此多的跳转指令呢?是怎么形成的呢?
! A0 `( R5 d0 f: P' z: s) Swww.520diannao.com
5 ^- W" w& s+ v1 I 计算机中的最小存储单位是字节(8个二进制位),指令功能、长度和格式也是在一个字节中规定的。因此,平均来说,每256个代码中就有可能出现一条跳转指令(8位二进制数最多表示256)。 www.520diannao.com, |/ V- C8 Y" A% o
, Q1 J( g# e4 |, D5 x2 W
还有一种情况:现在计算机的内存已经达到数G的存储容量,绝大多数都不可能用到这个极限,也就是说,有相当长一段区域是空白,即使内存只有数百M的计算机中也不可能把内存用完,同样存在相当数量的空白区域。特别需要注意的是,空白区域不等于里面就没有代码。因为,在数字逻辑电路中,不可能存在“没有”这种情况,即使是表示没有(叫做“空”--NULL)也是要用一个代码来表示的(NULL用00000000)来表示,所以,空白区域内的代码是“11111111”或者干脆就是一些随机代码。X86系列的CPU“11111111”是一条单字节的指令nop--空操作指令,当CPU跳转到这些空白区域时,虽然不会发生再次跳转的现象,CPU也会逐条执行这些代码,执行到最后一个内存后,CPU将会回到内存的0号起始地方然后又从头开始执行程序。 & T* T# L6 K, b# E P( b
我爱电脑技术论坛5 A7 p1 o8 a/ h a$ f8 }% I3 b& I/ x( Z
有朋友问了,如果硬盘出错会不会死机呢?这个问题要这样看。CPU从硬盘中调入数据的时候会对硬盘数据做比较严格的校验(一般是CRC--循环冗余校验),如果校验成功,则不会死机,如果校验失败,CPU会给予用户提示“校验失败或者文件损坏”--当然也不会死机;只有在硬盘上的文件已经损坏,硬盘把数据传给CPU的时候“自己没有发现”造成的数据混乱。所以,硬盘数据损坏后,只能造成数据丢失,无法执行程序,也可能无法启动计算机。不过,有一种情况例外,那就是硬盘上的某区域做成的虚拟内存,如果这个区域损坏是有可能死机。 打造最好的电脑自学交流论坛+ e$ }3 U0 p: ~+ W
打造最好的电脑自学交流论坛) I4 h/ t$ d6 g
内存的启动监测问题,计算机在开机的时候会对内存进行检测,这种检测的方法不外乎有如下一些: , {/ |+ F5 M* h9 s+ P! ~. D" e
) e u% P) z# k# ?+ s+ k 1.最简单的检测方法:把内存从头到尾读一遍,能够读出数据便认为内存正确。
+ l+ K* P% w1 i& t% b
: u( ? }) c/ n8 N打造最好的电脑自学交流论坛 2.稍微复杂一些的检测方法:把内存从头到尾读、写一遍,能够读写数据便认为内存正确。 www.520diannao.com- C7 a6 r5 |! {; {
0 a8 P U/ \! |* o打造最好的电脑自学交流论坛 3.再复杂一些的检测方法:把内存从头到尾读、写数遍能够读写数据便认为内存正确。 - T x& s$ F/ @5 M9 _5 @" {
3 ~0 _4 |9 i# }- `9 z打造最好的电脑自学交流论坛 4.简单的校验检测方法:把内存从头到尾读、写数遍,读出的数据和写入的数据进行比较,能够读写、并且读的数据和写的数据相同,则认为内存正确
: \$ S3 e6 F/ c8 q) [打造最好的电脑自学交流论坛. N8 M6 B* _( i* U. q9 ]4 y- Z6 h1 t
5.比较复杂的校验检测方法:对内存读写的数据同时进行奇偶校验和CRC校验,这种方法多用于高档服务器,同时,能够做奇偶校验的内存(ECC内存)价格比普通内存贵10倍以上(不知道为什么)。