1

我知道 malloc sbrk 是调用的系统调用,类似地,当我写入 malloed 内存(堆内存)时调用的系统调用是什么

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** ?????


}
4

3 回答 3

2

在这种情况下不涉及系统调用。让您的编译器生成程序集,以便您可以看到那里只有一些 MOV 指令。或者您可以使用调试器查看程序集

于 2012-06-09T06:05:46.317 回答
2

访问内存不需要系统调用。相反,访问内存是大多数代码大部分时间所做的事情!在现代操作系统上,您可以看到一个连续的虚拟内存范围,并且您通常只需要一个系统调用来将该内存的特定区域(“页面”)标记为有效;其他时候,连续增长的内存范围(例如调用堆栈)甚至不需要您的程序进行任何操作。拦截对未映射到物理内存的内存的访问(通过页面错误),执行一些内核魔术将所需的内存带入物理空间并将控制权返回给程序,这完全是操作系统内存管理器的工作。

偶尔需要执行系统调用的唯一原因malloc是因为它要求操作系统在中间某处随机获取一块虚拟内存。如果您的程序仅使用全局变量和局部变量(但没有动态分配)运行,则不需要任何系统调用来进行内存管理。

于 2012-06-09T11:58:31.470 回答
0

“操作系统不会看到发生的每一次写入:对内存的写入仅对应于 STORE 汇编指令,而不是系统调用。它是负责 STORE 和必要的地址转换的硬件。操作系统唯一一次当页表中的地址转换失败时会看到内存写入,从而导致操作系统陷入陷阱。”

请阅读以下链接了解详情

http://pages.cs.wisc.edu/~dusseau/Classes/CS537-F04/Questions/sol12.html

于 2012-10-25T06:33:59.560 回答