首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅谈内存管理的分页和分段

为了解决这个问题,CPU的MMU(内存管理单元)引入了虚拟地址空间。以32位操作系统经为例,每个进程都可以拥有4G的寻址空间,当进程需要内存时候,通过转换技术和虚拟地址进行关联。...段页机制是MMU机制提供,Linux内核是使用者。 MMU的内存管理机制 在x86体系结构下CPU对内存寻址都是通过分段和分页方式进行,在保护模式下,一个段的可以理解为基地址+段的界线+类型。...MMU对于内存的管理主要是分段和分页,CPU把生成的逻辑地址交给MMU内的分段单元,分段单元为每个逻辑地址生成一个线性地址,然后再将线性地址交给MMU的分页单元,最终生成物理内存的地址。...80x86的分页机制是由CR0寄存器的PG位开启,如果PG=1则开启分页机制,把线性地址转为物理地址;如果PG=0,禁用分页机制,直接把分段单元产生的线性地址当做物理地址使用。...32位或者64位系统的逻辑地址,经过分段单元,把逻辑地址转换为线性地址,在由分页单元,根据这个地址去查找对应多级页目录,根据页目录查找页表,最终得到物理地址。

94811

深入理解Linux C语言内存管理

在任何程序设计环境及语言中,内存管理都十分重要。   内存管理的基本概念   分析C语言内存的分布先从Linux下可执行的C程序入手。...C语言程序编译完成之后,已初始化的全局变量保存在DATA段,未初始化的全局变量保存在BSS段。...运行时所需要的BSS段大小记录在目标文件,但是BSS段并不占据目标文件的任何空间。 04.png 05.png   以上两图来自于《C语言专家编程》。   ...  在C语言中,对象可以使用静态或动态的方式分配内存空间。   ...堆是由malloc()函数分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成。栈和堆的主要区别有以下几点:   (1)管理方式不同。

2.7K10
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内存寻址之分段机制及分页机制【转】

前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制; 最近在学习Linux内核,读到《深入理解Linux内核》的内存寻址一章。...MMU IA32的三种地址 逻辑地址: 机器语言指令仍用这种地址指定一个操作数的地址或一条指令的地址。...因为,Linux基本不使用分段的机制,或者说,Linux分段机制只是为了兼容IA32的硬件而设计的。...参考资料 《深入分析Linux内核源码》 在上一篇文章Linux内存寻址之分段机制,我们了解逻辑地址通过分段机制转换为线性地址的过程。下面,我们就来看看更加重要和复杂的分页机制。...最后分享两篇linux内存寻址的实验文档,结合实例更容易理解。 Linux内存地址映射 Linux内核在x86_64 CPU地址映射

3.4K50

数据在内存的存储(c语言)

整形在内存的存储 原码、反码、补码 计算机的整数有三种2进制表示方法,即原码、反码和补码。...对于整形来说:数据存放内存其实存放的是补码。 这是因为在计算机系统,数值一律用补码来表示和存储。...而c则会从1111 1111变为11111111 11111111 11111111 11111111 也就是-1,所以b=256,c=0 让我们看看在内存的存储 我们可以看到对于...这又是因为什么 大小端 大端(存储)模式,是指数据的低位保存在内存的高地址,而数据的高位,保存在内存的低地址 ; 小端(存储)模式,是指数据的低位保存在内存的低地址,而数据的高位,,保存在内存的高地...但是在C语言中除了8 bit的char之外,还有16 bit的short 型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节

16210

C语言】数据在内存的存储

---- 前言 不同的数据在内存的存储形式是不同的,而当我们掌握数据在内存的存储形式之后,会帮助我们更加了解计算机深层工作原理 废话不多说,我们接下来直接进入正题 一:数据类型详细介绍 ##1....20在表现形式为16进制的大端字节序下存为14 00 00 00 2.4还是上练习题吧(介绍的好累) 先说一些看似是废话,实际上却是非常重要的话语(不知道这些话很可能产生很多傻逼的疑问,) 1.c语言默认数字是...%d是打印int型的,也就是输出有符号的十进制数字,%u是打印unsigned int,也就是输出无符号的十进制整数 3.整型提升是c程序设计语言中的一项规定,在表达式进行计算时,所有的整型首先要提升为...("a=%d,b=%d,c=%d",a,b,c); return 0; } 储存: -1的补码为全1,当发生截断后存储在变量abc内存形式均为11111111,但打印的是int型的十进制数字...E是可以出现负数的,所以IEEE规定,当我们在内存存储整数E时,E的真实值要加上一个中间数,对于不同的精度浮点数,这个中间数分别是127和1023 (2.指数从内存的取出):当我们存储的知识点介绍完之后

98720

系统内存管理:虚拟内存内存分段与分页、页表缓存TLB以及Linux内存管理

内存分段分段机制下,虚拟地址由两部分组成:段选择子和段内偏移量。段选择子是一个索引,用于指定要访问的段的起始地址和长度。段内偏移量则表示在该段内的具体位置。...当不够内存分配的时候,会选择使用内存交换,先把一块正在使用的内存移到磁盘,然后再移回来把中间留的内存缝隙全用上,虽然解决了内存碎片的问题,但是这个交换操作很慢,效率低,看下图示:虚拟内存分段内存交换似乎解决了同时运行多个程序的问题...内存分页内存分页是将整个虚拟和物理内存空间划分为固定大小的连续内存块,称为页(Page)。在Linux下,每一页的大小通常为4KB。...Linux内存管理Linux内存管理涉及逻辑地址和线性地址的转换。逻辑地址是程序使用的地址,而线性地址是通过段式内存管理映射的地址,也称为虚拟地址。...Linux的虚拟地址空间分为内核空间和用户空间两部分。32位系统,内核空间占用1G,剩下的3G是用户空间;64位系统,内核空间和用户空间都是128T,分别占据内存空间的最高和最低处。

56080

C语言】数据在内存的存储

前言 我们知道在操作符与2进制有关的操作符:& | ^ ~ >> << 使用这些操作符就离不开整数内存的存储。 我们一起来看看整数的存储。 2....整数在内存的存储 整数存储: 整数的二进制表示方法有三种:原码、反码和补码。...这是因为在计算机系统,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit 位,但是在C语言中除了8 bit 的 char 之外,还有16 bit 的short 型,32 bit...对于大端模式,就将0x11 放在低地址,即 0x0010 ,0x22 放在高地址,即 0x0011 。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而KEIL C51 则为大端模式。...说明整数和浮点数在内存的存储是不相同的。 4.1 浮点数的存储 上⾯的代码, num 和 *pFloat 在内存明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?

13010

C++】动态内存管理 ① ( C 语言中的动态内存管理 | C 语言 内存申请 | C 语言 内存释放 | 代码示例 )

一、动态内存管理 动态内存管理由 内存的申请 内存的释放 构成 , 这里的内存指的是 堆内存 , 与之相对的是 栈内存 ; 在 程序运行时 过程 , 经常 根据需要 进行动态内存管理 , 从而更加灵活地管理内存资源..., 包括 : 分配 堆内存 内存空间 释放 堆内存 内存空间 C 语言C++ 语言 , 都有 动态 分配 / 释放 堆内存 的方法 ; C 语言中 , 主要是 堆内存的 分配 与...释放 ; C++ 语言中 , 主要是 对象的动态建立和释放 ; 二、C 语言中的动态内存管理 1、C 语言 内存申请 在 C 语言中 , 使用malloc()、calloc()、realloc() 等标准库函数来动态地申请内存..., 需要导入 stdlib.h 头文件 ; #include 2、C 语言 内存释放 在 C 语言中 , 调用 free() 标准库函数 释放已申请的内存 ; 3、代码示例...- C 语言动态内存管理 在下面的代码 , 首先 , 使用 malloc() 函数 动态地申请了 可以存放 5 个 int 数据的 堆内存 , // 函数原型 : void *malloc(unsigned

30830

C语言内存函数

✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 从这篇开始,我们开始学习C语言内存函数——memcpy、memmove...void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置...结果是不是也是一样的❓ 居然成功了,难道是我们说错了❓不是哦,对于memcpy——只要实现了不重叠拷贝就可以了,在VS的实现既可以拷贝不重叠,也可以拷贝重叠内存!!!!在其他平台就不一定了!!...对于重叠内存的拷贝,我们需要介绍memmove memmove void * memmove ( void* destination, const void * source, size_t...num ); 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

84920

C语言内存管理

据调查80%的程序崩溃都是内存的管理出现问题,有时候表面没有问题,运行一段时间后问题就爆发了,所以对内存的管理非常重要,这里和大家一起总结讨论下C/C++关于内存管理的一些要点。...参数列表的函数,打印出ERROR:内存已耗尽。 ...在本例,_p申请了新的内存,只是把 _p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。...由于addr函数的变量k在函数返回后就已经不存在了,但是在全局变量p却保存了它的地址。...【规则4】动态内存的申请与释放必须配对,防止内存泄漏。 【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 更多案例可以go公众号:C语言入门到精通

1.6K2319

C语言内存模型

若在程序尝试对其修改(例如尝试修改第一个字符 *s = 'h';),将出现编译可通过,运行报错的情况。...这种写法主要是为了防止程序员在后续的代码误操作bb变量而添加的一个约束条件,并不会影响它存放的位置。 4.代码区 存放函数体的二进制代码。...用于存储程序编译连接后生成的二进制机器码指令的内存区域 区别 能否产生碎片 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。...生长方向不同 对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。...堆则是c/c++库函数提供的,机制很复杂。库函数会按照一定的算法进行分配。显然,堆的效率比栈要低得多。

1.7K30

C语言 | C++内存对齐

从结构体存储的首地址开始,每个元素放置到内存时,它都会认为内存是按照自己的大小(通常它为4或8)来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始,这就是所谓的内存对齐。...编译器为程序的每个“数据单元”安排在适当的位置上。C语言允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再模糊了。...(或联合)最大数据成员长度,比较小的那个进行; //2020.05.12 公众号:C语言与CPP编程 #include struct { int i; char c1...根据上面的分析,不难得出上面例子三个结构体的内存布局如下: 例子三个结构体的内存布局 更改C编译器的缺省字节对齐方式: 在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。...各个成员按照它们被声明的顺序在内存顺序存储,第一个成员的地址和整个结构的地址相同,向结构体成员size最大的成员对齐。

3.5K89

C语言——L数据在内存的存储

对于整形来说:数据存放内存其实存放的是补码。 为什么呢? 在计算机系统,数值⼀律⽤补码来表⽰和存储。...这是因为在计算机系统,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8bit位,但是在C语言中除了8 bit 的 char 之外,还有16 bit 的 short 型,32 bit 的...b = 11111111 // // unsigned char c = -1;//同a // //存储在c8个比特位要发生截断所以只有 c = 11111111 // //整型提升后...例如,CC++ 的 char 类型通常是有符号的,所以其取值范围是 -128 到 127。而在很多其他语言中,比如 Java,char 类型是无符号的,所以其取值范围是 0 到 255。...三、浮点数在内存的存储 常见的浮点数:3.14159、1E10等,浮点数家族包括: float、double、long double 类型。 浮点数表示的范围: float.h 定义。

14010

C语言进阶-数据在内存的存储

目录 前言 数据类型 C语言基本的内置类型 类型的意义 类型的基本归类 整形在内存的存储 原码、反码、补码 意义 大小端 什么是大端小端  为什么有大端和小端 一道笔试题 练习 浮点型在内存的存储...浮点型在内存的存储解析 数据类型 ---- C语言基本的内置类型 char //字符数据类型 unsigned char //signed(有符号)/unsigned(无符号)...long //长整型 unsigned long signed long long long //更长的整形 float //单精度浮点数 double //双精度浮点数 //C语言有没有字符串类型...(权)位,保存在内存的低地址 小端:指数据的低位保存在内存的低地址,而数据的高(权)位,保存在内存的高地址  为什么有大端和小端 计算机系统是以字节为单位,每个地址单元都对应着一个字节,一个字节为...8 bit 而C语言中除了8 bit的char之外,还有其他类型(大于8bite)以及寄存器宽度不一样 必然会涉及存储时字节安排的问题,而并没有规定,也没有科学的理由说服彼此,就有大小端之分 注:char

85930
领券