硬件结构框架
PC中最重要的三个部件分别是CPU,内存,I/O控制器;基于C或者汇编语言写底层程序时,需要了解这三部分(对于更高级的程序语言,比如java等是基于一个抽象的虚拟机进行编程的,物理机器的相关细节甚至包括操作系统都通过虚拟机进行了屏蔽).
三个部件的组织形式.
早期的PC,CPU和内存的工作频率基本一致,并且也没有太多的IO设备,所以所有设备通过一条总线挂在一起,如下图:
后来由于CPU频率不断提升,导致内存频率跟不上CPU的频率,所以产生了和内存频率(即CPU的外频)一样的系统总线,同时图形设备也需要和CPU以及内存进行大量的数据交换.另外相对于这些高速设备还有一些低速设备,比如磁盘,USB等设备.如果这些设备和前面一样直接连接在一条总线上,硬件设计就会很复杂,所以对总线进行了分级设计,就是南北桥设计.南桥用于高速设备,基于PCI结构,北桥用于低速设备,基于ISA结构.如下图:
操作系统
操作系统的作用:
- 管理硬件资源,最大限度的有效利用硬件资源,通过提供进程等机制;
- 为应用程序提供统一的应用程序接口,即API(Application Programming Interface);
- 屏蔽硬件的差异性;
很多复杂性的工程问题,都可以通过分层的思想来降低复杂度。操作系统也是类似。操作系统和应用软件以及硬件的关系如下图:
发展过程:
- 多道程序,监控硬件资源一旦闲置就启用新的等待程序,缺点是调度策略粗糙;
- 早期的分时系统,程序执行过程中主动让出硬件资源一段时间,供其他程序运行,但这个让出是应用程序主动让出,而不是被动。这是的操作系统只负责让出后,加载新的程序;
- 多任务系统,有了进程和优先级的概念,抢占执行,目前的操作系统都是基于多任务的,比如:Linux,windows NT等。
CPU的大小端模式
大小端模式是CPU的硬件属性,Inter是小端模式,一般嵌入式是大段模式。大段模式和小段模式的CPU,存放数据方式如下:
对于32bit数据0x12345678,的实际存放如上图,16bit数据类似,但是8bit数据没有区别。也就是说:
小端模式,低地址存放低有效位,更符合逻辑;
大段模式,低地址存放高有效位,查看内存更为方便,因为内存低地址在前面。
函数调用过程
IA32中用程序栈来支持函数(过程)调用,栈主要特性是“后进先出”的一个单向队列,只能对栈顶进行操作,数据压入栈顶,弹出栈顶的数据。并且在IA32中,栈顶是低地址,栈底是高地址,esp寄存器永远指向栈顶。如下为一个栈的原始结构:用pushl %eax,将%eax寄存器中的内容压入栈中(注意pushl是32bit压栈),执行效果如下:
对于上面的单个压栈指令pushl %eax,实际上等同于,下面两条指令:
subl $4,%esp ;栈顶指针%esp = %esp-4
movl %eax,(%esp) ;数据移动
popl出栈指令,与压栈指令的过程刚好相反。