我编写了一个linux内核模块和一个用户空间应用程序。他们通过netlink进行了很好的沟通。但是当我试图在CORE (Common Open Research Emulator)中的一个仿真节点上运行用户空间应用程序时,我得到了errno111(连接被拒绝)。你能帮我找出原因吗(根据CORE的说法,模拟节点是一个虚拟机,它使用与本地主机相同的内核)?
非常感谢!
这里是我的问题:我想从运行在Linux内核空间中的代码中对数据文件的一部分进行内存映射。我想稍后也从Linux内核空间中运行的代码中撤销相同的内存映射。如何执行这些操作?它们与在用户空间中使用mmap(2)/munmap(2)有何不同?
我试图在没有用户进程的内核空间中做到这一点。
我浏览了网络搜索和Linux内核书籍,包括Bovet和Cesati的"Understanding the Linux Kernel“。一本好书,但没有回答我的问题。
关于mm_struct和内核线程,在Linux kernel Development ( Robert Love)一书中提到的一些要点是:
内核线程没有进程地址空间,因此没有相关的内存描述符。因此,内核线程的进程描述符的mm字段为NULL。
“由于内核线程在用户空间中没有任何页面,它们实际上不值得拥有自己的内存描述符和页表(页表将在本章后面讨论)。尽管如此,内核线程仍需要一些数据,例如页表,甚至需要访问内核内存。”
内核线程没有地址空间,并且mm为NULL。因此,当调度内核线程时,内核会注意到mm为NULL,并保持前一个进程的地址空间已加载。然后,内核会更新内核线程的进程描述符中的active
我的问题不限于mmap(),而是在内核空间代码和用户空间代码中使用的所有函数(从userspace调用--一个系统调用)。例如,如果我从用户空间调用mmap(),其中包括一个上下文开关(SYSENTER / INT 80H),但是如果我从内核调用mmap,则不需要这样做。我的问题是,mmap()函数在内核或用户空间中是相同的吗?如果是相同的,那么如果从内核调用mmap实现是否能够不执行SYSENTER / INT 80H?