内存管理和内存之间的区别 allocation.do 它们在 allocation/access 发生时一起工作2内存|它们是如何完全相关的

difference between memory management &memory allocation.do they both work together when allocation/access happens2 memory|how they are exactly related

所以我想知道当我调用 malloc 时到底发生了什么?由于 malloc 必须是一个包装器,因此必须在其中调用其他一些函数,它可能是 brk 或其他东西,但是在 brk 内部发生了什么,我所知道的是这些是分配内存和 return 非零值的内存分配函数如果成功。但是什么是内存管理。

因此,如果我假设内存管理只是将内存大小与当前值保持一致。因此,例如,如果我有两个 malloc 调用,它们都分配了 10 个整数,每个分配的大小将根据某些 table 中的当前值保持不变。调用 table 的是什么。所以假设我正在实现一个内存管理单元是有意义的。 Linux 中是否有任何标准用于某些可以称为此 table 的结构,我可以在一个系统中有多个内存管理单元意味着有一个父 MMU,而我的 MMU 只是依赖在一些标准函数上

当您在 Linux 上调用 malloc() 时,您会调用 libc(C 标准库实现)中的精简包装器。这个瘦包装器通常会使用 mmap 系统调用来分配内存。

在 x86-64 上,系统调用是在汇编中使用 syscall 以及 SysV ABI 中指定的常规寄存器中的一些参数进行的。

syscall 指令使处理器在这些处理器的 STAR64 MSR 寄存器中指定的地址处从用户模式跳转到管理员模式。

在Linux上,它将跳转到文件entry_64.S的第一条指令。该程序集文件将进行多次检查以确定用户模式要求的是什么以及 return 某些寄存器中的值。

对于 mmap,系统调用正在寻求分配物理内存并修改页表,以便从可用虚拟内存的下一部分转换为物理内存中的这些位置。有关更多信息,您可以在 Each program allocates a fixed stack size? Who defines the amount of stack memory for each application running? 浏览我的回答。动态分配是在所谓的堆上完成的,它可以随着可用内存的增加而增长。

libc 库实际上会自己分配内存,以确定分配给用户模式进程的内存量。这是必需的,因为现代 x86-64 上的分配粒度是一个 4kb 页面。因此,libc 库将跟踪已分配页面的所谓“arenas”,以尝试在这些页面中为您提供新分配,而不是请求新分配。

此外,Linux 内核会在 mm 字段中跟踪分配给 PCB(task_struct)进程的内存,这本身就是一个复杂的结构.

编辑

I like to know does every allocation is against specific tid/pid and this allocated memory plus pid is saved in some table. Is this the work of MMU

要理解此答案中的概念,您需要了解分页。通过分页,每个 process/thread 都有自己的一组页表。每组页表都允许访问整个虚拟内存 space 这是相当大的,因为在大多数 OS 上,使用 48 位允许寻址 2^48 字节(这由 CPU 架构,但也有一个 57 位地址 space 在较新的 CPU 上可用,大多数 OS 不使用)。

MMU 对 processes/threads 或 PID 一无所知。它盲目地获取虚拟地址并跨越页表以将它们转换为物理地址。页表中的大多数条目都被清零以确保访问将触发硬件中断(页面错误)。发生页面错误时,Linux 内核将越过触发页面错误的进程的 mm 字段,如果其内存访问超出该区域,则终止该进程。每个核心都看到完整的物理地址 space,并且可能有自己的 MMU。 MMU 现在确实有 PCID,但它主要与缓存相关,这与您的问题并不真正相关。

处理器的每个核心运行一次只有一个线程,并且有自己的 CR3 寄存器。一个 OS 知道哪个进程 运行 在哪里以及在哪个内核上,因为内核模式中的不同故障处理程序 运行 并且可以访问内核的所有全局结构,这些结构识别哪个进程 运行s where 等。使用页表的翻译从 CR3 寄存器开始。 OS 只是将 CR3 寄存器的值保存在 PCB 中,并在上下文切换时恢复它。

希望这是清楚的!有关分页的更多信息,请参阅:.