malloc-systemcall-how-it';是什么做的?

malloc-systemcall-how-it';是什么做的?,c,memory-management,malloc,system-calls,C,Memory Management,Malloc,System Calls,关于malloc和systemcall-我想知道在进行systemcall时发生了什么。Malloc只是一个库函数,对吗 所以-当调用malloc时,堆上还有未映射的内存-我猜没有进行系统调用。但是,假设分配的堆已满,那么堆必须增长。在这里,我不知道陷阱是如何触发的 进行系统调用需要一个陷阱,因此可以创建一个内核函数,例如brk()或mmap(),但是它是如何生成的呢?它是通过内部的某种例外吗 我很想知道 编辑:关于另一个问题——我已经看过了,现在还不能(暂时)谈论任何关于系统调用函数、cpu中

关于
malloc
和systemcall-我想知道在进行systemcall时发生了什么。Malloc只是一个库函数,对吗

所以-当调用
malloc
时,堆上还有未映射的内存-我猜没有进行系统调用。但是,假设分配的堆已满,那么堆必须增长。在这里,我不知道陷阱是如何触发的

进行系统调用需要一个陷阱,因此可以创建一个内核函数,例如
brk()
mmap()
,但是它是如何生成的呢?它是通过内部的某种例外吗

我很想知道


编辑:关于另一个问题——我已经看过了,现在还不能(暂时)谈论任何关于系统调用函数、cpu中的陷阱的问题——而是关于程序崩溃的原因,不需要特殊的陷阱或异常。malloc的伪代码是:

void *malloc(size_t size)
{
    search for 'size' free space in available blocks;
    if(no block found}
        {
        request additional memory from OS;
        construct new block;
        }
    mark 'size' bytes used in block;
    return pointer into block;
}
您想知道的步骤是
从操作系统请求额外内存sbrk
的简单函数调用


(确实,当您调用
sbrk
时,在其实现中的某个地方会有一种特殊的机制,例如陷阱,来执行到操作系统的上下文切换,以便它可以为您完成工作,但这将是用于所有系统调用的同一种机制。您通常不需要这样做y about:您只需像调用任何其他函数一样调用
sbrk()

为了了解
malloc
是如何生成的,您可以编写一个调用malloc的程序,然后使用以下命令:
strace yourprogram


使用此命令,您可以在调用
malloc
时深入查看跟踪系统调用和信号,并了解其制作方法。

可能重复@joe-我在哪里可以了解另一个问题中的trap和systemcall?当您的软件尝试访问pag时,硬件内存管理系统会生成中断未加载的。加载并映射请求的页面,然后重新启动触发中断的CPU指令。在具有内存保护的操作系统上(类似Unix的-例如Linux、Windows NT和后续操作系统)在系统调用中,您需要一种特殊的机制来将代码的执行从用户模式切换到内核模式。这种机制在硬件体系结构和操作系统之间有所不同。---例如x86上的Linux通过特殊指令
int
(或更新的
syscenter
和x86上的syscall
)调用中断。中断处理程序在内核空间中运行,负责调用请求的代码(系统调用例程)。----例如,请参阅:@java:I不知道如何链接特定条目,但请参阅mgalgs于2013年9月16日21:07给出的答案。
sbrk
调用是一个需要“特殊陷阱”的系统调用在具有内存保护的系统上工作。请参阅我的评论@pabouk:当然,但我不认为OP是这样要求的。无论系统调用机制是什么,它都适用于所有系统调用(关于
brk
sbrk
),而且在任何情况下,普通C程序员都看不到它:您只需调用
sbrk()
在您的代码中,就像任何其他函数一样,库中的代码——实现
sbrk
的代码——为您提供了神奇的系统调用机制许多system C库函数只是围绕实际执行所请求任务的系统调用的包装。我认为这可以应用于malloc。因此@SteveSummit-你可能对此是正确的。但与此同时,systemcall提供了一个陷阱,因此调用方会失去对在受保护内核模式下发生的事情的控制。但在一个级别,这与调用其他函数让它为您完成任务时总是“失去控制”的方式没有什么不同。