memory之现代系统中的内存管理和段错误(Linux)
EasonJim
阅读:15
2024-11-01 17:39:52
评论:0
在现代操作系统中,内存可用作抽象资源。进程暴露于虚拟地址空间(独立于所有其他进程的地址空间),并且存在用于将任何虚拟地址映射到某个实际物理地址的完整机制。
我的疑问是:
在不同地方获得的数据非常混乱,因为他们谈论的是近代和近代,通常无法区分它们。 Linux说,如果有人能够在牢记现代系统的同时澄清疑问,那将很有帮助。
谢谢。
请您参考如下方法:
从技术上讲,操作系统可以在访问时分配任何内存页,但是有重要原因导致它不应该或不能:
不同的存储区具有不同的用途。
操作系统可能会假定所有无法识别的内存访问都是尝试分配更多的堆空间,但是:
1<<31
(高位设置)或3<<30
(高位设置)以上的所有内存均为内核内存。您不应该假定用户空间中有任何未分配的内存区域。 0x12341234
;应用程序:但我想在此处存储数据)。您可以通过触摸阵列的末端来告诉操作系统(无论如何这是不可靠的),但是仅调用操作系统函数就更容易了。最好是函数调用是“给我10MB的堆”,而不是“给我10g的开始于0x12345678
的堆” 程序的不同运行会导致变量的地址不同
这称为内存布局随机化,与适当的权限(堆栈空间不可执行)一起使用,使缓冲区溢出攻击更加困难。您仍然可以终止应用程序,但不能执行任意代码。
内存分配上的某些链接(例如在堆中)。
您的意思是分配器使用什么算法?最简单的算法是始终分配在最快的可用位置,并从每个存储块链接到下一个存储块,如果是空闲块或已用块,则存储标志。更高级的算法始终以两倍或某个固定大小倍数的幂的大小来分配块,以防止内存碎片(许多小的空闲块)或将这些块链接到不同的结构中,以更快地找到足够大小的空闲块。
甚至更简单的方法是从不取消分配,而仅指向第一个(也是唯一的)空闲块并保持其大小。如果剩余空间太小,请将其扔掉,然后要求操作系统提供新的空间。
内存分配器没有什么神奇的。他们所做的就是:
无论如何,维基百科有关内存分配的文章是 http://en.wikipedia.org/wiki/Memory_management。
一种有趣的算法称为 "(binary) buddy blocks"。它拥有多个2的幂的池,并将它们递归地分成较小的区域。然后,每个区域要么完全分配,完全自由,要么分为两个都不都是完全自由的区域(预算)。如果已拆分,则一个字节足以容纳此块中最大的空闲块的大小。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。