gpt4 book ai didi

c - 从Linux内核模块访问/dev/mem

转载 作者:行者123 更新时间:2023-11-30 18:55:47 26 4
gpt4 key购买 nike

我正在开发 Raspberry PI (Linux rpi 3.12.28+),并且我有以下 C 代码,可用于操作 GPIO 端口:

// IO Acces
struct bcm2835_peripheral {
unsigned long addr_p;
int mem_fd; // memory file descriptor
void *map;
volatile unsigned int *addr;
};

struct bcm2835_peripheral gpio = {0x40000000};

// Exposes the physical address defined in the passed structure using mmap on /dev/mem
int map_peripheral(struct bcm2835_peripheral *p)
{
// Open /dev/mem
if ((p->mem_fd = open("/dev/mem", O_RDWR | O_SYNC) ) < 0) {
return -1;
}

p->map = mmap(
NULL,
BLOCK_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED,
p->mem_fd, // File descriptor to physical memory virtual file '/dev/mem'
p->addr_p // Address in physical map that we want this memory block to expose
);

if (p->map == MAP_FAILED) {
return -1;
}

p->addr = (volatile unsigned int *)p->map;

return 0;
}

上面的代码适用于普通程序(用户空间)。但我需要创建一个具有相同功能的 Linux 内核模块。问题是编译器无法识别 open() 或 mmap() 等方法。将此代码转换为内核模块(驱动程序)的适当方法是什么?这些函数可用于内核编程还是我应该以不同的方式进行?我见过像 syscall_open()、filp​​_open()、sys_mmap2() 这样的方法,但我很困惑。我将不胜感激任何帮助。

最佳答案

您在内核空间中没有系统调用(打开、关闭、读取、写入等),相反,您必须使用模块提供的内部接口(interface),但似乎不是您的情况。

考虑到您正在访问 /dev/mem 我想您正在尝试读取 RaspberyPi 的物理内存。由于没有内存保护,您可以从内核空间直接访问它,但是,您必须使用 phys_to_virt 函数来转换地址。

关于c - 从Linux内核模块访问/dev/mem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26412303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com