操作系统课设-1

准备了两天,实在的活没干,补充知识学了不少


预编译头(Visual Studio中的应用)

是什么?为什么?

预编译是一项编译源码并产生中间代码的技术,它能使编译速度提高。总的来说就是在开发Windows程序时,一个工程中的很多CPP文件都会用到相同的头文件。而这些头文件如果很大的话(比如说windows.h),就会让编译速度变得很慢,因为#include语句其实就是把整个头文件复制过来了。
考虑到这个问题,有人就想到了将大家都要用到的头文件,在编译CPP文件之前就放在一起编译一下。这样就能很大地减少项目编译的时间。

怎么用?

在每个CPP中都要包括stdafx.h,stdafx.h中是大家都要用到的头文件(#include进来)。
PS:stdafx.cpp包含stdafx.h。stdafx.cpp编译后得到的是.pch文件


报错(scanf is unsafe)

将SDL选为“否”。这是VS的安全周期检查,将一些Warning直接变成了Error。


宏定义

#define
#ifdef
#endif

常见的预处理指令如下:

#: 空指令,无任何效果
#include: 包含一个源代码文件
#define:定义宏
#undef:取消已定义的宏
#if:如果给定条件为真,则编译下面代码
#ifdef:如果宏已经定义,则编译下面代码
#ifndef:如果宏没有定义,则编译下面代码
#elif:如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif:结束一个#if……#else条件编译块
#error:停止编译并显示错误信息

1.防止一个头文件被重复包含

1
2
3
4
5
#ifndef COMDEF_H
#define COMDEF_H
// 头文件内容

#endif

2.为什么要用宏定义?
待补充。。。


程序、作业、进程

程序是静态的,长期存在于电脑中的。它是一段代码,是计算机要执行的指令集合。
作业是交给计算机要完成的任务。分成四个阶段:作业提交、收容、执行和完成。它包括了程序,另外还有数据和控制命令。
进程则是操作系统中资源分配的基本单位,它是一段程序在一个数据集上的执行过程。一个作业分为一个或多个进程,一个程序可以由一个或多个进程完成,而一个进程也可以去执行一个或多个程序。


当Windows打开.exe文件时,都发生了什么?

第一个问题,exe是什么?
.exe就是源程序经过编译链接之后生成的可执行文件,是PE的一种文件形式。组成部分是机器指令和数据。由操作系统装载到内存中后,就可以运行了。
第二个问题,PE是什么?
.exe是一种文件类型,而PE是一种文件格式。
PE文件格式封装了Windows操作系统加载可执行程序代码时所必需的一些信息。都什么信息呢?可以参考一下PE的文件内部结构。
PE文件结构
另外,详见这篇文章:深入剖析PE文件
第三个问题,简单讲讲如何加载exe文件。
(这里看的是Windows2000的有关资料,现在可能有点变化,但是我觉得应该也变得不大)
点击.exe文件后,首先调用内核的CreateProcess()函数,创建进程。
同时,调用NTCreateProcess()函数,系统内部创建一个进程内核对象。用于存放进程的统计信息,同时分配给他虚拟存储空间。
接着,CreateProcess()会扫描文件头(就是PE文件格式中的有关内容),加载代码和数据段到内存当中。
至此,进程创建完成。然后创建有关线程开始执行。第一个要找到的是启动函数,它在程序链接的时候就放到了程序开始的位置。启动函数会完成程序运行的初始化工作。
启动函数代码中会调用进入点函数,每一个线程有自己的进入点函数(eg. main函数)

后记

有点想法啦,接下来开始做点实在的!