我知道malloc sbrk是调用的系统调用,类似什么是我写入malloed内存时调用的系统cal(堆内存)
int main
{
/* 10 byte of heap memory allocated */
char *ptr = malloc(5);
ptr[0] = 10; // **What is the system call invoked for
writing into this heap memory** ?????
}
答案 0 :(得分:2)
在这种情况下,没有涉及系统调用。请求编译器生成程序集,以便您可以看到那里只有一些MOV指令。或者您可以使用调试器来查看程序集
答案 1 :(得分:2)
访问内存不需要系统调用。相反,访问内存是代码中大多数的大部分时间!在现代操作系统上,您可以看到连续范围的虚拟内存的平面视图,并且通常只需要系统调用即可将该内存的特定区域(“页面”)标记为有效;其他时候,连续增长的内存范围(如调用堆栈)甚至不需要在程序中执行任何操作。操作系统内存管理器的工作就是截取未映射到物理内存的内存访问(通过页面错误),做一些内核魔法将所需内存带入物理空间,将控制权交还给你的程序。
malloc
偶尔需要执行系统调用的唯一原因是它向操作系统询问中间某处的随机虚拟内存。如果您的程序仅使用全局和局部变量(但没有动态分配),则不需要任何系统调用来进行内存管理。
答案 2 :(得分:0)
“操作系统没有看到每次发生的写入:对内存的写入仅对应于STORE汇编指令,而不是系统调用。它是处理存储和必要地址转换的硬件。操作系统将看到内存写入的时间是页表中的地址转换失败,从而导致操作系统陷阱。“
请阅读以下链接了解详情
http://pages.cs.wisc.edu/~dusseau/Classes/CS537-F04/Questions/sol12.html