2010年9月7日

intel cpu三种工作模式

Intel系列处理器的三种工作模式
2009年12月15日 星期二 13:44

微机中常用的Intel系列微处理器的主要发展过程是:80808086/808880186 802868038680486PentiumPentium IIPentium IIIPentium 4

8086/8088是一个重要的阶段,80868088是略有区别的两个功能相同的CPU8088IBM用在了它所生产的第台微机上,该微机的结构事实上成为以后微机的基本结构。

80386是第二个重要的型号,随着微机应用及性能的发展,在微机上构造可靠的多任务操作系统的问题日益突出。人们希望(或许是一种潜在的希望,一旦被挖掘出来,便形成了一个最基本的需求)自己的PC机能够稳定地同时运行多个程序,同时处理多项工作;或将PC机用作主机服务器,运行UNIX那样的多用户系统。

8086/8088不具备实现一个完善的多任务操作系统的功能。为此Intel开发了8028680286具备了对多任务系统的支持。但对8086/8088的兼容却做得不好。这妨碍了用户对原8086机上的程序的使用。IBM最早基于80286开发了多任务系统OS/2,结果犯了一个战略错误。

随后Intel又开发了80386微处理器,这是一个划时代的产品。它可以在3个模式下工作:

l)实模式:工作方式相当于一个8086

2)保护模式:提供支持多任务环境的工作方式,建立保护机制(这与VAX等小型机类似)。

3)虚拟8086模式:可从保护模式切换至其中的一种8086工作方式。这种方式的提供使用户可以方便地在保护模式下运行一个或多个原8086程序。

以后的各代微处理器都提供了上述3种工作模式。

你也许会说:"喂,先生,你说的太抽象了,这3种模式我如何感知?"

其实一的这3 种模式只要用过PC机的人都经历过。任何一台使用Intel系列CPUPC机只要一开机,CPU就工作在实模式下。如果你的机器装的是DOS,那么在DOS加载后CPU仍以实模式工作。如果你的机器装的是Windows,那么Windows加载后,将由WindowsCPU切换到保护模式下工作,因为Windows是多任务系统,它必须在保护模式下运行。如果你在Windows中运行一个DOS下的程序,那么WindowsCPU切换到虚拟8086模式下运行该程序。或者是这样,你点击开始菜单在程序项中进入MSDOS方式,这时,Windows也将CPU切换到虚拟8086模式下运行。

可以从保护模式直接进入能运行原8086程序的虚拟8086模式是很有意义的,这为用户提供了一种机制,可以在现有的多任务系统中方便地运行原8086系统中的程序。这一点,在Windows中我们都可以体会到,你在Windows中想运行一个原DOS中的程序,只用鼠标点击一下它的图标即可。80286CPU的缺陷在于,它只提供了实模式和保护模式,但没有提供虚拟8086模式。这使基于80286构造的多任务系统,不能方便地运行原8086系统中的程序。如果运行原8086系统中的程序,需要重新启动计算机,使CPU工作在实模式下才行。这意味着什么?意味着将给用户造成很大的不方便。假设你使用的是基于80286构造的Windows系统,就会发生这样的情况:你正在用Word写篇论文,其中用到了一些从前的数据,你必须运行原DOS下的DBASE系统来看一下这些数据。这时你只能停下现有的工作,重新启动计算机,进入实模式工作。你看完了数据,继续写论文,可过了-会儿,你发现又有些数据需要参考,于是你又得停下现有的工作,重新启动计算机…

幸运的是,我们用的Windows是基于80386的,我们可以以这样轻松的方式工作,开两个窗口,一个是工作于保护模式的Word,一个是工作于虚拟8086模式的DBASE,我们可以方便地在两个窗口中切换,只要用鼠标点一下就行。

前面讲过,我们在8086PC机的基础上学习汇编语言。但现在知道,我们实际的编程环境是当前CPU的实模式。当然,有些程序也可以在虚拟8086模式下运行。

如果你仔细阅读了上面的内容,或已具备相关的知识,你会发现,从80386到当前的CPU,提供8086实模式的目的是为了兼容。现今CPU的真正有效力的工作模式是支持多任务操作系统的保护模式。这也许会引发你的一个疑问:"为什么我们不在保护模式下学习汇编语言?"

类似的问题很多,我们都希望学习更新的东西,但学习的过程是客观的。任何合理的学习过程(尽可能排除走弯路、盲目探索、不成系统)都是一个循序渐进的过程。我们必须先通过一个易于全面把握的事物,来学习和探索一般的规律和方法。信息技术是一个发展非常快、日新月异的技术,新的东西不断出现,使人在学习的时候往往无所适从。在你的身边不断有这样的故事出现:COOL先生用了三天(或更短)的时间就学会了某某语言,并开始用它编软件。在这个故事的感召下,一个初学者也去尝试,但完全是另外一种结果。COOL先生的快速学习只是露出水面的冰山一角,深藏水下的是他的较为系统的相关基础知识和相关的技术。在开始的时候学习保护模式下的编程,是不现实的,保护模式下所涉及的东西对初学者来说太复杂。你必须知道很多知识后,才能开始编写第一个小程序。相比之下8086就合适得多。



--
we drink green tea

cpuid 详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
讲讲CPUID及其相关知识
1. 首先介绍一下什么是CPUID
CPUID指令是IntelIA32架构下获得CPU信息的汇编指令,可以得到CPU类型,型号,制造商信息,商标信息,序列号,缓存等一系列CPU相关的东西.
2. 怎样使用CPUID指令
2.1 怎样查看自己的CPU是否运行在缺陷状态.(代码如下,2.2---2.6代码类似)
对硬件熟悉的朋友应该知道Debug32这个软件.将其拷到启动盘中.然后在启动盘的引导下进入DOS并运行Debug32.
输入-a回车然后输入代码:
MOV EAX,1 //使用EAX作为输入参数
CPUID // 读CPUID,让CPU查看微码的版本,并把微码版本送到MSR 8b中.
INT 3 //设置编译断点
输入最后一条指令后回车,再输入-g ,回车,系统自动编译.然后输入-r32,回车,系统将显示出各寄存器的内容.完整的代码如下:
MOV ECX,008Bh
XOR EAX,EAX
XOR EDX,EDX
WRMSR // 向MSR 8bH写0,清除MSR中的信息

MOV EAX,01H
CPUID

MOV ECX,008BH
RDMSR //读出当前CPU微码版本

执行上面代码后,用r32+回车查看,如果EDX值为0,则表示CPU微码没有加载,你的CPU运行在缺陷的状态,如果不为0,则显示的是当前的微码版本号.
大家都知道,世界上任何事情都不是十全十美的,哪怕是世界顶尖公司Intel设计制造出来的CPU,它也是不可能完全没有任何缺陷,因此当他的CPU发生缺陷的时候, Intel会编写一个对应的程序来解决这个Bug,这个程序就叫做微码(Microcode),实际上它就是一个补丁(Patch).然后由各个制造电脑的厂商将这个微码包在系统BIOS代码中,从而达到解决CPU某些缺陷的目的.

注:简单介绍一下什么是MSR?
MSR英文全称是Model Specific Registers,是CPU中的一些特殊寄存器,CPU的很多重要的参数都保存在这些寄存器中.如System Bus Clock, FSB等等.

2.2 怎样获得CPU的制造商信息(Vender ID String).
把EAX=0作为输入参数,将可以得到CPU的制造商信息.
CPUID指令执行以后,会返回一个12字符的制造商信息,前四个字符的ASC码按低位到高位放在EBX,中间四个放在EDX,最后四个字符放在ECX。比如说,对于Intel的CPU,会返回一个"GenuineIntel"的字符串,返回值的存储格式为
31 23 15 07 00
EBX| u (75)| n (6E)| e (65)| G (47)
EDX| I (49)| e (65)| n (6E)| i (69)
ECX| l (6C)| e (65)| t (74)| n (6E)
2.3 怎样获得CPU商标信息(Brand String)
在我的电脑上点击右键,选择属性,可以在窗口的下面看到一条CPU的信息,这就是CPU的商标字符串。CPU的商标字符串也是通过CPUID得到的。由于商标的字符串很长(48个字符),所以不能在一次CPUID指令执行时全部得到,所以Intel把它分成了3个操作,EAX的输入参数分别是0x80000002,0x80000003,0x80000004,每次返回的16个字符,按照从低位到高位的顺序依次放在EAX, EBX, ECX, EDX。因此,可以用循环的方式,每次执行完以后保存结果,然后执行下一次CPUID。(具体每一个Bit代表什么,要到Intel相关网站上查看)

2.4 怎样检测CPU的特性(CPU Feature)
CPU的特性可以通过CPUID获得,参数是EAX = 1,返回值放在EDX和ECX,通过验证EDX或者ECX的某一个bit,可以获得CPU的一个特性是否被支持。比如说,EDX的bit 32代表是否支持MMX,EDX的bit 28代表是否支持Hyper-Threading,ECX的bit 7代表是否支持Speedstep。(具体每一个Bit代表什么,要到Intel相关网站上查看)

2.5 怎样获得CPU的缓存(Cache)
缓存,就是CACHE,已经成为判断CPU性能的一项大指标。缓存信息包括:第几级缓存(level),缓存大小(size),通道数(way),吞吐量(line size)。因此可以使用一个结构体来存储缓存信息。
缓存信息可以通过EAX= 2的CPUID来得到(得到的不光有cache信息,还有其他的一些信息),返回值在EAX(高24位), EBX, ECX和EDX,总共15个BYTE的信息,每个BYTE的值不同,代表的意义也不同. (具体每一个Bit代表什么,要到Intel相关网站上查看)

2.6 怎样获得CPU的序列号
序列号无处不在,CPU的序列号用一个96bit的串表示,格式是连续的6个WORD值:XXXX-XXXX-XXXX-XXX-XXXX-XXXX。WORD是16个bit长的数据.获得序列号需要两个步骤,首先用EAX = 1做参数,返回的EAX中存储序列号的高两个WORD。用EAX= 3做参数,返回ECX和EDX按从低位到高位的顺序存储前4个WORD。(具体每一个Bit代表什么,要到Intel相关网站上查看)
3. 怎样修改MSR中的值
当你有了相关经验后,也可以查看并修改MSR中某些Bit的值以达到你想要的目的.不过一般的人不要轻易去修改你的CPU中寄存器的信息.一旦失误,后果可能不堪设想.我只把怎样去修改MSR寄存器的代码写在下面(注:只能修改属性为可写的寄存器,有些只读寄存器是不能修改的)
MOV ECX, Index // Index为某个MSR寄存器的地址
XOR EDX, EDX //EDX清0
MOV EAX,DATA1 //DATA1为你要修改写入的值的高16位
MOV EDX,DATA2 //DATA2为你要修改写入的值的低16位
WRMSR


--
we drink green tea

2010年9月6日

软盘启动原理

软盘原理及制作软盘启动盘 收藏
我们现在用的软盘基本上是3.5寸软盘,软盘存储密度低,且只有一个盘片,软盘容量的计算公式为:2(磁头) × 80(磁道) × 18(扇区) × 512 bytes(扇区的大小) = 2880 x 512 bytes = 1440 KB = 1.44MB

 软盘并没有MBR,由于容量小也没有分区,整个软盘就是一个大的逻辑分区,从软盘启动电脑时,是从软盘的第0面,第0磁道的第0扇区开始的,每次读取一个扇区。如果这个扇区的最后两个字节是0xaa55,这里就叫做启动扇区,所以只要在这个扇区填入必要的指令,并在最后两个自己填入0xaa55,这个软盘就是启动盘了。(当然这是基于扇区大小是512字节,如果扇区大小变了,显然0xaa55已经不是最后两个字节了
--
we drink green tea

汇编语言org指令怎么用??

伪指令org用来规定目标程序存放单元的偏移量。比如,如果在源程序的第一条指令前用了如下指令:
org 200h
那么,汇编程序会把指令指针的ip的值设成200h,即目标程序的第一个字节放在200h处,后面的 内容则顺序存放,除非遇上另一个org 语句


--
we drink green tea

汇编 ORG 指令存放地址会不会有冲突?

汇编 ORG 指令是指定存放地址,会不会发生:
指定的地址已有数据,产生冲突?
 
这个要从单片机的内存开始讲起了:首先单片机分为两大存储器,即内部存储器,以及外部(指单片机外接)存储器。对于初学者来说外部存储器完全可以先忽略(因为内部存储器的存储容量完全够用了)。
其次内部存储器又分为内部程序存储器和内部数据存储器。
下面切入正题,一般使用ORG指令如ORG 00H;表示下面的程序是放在从内部程序存储器的00H这个地址开始的。而在程序中写的如SETB 00H;表示将内部数据存储器的00H这个地址的值给置1,这两个00H没有冲突。另一种情况:当你的ORG 00H这个指令下面写了几行程序时,而又在下面写个ORG 0001H这个指令,这种情况就是你说的指定的地址已有数据了,试想当那个地方已有数据而你又命令再放一次数据在那个地址,那么到底单片机会接收哪个数据呢?所以就有冲出发生了。
 
会的。ORG 指令可以重复使用,但其指定的地址空间不能重复,否则,冲突。
不可以占用先前的确定的地址。(这里包括初始化后的中断入口地址


--
we drink green tea