声明
以下都是我刚开始看驱动视频的个人强行解读,如果有误请指出,共同进步。
本节目标
- 了解物理地址和虚拟地址,MMU是关键
在之前我们对linux驱动已经有了一个大概印象,而编写的代码也都是学习性质的编写,在本节之后就开始逐渐深入。
首先我们要用到的就是迅为提供的开发板的原理图,他的位置是 iTOP-4412精英版光盘资料\01_PCB_SCH_DATASHEET
下的iTOP4412_MAIN_CLASICS_V3_2_20180205
文件夹下,而怎么去看这些就看迅为的视频即可。
对于用过单片机的人来说,这一节应该是比较好理解的。
我们以LED为例,一步步的查找硬件是如何连接,最终找到GPL2_0就是迅为开发板4412芯片接LED的管脚
所以我们要编写驱动,最终还是要操控GPL2_0的寄存器,打开4412芯片的datasheet搜GPL2CON就能找到他的硬件地址。
那是不是我们直接操控他的硬件地址就行了呢?不是。
我们要谨记,单片机和linux是不一样的。如果把linux当单片机去使,他就只是一个单片机,没有系统层面的思想,这样是没有灵魂的!
单片机我们是怎么玩的?
我们知道程序其实都是操作CPU的寄存器。程序就是告诉CPU,你的哪个寄存器要怎么做。
对于linux来说
linux是个系统,也是一个平台,做事要讲究,我们不能什么直接操作寄存器。对于物理地址,linux都把他封装起来了,不直接开放给我们操作。我们程序想操作,要经过linux的允许。
对于单片机和ARM Linux的区别是什么。百度一搜就知道多了一个cache缓存和mmu内存管理单元。
引入内存概念
关于CPU大家应该都知道,他的速度是非常快的,而硬盘则是非常慢的。所以CPU直接读硬盘的程序,那着急死了。
因此我们引入了内存,他的速度介于CPU和硬盘之间作为一个中转站,这样大家就会都好受一点了。
引入cache缓存概念
虽然引入了内存,但这个对于CPU来说这个速度还是太慢了,所以在CPU和内存直接又引入了一个cache缓存,他的速度介于CPU和内存之间。
这下成了,CPU -> cache -> 内存 -> 硬盘,有这么多的缓存介质,才OK,至于为什么不都换成cache或者内存,速度这么快,emmm…只能说太贵了。
这下速度够快了,linux还是觉得差了点。
引入MMU内存管理单元的概念
我们随便说一台电脑的配置,什么i7的CPU(随便举个例子,缓存是几M),8G的内存,1T的硬盘。
速度是够了,但是问题在于大家的大小不一样啊,我要是有个10G的程序,8G内存那不是装不下?难道就运行不了了?
所以linux引入了一个虚拟内存概念
此时MMU出现了,他不存数据,而是建立一个映射的“表格”,他保存了虚拟地址和物理地址的映射关系。当你操作这些虚拟地址的时候,MMU就会找到他的物理地址去调用它。
什么是虚拟地址?对于一个32位的CPU,他能表示的最大寻址空间是2^32=4GB,也就是虚拟内存有4G。即便我们用的1G的内存条,那么跑3G的程序也是没问题的,他会挪用一部分硬盘来当内存使。你这个3G的程序跑是能跑,只是会卡(毕竟硬盘速度很慢)。
至于具体是怎么实现的,我也只是大致了解个概念,这些东西以后再深究吧…
收尾
对于上系统来说,东西虽然看起来好像变复杂了,但是复杂的同时,也能让他能做的事变多了。而且这些复杂的东西不需要你全部完成,很多东西都是自动的(不然要系统干啥)。
对于编写驱动来说,只需要操作虚拟地址即可。只要想操作的虚拟地址能对应上我们遥操作的那个物理地址,中间是怎么实现的自然有芯片厂家来做,他们会提供这个地址是如何映射的,我们只管看芯片手册,使用映射好的虚拟地址即可。