【问题标题】:Linux kernel memory management?Linux内核内存管理?
【发布时间】:2011-01-18 18:48:20
【问题描述】:

在模块发布后,Linux 内核会释放内核模块内存中的 kmalloc'ed 而不是 kfree'd,就像它与用户空间应用程序一起工作一样?

【问题讨论】:

    标签: memory-management memory-leaks linux-kernel linux-device-driver


    【解决方案1】:

    内核不会对模块进行任何垃圾回收。如果模块kmallocs 一个内存块并且在模块被卸载之前没有kfree 它,则该块将保持分配状态并且不可访问,直到下一次重新启动。

    【讨论】:

    • 内核不会做任何垃圾回收,也不会在模块退出时释放内存。后者是用户空间进程的关键区别,它在退出时将所有内存返回给系统。
    • 请注意,如果您编写一个使用 dlopen() 加载的模块,则完全相同的事情也适用于用户空间。
    【解决方案2】:

    正如其他人所说,内核不会对模块进行任何垃圾收集,但设备驱动程序可以使用 devm_* 类型的资源分配(称为托管资源分配函数),并且内核将在没有垃圾回收之后执行所有必需的清理对设备的更多参考。

    请参阅此处以获取devm_kmalloc 的内核源代码中的注释源代码。

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2017-04-26
      相关资源
      最近更新 更多