linux物理地址到虚拟地址映射MMU

9、linux物理地址到虚拟地址映射MMU

在单片机和裸机中操作硬件直接访问物理寄存器即可

例如 unsigned int *p = 0x12345678;

*p = 0x87654321;

但是在Linux上不行,在Linux上,如果要想操作硬件,需要先把物理地址转换为虚拟地址,因为Linux使能了MMU(物理地址转换为虚拟地址),所以我们在Linux上不能直接操作物理地址。

MMU的好处?

​ (1) 让虚拟地址成了可能

​ (2) 可以让系统更加安全,因为有了MMU,我们上层应用看到的内存都是虚拟内存,我们的应用就不能直接访问硬件,这样就保证了系统的安全。

MMU非常复杂**,我们如何完成物理地址到虚拟地址的转换?**

内核给我们提供了函数

ioremap,iounmap

ioremap

ioremap : 把物理地址转换成虚拟地址

static inline void __iomem *ioremap(unsigned long port, unsigned long size)
{
   
	return IO_CONCAT(__IO_PREFIX,ioremap) (port, size);
}

port 映射物理地址的起始地址。

size : 映射多大的内存空间

返回值: 成功返回虚拟地址的首地址、 失败: 返回NULL

iounmap

iounmap: 释放掉ioremap映射的地址

static inline void iounmap(volatile void __iomem *addr)
{
   
	IO_CONCAT(__IO_PREFIX,iounmap)(addr);
}

addr 要取消映射的虚拟地址的首地址

注意: 物理地址只能被映射一次,多次映射会失败

如何查看那些物理地址被映射过了?

cat /proc/iomem 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97dN1Ivo-1618902591032)(linux驱动.assets/image-20210412095539685.png)]

10、LED驱动

•GPIO (General Purpose InputOutput Port)

– 通用输入输出口
– 单片机或处理器对外设进行操作的主要方式
– 通过设置GPIO的高电平或者低电平来实现
对外设的操作
– GPIO很多是复用的
•程序对寄存器操作即可实现对GPIO的操作

1、查看电路图、datasheet

编写IED驱动,主要是对GPIO的操作

在这里插入图片描述

在核心板连接到了GPL2_0
在这里插入图片描述

在datasheet中找到GPL2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6rmJQGS1-1618902548334)(linux驱动.assets/image-20210412130042151.png)]

GPL2_0的控制寄存器,主要是控制输入/输出(电平方向)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n0cYY3Jw-1618902548337)(linux驱动.assets/image-20210412130057868.png)]

数据寄存器,写入0x1 为高电平、0为低电平 因为这里使用的是GPL2_0 第0位对应着GPL2_0 , 如果是2_1
就是对应着第1位 第1位为1 则为高电平、0位低电平

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F1Ejvtma-1618902548339)(linux驱动.assets/image-20210412130153644.png)]

2、编写驱动程序

这里使用的是物理地址和虚拟地址映射的方式来操作GPIO

#include <linux/init.h>
#include <linux/module.h>
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值