总线地址:CPU能够访问的地址范围
物理地址:硬件中的实际地址或绝对地址:比如磁盘地址,比如51的寄存器,就是物理地址
虚拟地址: 操作系统运行在保护模式下所使用的地址,也叫逻辑地址,它是基于算法的,处于软件层面。
编写驱动之前必须要树莓派内核移植,以及内核编译
(141条消息) 树莓派-内核开发-说明 下载代码 编译 替换内核_TX564的博客-优快云博客
(141条消息) Linux内核介绍、编译_TX564的博客-优快云博客
我们在编写驱动程序的时候,IO空间的起始地址是0x3f000000,加上GPIO的偏移量0x2000000,所以GPIO的物理地址应该是从0x3f200000开始的,然后在这个基础上进行Linux系统的MMU内存虚拟化管理,映射到虚拟地址上。
特别注意,BCM2708 和BCM2709 IO起始地址不同,BCM2708是0x20000000,BCM2709是0x3f000000,这是造成大部分人驱动出现“段错误”的原因。树莓派3B的CPU为BCM2709。
我们来配置一下pin4口:
1.查询数据手册或者查看官网引脚图
MMU(页表)
MMU的作用就是将物理地址比如1GB的物理地址映射成4GB虚拟地址 ,同时也是防止程序对物理地址写数据造成一些不可必要的问题
怎么映射呢:4G空间时其实根本用不了所谓的4G空间,其中有大片内存被闲置,那么这个时候呢,其他程序被加载进来时发现内存不够了,就把其他程序里的4G空间里闲置部分拿出来给这个进程用,换之这个进程内存不够时就会把其他进程里闲置的空间拿过来给该进程使用。
这里可以得知pin4被分在第0组,那么我们所有的配置都要选第0组的 ,根据上面给出的pin9的例子我们可知,如果要将pin4配置为output模式就要将bit12-bit14配置为001
注意:前面的地址并不是物理地址,而是