Win知识 – 程序是怎样跑起来的(合集)

Win知识 – 程序是怎样跑起来的(合集)操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(systemcall),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了time()及printf()等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字…

大家好,又见面了,我是你们的朋友全栈君。

系统调用和高级编程语言的移植性

操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(system call),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了time()及printf()等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字符串等功能的系统调用的函数名,并不是time()和printf()。系统调用是在time()和printf()函数的内部执行的。大家可能会认为这个方法有些绕,不过这是有原因的。

C语言等高级编程语言并不依存于特定的操作系统。这是因为人们希望不管是Windows还是Linux,都能使用几乎相同的源代码。因此,高级编程语言的机制就是,使用独自的函数名,然后再在编译时将其转换成相应操作系统的系统调用(也有可能是多个系统调用的组合)。也就是说,用高级编程语言编写的应用在编译后,就转换成了利用系统调用的本地代码(图9-6)。

Win知识 - 程序是怎样跑起来的(合集)

图9-6 高级编程语言的函数调用在编译后变成了系统调用

在高级编程语言中,也存在可以直接调用系统调用的编程语言。不过,利用这种方式做成的应用,移植性并不友好(也俗称为有恶意行为的应用)。例如,直接调用Windows系统调用的应用,在Linux上显然是无法运行的。

Ps:①移植性指的是同样的程序在不同操作系统下运行时需要花费的时间等,费时越少说明移植性越好。

 

Win编译和链接机制

Win知识 - 程序是怎样跑起来的(合集)

 

应用和硬件无关?

在用C语言等高级编程语言开发的Windows应用中,大家很少能接触到直接控制硬件的指令。这是因为硬件的控制是由Windows全权负责的。

不过,Windows提供了通过应用来间接控制硬件的方法。利用操作系统提供的系统调用功能就可以实现对硬件的控制。在Windows中,系统调用称为API(图11-1)。各API就是应用调用的函数。这些函数的实体被存储在DLL文件中。

Win知识 - 程序是怎样跑起来的(合集)

图11-1 应用通过操作系统间接控制硬件

下面让我们来看一个利用系统调用来间接控制硬件的示例。例如,假设要在窗口中显示字符串,就可以使用Windows API中的TextOut函数①。TextOut的语法如代码清单11-1所示。在这段代码中,确实没有能让大家意识到硬件的参数。带有“设备描述表的句柄”这一注释的参数hdc,是用来指定字符串及图形等绘制对象的识别值,表示的也不是直接硬件设备。

代码清单11-1 TextOut函数的语法(C语言)

BOOL TextOut(
	HDC hdc,              //设备描述表的句柄
	int nXStart,          //显示字符串的x坐标
	int nYStart,          //显示字符串的y坐标
	LPCTSTR lpString,     //指向字符串的指针
	int cbString          //字符串的文字数
);

那么,在处理TextOut函数的内容时,Windows做了什么呢?从结果来看,Windows直接控制了作为硬件的显示器。但Windows本身也是软件,由此可见,Windows应该向CPU传递了某些指令,从而通过软件控制了硬件。

Ps:注脚

① 在向窗口和打印机输出字符串时,可以使用Windows提供的TextOut函数作为API。C语言提供的printf函数,是用来在命令提示符中显示字符串的函数。使用printf函数,是无法向窗口和打印机输出字符串的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154108.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月28日 上午8:46
下一篇 2022年6月28日 上午8:46


相关推荐

  • pycharm中配置并使用git步骤(小白的摸索)

    pycharm中配置并使用git步骤(小白的摸索)前提 1 本地电脑中安装 git pycharm 版本信息如下 步骤 1 配置 gitPycharm Setttings VersionContr Git 弹出框中 pathtoGitexe 输入框中输入本地电脑中安装的 git exe 的文件路径 点击 Test 按钮 git 版本号弹窗弹出 配置成功 2 同步 githubPychar VCS Getfromvesio URL 中输入 GitHub 仓库的地址和本地目录 这里注意下 目

    2026年3月27日
    1
  • html精灵图坐标如何确定,背景设置及精灵图

    html精灵图坐标如何确定,背景设置及精灵图背景色.box{width:450px;height:450px;border:1pxsolidaqua;background-color:burlywood;/*背景色默认可以从内边距透出来*/padding:20px;/*控制背景的覆盖范围*/background-clip:content-box;/*渐变*/background:linear-gradient(45deg,re…

    2022年5月11日
    37
  • JS截取字符串 3种方法

    JS截取字符串 3种方法1 String 定义了 3 个字符串截取的原型方法 String 类型的截取字符串方法字符串方法说明 slice 抽取一个子串 substring 返回字符串的一个子串 substr 抽取一个子串 1 1 截取指定长度字符串 substr 方法能够根据指定长度来截取子字符串 它包含两个参数 第一个参数表示准备截取的子字符串起始下标 第二个参数表示截取的长度 示例 1 在下面示例中使用 lastIndexOf 获取字符串的最后一个点号的下标位

    2026年3月18日
    2
  • Node-RED简介

    Node-RED简介Node RED 是构建物联网 IOT InternetofTh 应用程序的一个强大工具 其重点是简化代码块的 连接 以执行任务 它使用可视化编程方法 允许开发人员将预定义的代码块 称为 节点 Node 连接起来执行任务 连接的节点 通常是输入节点 处理节点和输出节点的组合 当它们连接在一起时 构成一个 流 Flows Node RED 最初是 IBM 在 2013 年末开发的一个开源项

    2026年3月18日
    1
  • java嵌套条件运算符_java条件运算符的嵌套使用「建议收藏」

    java嵌套条件运算符_java条件运算符的嵌套使用「建议收藏」对于java条件运算符的嵌套使用你熟悉吗?下面要给大家带来的就是和这方面有关的编程题,一起来了解一下。一、题目学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示注:利用条件运算符的嵌套来完成这道题目二、思路(a>b)?a:b这是条件运算符的基本例子三、代码实现publicclassProg5{publicstaticvoidmain(Strin…

    2026年4月17日
    9
  • Meta 删邮件事故背后,OpenClaw 为什么会“失忆”?代码库维护者拆解记忆架构

    Meta 删邮件事故背后,OpenClaw 为什么会“失忆”?代码库维护者拆解记忆架构

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号