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