这里是我的问题:我想从运行在Linux内核空间中的代码中对数据文件的一部分进行内存映射。我想稍后也从Linux内核空间中运行的代码中撤销相同的内存映射。如何执行这些操作?它们与在用户空间中使用mmap(2)/munmap(2)有何不同?
我试图在没有用户进程的内核空间中做到这一点。
我浏览了网络搜索和Linux内核书籍,包括Bovet和Cesati的"Understanding the Linux Kernel“。一本好书,但没有回答我的问题。
我需要在linux驱动程序中获得分配内存块的物理内存:这是一个FPGA SOC,内存被传递给SGDMA FPGA模块。
这可以归结为对“逻辑”和“虚拟”记忆的混淆:--它们是同义词还是反义?--
因此,我的驱动程序代码片段是:
unsigned long m = __get_free_pages(GFP_USER, order); // returns 'logical' address
if (m) {
instance->read_buffer[i].order = order;
if(1) { // should this be 0?
关于mm_struct和内核线程,在Linux kernel Development ( Robert Love)一书中提到的一些要点是:
内核线程没有进程地址空间,因此没有相关的内存描述符。因此,内核线程的进程描述符的mm字段为NULL。
“由于内核线程在用户空间中没有任何页面,它们实际上不值得拥有自己的内存描述符和页表(页表将在本章后面讨论)。尽管如此,内核线程仍需要一些数据,例如页表,甚至需要访问内核内存。”
内核线程没有地址空间,并且mm为NULL。因此,当调度内核线程时,内核会注意到mm为NULL,并保持前一个进程的地址空间已加载。然后,内核会更新内核线程的进程描述符中的active
众所周知,MMIO空间被映射(例如,通过/dev/mem,通过调用remap_pfn_range()作为单个PTE来映射,这样就没有struct页面了。
在使用ioremap_wc()时也是这样吗,还是ioremap_wc()创建了一个由页面和许多PTE组成的结构?
操作系统: Linux x86_64
我使用下面的代码从嵌入式板的SPI端口输出数据(olimex 233-micro-它不是板上的特定问题)。当我运行代码时,ioctl返回“坏地址”。我正在修改上的代码,它工作得很好。有人能告诉我我做错了什么吗?
root@ubuntu:/home# gcc test.c -o test
test.c:20: warning: conflicting types for ‘msg_send’
test.c:16: note: previous implicit declaration of ‘msg_send’ was here
root@ubuntu:/home# ./test
errno:B
在Linux进程内部,可以从/proc/self/maps中读取来查看其地址空间的描述。例如,
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
void print_maps() {
int fd = open("/proc/self/maps", O_RDONLY);
char buf[512];
int rc;
fflush(stdout); //Not necessary for this example, but I usually