【发布时间】:2017-01-10 16:42:37
【问题描述】:
我可以在内核空间中使用malloc 吗?当我在内存的哪一部分使用kmalloc 函数时,会发生分配?如果我正在编写驱动程序,我在该程序中使用的变量将以与用户空间中相同的方式分配,例如堆栈中的普通变量函数和初始化和未初始化数据部分中的静态变量,或者它将位于内存的不同部分,如果它存储方式不同,那么它将存储在内存的哪个部分?
请澄清以上内容,我在使用设备驱动程序时遇到问题。
【问题讨论】:
我可以在内核空间中使用malloc 吗?当我在内存的哪一部分使用kmalloc 函数时,会发生分配?如果我正在编写驱动程序,我在该程序中使用的变量将以与用户空间中相同的方式分配,例如堆栈中的普通变量函数和初始化和未初始化数据部分中的静态变量,或者它将位于内存的不同部分,如果它存储方式不同,那么它将存储在内存的哪个部分?
请澄清以上内容,我在使用设备驱动程序时遇到问题。
【问题讨论】:
嗯,我有使用 Windows 驱动程序的经验,您可能不感兴趣。但是,我希望两个操作系统上的情况都相似。
局部变量在栈上分配,
内核驱动程序映像的数据部分中的全局/静态文件。
换句话说,与用户空间中的规则相同。在 Windows 世界中,整个驱动程序映像被放置在所谓的常驻内存块中——该块永远不会分页到磁盘,也不会移动到另一个物理内存位置。
kmalloc(Windows 中的ExAllocatePoolXxx)相当于malloc 例程,用于分配内存块(通常小于一页)。与用户空间 malloc 不同,kenrel 变体允许您指定其他选项。
例如,ExAllocatePoolXxx 例程允许您指定分配的内存块是否需要常驻。 Linux 内核变体 (kmalloc) 似乎提供了更多选择:http://www.makelinux.net/books/lkd2/ch11lev1sec4。
如果您需要分配大于页面大小的内存块,最好使用其他一些内核内存分配方式。
【讨论】: