关于malloc
和系统调用-我想知道系统调用时发生了什么。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;
}
您想知道的步骤是request additional memory from OS;
,正如您所推测的,它通常是对sbrk
的直接函数调用。
(的确,当你调用sbrk
时,在它的实现中的某个地方会有一个特殊的机制,比如陷阱,来执行到操作系统的上下文切换,这样它就可以为你完成工作,但这将是用于所有系统调用的同一种机制。这不是你通常需要担心的事情:你只需要像其他任何函数一样调用sbrk()
。)。)
为了了解malloc
是如何制作的,您可以编写一个程序,在其中调用malloc,然后使用以下命令:strace yourprogram
。
使用此命令,您可以深入查看调用malloc
时的跟踪系统调用和信号,并了解它是如何生成的。