编写内核模块调用内核相关接口实现申请 IO 内存、读写 IO 内存、释放 IO 内存展示代码
以下是一个简单的内核模块,展示如何申请、读写和释放 I/O 内存:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/io.h>
static void __iomem *io_mem;
static int __init io_mem_init(void)
{
int ret;
// 申请 4KB 的 I/O 内存
io_mem = io_mapping_create_wc(0x1000, 0);
if (!io_mem) {
pr_err("Failed to allocate I/O memory\n");
return -ENOMEM;
}
// 在 I/O 内存中写入数据
iowrite32(0x12345678, io_mem);
// 从 I/O 内存中读取数据
pr_info("I/O memory value: 0x%08x\n", ioread32(io_mem));
// 释放 I/O 内存
io_mapping_free(io_mem);
return 0;
}
static void __exit io_mem_exit(void)
{
pr_info("I/O memory module unloaded\n");
}
module_init(io_mem_init);
module_exit(io_mem_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("I/O memory module");
在这个例子中,我们使用 io_mapping_create_wc() 申请了一个 4KB 大小的 I/O 内存区域,并使用 iowrite32() 向 I/O 内存中写入了一个 32 位的数据。接着,我们使用 ioread32() 从 I/O 内存中读取了这个数据,并使用 io_mapping_free() 释放了这个 I/O 内存区域。
需要注意的是,在使用 I/O 内存时,需要使用 __iomem 关键字来标记指针,以确保编译器正确地处理这些指针。此外,由于 I/O 内存通常位于物理地址空间中,因此需要使用 ioread*() 和 iowrite*() 系列函数来进行读写,而不能直接使用指针访问内存。最后,要记得在使用完毕后释放 I/O 内存,以避免内存泄漏
原文地址: https://www.cveoy.top/t/topic/ewU9 著作权归作者所有。请勿转载和采集!