【迅为iTop4412学习笔记】10.了解物理地址和虚拟地址

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39057987/article/details/84557237

声明

以下都是我刚开始看驱动视频的个人强行解读,如果有误请指出,共同进步。

本节目标

了解物理地址和虚拟地址,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和硬盘之间作为一个中转站,这样大家就都好受一点了。

对于单片机,实时性能要求较高,操作GPIO是第一位的,所以CPU要等待引脚的操作完成,再去做别的事情。因此单片机只需要这么多就可以了。

引入cache缓存概念

但是对于linux来说,他是一个平台,他的梦想远大,怎么能满足这么一点功能呢?

虽然引入了内存,但这个速度还是不够快,所以在CPU和内存直接又引入了一个cache,他的速度介于CPU和内存之间。

这下速度差不多了,CPU -> cache -> 内存 -> 硬盘,有这么多的缓存硬件,这下大家的速度都匹配了。(不要问为什么不全部用cache,贵啊…)

这下速度够快了,linux还是觉得差了点。

引入MMU内存管理单元的概念

我们随便说一台电脑的配置,什么i7的CPU(随便举个例子,缓存是几M),8G的内存,1T的硬盘。

速度够了,但是好像大家大小不一样啊,我要是有个10G的程序,8G内存那不是装不下?难道就运行不了了?

linux决定搞一些骚操作,我要用8G的内存也能加载10G的程序。

他引入了一个虚拟内存

10G的程序,难不成10G都会用到?所以程序常用的部分就加载进内存,不常用的还放在硬盘里,当程序需要调用不在内存的部分程序的时候,再从硬盘里读。虽然慢了点,但好在能用8G的内存加载10G的程序了。

但是问题来了,我怎么知道你程序在哪?

此时MMU出现了,他不存这些数据,而是建立一个“表格”,他保存了虚拟地址和物理地址的映射关系。当你操作这些虚拟地址的时候,MMU就会找到他的物理地址去调用它。

我们假设我们的电脑的配置很低(1G内存,10G硬盘)
现在我们运行了一个4G的程序。我们CPU开始运行程序,程序要操作,但是操作就要有地址,那么则去操作那些虚拟地址,而MMU再找到虚拟地址对应的真正的物理地址,最后从物理地址里真正的读程序去控制CPU里的寄存器。

为什么ARM的linux要做比单片机这么多复杂的事情呢?

  1. 即使你的内存不够大,也能跑比内存还要大的程序(慢了点,也比跑不了好吧!)
  2. 直接操作CPU的寄存器虽然快,但其实是一个很危险的事情,linux要统一管理

虚拟内存是不是无限大呢?

不是,就像牛皮一样,你可以吹牛皮,但是你不能吹破了。

对于32位的CPU,他最多寻找2^32=4G个地址,那么能操控的地址最大也就是4G。

  1. 假如你不富有,只有1G的内存条,那么系统可以最大帮你虚拟4G的内存出来(4G的程序不是同时在跑,所以用哪一部分,那里加载硬盘里的程序到1G内存里去跑),你就能跑4G的程序了。
  2. 假如你很有钱,有4G的内存条,4G的虚拟地址和4G的物理地址一一对应,你的程序全部加载在内存条里,程序跑的自然快很多(因为内存比硬盘快)
  3. 假如你特别有钱,用的8G的内存条,那么恭喜你,你浪费了4G的内存,因为32位的CPU最多只能寻找4G个地址。(所以有傻X用32位的系统但是用8G的内存条,尽情的嘲笑他…)

对于64位的CPU,最多能模拟2^64=17179869184G的大小。多么吓人的数字。

  1. 假如你不富有,还是用的1G的内存条,系统照样可以用硬盘来当内存使,只是硬盘速度慢,跑起程序来也慢。
  2. 假如你有钱,内存条你可以使劲加大,因为64位的CPU可以操作的地址太大了,你内存够大,能跑的程序就越多越快(因为都在内存)。

所以有钱,就加内存,你就可以加载很多程序到内存条,因为都在内存,所以速度也很快。
但是内存大还不够,你硬盘如果太慢了,内存读的着急死了也读不进去。所以硬盘虽然大,但硬盘速度也要快,机械硬盘的速度太着急了,用SSD吧,读写速度很快。
(emmm…三千预算进卡吧,加钱加到十万八…)

收尾

对于上系统来说,东西虽然看起来好像变复杂了,但是复杂的同时,也能让他能做的事变多变强了。
而且这些复杂的东西不需要你全部完成,很多东西都是自动的(不然要系统干啥)
对于我们编写驱动来说,只需要操作虚拟地址即可。只要想操作的虚拟地址能对应上我们遥操作的那个物理地址,中间是怎么实现的自然有芯片厂家来做,他们会提供这个地址是如何映射的,我们只管看芯片手册,使用映射好的虚拟地址即可。

猜你喜欢

转载自blog.csdn.net/qq_39057987/article/details/84557237