当前位置: 技术问答>linux和unix
开机时,CPU会自动把CS设置为0XF000......
来源: 互联网 发布时间:2015-11-29
本文导语: 最近正在看赵炯的《Linux内核完全剖析》,刚刚看不多,遇到一个问题,18页(没看过这本书的朋友也可以解答我的这个问题),书上这么说: “当计算机系统上电开机或者按了机箱上的复位按钮时,CPU会自动把...
最近正在看赵炯的《Linux内核完全剖析》,刚刚看不多,遇到一个问题,18页(没看过这本书的朋友也可以解答我的这个问题),书上这么说:
“当计算机系统上电开机或者按了机箱上的复位按钮时,CPU会自动把代码段寄存器CS设置为0XF000,其段基址被设置为0XFFFF0000,段长度设置为64KB。而IP被设置为0FFF0,因此此时CPU代码指针指向0XFFFFFFF0处,即4GB空间最后一个64KB的最后16字节处。”
我记得在系统上电开机时,CPU应该工作在实方式下,因此此时如果CS被设置为0XF000,那么段基址应该是0XF0000。但是上面这段话却说“段基址被设置为0XFFFF0000”,而且“段长度设置为64KB”,在实方式下怎么设置段长度呢(只有在保护方式下,才能在段描述符中设置段界限,即段长度)?
望高手给解答一下,先谢谢了。
“当计算机系统上电开机或者按了机箱上的复位按钮时,CPU会自动把代码段寄存器CS设置为0XF000,其段基址被设置为0XFFFF0000,段长度设置为64KB。而IP被设置为0FFF0,因此此时CPU代码指针指向0XFFFFFFF0处,即4GB空间最后一个64KB的最后16字节处。”
我记得在系统上电开机时,CPU应该工作在实方式下,因此此时如果CS被设置为0XF000,那么段基址应该是0XF0000。但是上面这段话却说“段基址被设置为0XFFFF0000”,而且“段长度设置为64KB”,在实方式下怎么设置段长度呢(只有在保护方式下,才能在段描述符中设置段界限,即段长度)?
望高手给解答一下,先谢谢了。
|
当按下开关或复位键时,微机产生一脉冲,送到CPU第24号引脚,CPU将CS置FFFFH,IP置0000H,执行FFFF:0000H处指令,该指令一般为一JMP指令,转到BIOS自检程序的入口处进行POST上电自检
自检完毕后,BIOS程序按照CMOS中设置的启动顺序搜索软硬盘或光驱(新主板可能还支持U盘启动,不过原理都一样的),从中读出操作系统引导记录(一扇区的大小)放入内存0000:7C00H
处,再跳转到该处执行,进一步引导操作系统
这就是大致的启动过程,OK?
自检完毕后,BIOS程序按照CMOS中设置的启动顺序搜索软硬盘或光驱(新主板可能还支持U盘启动,不过原理都一样的),从中读出操作系统引导记录(一扇区的大小)放入内存0000:7C00H
处,再跳转到该处执行,进一步引导操作系统
这就是大致的启动过程,OK?
|
BIOS有两个主要的组成部分,BootBlock段和主体BIOS。BootBlock段是不压缩的且存放于固定的地址空间,它是计算机开机时首先执行的部分。主要负责对计算机硬件做最基本、最简单的初始化,而后解压缩主体BIOS的其他模块,并一一执行,复制的过程在这个里面完成,然后BIOS跳转到这个地方的某个位置继续执行。
|
to zhensm012498()
最近正在看赵炯的《Linux内核完全剖析》,刚刚看不多,遇到一个问题,18页(没看过这本书的朋友也可以解答我的这个问题),书上这么说:
“当计算机系统上电开机或者按了机箱上的复位按钮时,CPU会自动把代码段寄存器CS设置为0XF000,其段基址被设置为0XFFFF0000,段长度设置为64KB。而IP被设置为0FFF0,因此此时CPU代码指针指向0XFFFFFFF0处,即4GB空间最后一个64KB的最后16字节处。”
我记得在系统上电开机时,CPU应该工作在实方式下,因此此时如果CS被设置为0XF000,那么段基址应该是0XF0000。但是上面这段话却说“段基址被设置为0XFFFF0000”,而且“段长度设置为64KB”,在实方式下怎么设置段长度呢(只有在保护方式下,才能在段描述符中设置段界限,即段长度)?
你可以去Intel官方网站下载一下order number:25366819的IA-32 Intel Architecture Sofeware Developer's Manual.搜一下Table 9-1,里面有CS Base
最近正在看赵炯的《Linux内核完全剖析》,刚刚看不多,遇到一个问题,18页(没看过这本书的朋友也可以解答我的这个问题),书上这么说:
“当计算机系统上电开机或者按了机箱上的复位按钮时,CPU会自动把代码段寄存器CS设置为0XF000,其段基址被设置为0XFFFF0000,段长度设置为64KB。而IP被设置为0FFF0,因此此时CPU代码指针指向0XFFFFFFF0处,即4GB空间最后一个64KB的最后16字节处。”
我记得在系统上电开机时,CPU应该工作在实方式下,因此此时如果CS被设置为0XF000,那么段基址应该是0XF0000。但是上面这段话却说“段基址被设置为0XFFFF0000”,而且“段长度设置为64KB”,在实方式下怎么设置段长度呢(只有在保护方式下,才能在段描述符中设置段界限,即段长度)?
你可以去Intel官方网站下载一下order number:25366819的IA-32 Intel Architecture Sofeware Developer's Manual.搜一下Table 9-1,里面有CS Base
|
不是复制的,这个地址就是rom起始地址,硬件决定。
|
那个位置是BIOS中ROM的地址空间开始,这是人为规定了,相关PC加电引导的知识可以参考《BIOS Boot Specification》里面的相关内容。
|
1、系统加电后CS全置1,IP全置0。所以系统是由地址0xFFFF0开始执行的。
2、ROM BIOS本身就包含了一段代码,这段代码里包含了复制BIOS中断到内存的实现。所以这个是由硬件自动实现的,不用我们操心。
2、ROM BIOS本身就包含了一段代码,这段代码里包含了复制BIOS中断到内存的实现。所以这个是由硬件自动实现的,不用我们操心。
|
linux内核完全剖析里第18页中上半部分有这方面的说明请您仔细看看