MMU诞生之前: 在传统的批处理系统如DOS系统,应用程序与操作系统在内存中的布局大致如下图: 应用程序直接访问物理内存,操作系统占用一部分内存区。...虚实内存映射及交换管理,可以将真实的物理内存,有可变或固定的分区,分页或者分段与虚拟内存建立交换映射关系,并且有效的管理这种映射,实现交换管理。...那么实际上内存是昂贵的,即使内存成本远比从前便宜,但是应用进程对内存的寻求仍然无法在实际硬件中,设计足够大的内存实现直接访问,即使能满足,CPU利用地址总线直接寻址空间也是有限的。...从应用程序角度来看,应用程序(往往是进程)所使用的地址是虚拟内存地址,从概念上就如下示意图所示,MMU在操作系统的控制下负责将虚拟内存实际翻译成物理内存。...所以这种技术节省内存的好处是显而易见的。 使得应用程序以及操作系统更具灵活性。 操作系统根据应用程序的动态运行时行为灵活的分配内存给应用程序。 使得应用程序可以使用比实际物理内存多或少的内存空间。
; 操作系统分内核与外壳(我们可以把外壳理解成围绕着内核的应用程序,而内核可以理解为能直接操作硬件的程序)。...根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别: 用户态(user mode) : 用户态运行的进程或可以直接读取用户程序的数据。...分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要。 3.5 逻辑(虚拟)地址和物理地址 ??...虚拟内存 使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。...由于外存往往比内存大很多,所以我们运行的软件的内存大小实际上是可以比计算机系统实际的内存大小大的。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。
是将整个程序一起载入内存中吗? 不是!采用离散存储方式 离散存储方式 (1) 分页存储管理方式。 (2) 分段存储管理方式。 (3) 段页式存储管理方式。...而对于需要处理大量大型数据的应用程序,较大的页大小可以提高数据访问速度,但是可能会降低内存利用率。 分页存储管理的基本方法 页面和物理块 (1) 页面。 (2) 页面大小。...假设访问一次内存的时间为t: 1)在基本分页存储管理方式中,有效访问时间分为第一次访问内存时间(即查找页表对应的页表项所耗费的时间t)与第二次访问内存时间(即将页表项中的物理块号与页内地址拼接成实际物理地址所耗费的时间...,可以直接得到逻辑页所对应的物理块号,由此拼接形成实际物理地址,减少了一次内存访问,缩短了进程访问内存的有效时间。...对于不具有请求调页功能的存储器管理系统,此时则表示地址出错。对于具有请求调页功能的存储器管理系统,此时应产生请求调页中断,系统将把此页调入内存。
而这三种其中我们编写的应用程序打交道最多的就是内存,我们继续细化下内存。内存的管理方式现代操作系统中,计算机内存的管理通常是按照先分段再分页的方式进行的。...分段机制主要是为了解决程序直接使用物理地址时可能遇到的问题,例如两个程序使用的地址有交集时无法同时运行,写代码时需要考虑到目标计算机的内存大小,以及系统程序和各个程序之间需要隔离等。...通过将内存分成若干段,每个程序只能访问为其分配的段,从而实现了内存的有效管理和保护。分页机制则是对内存进行更细粒度的管理。它将内存划分为固定大小的页面,每个页面都可以单独进行分配和管理。...分段为程序提供了初步的隔离和保护,而分页则进一步提高了内存管理的效率和灵活性。这种结合使用的方式使得现代操作系统能够更有效地管理计算机内存,支持多任务运行和复杂的应用程序。...而页地址则与分页内存管理相关,现代操作系统常常使用分页机制来管理物理内存,将内存划分为固定大小的页,每页有一个唯一的页地址。然而,在编程语言如C中,程序员通常不需要直接处理段地址或页地址。
物理内存管理在另外一篇:《操作系统内存管理(思维导图详解)》 1、程序的进程在内存的数据结构 一.Linux 进程在内存数据结构 ---- 1、存储(没有调入内存)阶段: 可以看到一个可执行程序在存储...再比如32位机器可以直接寻址4G空间,意思是每个应用程序都有4G内存空间可用。但是显然机器内存罕有如此之大,可以支持每个程序使用4G内存的。...应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。...随着可执行映像的运行和页面的换入.系统中的内存有可能变得不足.这时Linux核心就必须调用kswapd守护进程释放部分物理内存。kswapd在系统启动时由init进程建立。在系统的运行过程中。...缺页中断:即指的是当应用程序试图访问已映射在虚拟地址空间中,但是并未被加载在物理内存中的一个分页时,产生一个页不存在的中断,需要操作系统将其调入物理内存后再进行访问。
可执行文件生成:链接时内存分配的结果是生成可执行文件,该文件包含了所有的代码和数据,可以直接在操作系统上运行。...同时,通过分页可以进一步将段内的页面划分为固定大小的块,更好地适应系统的物理内存管理。 隔离性:不同的段可以具有不同的访问权限和保护机制,提供更好的隔离性。...通过为每个段设置访问权限,可以对进程或线程对不同段的访问进行精细的控制。 页表项:在分页式内存管理中,通过页表项来记录每个页的访问权限。...通过为每个段设置访问权限,可以对进程或线程对不同段的访问进行精细的控制。 页表项:在分页式内存管理中,通过页表项来记录每个页的访问权限。...提高分配和释放效率:由于内存块已经预先分配,应用程序可以直接从内存池中获取内存块,无需频繁进行内存分配和释放操作,从而提高效率。
实际上,存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。CPU寄存器保存着最常用的数据。高速缓存存储器作为一部分存储在相对慢速的主存储器中数据和指令的缓冲区域。...02 — 内存管理 在计算机系统内,进程可以看成是程序的抽象,程序的功能是由多个进程的执行来实现的,而主存是用于保存进程运行时的程序和数据,在进程整个生命周期中(创建、执行、结束),内存都扮演着非常重要的角色...在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。 在分页系统中的页面其大小应适中。...页表 在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。为此,系统又为每个进程建立了一张页面映像表,简称页表。 ?...为使程序能正常运行,亦即,能从物理内存中找出每个逻辑段所对应的位置,应像分页系统那样,在系统中为每个进程建立一张段映射表,简称“段表”。
磁盘 disk 作为一种大容量的存储也作为"内存"的一部分参与程序的运行,内存管理系统会将不常用非活跃内存进行页面换出,可以认为内存是磁盘的缓存,内存中保留了活跃的数据,从而间接扩展了有限的物理内存空间...本文对于段页管理机制只想通俗地说明一些概念,段页管理机制是分段式管理和分页式管理的组合,段式管理是逻辑上的管理方式,分页管理是偏物理上的管理方式。...举个栗子: 在进行居民户籍管理时都会有区县市的概念,但是实际上并没有这种实体,都是逻辑上的,增加了这些行政单位之后可以让地址管理更加直接。...从应用层角度来查看内存的状态: 也就是Linux上运行的程序可以使用的内存大小,即free命令第三行 -/+ buffers/cache 的输出。...,如果找到,直接读出传送给应用程序,否则,才从磁盘读取,通过这种缓存机制,大大降低了对磁盘的IO操作,提高了操作系统的数据访问性能。
同时运行多个程序比较困难:多个用户程序如果都直接引用物理地址,很容易互相干扰。那么是不是可以通过不断交换物理内存和磁盘来保证物理内存某一时间自由一个程序在运行呢?...实际上只有 1G 物理内存的 PC 是可以运行 2G 的应用程序的。 综合上面各种缺点,虚拟内存出现了。 2....分段概述 前面介绍了分页内存管理,可以说通过多级页表,TLB 等,分页内存管理方法已经相当不错了。那么分页有什么缺点呢? 共享困难:通过共享页面来实现共享当然是可以的。...采用分段和分页结合的方式管理内存,一个地址由两个部分组成:段和段内地址。段内地址又进一步分为页号和页偏移。在进行内存访问时,过程如下: 根据段号找到段描述符(存放段基址)。...4. malloc 和物理内存有关系吗? 可以说没关系,malloc 申请的地址是线性地址,申请的时候并没有进行映射。访问到的时候触发缺页异常,这个时候才会进行物理地址映射。
虚拟内存虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。...当程序访问虚拟内存地址时,操作系统会进行地址转换,将虚拟地址映射到物理地址上,这样不同的进程运行时,写入的是不同的物理地址,避免了互相覆盖指针的问题。...虚拟地址与物理地址之间通过页表进行映射,页表存储在CPU的内存管理单元(MMU)中,从而CPU可以直接通过MMU找到实际访问的物理内存地址。...因此,每次写入硬盘的是少量的一页或几页,不会花费太多时间,从而提高了内存交换的效率。简单分页简单分页存在空间上的缺陷。在操作系统可以同时运行大量进程的情况下,页表会变得非常庞大。...总结虚拟内存是操作系统提供的一种机制,通过将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上,解决了多个应用程序直接操作物理内存可能引发的冲突问题。
在分页机制完成后, 才会开始初始化系统的内存数据结构(包括内存节点数据和内存区域), 并在随后初始化buddy伙伴系统来接管内存管理的工作 2 分页机制初始化 arm64架构下, 内核在start_kernel...这对管理普通应用程序和内核访问内存的方式,有深远的影响 2.1 虚拟地址空间(以x86_32位系统为例) 因此在仔细考察其实现之前,很重要的一点是解释该函数的目的 在x86_32系统上内核通常将总的4GB...因此有必要将地址空间的一部分分配给内核专用. 物理内存页则映射到内核地址空间的起始处,以便内核直接访问,而无需复杂的页表操作....如果所有物理内存页都映射到用户空间进程能访问的地址空间中, 如果在系统上有几个应用程序在运行, 将导致严重的安全问题. 每个应用程序都能够读取和修改其他进程在物理内存中的内存区....内核通常会成功,因为大部分大的内存块都在启动时分配给内核,那时内存的碎片尚不严重。但在已经运行了很长时间的系统上,在内核需要物理内存时,就可能出现可用空间不连续的情况。
而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。 在分页机制下,虚拟地址分为两部分,页号和页内偏移。...应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。...),是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来; Swap 换入换出的过程如下图: img 使用 Swap 机制优点是,应用程序实际可以使用的内存空间将远远超过系统的物理内存。...在内核态下,操作系统可以执行特权指令,访问所有的内存和设备,以及执行关键的系统操作。内核态下运行的代码通常是操作系统内核或驱动程序。 用户态是应用程序运行的一种模式,它运行在较低的特权级别下。...在用户态下,应用程序只能访问有限的系统资源,不能直接执行特权指令或访问内核级别的数据。用户态下运行的代码通常是应用程序或用户进程。 内核态和用户态的区别在于权限和资源访问的限制。
分区式存储管理是把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。...离散存储的基本概念 将一个进程直接分散地装入到许多不相邻的分区中,而无须“紧凑”的分配方式,称为离散分配。 离散分配的种类包括分页存储管理、分段存储管理和段页式存储管理。...不具备页面对换功能的分页存储管理方式称为基本分页存储管理方式。 分页存储管理 分页存储管理的基本方法 页面和物理块 页面。 页面大小。...页表 在分页系统中,允许将进程的各个页离散地存储在内存的任一物理块中,为保证进程仍然能够正确地运行,即能在内存中找到每个页面所对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表 ?...由于虚拟存储器系统能从逻辑上扩大内存,这时,只需装入一个进程的部分程序和数据便可开始运行,故人们希望在系统中能运行更多的进程,即增加多道程序度,以提高处理机的利用率。
大家好,我是坤哥 知乎上搜到一个比较有意思的话题:如何理解「进入内核态」,要回答好这个问题需要对内存管理及程序的运行机制有比较深刻的了解,比如你需要了解内存的分段,分页,中断,特权级等机制,信息量比较大...:段内偏移量组成的,也叫逻辑地址,在只有分段内存管理的情况下它也被称为虚拟内存 GDT 及段描述符的分配都是由操作系统管理的,进程也无法更新 CS 等寄存器中值,这样就避免了直接操作其他进程以及自身的物理地址...当通过线性地址(在只有段式内存情况下,线性地址为物理地址)访问一个内存页时。...,系统调用可以直接由应用程序调用,或者通过调用一些公用函数库或 shell(这些函数库或 shell 都封装了系统调用接口)等也可以达到间接调用系统调用的目的。...,我们完全可以认为程序拥有所有的内存空间(虚拟空间),因为段选择子是由操作系统分配的,只要操作系统保证不同进程的段的虚拟空间映射到不同的物理空间上,不要重叠即可,也就是说虽然各个程序的虚拟空间是一样的,
有趣的是,尽管进程和内存的关系如此紧密,但进程并不能直接访问内存。在Linux下,进程不能直接读写内存中地址为0x1位置的数据。...程序中表达的内存地址,也都是虚拟内存地址。进程对虚拟内存地址的操作,会被操作系统翻译成对某个物理内存地址的操作。由于翻译的过程由操作系统全权负责,所以应用程序可以在全过程中对物理内存地址一无所知。...比如在C语言中,可以用下面指令来打印变量地址: int v = 0; printf("%p", (void*)&v); 本质上说,虚拟内存地址剥夺了应用程序自由访问物理内存地址的权利。...进程对物理内存的访问,必须经过操作系统的审查。因此,掌握着内存对应关系的操作系统,也掌握了应用程序访问内存的闸门。借助虚拟内存地址,操作系统可以保障进程空间的独立性。...在分页的基础上,虚拟内存和物理内存实现了分离,从而让内核深度参与和监督内存分配。应用进程的安全性和稳定性因此大为提高。
有趣的是,尽管进程和内存的关系如此紧密,但进程并不能直接访问内存。在Linux下,进程不能直接读写内存中地址为0x1位置的数据。...进程对虚拟内存地址的操作,会被操作系统翻译成对某个物理内存地址的操作。由于翻译的过程由操作系统全权负责,所以应用程序可以在全过程中对物理内存地址一无所知。...比如在C语言中,可以用下面指令来打印变量地址: int v = 0; printf("%p", (void*)&v); 本质上说,虚拟内存地址剥夺了应用程序自由访问物理内存地址的权利。...进程对物理内存的访问,必须经过操作系统的审查。因此,掌握着内存对应关系的操作系统,也掌握了应用程序访问内存的闸门。借助虚拟内存地址,操作系统可以保障进程空间的独立性。...在分页的基础上,虚拟内存和物理内存实现了分离,从而让内核深度参与和监督内存分配。应用进程的安全性和稳定性因此大为提高。
虽然内存的大小增长迅速,但是软件的大小增长的要比内存还要快。在 1980 年的时候,许多大学用一台 4 MB 的 VAX 计算机运行分时操作系统,供十几个用户同时运行。...这一发展的结果是,需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序同时运行,即使内存可以满足其中单独一个程序的需求,但是从总体上来看内存仍然满足不了日益增长的软件的需求(感觉和xxx...在使用虚拟内存时,虚拟地址不会直接发送到内存总线上。相反,会使用 MMU(Memory Management Unit) 内存管理单元把虚拟地址映射为物理内存地址,像下图这样 ?...然而只有 32 KB 的物理地址。所以虽然可以编写 64 KB 的程序,但是程序无法全部调入内存运行,在磁盘上必须有一个最多 64 KB 的程序核心映像的完整副本,以保证程序片段在需要时被调入内存。...在进程启动时,执行很多次虚拟地址到物理地址的转换,会把物理地址的副本从内存中读入到寄存器中,再执行这一转换过程。 所以,在进程的运行过程中,不必再为页表而访问内存。
有趣的是,尽管进程和内存的关系如此紧密,但进程并不能直接访问内存。在Linux下,进程不能直接读写内存中地址为0x1位置的数据。...进程对虚拟内存地址的操作,会被操作系统翻译成对某个物理内存地址的操作。由于翻译的过程由操作系统全权负责,所以应用程序可以在全过程中对物理内存地址一无所知。...比如在C语言中,可以用下面指令来打印变量地址: int v = 0; printf("%p", (void*)&v); 本质上说,虚拟内存地址剥夺了应用程序自由访问物理内存地址的权利。...进程对物理内存的访问,必须经过操作系统的审查。因此,掌握着内存对应关系的操作系统,也掌握了应用程序访问内存的闸门。借助虚拟内存地址,操作系统可以保障进程空间的独立性。...不过,多层分页表的基本原理都是相同。 综上,我们了解了内存以页为单位的管理方式。在分页的基础上,虚拟内存和物理内存实现了分离,从而让内核深度参与和监督内存分配。应用进程的安全性和稳定性因此大为提高。
领取专属 10元无门槛券
手把手带您无忧上云