标签:inux 64位 变量 全局 指令 include 芯片 抽取 free
HelloWord程序C语言代码
#include<stdio.h>
void main(){
printf("HelloWord\n");
}
要了解一个helleword程序的运行,首先要知道一个计算系系统的基本组成部分:
1.中央处理单元CPU
包括程序计数器(PC).寄存器文件,算术/逻辑运算器(ALU)高速缓存
程序计数器是一个字长的存储设备(也叫寄存器),程序计数器永远指向主存中某个的机械语言指令(也就是含有有该指令的地址)。
寄存器文件是有一些很小的由一个字长组成寄存器组成。每个寄存器都有唯一的名字。
算术/逻辑运算器主要计算新的数据和地址。
从计算机通电开始CPU就在不停的执行PC中的指令并更新PC,使其指向下一个地址。处理器看上去是由一个非常简单是指令模型来操作的,这个模型由指令集决定。处理器的操作是围绕PC,寄存器文件,主存,ALU来进行的。
加载:将一个字节或者一个字从主存中复制到寄存器中,覆盖寄存器中的内容。
存储:将寄存器中的一个字节或字复制到主存的某个位置中,覆盖主存中原来的内容。
操作:将两个寄存器中的值复制到ALU中。ALU对着两个值进行运算在将得到的结果复制到一个寄存器中,覆盖原来的内容。
转跳:从指令中抽取一个字,复制到PC中,覆盖PC中的值。
2.总线
总线是连接计算机所有部位的通道,传送一个固定长度的字节块,这样的一个字节块的大小叫做字长,我现在用的操作系统就是8个字节组成的64位操作系统。
3.I/O设备
I/O设备通过控制器(主板芯片)和适配器与字长相连。如硬盘。
4.主存
主存物理上是由许躲动态随机存储器(DRAM)芯片组成,逻辑上是一个线性数组字节,每个字节有唯一的地址(数组索引)。
一个HelloWord程序的运行首先需要通过编译器进行编译,编译分为4个阶段:
1.预处理阶段,预处理器根据以#开头的命令修改HelloWord程序。将<stdio.h>加入到HelloWord程序中。一般文件用.i结尾。HelloWord.i
2.编译阶段,将修改过的程序变为汇编语言。文件以.o结尾。HelloWord.o
3.汇编阶段,将汇编语言转化为二进制,文件以.s结尾,HelloWord.s
4.连接阶段,连接C语言自己自带的函数,如HelloWord程序中的printf函数,printf存在于一个单独编译好的目标文件中。连接之后HelloWord程序将变成一个二进制文件,也是可执行文件。
HelloWord程序运行时,外壳程序将其读入到寄存器中,再把它存放在存储器中。处理器开始执行HelloWord程序中的main指令。指令将“HelloWord”字符串从主存复制到寄存器。然后显示到显示器上。
进程
进程是对一个正在运行的程序的抽象。是对CPU,虚拟存储器,文件的抽象。一个系统可以运行多个进程,他们之间的切换时通过上下文来进行的。
线程
进程并非只有一个单一的控制流,它是通过多种叫做线程的执行单元来实现的。
虚拟出存储器
它为进程提供了一个假象,即每个进程单独占用主存。每个进程看到的都会一致的存储器,称为虚拟存储空间。Linux的虚拟存储空间包括如下
程序代码和数据区:对于所有进程来说,代码是从一个固定地方开始的,紧接着是和C全局变量相对应的数据位置。代码和数据区是按可执行文件初始化的。
堆:代码和数据区后面跟着运行时堆,代码和数据区一开始就被规定的大小。而堆不同,比如当调用malloc和free这样的C标准函数时,堆可以动态的扩大和缩小。
共享库:大约在数据的中心位置。存放像C语言中的标准库和数学库这样共享库的数据和代码。共享库概念强大难懂。
栈:实现函数调用,调用时扩大,函数返回时收缩。
内核虚拟存储器:内核总是驻留在内存中,是操作系统的一部分,是为内核保留的,不允许应用程序读写和调用代码定义的函数。
文件就是字节序列。
线程可以并发进行,多线程(超线程)处理器。
指令集并行。指令放在流水线上执行。
单指令、多数据并行。
标签:inux 64位 变量 全局 指令 include 芯片 抽取 free
原文地址:http://www.cnblogs.com/oh-my-gad/p/7636468.html