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

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

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

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

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

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

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

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

 

Win编译和链接机制

image.png

应用和硬件无关?

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


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

image.png

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


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


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

BOOLTextOut(HDChdc,              //设备描述表的句柄intnXStart,          //显示字符串的x坐标intnYStart,          //显示字符串的y坐标LPCTSTRlpString,     //指向字符串的指针intcbString//字符串的文字数);


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

Ps:注脚

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

目录
相关文章
|
Linux Python
如何在服务器上跑python程序
购买服务器 首先你需要一个服务器,阿里云云翼计划有一个9.9云服务器ECS服务。你怎么买我不管,反正你最后给我搞到一个云服务器。 购买的配置界面 由于阿里云现在限量购买,所以这里只是截个图说明而已,主要说明一点公共镜像选择ubuntu14.04 64位,还有root密码别忘了。
10068 1
|
5月前
|
缓存 小程序 Linux
《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现
《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现
23 0
|
5月前
|
vr&ar 开发工具 iOS开发
visionOS空间计算实战开发教程Day 1:环境安装和编写第一个程序
截至目前visionOS还未在Xcode稳定版中开放,所以需要下载Xcode Beta版。比如我们可以下载Xcode 15.1 beta 2,注意Xcode 15要求系统的版本是macOS Ventura 13.5或更新,也就是说2017年的MacBook Pro基本可以勉强一战,基本上还是推荐使用M系列芯片的电脑进行开发。
75 0
|
数据采集 JSON 小程序
走进小程序【二】微信小程序环境搭建并初始化第一个小程序项目
走进小程序【二】微信小程序环境搭建并初始化第一个小程序项目
184 0
走进小程序【二】微信小程序环境搭建并初始化第一个小程序项目
|
IDE Linux 网络安全
走过岁月我才发现——云IDE真方便(Python3.8环境测试)
走过岁月我才发现——云IDE真方便(Python3.8环境测试)
127 0
走过岁月我才发现——云IDE真方便(Python3.8环境测试)
|
Python
leecode上的代码到pycharm运行解决历程
leecode上的代码到pycharm运行解决历程
124 0
|
Java 编译器 程序员
Win知识 - 程序是怎样跑起来的——有点难度的Q&A
Win知识 - 程序是怎样跑起来的——有点难度的Q&A
49 0
|
存储 缓存 算法
《程序是如何跑起来的》知识整理
《程序是如何跑起来的》知识整理
120 0
|
存储 自然语言处理 Linux
【C进阶】程序的环境
目录 1、引言 2、翻译环境 (一)编译 (1)预处理 (2)编译环节 (3)汇编 (二)链接 3、运行环境
【C进阶】程序的环境