软件是如何控制硬件的?
软件是如何控制硬件的?我的答案是,这个问题首先就是错误的,这个世界上本身就没有软件。这个时候好多小伙伴也许开始向我扔鸡蛋了,rz一样,没软件我的电脑怎么运行的,我昨天还写了一个软件控制LED灯实现了跑马灯效果呢。。。你今天告诉我这个世界上不存在软件?脑子有问题吧?大家先别着急,听我慢慢说。我先问大家,软件是什么?小伙伴直接掏出下面一段代码,喏,这就是软件,并且我能通过这段代码将一个LED点亮...
软件是如何控制硬件的?
我的答案是,这个问题首先就是错误的,这个世界上本身就没有软件。
这个时候也许许多小伙伴开始向我扔鸡蛋了,rz一样,没软件我的电脑怎么运行的,我昨天还写了一个软件控制LED灯实现了跑马灯效果呢。。。你今天告诉我这个世界上不存在软件?脑子有问题吧?
先别着急,听我慢慢说。我先问大家,软件是什么?小伙伴直接掏出下面一段代码,喏,这就是软件,并且我能通过这段代码将一个LED点亮。
#include "stm32f1xx_hal.h"
#include "gpio.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 1);
HAL_Delay(100);
}
}
说得确实不错,所以说你发出了软件是如何控制硬件的疑问,想知道底层代码是如何点亮LED的,这种刨根问底的思想非常好。那我现在问你,你的软件,也就是上面这份代码,它在真实世界中长什么样子的?估计你又被我问的生气了,不就长上面这个样子吗?还能长什么样子!那好,我在问你,你的这份代码是存在哪里的?硬盘啊。
对,软件也就是代码,是存在硬盘里的。硬盘存储数据的原理是什么,是利用磁盘上一颗颗磁粒的磁极方向存储数据的。那么好了,我们的代码在物理世界中的真实存在,其实就是硬盘上一片有着不同磁极方向的磁粒,也就是说,我们的软件其实是硬件。所以开头我说,软件控制硬件的这种说法是错误的。
我刚刚说它是错误的是站在计算机的角度上来讲。但是,站在人的角度来讲这个问题又是正确的,是有意义的,不扯这么多了,我们现在来分析下“软件是如何控制硬件的?”。
首先软件是位于磁盘上的一片有磁极方向的磁粒,软件运行前要将硬盘上的代码读到内存中,我们分析下硬件上是怎么实现的。首先主机上电,磁盘可以旋转,这个没问题吧,这个是物理上的事实,有电流的导体在磁场中受到力的作用进行旋转。磁头感应到了磁片上一个个磁粒的磁场,生成了相应的感应电流,进而产生高低电平,这些高低电平最终去给内存条中相应的一个个电容充电(实际可能更复杂,我们这里先以最简单的思路来把问题想明白,证明路是通的)。这样就完成了代码从硬盘到内存的搬运,物理上可以认为是磁转电的过程。这个时候的软件依然是有硬件载体的,可以说软件是内存中的一批电荷。软件依然是硬件。代码被放到内存后,CPU就可以读取代码和数据并且进行计算。CPU读取内存数据的时候其实是操纵一块电路,进行电信号的交流,这块电路其实就是读取指令的真实物理存在。同样的加法指令也是一小块电路,实现了加法的功能。这样各种计算和读写操作所对应的一块块电路,就是CPU的运算器,这也构成了这款CPU的指令集。如果这款CPU中只有加法电路,没有乘法电路,那么这款CPU就只支持加法指令,不支持乘法指令。 好了,CPU读取代码和数据后进行计算,将结果再写回内存中。刚刚控制LED亮灯的代码最后被CPU执行的结果就是向内存的某一个电容中充电,使之具有高电平,假如这个电容上连了一个LED灯,这个LED灯不就亮了吗。这就回答了“软件是如何控制硬件的?”这个问题。
最后,大家发现没,其实一开始的问题并不应该是软件如何控制硬件,而应该是硬件如何控制硬件。
我们再整理下整个原理:磁盘上不同磁极方向的一片磁粒(软件),通过磁头进行磁生电,并将电荷送到内存的电容中(硬盘代码和数据读入内存),CPU通过具有读写和运算功能的电路对内存中的电容进行充放电(CPU进行读写运算操作并将结果输出),最终使得与内存电容相连的LED点亮了。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)