Heng30的博客
搜索 分类 关于 订阅

在Linux内核中如何映射物理地址?

2025-02-23

Linux内核中,一般使用ioremap将物理地址映射到内核虚拟地址空间,使内核能够通过指针访问设备的内存或寄存器。主要用于访问设备的内存映射I/O区域。

函数原型

void __iomem *ioremap(resource_size_t phys_addr, unsigned long size);
  • 参数

    • phys_addr:要映射的物理地址。
    • size:映射区域的大小。
  • 返回值

    • 成功时返回映射后的内核虚拟地址。
    • 失败时返回NULL

示例

#include <linux/io.h>

int main(void) {
    void __iomem *regs = ioremap(0x10000000, 0x1000);
    if (!regs) {
        pr_err("ioremap failed\n");
        return -ENOMEM;
    }

    // 通过regs访问硬件寄存器
    iowrite32(0x12345678, regs + 0x10);

    // 释放映射。
    iounmap(regs);
}

总结

ioremapLinux内核中用于访问设备内存的重要函数,通过将物理地址映射到虚拟地址空间,使内核能够安全地操作硬件资源。