Linux内核——ioremap映射函数

一、ioremap函数的使用意义

        首先先介绍一下MMU的概念:

        MMU(Memory Manage Unit),即内存管理单元。其主要功能为:

                1.完成虚拟空间到物理空间的映射

                2.内存保护,设置存储器的访问权限

        对于有MMU的处理器,Linux内核启动时会初始化MMU,设置内存映射,设置好以后处理器访问的都是虚拟地址,而访问不到物理地址。在Linux内核中,有许多与硬件相关的操作需要使用到物理内存地址。然而,在内核态中,直接访问物理内存是非常危险的,容易导致系统崩溃。因此,为了安全地访问物理内存,Linux内核提供了ioremap函数。如何解决这个问题呢?需要用到地址映射。

        虚拟空间到物理空间的映射,也叫做地址映射。物理内存和虚拟内存之间的转换,需要用到两个函数: ioremap()和 iounmap()。通过ioremap()函数将物理地址映射为虚拟地址后,内核就能通过ioremap()返回的虚拟地址,以虚拟地址->mmu页表映射-> 物理地址的形式正确地访问到物理地址了。

二、ioremap函数的用法

  1.ioremap函数原型

//需要包含的头文件
#include <asm/io.h>
void __iomem *ioremap(phys_addr_t offset, size_t size);

  2.ioremap函数——参数解析

offset:需要映射的物理内存起始地址。
size:需要映射的物理内存大小。

  3.ioremap函数——返回值解析

该函数返回值为__iomem修饰的指针,指向映射后的内存地址。

三、iounmap函数——解除映射函数

  1.iounmap函数原型

void iounmap(void * addr);

  2.iounmap函数——参数解析

addr:映射的虚拟地址

                     它的作用就是把映射过来的物理地址还原,释放掉虚拟地址。

四、使用案例

#include <linux/io.h>

void *mapped_addr;

void map_io_memory(void) {
    phys_addr_t phys_addr = 0x50000000;
    size_t size = 0x1000;

    mapped_addr = ioremap(phys_addr, size);
    if (mapped_addr == NULL) {
        printk(KERN_ERR "Failed to map IO memory\n");
        return;
    }

    // 对映射后的内存进行读写操作
    // ...

    iounmap(mapped_addr);
}

参考:1.Linux 操作寄存器前为什么要 ioremap? - 知乎 (zhihu.com)

           2.ioremap函数详解|极客笔记 (deepinout.com)

 .
 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值