了解 Linux 内存分配的细节非常重要,尤其是在内核和系统架构中。让我们深入了解 Linux 内存分配并了解幕后发生的事情。
在计算机中,要使进程可执行,就需要将其放置在内存中。为此,必须将字段分配给内存中的进程。内存分配是一个需要注意的重要问题,尤其是在内核和系统架构中。
让我们详细了解一下 Linux 内存分配,并了解幕后发生的事情。
内存分配是如何完成的?
大多数软件工程师不知道这个过程的细节。但如果你是一名系统程序员候选人,你应该对它了解更多。在看分配过程的时候,有必要对 Linux 和glibc库做一个小细节。
当应用程序需要内存时,它们必须从操作系统请求它。来自内核的这个请求自然需要系统调用。您不能在用户模式下自己分配内存。
**malloc()**系列函数负责 C 语言中的内存分配。这里要问的问题是 malloc() 作为 glibc 函数是否进行直接系统调用。
Linux 内核中没有称为 malloc 的系统调用。但是,对于应用程序的内存需求有两个系统调用,它们是brk和mmap。
由于您将通过 glibc 函数在应用程序中请求内存,您可能想知道此时 glibc 正在使用哪些系统调用。答案是两者兼而有之。

第一个系统调用:brk
每个进程都有一个连续的数据字段。通过 brk 系统调用,增加了决定数据域限制的程序中断值,并执行了分配过程。
尽管使用这种方法分配内存非常快,但并不总是可以将未使用的空间返回给系统。
例如,假设您通过 malloc() 函数为 brk 系统调用分配了五个字段,每个字段大小为 16KB。当您完成其中第二个字段时,无法返回相关资源(解除分配)以便系统可以使用它。因为如果您减少地址值以显示第二个字段的开始位置,并调用 brk,您将完成第三、四个和五个字段的释放。
为了防止这种情况下的内存丢失,glibc 中的 malloc 实现会监控进程数据字段中分配的位置,然后通过 free() 函数指定将其返回给系统,以便系统可以将空闲空间用于进一步的内存分配。
也就是说,在分配了 5 个 16KB 的区域之后,如果用 free() 函数返回第二个区域,过一段时间再请求另一个 16KB 的区域,而不是通过 brk 系统调用扩大数据区域,之前的地址是回来。
但是,如果新请求的区域大于 16KB,则数据区域将通过 brk 系统调用分配新区域来扩大,因为区域 2 无法使用。虽然二号区域没有使用,但由于大小不同,应用程序无法使用它。因为这样的场景,有一种情况叫做内部碎片,实际上你很少能充分利用内存的所有部分。
为了更好地理解,请尝试编译并运行以下示例应用程序:
#include #include #include int main(int argc, char* argv[]) { char *ptr[7]; int n; printf("Pid of %s: %d", argv[0], getpid()); printf("Initial program break : %p", sbrk(0)); for(n=0; nprintf("After 5 x 16kB malloc : %p", sbrk(0)); free(ptr[1]); printf("After free of second 16kB : %p", sbrk(0)); ptr[5] = malloc(16 * 1024); printf("After allocating 6th of 16kB : %p", sbrk(0)); free(ptr[5]); printf("After freeing last block : %p", sbrk(0)); ptr[6] = malloc(18 * 1024); printf("After allocating a new 18kB : %p", sbrk(0)); getchar(); return 0; }
运行应用程序时,您将获得类似于以下输出的结果:
Pid of ./a.out: 31990 Initial program break : 0x55ebcadf4000 After 5 x 16kB malloc : 0x55ebcadf4000 After free of second 16kB : 0x55ebcadf4000 After allocating 6th of 16kB : 0x55ebcadf4000 After freeing last block : 0x55ebcadf4000 After allocating a new 18kB : 0x55ebcadf4000

带有 strace 的 brk 的输出如下:
brk(NULL) = 0x5608595b6000 brk(0x5608595d7000) = 0x5608595d7000
如您所见,0x21000 已添加到数据字段的结束地址。您可以从值 0x5608595d7000 中理解这一点。因此分配了大约 0x21000 或 132KB 的内存。
这里有两点需要考虑。第一种是分配超过示例代码中指定的数量。另一个是哪一行代码导致了提供分配的 brk 调用。
地址空间布局随机化:ASLR
当您一个接一个地运行上述示例应用程序时,您每次都会看到不同的地址值。以这种方式随机更改地址空间会使安全攻击的工作变得非常复杂,并提高了软件的安全性。
但是,在 32 位架构中,通常使用 8 位来随机化地址空间。增加位数将不合适,因为剩余位上的可寻址区域将非常低。此外,仅使用 8 位组合不会使攻击者的事情变得足够困难。
另一方面,在 64 位体系结构中,由于可以为 ASLR 操作分配的位太多,因此提供了更大的随机性,并且提高了安全程度。
Linux 内核还支持基于 Android 的设备,并且 ASLR 功能在 Android 4.0.3 及更高版本上完全激活。即使仅出于这个原因,也可以说 64 位智能手机比 32 位版本具有显着的安全优势。
通过使用以下命令暂时禁用 ASLR 功能,之前的测试应用程序每次运行时都会返回相同的地址值:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
要将其恢复到以前的状态,在同一个文件中写入 2 而不是 0 就足够了。
第二个系统调用:mmap
mmap 是 Linux 上用于内存分配的第二个系统调用。通过 mmap 调用,内存中任何区域的空闲空间都映射到调用进程的地址空间。
在以这种方式完成的内存分配中,当您想使用前面 brk 示例中的 free() 函数返回第二个 16KB 分区时,没有机制可以阻止此操作。从进程的地址空间中删除相关的内存段。它被标记为不再使用并返回系统。
因为与使用 brk 相比,使用 mmap 的内存分配非常慢,所以需要分配 brk。
使用 mmap,内存的任何空闲区域都映射到进程的地址空间,因此在该进程完成之前,已分配空间的内容被重置。如果没有以这种方式进行重置,则属于先前使用相关内存区域的进程的数据也可以被下一个不相关的进程访问。这样就不可能谈论系统中的安全性。
Linux 中内存分配的重要性
内存分配非常重要,尤其是在优化和安全问题上。如上面的示例所示,不完全理解此问题可能意味着破坏系统的安全性。
甚至许多编程语言中存在的类似于 push 和 pop 的概念也是基于内存分配操作的。能够很好地使用和掌握系统内存对于嵌入式系统编程和开发安全和优化的系统架构都是至关重要的。
如果您还想涉足 Linux 内核开发,请考虑首先掌握 C 编程语言。
综上所述,Linux 中的内存分配是一个需要注意和理解的重要问题,特别是对于程序员、内核开发人员和系统架构师而言。熟练掌握内存分配可以提高软件性能和安全性,并在嵌入式系统编程和系统架构方面提供更好的支持。同时,C 编程语言的掌握也是涉足 Linux 内核开发的关键。
以上是Linux 上内存分配的工作原理的详细内容。更多信息请关注PHP中文网其他相关文章!

本指南向您展示了如何使用QEMU模拟器在Linux环境中设置免费和开源DOS的操作系统Freedos。 这使您可以在现代硬件上运行Legacy DOS软件和游戏,而无需分开

Linux Mint,这款以简洁、稳定和易用性着称的操作系统,广受用户欢迎,尤其适合新手。 它默认使用Cinnamon桌面环境,提供简洁友好的用户界面。但如果您偏好不同的外观或需要更多自定义选项,可以安装其他桌面环境,例如KDE Plasma。 KDE Plasma是一个功能丰富、高度可定制且视觉效果出色的桌面环境,提供现代时尚的用户体验。它拥有广泛的自定义选项、高级窗口管理功能和精致的美感,非常适合希望更好地掌控桌面体验的用户。 本指南将逐步指导您在Linux Mint 22上安装KDE Pl

Linux系统性能优化:降低RAM和CPU使用率 Linux系统功能强大且高效,但高RAM和CPU使用率会降低性能,减慢应用程序速度,甚至导致服务器、工作站或嵌入式系统崩溃。因此,优化资源使用对于系统平稳运行至关重要。 本指南将探讨降低Linux系统RAM和CPU使用率的实用方法,涵盖监控工具、进程管理、内核调整和系统优化技术,帮助您保持系统高效运行。 识别资源密集型进程 降低RAM和CPU使用率的第一步是识别哪些进程消耗了最多的资源。为此,可以使用以下几个命令行工具: a. 使用top

AlmaLinux 8 和 9 的单用户模式 (也称为救援模式) 指南 单用户模式是一个精简的 Linux 环境,允许系统管理员执行维护任务、排查问题和从系统故障中恢复。当您需要重置 root 密码、修复配置错误、修复损坏的文件系统或调查阻止正常启动的系统错误时,单用户模式特别有用。 作为基于 RHEL 的发行版,AlmaLinux 8 和 9 通过 GRUB 引导加载程序提供了一种简单的进入单用户模式的方法。本指南将逐步解释如何在 AlmaLinux 8 和 9 上进入单用户模式。 什么是单用

Linux系统以其强大和可靠性着称,但即使是经验丰富的用户也会遇到意想不到的问题。无论是意外删除的文件、忘记的root密码,还是系统运行缓慢,高效的故障排除技巧是成为Linux专家的关键。 本指南将介绍一些常见的Linux问题解决场景以及逐步解决方案,这些问题在系统管理员、开发人员和日常Linux用户中普遍存在。 场景一:意外删除重要文件 您意外地使用rm命令删除了一个重要文件,现在需要恢复它。与Windows和macOS不同,Linux没有内置的“回收站”来存储从终端删除的文件。 恢复选项取决

Docker 是一款强大的工具,允许您在称为 容器 的隔离环境中运行应用程序。但是,有时您可能需要更改 Docker 文件夹的权限,以确保您的应用程序可以访问必要的文 件和目录。 本文将指导您完成在 Linux 系统上永久更改 Docker 文件夹权限的过程。 了解 Docker 文件夹权限 默认情况下,Docker 将其数据(包括镜像、容器和卷)存储在 Linux 系统上的特定目录中。最常见的目录是 /var/lib/docker。 这些文件夹的权限决定了谁可以读取、写入或执行其中的文件。如果

用Linux上的Portainer CE简化Docker Management:逐步指南 通过命令行管理Docker容器可能令人生畏,尤其是对于新移民而言。 Portainer CE(社区版)提供免费,轻巧且直观的Solutio

本指南详细介绍了如何在Linux系统上安装和使用Whisper AI进行实时语音到文本转录。 Whisper AI是一种Openai创作,可提供多种语言的高准确性转录。虽然主要是为批处理设计的


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3汉化版
中文版,非常好用

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具