写在前面
我也是个实用主义者,喜欢《明朝那些事儿》里面的一些基本态度,不觉得知识应该被束之高阁,是它呈现出一种晦涩的、学术的面貌。同时我也认为真正优秀的事物总是相通的。于是我想把自己学习操作系统的一些知识和重要思想和平时的通俗化的场景来一场双厨狂喜。
重映射
“重映射”是一个非常重要的思想,第一次接触“映射”的概念在数学上,为了理解函数而提出概念,就是一种对应关系,常见的时一对一映射。重的意思就是重新,就是重新建立一个映射关系,概念可能说的不太清楚,那我们来展示两个具体的应用场景:
1.关于STM32引脚的重映射
最先整体听到“重映射”这个词应该是在学习STM32的时候关于引脚复用的重映射,一般而言呢,这个引脚充当普通的I/O口,但是通过“重映射”可以让他成为某些外设的输入输出引脚,最常见的就是STM32F103的<PA9 和 PA10>这两个引脚被用作串口的输入输出。
这是一种引脚意义上的“重映射”——把普通的I/O口重映射到串口引脚了;
2.关于现代操作系统内存的重映射
这里涉及到常见的如STM32、51单片机等单片机的工作方式。这种裸机最大的特点是一次只能执行一个程序,原因在哪?原因在于固化好的程序在内存中的位置已经相对确定,无法通过CPU主动更改。现代操作系统中“多任务”是基本需求,那么多任务是怎么实现的呢?答案是内存的重映射。在固定大小的内存区域中,操作系统不停的把要执行的进程的数据加载到内存中,已经完成的进程及时进行销毁空出该进程占用的空间。
这是一种内存意义上的“重映射”——把一个已经退出的进程的内存空间重新映射到一个处于就绪态马上要执行的进程上;
3.关于单片机函数层面的重映射
刚刚我们提到的现代操作系统的重映射应用比较直观,这里先问一下,在STM32这种单片机里面有没有“重映射”思想?可以先思考一下…答案是有的!STM32中的重映射发生在RAM区域,确切讲是发生在RAM区域的堆栈区。这两个区域中的数据是变化的,堆区存放我们临时申请的内存空间,栈区存放函数执行时的局部变量、上下文等。在上“C语言”这门课程的时候,老师讲函数的时候会讲到函数中的局部变量的作用域,说函数中的局部变量函数执行完之后就会被回收,那么回收之后的变量空间就空出来了,新调用的函数的局部变量会被重新映射到这个地址。同样我们调用free后申请的堆区的空间也被回收,会被新malloc的空间占用。
这是一种函数堆栈意义上的“重映射”——把一个已经结束的函数的地址重新映射到一个马上要执行的函数;
4.生活中的重映射
说完上面3个重映射的应用,我们能够总结出这个思想的共性其实和时分复用是一样的。那么生活中一切“共享的”事物其实都是重映射思想的体现,共享单车骑过吧这就是一开始映射到用户A,你用的时候重映射到你。火车站/飞机场侯过车吧,一个座位不能被两个人同时坐,一个旅客走了另外一个旅客坐上去了,就是完成了一次重映射。 你和你舍友卫生间不能同时使用吧…凡此种种都是重映射,资源有限,没办法人人都对号入座,应用太广泛了因此,这确实是一种很好的思想。