Linux内核完全注释 阅读笔记:2.3、主存储器、BIOS和CMOS存储器
<p class="artical_littlestyle1">1、主存储器</p><p style="text-indent: 2em;">首先声明一下,这里的主存储器指的是内存。最开始的计算机支持的内存很小,随着计算机技术的发展,计算机所配置的内存越来越大。为了与原来的PC机在软件上兼容,系统1MB以下物理内存使用分配上仍然保持与原来的PC机基本一致,只是原来系统ROM中的基本输入输出程序(BIOS)一直处于CPU能寻址的内存最高端位置处,而BIOS原来所在的位置将在计算机开机初始化时被用作BIOS的影子(Shadow)区域,即BIOS代码仍然会被复制到这个区域中。PC机使用4G内存时,内存的使用区域如下图所示:</p><p style="text-align:center"><img src="/uploads/AilsonJack/2018.09.04/1536070346134933.png" onclick="preview_image('/uploads/AilsonJack/2018.09.04/1536070346134933.png')"/></p><p style="text-indent: 2em;">当计算机上电初始化时,物理内存被设置成从地址0开始的连续区域。除了地址从0xA0000到0xFFFFF(640K到1M共384K)和0xFFFE0000到0xFFFFFFFF(4G处的最后一64K)范围以外的所有内存都可用作系统内存。这两个特定范围被用于I/O设备和BIOS程序。<br/></p><p style="text-indent: 2em;">假如我们的计算机有16MB的物理内存,那么在Linux 0.1.x系统中,0-640K将被用作存放内核代码和数据。Linux内核不使用BIOS功能,也不使用BIOS设置的中断向量表。640K-1M之间的384K仍然保留用于图中指明的用途。其中地址0xA0000开始的128K用作显示内存缓冲区,随后部分用于其他控制卡的ROM BIOS或其他映射区域,而0xF0000到1M范围用于高端系统ROM BIOS的映射区。1M-16M将被内核用作可分配的主内存区。另外高速缓冲区和内存虚拟盘也会占用内核代码和数据后面的一部分内存区域,该区域通常会跨越640K-1M的区域。<br/></p><p class="artical_littlestyle2">2、基本输入/输出程序 BIOS</p><p style="text-indent: 2em;">存放在ROM中的系统BIOS程序主要用于计算机开机时执行系统各部分的自检,建立起操作系统需要使用的各种配置表,例如中断向量表、磁盘参数表。并且把处理器和系统其余部分初始化到一个已知状态,而且还为DOS等操作系统提供硬件设备接口服务。但是由于BIOS提供的这些服务不具备可重入性(即其中程序不可并发运行),并且从访问效率方面考虑,Linux操作系统只在初始化时会利用BIOS提供一些系统参数,在Linux运行时并不使用BIOS中的功能。<br/></p><p style="text-indent: 2em;">当计算机系统上电开机或者按了机箱上的复位按钮时,CPU会自动把代码段寄存器CS设置为0xF000,其段基地址则被设置为0xFFFF0000,段长度设置为64KB。而IP被设置为0xFFF0,因此此时CPU代码指针指向0XFFFFFFF0,即4G空间最后一个64K的最后16字节处(<span style="color: rgb(0, 112, 192);">这里貌似计算出的CPU地址是段基地址和IP相加得出的结果,应该是遵循80x86保护模式下,地址的计算方法,不知是否正确,希望各位指教,后续第4章节也会详细讲述80x86保护模式及其编程</span>)。由上图可知,这里正是系统ROM BIOS存放的位置。并且BIOS会在这里存放一条跳转指令JMP跳转到BIOS代码中64KB范围内的某一条指令开始执行。<br/></p><p style="text-indent: 2em;">由于目前PC机BIOS容量大多有1MB到2MB,并存储在ROM中,因此为了能够执行或访问BIOS中超过64KB范围并且又远远不在0-1M地址空间中的其他BIOS代码或数据,BIOS程序会首先使用一种称为32位大模式(Big Mode)技术把数据段寄存器的访问范围设置成4G(而非原来的64K),这样就可以在0到4G范围内执行和操作数据。此后,BIOS在执行了一系列硬件检测和初始化操作之后,就会把与原来PC机兼容的64KB BIOS代码和数据复制到内存低端1M末端的64K处,然后跳转到这个地方并且让CPU进入真正的实地址模式工作,最后BIOS就会从硬盘或其他块设备把操作系统引导程序加载到内存0x7c00处,并跳转到这个地方继续执行引导程序,图示如下:<br/></p><p style="text-align:center"><img src="/uploads/AilsonJack/2018.09.04/1536070346512202.png" onclick="preview_image('/uploads/AilsonJack/2018.09.04/1536070346512202.png')"/></p><p class="artical_littlestyle3">3、CMOS存储器</p><p style="text-indent: 2em;">在PC机中,除了需要使用内存和ROM BIOS以外,还需要使用只有很少存储容量的(只有64或128字节)CMOS(Complementary Metal Oxide Semiconductor,互补金属氧化物半导体)存储器来存放计算机的实时时钟信息和系统硬件配置信息。这部分内存通常和实时时钟芯片(Real Time Chip)做在一块集成块中。CMOS内存的地址空间在基本内存地址空间之外,需要使用I/O指令来访问。<br/></p>
你可能也喜欢:
暂无评论,要不要来个沙发
发表评论
JLink V9掉固件修复(灯不亮) 3Zephyr笔记2 - 在STM32F429上运行HelloWorld 2计算NandFlash要传入的行地址和列地址 1Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式 0Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式 0Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2) 0
标签云
Linux嵌入式实用技巧ARM内核学习问题集合CC++编程语言阅读笔记汇编Linux内核完全注释Windows驱动开发计算机基础ARM11ARMv7-ASTM32IDESublimeLinux内核学习eMMCMMC子系统Ubuntu操作系统OfficeVMWareAPUEgccRTOS中断漫游世界随笔感悟开发工具软件应用编程VsCodearmccarmclang编译器ZephyrSPIJLink网卡驱动安装各种芯片库函数NFSμCOS内核sambaFlashUnix命令与脚本输入法Linux内核设计与实现gitRIFFWAVJATGFTPar8161安装centos有线上网μCGUI字库工程建立右键菜单网络文件系统Firefox百度NTFS文件系统CodeBlocksCentOS数据结构算法PhotoShop51KeilQTUltraEditscanfglibc宏定义UIDGID优先级娱乐天地SourceInsight磁盘扇区总线I2CPDFBComparePythonI2SFPUMakefileSWDCPUARP软件推荐FileZilla