以下是一个简单的内核模块,展示如何申请、读写和释放 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 内存,以避免内存泄漏

编写内核模块调用内核相关接口实现申请 IO 内存、读写 IO 内存、释放 IO 内存展示代码

原文地址: https://www.cveoy.top/t/topic/ewU9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录