1.程序为什么要被编译器编译了之后才可以运行?

2.编译器在把c语言程序转换成可以执行得机器码得过程中作了什么,怎么做的?

3.最后编译出来的可执行文件里面匙什么?除了机器码还有什么?他们怎么存放的,怎么组织的?

4.#include<stdio.h>是什么意思?把stdio.h包含近来意味着什么?c语言库又是什么?他怎么实现的?

5.不同的编译器(Microsoft VC,GCC)和不同的硬件平台(x86,SPARC,MIPS,ARM),以及不同的操作系统

(Windows,Linux,UNIX,Solaris),最终变异出来的结果一样么?为什么?

6.Hello World程序是怎么运行起来的?操作系统是怎么装载它的?他冲哪里开始执行,到哪儿结束?

main函数之前发生了什么?main函数结束以后又发生了什么?

7.如果没有操作系统,Hello World可以运行么?如果要在一台没有操作系统的机器上运行Hello World 需要什么?

应该怎么实现?

8.printf是怎么实现的?他为什么可以有补丁数量的参数?为什么它能够在终端上输出字符串?

9.Hello World 程序在运行时,它在内存中是什么样子的?


======================================================================

计算机范围:兼容x86指令集的32位CPU的个人计算机

三个关键部件:中央处理器CPU、内存、I/O控制芯片

======================================================================

CPU采用倍频的方式与系统总线进行通信

北桥芯片:处理高速设备

南桥芯片:处理低速设备-->磁盘、USB、键盘、鼠标

20世纪90年代-->系统总线:PCI结构

              低速设备:ISA总线

之后发明了AGP、PCI Express的诸多总线结构和相应控制芯片

======================================================================

增加CPU的数量,提升计算频率

方式:

     1.对称多处理器(SMP,Symmetrical Muti-Processing):每个CPU在系统中所处的地位和所发挥的功能都一样,是相互对称的。

       在大型数据库、网络服务器上、他们要处理大量的请求、而这些请求之间往往是相互独立的,所以多处理器就可以最大想能的发挥威力。

     2.多核处理器(Multi-core Processor): 多个处理器“合并在一起打包出售”,这些“被打包”的处理器之间共享比较昂贵的缓存部件,

       只保留多个核心,并且以一个处理器的外包装进行出售。

多核和SMP在缓存共享等方面有细微的差别,是的程序在优化上可以有针对性地处理。

======================================================================

系统软件:传统意义上将用于管理计算机本身的软件称为系统软件,以区别普通的应用程序。

平台性的系统软件:操作系统内核,驱动程序,运行库和系统工具

程序开发的系统软件:编译器,会变起,链接器等开发工具和开发库

======================================================================

计算机系统软件体系结构采用一种层的结构

“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”

“Any problem in computer science can be solved by another layer of indirection”

整个体系结构从上到下都是按照严格的层次结构设计的,体系里面的每个组件比如操作系统本身,很多应用程序,软件系统甚至很多硬件结构都是

按照这种层次的结构组织和设计的


每个层次之间都需要相互通信,既然需要通信就必须有一个通信的协议--->接口

接口的下面那层是接口的提供者,由它定义接口

     上面那层是接口的使用者,他使用接口来实现所需要的功能

理论上层次之间只要遵循这个接口,任何一个层都可以被修改或被替换。


除了硬件和应用程序,其他都是所谓的中间层,每个中间层都是对他下面的那层的包装和扩展。

中间层使得应用程序和硬件之间保持相对的独立


虚拟机技术:在硬件和操作系统之间增加了一个虚拟层,使得一个计算机上可以同时运行多个操作系统


曾系统:在尽可能少改变甚至不改变其他层的情况下,新增加一个层次就可以提供前所未有的功能。

======================================================================

软件体系最上层-->应用应用程序:网络浏览器,Email客户端,多媒体播放器,图片浏览器


开发工具与应用程序是属于同一层次,因为他们都使用一个接口-->操作系统应用程序编程接口


应用程序接口的提供者是运行库:Linux下的Glibc库提供POSIX的API;

                             Windows的运行库提供Windows API(win 32)


运行库使用操作系统提供的系统调用接口(System call interface),系统调用接口实现中以软件中断(Software interrupt)的方式提供

例如:Linux 使用0x80号中断作为系统调用接口

     Windows 使用0x2E号中断作为系统调用接口


操作系统的内核层对于硬件层来说是硬件接口的使用者,而硬件是接口的定义者,

硬件的接口决定了操作系统的内核具体来讲就是驱动程序如何操作硬件,如何与硬件进行通信

这种接口叫做硬件规格(Hardware Specification),硬件的生产商负责提供硬件规格,操作系统和驱动程序的开发者通过阅读

硬件规格文档所规定的各种硬件编程接口标准来编写操作系统和驱动程序。

======================================================================

操作系统功能:1.提供抽象接口

             2.管理硬件资源

======================================================================

CPU使用:

   1.早期,一个CPU运行一个程序

   2.多道程序(Multiprogramming):编写一个监控程序,某个程序暂时无法使用CPU时,监控程序把另外正在等待CPU资源的程序启动

     缺点:程序之间的调度策略太粗糙

   3.分时系统(Time-Sharing System):每个程序运行一段时间以后,主动让出CPU给其他程序。

   4.多任务系统(Multi-tasking):操作系统接管了所有的硬件资源,并且本身运行在一个受硬件保护的级别。所有的

     应用程序都以进程(Process)的凡是运行在比操作系统权限更低的级别,每个进程都有自己独立的地址空间,使得

     进城之间的地址空间相互隔离

     抢占式(Preemptive):操作系统可以强制剥夺CPU资源并且分配给他认为目前最需要的进程

======================================================================

设备驱动:

   硬件驱动程序:驱动程序可以看作操作系统的一部分,往往跟操作系统内核一起运行在特权级,但又与操作系统

     内核之间有一定的独立性,操作系统开发者为硬件厂商提供了一系列接口和框架,驱动程序的开发工作通常由

     硬件生产厂商完成。

======================================================================

37