指令队列的作用是什么?

帅依莲帅依莲最佳答案最佳答案

这个问题问得有点时间了,可能答案已经过时,但仍然有效。 简单地说,在 x86(IA-32)的计算机中,内存被分成了两部分,第一部分是用户区,第二部分是内核区。操作系统、驱动程序等在内存中分配的地址都是指向这个区域首部的指针,而不是直接使用物理内存地址;而应用程序则直接使用物理内存地址。这样,虽然整个系统只有4GB的内存,但是通过巧妙的设计,可以让操作系统及所有驱动只占用不到1GB的用户区,将剩余的约3GB的空间留给应用程序。

为了实现这一点,在计算机启动的时候,操作系统会先执行一个叫做“Boot Sector”的代码块来初始化自身,然后才调用其它代码。这段代码位于硬盘的第一个扇区,而且无法被删除或修改。它只包含一些变量和一个无返回值的函数,这个函数就是“SetUserPointer()”。这个函数的功能是设置一个全局变量来指示操作系统从用户区的什么位置开始放置指令和数据,即把刚才提到的那3GB空间都标记为可用。接下来,操作系统就可以像先前只有1GB用户区一样来使用这3GB的空闲区了。因为所有的程序和命令都是从用户区开始的,所以它们看上去好像都是从0开始存放的,其实只是绕过了一个已经被占用的1GB空间而已。从编程的角度看,这些代码其实并没有实际移动,操作系统的功能也没有增加或减少,只不过所有的程序看来都是在整块内存在运行,感觉上就像没限制一样。

如果现在要增加内存,例如添加一块16GB的DIMM,那么只要把这个新内存插到插座上,操作系统就能立即识别并使用新的内存。因为Windows/x64是从硬盘上的MBR开始的,而Linux/x64是从BIOS中的RTM开始的,不论二者内部如何划分,外部看来就像又有了16GB的用户区。

但是如果要从硬件上进行优化,就需要改变硬盘内的Boot Sector,让操作系统能直接找到新插入内存的插座,从而不用重新写入那些本来已经存在的数据,否则就得不偿失了。这也是Intel在发布新的CPU时附带改进版的Boot Sector的原因,后者能够自动判断新增加的内存,无须重启电脑就能使新增加的内存得到利用。(当然,如果要用新增加的内存来缓存数据而不希望操作系统使用的话,则需要另外设置Linux/x64或其他平台的参数才行。)

我来回答
请发表正能量的言论,文明评论!