编程语言和操作系统是什么关系?编程语言如何被计算机执行的?驱动程序的理解?
创始人
2024-01-28 01:52:14
0

编程语言和操作系统是什么关系?

首先,编程语言是不能运行的,它是可运行的计算机程序的一种表达方式,而编译器或者解释器把编程语言转换为计算机可执行的程序。

而操作系统也是一种可执行的计算机程序,它通常先在计算机上运行起来,作为一套中间层存在。我们都知道,中间层是为了提供抽象转换而存在的,而这套叫做操作系统的中间层,定义了一套规则,使得后续的可执行程序能够更容易的被运行起来,而且能更容易的利用各种硬件(显示,键盘等等),能够调用一些库来消除不同的程序间重复的运行逻辑。

总结下,编程语言是一种可执行程序的表达方式,编译器把编程语言的表达方式转换为可执行的程序,而编译器做转换的过程,可以操作系统相关(也就是转换出的程序运行在特定操作系统上),也可以操作系统无关(直接在裸机运行)。而操作系统,本身是一个程序,也可以是编程语言来表达的(编译后通常操作系统无关),也可以不是(直接写机器码),而操作系统这个特殊的程序,提供了库,硬件驱动,运行时环境,框架等,是为了让运行在其上的程序写得更容易

编程语言实际如何被计算机执行的

以c语言中的printf举例,如printf的底层就是调用了系统调用write函数,write系统调用函数作为操作系统API,为用户层提供写文件最基本的实现。这里系统调用write函数(属于c语言)的底层实现就是系统调用指令(汇编语言)的封装。我们知道调用“系统调用”有两种方式。
( 1) 将系统调用指令封装为 c库函数,通过库函数进行系统调用,操作简单。
(2)不依赖任何库函数,直接通过汇编指令 int与操作系统通信。

所以通过printf函数的实际实现其实是汇编指令的这个例子,我们可以认为c语言的底层实现就是汇编指令,因为c语言在编译过程中也都会全被翻译成汇编。最后翻译好的汇编会全部被翻译成机器指令,每条汇编指令都有一条对应的机器码,逐行翻译就行了。然后在执行时,这些程序会从硬盘中加载进内存。

接下来就是计算机执行机器指令了。计算机执行一个机器指令经历了这5个阶段:

  1. 取指: 根据pc 的寄存器中存的指令的内存地址,取指指的是根据这个内存地址从内存中取出指令。
  2. 译码:把需要用到值从寄存器中取出来。
  3. 执行:接着把取出的数据按指令所要求的算法进行加工。
  4. 访存:执行后自然就会产生结果,结果呢当然需要存储起来,有的需要根据计算出的内存地址,从中取出数据,有的也需要把数据写入指定的内存地址。
  5. 写回:执行后的结果,以及访存后的结果可能需要写入到寄存器中。寄存器只是CPU结构内用来存储当前程序需要用到的一些数据,这些贮存在寄存器内的数据可以实现高速读写,减少了进程从存储器中读取数据的时间。只有一部分数据会存储在寄存器里,其他数据会在主存储器(内存)与外存储器(硬盘)中。

既然内存是用来存放当前正在使用的(即执行中)的数据和程序,那么它是怎么工作的呢?我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的“动态”,指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。具体的工作过程是这样的:一个DRAM的存储单元存储的是0还是1取决于电容是否有电荷,有电荷代表1,无电荷代表0。但时间一长,代表1的电容会放电,代表0的电容会吸收电荷,这就是数据丢失的原因。刷新操作定期对电容进行检查,若电量大于满电量的1/2,则认为其代表1,并把电容充满电;若电量小于1/2,则认为其代表0,并把电容放电,藉此来保持数据的连续性。

驱动程序

驱动程序是什么:驱动程序与硬件相关,编写驱动程序要非常了解硬件,同时给应用层提供API函数接口,应用层可以调用这些接口去访问硬件而不必了解硬件。
如果有上层应用软件来控制硬件时,还可以这样理解:驱动程序就是衔接操作系统与外部的硬件的C代码。因为上层的应用软件最后都是会调用操作系统api去做事情的。那操作系统怎么和硬件做交互?答案就是通过驱动程序实现的。

通俗地解释:比如说你有一个应用是控制每天早上六点钟开灯.应用程序只负责在适当的时间做适当的事(到六点了,要开灯了,触发按键信号,这个信号由操作系统调度通过驱动程序相应的API接口下发至硬件);具体它不用知道为什么按下键就能开灯,因为按下键后开灯的事情就是驱动程序完成了,驱动程序再去控制硬件管脚发出高低电平信号去驱动灯的开关.

单片机驱动程序文件组成:以led点灯为例,包括三个文件led.h(包括宏定义,变量声明,函数声明),led.c(模块的具体代码实现),main.c(工程的主函数,调用模块函数并适当组合就可以完成工程的项目要求功能)三个文件。用keil编译

refer:
操作系统学习(二)–进程描述和执行
单片机驱动程序编写
OpenGL与显卡驱动
操作系统——系统调用
用户态和内核态的简单理解
底层原理——用户态和内核态的区别,和上面一篇结合起来看,非常重要!:比如print()实际上就是执行了一个输出的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
调用"系统调用函数write"的两种实现
计算机机器语言是如何被执行的

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...