kernel学习之内存管理简介

内存是linux内核所管理的最重要的资源之一,内存管理子系统是操作系统中最重要的部分之一。对于立志从事内核开发的工程师来说,熟悉linux的内存管理系统是非常重要的。早些年的DOS是直接访问内存的,这样不同的应用程序很容易让系统死机。在现在的linux系统,应用程序会产生一个trap,进入内核,这时内核是安全的。虚拟内存可以使应用程序使用连续。比实际内存更大的内存空间,这些内存空间在物理上可能是离散的,甚至可能是交换到磁盘上的。可以 这么说现代操作系统的内存管理就是虚拟内存的管理。

一、存储器地址:

Intel早期的8086/8088处理器只具有实地址模式(real-address-mode)工作方式,不能有效的支持现在多任务操作系统所需的虚拟内存管理功能。Intel从80286开始实现保护模式protected mode该处理器是16位处理器。80386为32处理器。自80386后intel cpu经历了80486 、pentium等,虽然在速度功能上提高了很多,但其体系结构无根本的实质变化,所以统称为IA32(Intel Architecture 32 bit)

80386从8086,80286过度而来的,为了保持向上兼容,还保留了以前的16为段寄存器。虽然只用分页机制就能实现有效的内存保护,但还不得不在分段机制的基础上实现保护模式,所以IA32体系结构中的分段机制很大程度上是Intel产品兼容的结果。

现在几乎所有的risc体系结构的处理器不支持分段机制只采用了分页机制来实现对多任务间的内存保护。同时linux中内存管理也尽可能的不用IA32体系结构中的分段机制,只是在迫不得已的时候才用,这也调高了linux可移植性。

物理地址:是指出现在cpu地址总线上的寻址物理内存的地址信号,是地址转化的结果

逻辑地址:是程序代码经过编译后出现在汇编程序中的地址

线性地址:线性地址又名虚拟地址,在32位cpu架构下。可以表示4GB的地址空间用十六进制表示为:0x00000000到0xffffffff

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/unix/

地址之间的转换:

一个基于IA32体系结构的当代操作系统中(采用了保护模式和分页机制的情况下),访问一个内存单元需要两次地址的转换:

cpu将一个逻辑地址转换为物理地址:cpu利用段式内存管理单元,将逻辑地址转换为线性地址,在利用页式管理单元把线性地址,转化为物理地址。

在大多数的risc下,只需要一次线性地址到物理地址的转换即可,在大多数risc的情况下没有分段的概念,没有逻辑地址。

段寄存器:

IA32体系结构只提供了段寄存器。在实模式下段寄存器用于存放段基地址,此时我们称段寄存器为段基地址寄存器。在保护模式下,段寄存器用于存放段选择子,此时我们称段寄存器为段选择子寄存器。段基地址寄存器和段选择子寄存器是在不同模式下对段寄存器的不同解释。IA32体系结构提供的段寄存器包括cs,ds,ss,es,fs,gs。尽管只用6个寄存器但程序可以把一个寄存器用于不同的目的。将其值先放到存储器中然后再恢复即可。段寄存器视为了对内存进行分段管理而增加的。

CS:代码段寄存器,CS是指向存放程序的段。SS:堆栈段寄存器,指向当前程序栈的段。DS:数据段寄存器,指向包含静态数据或全局数据的段。其他段寄存器可用于其他用途,指向任意段。

段基地址寄存器:在这种模式下32位cpu内存管理与16位cpu是一致的。IA32体系结构处于实模式是逻辑地址由一个段基地址和一个段内偏移量决定。段基地址寄存器保存了一个16位的段基地址,段内偏移地址也是一个16位的数据。在实模式下线性地址即物理地址。

线性地址=16位段基地址*16 + 偏移量

段选择子寄存器:在保护模式下由一个段选择子寄存器和一个段内偏移量决定。根据段选择子寄存器可以获得一个32位段基地址。偏移量是32位的数据,每个段的最大容量可达4GB。

线性地址=32位段基地址 + 32位偏移量数据

时间: 2024-09-19 08:17:53

kernel学习之内存管理简介的相关文章

Python深入学习之内存管理_python

语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式.  对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象.而a是一个引用.利用赋值语句,引用a指向对象1.Python是动态类型的语言(参考动态类型),对象与引用分离.Pytho

WinApi学习笔记-内存管理

一:进程虚拟地址空间的实现 每个进程都有一个私有的虚拟地址空间 系统将每个进程的虚拟地址空间映射到物理内存上 为了实现每个进程都有一个私有的虚拟地址空间系统为每个进程都创建了一个页目录和一组页表 每个进程的页表是独立的 而内核空间的页表是所有进程共享的 X86平台上有一个CR3寄存器,该寄存器保存当前运行的进程的页目录地址 系统进行进程切换时,会将CR3内的地址置为将要执行的进程的页目录地址 每个进程都有一个KPROCESS结构的属性,其中包括了进程页目录地址 二:数据共享与保护 有一些进程间共

kernel学习之进程调度器简介

多任务操作系统可分为非抢占式多任务和抢占式多任务.和大多数现代操作系统一样,linux也采用了抢占式多任务模式.这也就是说任务占用cpu的时间由调度器来决定. 调度策略: 决定在什么时候用怎样的方式选择一个新的进程在哪个cpu上运行多长时间的规则称为调度策略. 通常情况下,使用什么样的调度策略与进程的类型有关.进程常分为cpu消耗型和IO消耗型. 另一种分类方式为: 1.交互式进程(interactiveprocess):此类进程需要大量的人机交互,这样的进程会不断的睡眠,等待键盘和鼠标操作将其

c++内存管理学习纲要

本系列文章,主要是学习c++内存管理这一块的学习笔记. 时间:6.7-21 之下以技术内幕的开头语,带入到学习C++内存管理的技术中吧: 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,因此要想成为C++高手,内存管理一关是必须要过的! 笔记汇总: 1.C++内存管理学习笔记(1) 2.C++内存管理学习笔记(2) 3.C++内存管理学习笔记(3) 4.C++内存管理学习笔记(4) 5.C++内存管理学习笔记(5) 6.C++内存管理学习笔记(6) 7.C++内存管理学习笔记(7

Linux内存管理初探

作者:王智通   一.前言 二.简单的内存管理器示例 三.GNU malloc算法 四.Kernel Buddy伙伴系统算法 五.Kernel Slab/Slub高速缓存算法   一.前言 这次课程最初的题目叫<linux内存管理>, 可是写着写着就感觉这个题目起的太大了, VM(virtul memory)是操作系统中最抽象最复杂的子系统, 想通过一次课把它全部讲清楚有点不现实. 所以我把这次课程的名字改成内存管理初探,先讲讲linux内存的分配算法, 后续课程中在陆续涉及内存映射与回收机制

Linux堆内存管理深入分析(上)

Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了.鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点.因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸如基本堆溢出漏洞.基于unlink的堆溢

Linux堆内存管理深入分析(上)

0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了.鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点.因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸如基本堆溢出漏洞.基于unlink的堆溢出漏洞利用.double free.use-after-free等

Linux堆内存管理深入分析 (上半部)【转】

转自:http://www.cnblogs.com/alisecurity/p/5486458.html 0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了.鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点.因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸

java内存管理(堆、栈、方法区)

java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉到的内存问题,并且在内存问题出现的时候,也不能很快的定位并解决.因此,了解并掌握Java的内存管理是我们必须要做的是事,也只有这样才能写出更好的程序,更好地优化程序的性能. 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁