Linux kernel 内核如何阻止您使用malloc?

Linux kernel 内核如何阻止您使用malloc?,linux-kernel,Linux Kernel,我知道不能在内核模块中使用malloc,因为内核中使用的所有函数都必须在内核中定义,但是内核如何实现这种锁定呢?为内核编写模块时,头文件中没有这些函数。而且你链接的文件中没有它 malloc的实现也是一个调用系统调用的过程。系统调用将您移动到hypervisor并调用内核代码。在虚拟机监控程序模式下执行此操作毫无意义 您可以查看更多详细信息。与其说它被锁定,不如说它被锁定了。只是您的内核模块不知道malloc()在哪里。malloc()函数是C标准库的一部分,它与用户空间中的程序一起加载。当执行

我知道不能在内核模块中使用malloc,因为内核中使用的所有函数都必须在内核中定义,但是内核如何实现这种锁定呢?

为内核编写模块时,头文件中没有这些函数。而且你链接的文件中没有它

malloc的实现也是一个调用系统调用的过程。系统调用将您移动到hypervisor并调用内核代码。在虚拟机监控程序模式下执行此操作毫无意义


您可以查看更多详细信息。

与其说它被锁定,不如说它被锁定了。只是您的内核模块不知道malloc()在哪里。malloc()函数是C标准库的一部分,它与用户空间中的程序一起加载。当执行userland程序时,链接器将加载程序所需的共享库,并找出所需函数的位置。因此它将在一个地址加载libc,malloc()将位于该地址的某个偏移量。因此,当程序调用malloc()时,它实际上会调用libc


您的内核模块没有链接到libc或任何其他用户空间组件。它是针对内核链接的,内核不包括malloc。您的内核驱动程序不能依赖于用户空间中任何内容的地址,因为它可能必须在任何用户空间程序的上下文中运行,甚至不能在任何上下文中运行,比如在中断中。因此,当模块运行时,malloc()的代码甚至可能不在内存中的任何位置。现在,如果您知道您正在加载了libc的进程的上下文中运行,并且知道malloc()所在的地址,那么您可以通过将该地址存储在函数指针中来调用该地址。但坏事情可能会发生,可能包括内核恐慌。您不想跨越用户空间和内核空间的边界,除非通过合理、定义良好的接口

内核没有。如果函数还没有定义,你就不能使用它(你会得到链接器错误)。当然,但是内核知道在哪里可以找到glibc,不是吗?编译内核时,没有libc。您需要一个内核来编译libc实现。当您在内核中时,libc根本不存在。首先,userspace malloc()可能无法为内核需求分配具有正确所有权和权限的页面。另一方面,用户空间malloc()在不回调用内核的情况下真的不能做任何事情,除非它给您以前通过这种机制获得的内存。当然,内核中有多种内存分配函数,它们对内核代码的需求起着类似的作用,就像malloc()对用户代码所起的作用一样。malloc()-->[glibc.so]-->sbrk()/brk()-->sys\u brk()。注意:对于内核空间中的内存分配,请使用类似于malloc的kmalloc()、vmalloc()。是否
malloc()
使用系统调用是一个实现细节。另外,我认为您在这里使用的术语hypervisor不正确。