您好、欢迎来到现金彩票网!
当前位置:打鱼棋牌游戏平台 > 物理分页 >

计算机原理学习(6)-- x86-32 CPU和内存管理之分页管理

发布时间:2019-08-19 08:06 来源:未知 编辑:admin

  上一篇我们了解了x86-16 CPU计算机的内存访问方式,寻址方式,以及基于MS-DOS的应用程序的内存布局。这一篇会主要介绍32位处理器的内存访问,内存管理以及应用程序的内存布局。虽然目前64位CPU已经非常普及了,不过相对于32位的内存管理方式并没有大的变化,而32位相对于16位却有了极大的改变。

  1985年10月。Intel推出了80386 CPU 用来取代之前x86-16位的架构,一直到现在差不多块20年的时间里,虽然处理的速度,制造工艺都在不断提升,但x86-32的架构都没有大的改变。一般我们说的IA-32, I386和x86-32是一个意思。

  从80386开始,地址线位,和CPU寄存器以及运算单元位数一样,最大寻址范围增加到4G。所以在也不会出现16位CPU时访问内存出现的问题。另外80386处理器都可以支持虚拟存储器,支持实模式,保护模式和虚拟8086模式,支持多任务。 而之后的CPU,主要的改进就在于:

  但是在内存管理访问,却没有太大的变化,所以我们后面介绍的内容基本上可以试用所有的x86-32 CPU而不用特意去区分那个型号的CPU。

  前一篇我们已经比较详细的了解了16位CPU的内存访问技术,现在可以会头想想他所存在的缺点,

  单任务: 16位的CPU只支持单任务,也就是同时只有一个程序在运行,随着计算机的发展,单任务的缺点在于体验较差;

  内存小: 前面我们知道,在运行程序时,会把程序全部加载到内存中,但是当程序大于内存时,程序就无法运行了;

  地址不确定:每次程序装载时分配的地址可能都不一样,使得程序在编写时处理转跳等问题非常麻烦。

  安全差: 因为对于内存访问没有太多的限制,所以应用程序很容易去修改操作系统以及BIOS和硬件映射的内存空间,导致系统崩溃;

  而当80386引入多任务的支持后,以前的内存管理方式已经不能满足现状的需求的了。于是我们需要新的内存管理方式来解决上面的问题:

  地址空间:这个是对物理内存的一个抽象,就好像进程是对CPU的一个抽象。一个进程可用于寻址的一套地址的集合,每个进程都有自己的地址空间,相互独立,这就解决了安全问题。

  交换:把程序全部加载到内存,当进程处于空闲时,把他移除内存,存放到硬盘上,然后载入其他程序。这样使得每个进程可以使用更多的内存。

  虚拟内存:在老的内存管理中,一次把程序加载到内存,而当程序过大时就无法正常运行了。而利用到计算机系统的局部性和存储分层,我们可以只加载一部分需要使用的代码和数据到内存,当访问的内容不在内存时,和已经使用完的部分进行交换,这样就能在小内存的机器上运行大的程序了。对于程序来说这是透明的,看起来自己好像使用了全部内存。而多个应用完全可以使用相同的虚拟地址。

  32位CPU中开始,因为地址线位,所以采用了一种全新的内存访问方式,虚拟寻址。也就是CPU发出的地址并不是真正的物理地址,而是需要转换才能得到真实的物理地址。初看起来和16位计算机的分段内存访问好像差不多。但本质却不同。16位的分段访问是为了解决地址线位数大于CPU位数的问题。而虚拟寻址则是真正解决了上面提到的那些问题。  当然,Intel为了兼容,仍旧支持16位的分段式内存访问。

  CPU在内部增加了一个MMU(Memory Management Unit)单元来管理内存地址的转换。我们知道在16位时代,仅仅使用一个地址加法器来计算地址,而这里MMU单元除了可以转换地址,还能提供内存访问控制。 比如操作系统固定使用一段内存地址,当进程请求访问这一段地址时,MMU可以拒绝访问以保证系统的稳定性。而MMU的翻译过程则需要操作系统的支持。所以可见硬件和软件在计算机发展过程中是密不可分的。后面会详细介绍虚拟地址转换的过程。这也是本文的重点。

  从80286开始为了兼容8086引入了实模式和保护模式。但是80386因为引入了对虚拟内存的支持,使得保护模式相对80286有了很大改变。而80286也受限于当时MS-DOS只能工作于实模式,所以无法使用到保护模式。所以我们一般谈到保护模式都是指386之后的32位保护模式。而CPU工作模式也和操作系统有关。

  实模式: 实际就是8086的工作模式,可寻址空间为1M,采用分段式内存访问。程序可以直接访问BIOS和硬件的内存映射,所以目前计算机在启动时都是在实模式下。

  保护模式: 80386以后因为引入了虚拟存储器,所以能更好的保护操作系统和各个进程的内存, 它主要体现在4G可寻址空间,采用段页式虚拟内存访问,支持多任务。当计算机启动后,BIOS把控制权交给操作系统,从实模式切换到保护模式。

  虚拟8086模式:  主要是在保护模式下虚拟执行8086的实模式,这并不是一个CPU的模式,本质还是工作在实模式下,但可以实现多任务。

  我们平时会经常听到实模式和保护模式,我们现在可以了解到他们主要的区别就在于内存访问的方式上,而CPU工作模式也离不开操作系统的支持。在DOS和Windows 1.X系统中,只支持实模式;Windows3.0中,同时支持实模式和保护模式;而到了Windows3.1,从上面微软操作系统和Intel CPU的版本图来看,当时主流已经是80386和80486了,所以移除了对实模式的支持。

  EAX,EBX,ECX,EDX相对于16位的CPU来说扩展成了32为,当然为了兼容16为CPU,低位的16位和8位寄存器可以被单独使用。

  ESI,EDI两个个变址寄存器升级到了32位,其低位的16位对应之前的SI,DI寄存器、

  ESP,EBP2个指针寄存器同样变为32位,其低位的16位对应之前的SP,BP寄存器。

  在8086内存寻址中有介绍,只有BX,BP,SI,DI可以用来存放基址和变址的地址,但是80386开始,以上8个寄存器都可以用来存放指针地址,所以更加的通用。

  32位CPU为了保持对16位CPU的兼容性,保留了4个16位段寄存器,CS,SS,DS,ES,同时增加了2个段寄存器FS,GS

  EIP扩展到了32位,和数据线位作用和IP寄存器相同。在32位计算机中存放的是指令的虚拟地址,16位计算机中存放的是CS段内有效地址。EFLAGS寄存器同样扩展到32位,具体含义我们这里不做介绍。

  另外我们也看到,在IA-32中也新增了一些寄存器,GDTR/IDTR/LDTR/TR。他们主要在CPU保护模式下需要用到的寄存器,具体使用在后面会介绍到。

  虚拟存储器我们一般也称为虚拟内存(和Windows中的虚拟内存不是一个概念,但是有关联),它的基本思想是:

  在实模式下,CPU将偏移地址和段寄存器,基址寄存器等进行计算得到的实际的物理地址。 而在保护模式下,引入了虚拟内存的概念,在虚拟内存中使用的地址称为虚拟地址(线性地址),虚拟地址通过MMU将虚拟地址映射为物理地址,然后送到总线,进行内存访问。这里最关键的就是虚拟地址的映射。

  对于虚拟内存来说,是对物理内存的抽象,整个虚拟内存空间被划分成了多个大小固定的页(page),每个页连续的虚拟地址,组合成了一个完整的虚拟地址空间。同样,操作系统也会把物理内存划分为多个大小固定的块,我们称为页框(page frame),它只是操作系统为了方便管理在逻辑上的划分的一个数据结构,并不存放实际内存数据,但是我们可以简单的认为它就是内存。这样一个虚拟内存的page就可以和一个物理内存的page frame对应起来,产生映射关系。

  关于一个虚拟页的大小,现在的操作系统中一般是512B-64K(准确的说是地址范围大小,而非容纳数据的大小)。但是内存页的大小会对系统性能产生影响,内存页设得太小,内存页会很多,管理内存页的数组会比较大,耗内存。内存页设大了,因为一个进程拥有的内存是内存页大小的整数倍,会导致碎片,即申请了很多内存,真正用到的只有一点。目前Windows和Linux上默认的内存页面大小都是4K。

  从上图我们也可以看出,虚拟内存的页和物理内存的页框并不一定是一一对应的,虚拟内存的大小和系统的寻址能力相关,也就是地址线的位数,而物理内存的页框数取决于实际的内存大小。所以可能只有一部分页有对应的页框,而当访问的数据不在物理内存中时就会出现缺页,这个时候操作系统会负责调入新的页,也就是建立新的映射。这样就不需要一次把程序全部加载到内存。

  很多人会有一个疑问,虚拟页到底是实际存在的还是虚拟的?我们知道内存中存放的是执行文件的代码和数据,而程序在运行前,它的数据和代码是存放在这个程序的可执行文件中的(比如.exe和.so),而在运行时需要把可执行文件加载到内存。所以我们把这个硬盘上的文件也划分为4K大小的页(逻辑上划分,实际是加载过程中加载器完成的),这就是虚拟页里面实际的东西。但是程序在运行是可能会申请内存,这个时候需要新的虚拟页来映射,所以我们可以得知虚拟页应该有3种状态:

  已映射:虚拟页面被创建已经被加载到物理内存,和物理页之间存在映射关系。

  未映射:虚拟页面被创建,但是没有被加载到内存或已经被调出内存,和物理页面之间没有映射关系,当需要使用时调入内存建立映射。

  未创建:虚拟页面没有被创建,可能是因为还没有访问到此页面所以没有加载或者是调用macllo来分配内存,只有在运行是才会被创建。

  加载应用程序到内存时,因为和虚拟地址有关,我们需要把应用程序文件和虚拟内存关联起来,在Linux中称为存储器映射,同时提供了一个mmap的系统调用来实现次功能。文件被分成页面大小的片,每一片包含一个虚拟页面的内容,因为页面调度程序是按需求调度,所以在这些虚拟页面并没有实际的进入内存,而是在CPU发出访问请求时,会创建一个虚拟页并加载到内存。我们在启动一个进程时,加载器为我们完成了文件映射的功能,所以此时我们的执行文件又可以称为映像文件。实际上加载器并不真正负责从磁盘加载数据到内存,因为和虚拟内存建立了映射关系,所以这个操作是虚拟内存自动进行的。 正是有了存储器映射的存在,使得我们可以很方便的将程序和数据加载到内存中。

  当CPU请求一个虚拟页是,虚拟页会被创建并加载到内存,而页面调度算法可能在页面休眠或在内存满的情况下更具调度算法将虚拟页交换出去,在适当的时候可能被交换回来。这个时候就需要一个区域来存放被交换出来的虚拟页,这个区域称为交换分区。 这个分区在Linux中称为swap分区,而在Windows中我们称为虚拟内存(注意这里和我们谈到的虚拟内存技术不是一回事)。

  以前电脑内存很小,特别是玩一些游戏时经常会提示内存不足,网上一般会告诉你增大你的虚拟内存(交换分区),这样一来在内存不足的时候可以存放更多交换出来的虚拟页,看起来好像内存变大了一样。从这方面来说Windows把他叫虚拟内存(交换分区)也是很正确的。  交换分区虽然也是硬盘的一部分,但是交换分区没有普通的文件系统,这样消除了将文件偏移转换为页地址的开销。但是过于频繁的交换页面,IO操作会导致系统性能下降。但是在内存不足时可以保证系统 正常运行。当然这也和交换分区的大小有关。

  而如今,一般使用的电脑都已经4G,8G内存了,对于普通需求来说足够大了。所以虚拟页会长时间存在与内存中而不被交换出去。所以我们可以禁用掉交换分区,以便提高性能。对于Windwos 从Vista开始有一个Superfetch的内存管理机制,而linux有Preload与之类似。这种内存机制会将用户经常用的应用的部分虚拟页提前加载到内存,当用户使用时就无需在从硬盘加载。而当应用休眠或关闭时,也不会将这些虚拟页交换出去。

  如下图就是Windows 8上内存使用情况,其中最左灰色部分是给BIOS和硬件保留的内存映射区域;绿色为操作系统,驱动以及用户进程使用的内存;橙色表示已经修改的内存也,当交换出来时需要先写回到硬盘;而蓝色部分5G内存则是用来缓存了未激活进程的数据和代码页;最后剩余的3M才是空闲内存。 当活动进行需要更多内存时会优先使用可用部分,当可用部分没有内存可用时,会释放一部分备用区域的内存。

  上面我们看到当实际物理内存小于虚拟内存时,会存在缺页以及页面交换等问题。此时操作系统会处理这些事情,是的这一切对于程序来说是透明的,它们不知道发生了什么,只知道自己可以使用全部的虚拟内存空间。而对于操作系统来说,它们需要负责一切,需要知道程序的那些页在实际内存中,那些不在。于是出现了页表,就是用来记录虚拟内存的页和物理页框之间的映射关系。MMU也正是利用页表来进行虚拟地址和物理地址的转换。

  上面这张图是一张虚拟内存页和物理内存页框之间通过页表的映射关系,其中虚拟页面从VP0-VP7,物理页为PP0-PP3,我们从图中可以得到几点信息:

  这里可能会有疑问,为什么VP5没有被创建?虚拟页不是应该连续的吗?这就涉及到内存分段,程序编译和加载一些列问题了,这个会在介绍程序加载时解释。

  最后我们看下页表中PTE的结构,一个PTE大小是32位,系统在操作页表时则会根据这些属性进行相应操作。

  当然,如果访问过程中出现缺页,会产生一个中断,然后操作系统会载入需要的页面并进行映射(设置页表),最后返回物理页号得到物理内存。从上面的过程我们可以知道,每次进行地址变化,MMU都要访问内存。回忆8086地址变换时是不需要访问内存的,于是虚拟地址的转换会影响系统性能,但是相当于虚拟内存带来的好处,这点代价还是值得的。

  在IA-32平台上,地址线位,所以最大的寻址范围是4G,那么最多能够支持使用4GB的内存(内存按字节编码)。那么对于虚拟内存来说,它的地址范围为4G(0x00000000 ~ 0xFFFFFFFF),而一个内存页的大小是4K,那么一个程序虚拟内存空间中有1048576个页(实际上进程可访问的虚拟地址范围没有4G,Linux是3G,Windows是2G或3G)。

  从上面我们知道每个虚拟页都会在页表中有一个PTE,每个PTE为32位,那么对于一个进程至少需要4MB的内存来维护自己的页表;而一个系统中可能存在多个进行,仅仅维护页表这一项就需要消耗比较多内存。但实际上很多PTE项并没有映射到对应的物理页,这就造成了浪费。

  有人会说那我们就动态建立页表,在映射时才增加这一项。但是从虚拟地址转换我们可以看到,找到PTE是通过PT首地址+页号得到的,所以页表PTE必须是连续的,但我们又知道并不是所有的虚拟页都会马上被创建,在访问是就会出现问题,比如VP0-VP8中的VP5没有被创建,当访问页号是5时,就会错误的访问到VP6。所以为了解决页表占用内存过多的问题,引入了分级页表。注意分级页表也需要CPU硬件提供支持。

  上图是Linux系统上二级页表的示意图。与一级页表不同的是,多增加了一层目录,虚拟地址的组成变为了【目录地址+页表地址+页内偏移】。其中页内偏移地址为12位,页表(PGT)地址为10位,页表目录(PGD)地址为10位。因为总过是32位,他们表示的PTE的个数是不变的。同样,PEG的每一个项目也有自己的结构。

  现在谈一谈为什么页表分级可以解决内存问题。首先因为页表需要连续的大的内存空间,通过引入目录级,我们可以离散对连续大空间的需求,这样,只有在同一个目录下的页表才需要连续的空间。另一方面,如果某个目录下的页表中没有任何映射的记录,那么这一张页表就不需要加载。因为其他页表可以通过其他目录项来获得,而不会存在一级表中不加载页表项导致访问出错的问题。但是同一个页表中,如果只有一个PTE被使用,这张页表也是需要被加载的。分级的方法同样用到了程序的局部性原理。

  对于32位系统最多能使用4G内存,为了让系统可以使用更多内存,加入了物理地址扩展(Physical Address Extension,缩写为PAE)功能,可以支持36位。在前面8086时候我们见过类似的技术来使用更多内存。这个时候2级页表就无法满足要求了,于是引入了三级页表。其中增加了PMD中间目录一级。

  为了适应64位CPU,操作系统又引入了4级页表。但是总体上来说他们工作原理都是相同的,这里就不叙述工作工程了。但是要注意的是,分级页表需要处理器的支持,对于只支持二级或三级页表的CPU来说,内核中体系结构相关的代码必须通过空页表对缺少的页表进行仿真。因此,内存管理代码剩余部分的实现是与CPU无关的。目前Windows 2000/XP使用的是二级页表,而使用PAE时则使用的是三级页表,对于64位操作系统则采用了四级页表。Linux则使用了四级页表。

  在64位操作系统中,因为有64位地址线,所以页表的大小可能非常非常大,虽然分级页表可以不必加载全部页表,IA-32,IA64系统一般使用四级页表来处理,而在PowerPC等体系中则使用倒排页表来解决这个问题。与传统页表的区别: 使用页框号而不是虚拟页号来索引页表项。因为不是X86体系中常用的方法,这里就不相信介绍了。具体可以查看《现代操作系统》P113

  前面介绍虚拟地址转换时说过,相对于8086上的地址转换而言,这里多了一次内存访问查找页表的过程。我们知道内存速度比CPU慢很多,每次从内存取数据都要访问2次内存,会使得系统性能下降。

  为了解决这个问题,在MMU中包含了一个关于PTE的缓冲区TLB(Translation Lookaside Buffer ),TLB是一个寄存器,所以它运行的速度和CPU速度相同。TLB中每一行保存了一个PTE,如上图所示,每次在去页表中查找之前,可以先在TLB中进行查找,如果命中则直接拿到物理页地址,如果不命中则再次访问内存。我们多次提到程序的局部性,在这里下一个要访问的地址很可能和前一个是在同一个内存页中,于是我们可以直接从寄存器中拿到物理内存页号,而不需要在访问内存,这样大大提高的了系统的速度。

  上图是TLB的一个基本结构,对于多级页表来说,TLB可以缓存每一级的地址,所以同样能起作用。因为局部性原理,多级页表的访问速度并不比一级页表差。关于TLB更详细的内容,可以查看《深入理解计算机系统》P607 - P619

  我们知道在系统中,每个进程都有自己独立的虚拟空间,于是每个进程都有一张属于自己的内页表。 而我们翻译地址时,从cr3中取出页表目录的首地址。对于不同的进程,他们都使用同一个寄存器。于是在CPU调度进程的时候,虚拟的地址空间也需要切换。于是对于普通用户程序需要做下面几件事情:

  但是内存中除了用户程序之外还存在操作系统自身占用的内存。我们可以简单的把操作系统看成一个超大的进程,他和其他普通进程一样需要使用虚拟内存,需要使用到页表。当然作为内核程序,它必须是有一些特权的,下一篇我们将会介绍虚拟内存的布局。而对于内核而言不是存在进程调度的。因为所有的内核进程都是共享内核的虚拟地址空间,而我们一般都称之为内核线程,而非进程。 当然对于Linux而言,没有线程的概念,线程和进程唯一不同就是是否共享虚拟地址空间。一般来说内核代码是常驻在内存的,那么内核会不会缺页呢?

  这一篇文章主要介绍了IA-32上的虚拟内存管理,主要的核心就是虚拟内存分页。这也是现代操作系统和计算机的核心部分。整个虚拟内存部分涉及的内容也非常广,加上自己理解不深,很多东西就只能简单介绍了。而且内存管理这一块不同操作系统可能会有一些不同的,这里我尽量避开这些差异,总体来说都是比较通用的。在下一篇将主要介绍虚拟内存中的分段管理。

  一、问题提出:我们经常会使用malloc()以及free()函数进行堆区内存申请与释放。那么你是否会这样做:int*p=malloc(0);/*malloc分配了0个字节吗,如果是那么p指向谁呢,是N...博文来自:Apollon_krj的博客

  前言 前一篇我们介绍了内存管理中的分页试内存管理,分页的主要作用就是使得每个进程有一个独立的,完整的内存空间,通过虚拟内存技术,使得程序可以在较小的内存上运行,而进程之间内存空间相互独立,提高了安全性...博文来自:CC的技术专栏

  当我们写完一个程序后,编译、链接、执行,表面看似很简单,其实程序执行过程中,内存为我们的程序做了很多事。我们先来看一个图一般我们将内存分为:堆区、栈区、全局区、代码区、常量区,各个区域存放的内容:栈区...博文来自:well的博客

  操作系统——分页式内存管理为什么要引入内存管理?答:多道程序并发执行,共享的不仅仅只有处理器,还有内存,并发执行不过不进行内存管理,必将会导致内存中数据的混乱,以至于限制了进程的并发执行。扩充内存的两...博文来自:MISAYAONE的博客

  一概述1.物理分页物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的就是分页结果。2.逻辑...博文来自:MoveFlower的博客

  内存分页大小对性能的提升原理转自:优化之调整大内存分页(LargePage)本文将从...博文来自:Cheers Li 软件测试博客

  内存管理包括内存管理和虚拟内存管理。内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(分页管理方式、分段管理方式、段页式管理方式)。虚拟内存管理包括虚拟内存概念、请求分页管理...博文来自:Peter-H

  本文为第16章笔记因为段的长度不定,在分配内存时,可能会发生内存中的空闲区域小于要加载的段,或者空闲区域远远大于要加载的段.在前一种情况下,需要另外寻找合适的空闲区域;在后一种情况下,分配会成功,但太...博文来自:ProgrammingRing的专栏

  1:实际内存实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序,现在的RAM的形式有多种:SIMM、DIMM、Rambus、D...博文来自:晴天的专栏

  (一):逻辑地址(LogicalAddress)     指由程式产生的和段相关的偏移地址部分。例如,你在进行C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当...博文来自:HotIce0

  页的尺寸是4KB,虚拟地址的前20位用于指定一个物理页,后12位用于访问页内偏移。页表项的结构:层次化的设计想法:因为4GB的虚拟内存共有1M=220=1048576个4K大小的页面。我们将这些页面分...博文来自:请赐予我力量

  本文将从内存分页的原理,如何调整分页大小两节内容,向你阐述LargePage对JVM的...博文来自:Java&&大数据专栏

  离散分配方式连续分配存储管理方式产生的问题:要求连续的存储区碎片问题变连续分配为离散分配,允许将作业离散放到多个不相邻接的分区中。分页式存储管理:离散分配的基本单位是页分段式存储管理:离散分配的基本单...博文来自:杨森源的博客

  1、离散分配方式----连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但需为之付出很大开销。如果允许将一个进程直接分散的装入到许多不相邻接的分区中,则无需再进行...博文来自:dongyanxia1000的专栏

  一、内存管理的目的和功能内存一直是计算机系统中宝贵而又紧俏的资源,内存能否被有效、合理地使用,将直接影响到操作系统的性能。此外,虽然物理内存的增长现在达到了N个GB,但比物理内存增长还快的是程序,所以...博文来自:渴望,就奋力追寻...

  非连续分配允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式和分段存储管理方式。分页存储管理方式中,又根据运行作业时是否要把作业的所有页面都装入内存才能运行分为基本...博文来自:姜兴琪的博客

  1.物理内存的划分1)等长分区划分:将内存等长划分,然后选择一部分给进程(分页)2)不等长分区划分:进程需要多少给它划分多少(分段)分页就是将内存分为等块等块的,在虚拟内存中称为页,在物理内存中...博文来自:凡尘

  这几篇文章里介绍的是是概念和逻辑,我在总结完会去学调一下windowsAPI博文来自:Edens space

  两者描述    打个比方,比如说你去听课,带了一个纸质笔记本做笔记。笔记本有100张纸,课程有语文、数学、英语三门,对于这个笔记本的使用,为了便于以后复习方便,你可以有两种选择。     第一种是,你...博文来自:TinyFisher的专栏

  内存管理之分页昨晚读《go语言学习笔记》的时候,看到了内存管理这一章,提到了内存的分页。其实分段与分页在微机接口这课程也学过,只是一直在弄上层的东西,有点儿生疏了,今天有空查了点资料,做了点笔记。虚拟...博文来自:sryan的专栏

  Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存有些虚拟内存永远不会交换到文件中,这些内存叫非分页内存#definePAGEDCODEcode_seg(“PAGE”);//分页内...博文来自:Vinx Blog

  页式非连续分配方式。其出发点打破了程序装入的整体性和存储分配的连续性允许进程逻辑地址空间不必分布在内存的一段连续空间中,而是可以分布在若干非连续的内存块中。即内存分配时,以页为单位,并按用户...博文来自:青帝的专栏

  虚拟地址由操作系统维护,由MMU可以进行转换,扩大了内存空间分页管理。大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间...博文来自:水木米

  分页内存和非分页内存  首先介绍几个术语:进程上下文,就是表示进程信息的一系列东西,包括各种变量、寄存器以及进程的运行的环境。这样,当进程被切换后,下次再切换回来继续执行,能够知道原来的状态。中断上下...博文来自:蜗牛的专栏

  内存管理包括内存管理和虚拟内存管理。内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(分页管理方式、分段管理方式、段页式管理方式)。虚拟内存管理包括虚拟内存概念、请求分页管理...博文来自:weixin_30784501的博客

  学习操作系统时的一些小小总结。分区存储管理的优点是简单易实现,但缺点是碎片问题突出,主存空间的利用率低下。导致该问题的主要原因是采取了连续分配原则,即一个作业必须占用一个连续的分区,提高了分区分配的难...博文来自:高冷的大帅哥的博客

  前言前面我们已经了解了计算机硬件的工作原理,以及操作系统的发展。我们知道是内存把计算机硬件和软件联系了起来。不夸张的说,了解了软件在内存中的结构,就基本了解了程序最底层的运行原理。所以从这一篇开始,将...博文来自:Code-lovers Learning Notes

  今天这篇关于操作系统的方面的技术文章,我们继续为各位朋友们讲解关于操作系统的内存方面的内容。今天我们主要为各位朋友们讲解内存分页管理、虚拟内存介绍。传统存储管理方式的特征上一节所讨论的各种内存管理策略...博文来自:secret

  386及更高型号处理器使用内存分页机制,这使得同一个线性地址可以被映射为多个物理地址,这种映射是通过分页单元这一特殊的硬件电路实现的。通常程序中所使用的线性地址是由链接器帮我们产生的,而操作系统通过维...博文来自:ars longa, vita brevis

  1.分段,分页机制 不分页:  线性地址  ==  物理地址分页:  线性地址  !=  物理地址线性地址空间也就是所有可能线性地址的范围.操作系统会在启动的时候测量到实际的内存有多少,  什么范围....博文来自:farmwang的专栏

  要想弄懂Linux内核的工作原理,就必须懂点基本的硬件知识。这里我们主要介绍Intel80x86系列CPU保护模式下最核心的部件中几个寄存器的作用,这些寄存器在Linux内核运行时起着至关重要的作用。...博文来自:farmwang的专栏

  因为段的长度不定,在分配内存时,可能会发生内存中的空闲区域小于要加载的段,或者空闲区域远远大于要加载的段.在前一种情况下,需要另外寻找合适的空闲区域;在后一种情况下,分配会成功,但太过于浪费.为了解决...博文来自:baixiaoshi的专栏

  分页分段目的页是信息的物理单位,分页是为实现离散分配方式,以减少内存的外零头,提高内存的利用率。或者说,分页仅仅是由于系统管理的需要而不是用户的需要是信息的逻辑单位,它含有一组其意义相对完整的信息。分...博文来自:姜兴琪的博客

  对于计算机系统而言,操作系统充当着基石的作用,它是连接计算机底层硬件与上层应用软件的桥梁,控制其他程序的运行,并且管理系统相关资源,同时提供配套的系统软件支持。对于专业的程序员而言,掌握一定的操作系统...博文来自:梦里水乡的专栏

  序言又有两年没有写Blog了,这2年从做windowsphone到AndroidC++,慢慢的很多观念也有所改变了。以前一心想做C#相关的工作,现在却感觉,什么语言都无所谓了。公司项目挺忙,加班比较多...博文来自:Innocence_y的博客

  一、逻辑地址转线性地址   机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。我们写个最简单的helloworld程序...博文来自:zwj0403的专栏

  前言前面我们已经了解了计算机硬件的工作原理,以及操作系统的发展。我们知道是内存把计算机硬件和软件联系了起来。不夸张的说,了解了软件在内存中的结构,就基本了解了程序最底层的运行原理。所以从这一篇开始,将...博文来自:CC的技术专栏

  分段机制:  在8086时期,寄存器是16位,无法存放20位的物理地址,为了解决这问题,人们提出了分段机制,分段机制就是将内存分段,每段大小64kb(正好由16位表示),在段寄存器中放入段基址,然后+...博文来自:This is bill的专属博客

  近来工作比较空闲,所以就上看帖子什么的,两个多月前,我在VC/MFC板块中发了这么一个帖子:dll占的究竟是谁的空间?详细参考: 博文来自:*无名小卒*

  PAE分页模式可以将32位的线位的物理地址空间。相比于32位分页方式,其物理地址空间增加到了4PB。但对于在处理器上运行的任一进程而言,其最大的线GB。页面大小P...博文来自:huangkangying的专栏

  分页式和段式存储管理 (2014-05-2722:49:05)转载▼      在操作系统引入分页和分段管理之前,操作系统采用的是分区管理,就是将内存分成多个连续的地址空间,如果允许将一个进程分散到许...博文来自:刘淏卿的专栏

  linningya:[reply][/reply] 时序发生器不用控制,就是永远不变的方波信号,通过固定的上升沿和下降沿触发下一级器件,建议学习数字电路基础这方面资料。。。

http://lotusyogacenter.com/wulifenye/486.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有