【问题标题】:System call invoked when writing into a heap memory写入堆内存时调用的系统调用
【发布时间】:2021-03-20 13:23:53
【问题描述】:

我知道 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** ?????


}

【问题讨论】:

    标签: c linux memory-management linux-kernel


    【解决方案1】:

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

    【讨论】:

    • 谢谢qian,但是从我的理论课上我了解到在基于操作系统的系统中,每个内存操作都只会通过操作系统。那么操作系统在这条指令中的作用是什么(ptr [0] = 10) ?,或者在操作系统中有什么地方我可以找到写入该内存的地方吗?如有问题请见谅
    • 操作系统只是帮助将虚拟地址映射到物理地址并处理页面错误。我认为当写入发生时操作系统不会知道任何事情。
    • 如果操作系统(或者调试器)有兴趣查看写入,它可以写保护包含此堆内存的页面。 然后当你尝试在那里写时它会被通知。通常不会发生这种情况。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      详情请阅读以下链接

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

      【讨论】:

        猜你喜欢
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多