操做系统基本知识(一)

计算机系统体系结构:

  1. 单处理器的计算机系统,它只有一个general purpose 的处理器,它有一个CPU来执行通用的指令集,    另外,里面也包括一些专用的控制器(处理器),好比控制硬盘、网卡、键盘的等,这些控制器一般由操做系统管理; 
  2. 多处理器的计算机系统,能够分为非对称型(asymmetric multiprocessing )与对称型(symmetric multiprocessing, SMP);  在非对称型的多处理器系统中,由其中一个处理器控制与监督其它的处理器工做; 在对称型的多处理器系统中,全部的处理器都是平等的。 对于多处理器计算机系统,一般每个处理器都有本身的寄存器与缓存,因此的处理器都共享物理内存的; 
    另外,现代的CPU设计,一般在一个chip上设计多个计算单元,常称为多核处理器, 从2006年之后, 如今Intel 与AMD的CPU都本都是多核处理器了。
  3. 集群计算机系统

 

操做系统的相关操做:

  1. 经过双模或多模(dual-mode or multimode) 操做 来肯定 能够区分系统(内核或特权)指令仍是用户指令, 实现的方法是经过硬件增长一个mode 位来识别; 把一些危险的或特征重要的指令设为特权指令,这样用户就没法执行,肯定操做系统的性;
  2. 使用一个timer 进行周期性的中断,来确保了操做系统能够一直掌控着CPU的控制权.  好比,万一个用户进入无限循环时,  经过这么一个中断能够把CPU的控制权交给操做系统;

 

操做系统结构:

  1. 什么是系统调用(system calls)?
    由于在用户状态是没有办法执行内核指令,怎么办??那就经过系统调用来完成吧。它是由操做系统内核提供的一些服务,包括:进程管理、文件操做、内存管理、通讯等;
  2. 什么是API(application programming interface)?
    它是应用程序接口, 对于应用程序编程人员是可见的。  它实际上是对 系统调用的封装,一个API能够对应一个系统调用,也能够包括多个system calls.  当编程人员使用须要使用内核功能时, 不须要直接调用系统调用,而是经过API来完成,API再去调用相应的systm calls。  为何这么作??1. 为了程序的可移植性,API经常能够作到统一,而system call 的实现能够不不同;2. 使用API比直接使用 system call 要简单的多。
    经常使用的三种API: windows系统的windows API; POSIX based 的系统(unix, linux, MAc OSX)的 POSIX API; JAVA虚拟机的 Java API;
  3. 什么是 system call interface?
    它就是系统调用接口, 它能够截获API中使用的系统函数调用, 而后system call interface 再调用实际的 内核函数完成任务;  system call interface 起到 在API与实际的核函数之间的link 做用;
  4. 操做系统的结构组成?
    1)简单的 monolithic 操做系统;整个内核里包括不少东西;性能高,可是维护、调试难。
    2) 分层的结构,实现简单;
    3)microkernel结构,把一些必要的功能加入内核,其它的都放入到用户态里去;
    4)模块化的结构: 一些必要的功能在内核,加入一些能够加载的其它模块(在内核态);
    5) hybrid system :杂交以上的;

 

操做系统的启动:  (讲启动过程 ,重点说了一下在加载硬盘上的 bootloader程序以前,电脑都干了哪些事, 具体到 bootloader程序, 不一样的操做系统不同吧)

了解一些背景知识:html

1. CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中  CS  为代码段寄存器,而   IP  为指令指针寄存器 。linux

2. 1979年,Intel 推出了8088 CPU, 8088内部数据总线都是16位,外部数据总线是8位,能够寻址 1024 KB 的内存; 1981年8088芯片首次用于IBM PC机中,开创了全新的微机时代, 它运行的操做系统也是第一代的DOS系统。也正是从8088开始,PC机(我的电脑)的概念开始在全世界范围内发展起来。编程

3. PC机的设计师将8088CPU 能够寻址的 1M 中的低端640KB用做RAM,供DOS及应用程序使用, 这就是640K的基本内存; 高端的384KB常称做上位内存, 则保留给ROM、视频适配卡等系统使用。今后,这个界限便被肯定了下来而且沿用至今。这384K中的的低128KB是显示缓冲区,高64KB是系统BIOS(基本输入/输出系统)空间,中间192KB空间用于其它留用,以下图所示。在微软的操做系统没有完全脱离DOS的时候,即便你的电脑装有几兆或几十兆内存,但若是你使用以DOS为核心的操做系统,那么你也只有640K的内存能够直接使用,1M以上的内存要经过一些内存管理工具才能使用。从Windows 95开始,才不存在常规内存的限制了,全部的内存,不论是8M仍是128M,均可以被直接使用。windows

image_thumb[5]

 

操做系统的启动过程: 

1. 当在咱们刚刚接通电源的时候,整个系统由BIOS控制,电压还不太稳定,主板芯片组会向CPU发出reset的命令让CPU开始初始化,同时主板芯片组等待电源发出POWE GOOD命令,一旦电源发出POWER GOOD命令,主板芯片组就会撤出 reset 的命令, 此时,这时候,CS:IP 两个寄存器指向FFFF0H地址, CPU从 FFFF0H 地址开始执行寻址指令(这个地址是在BIOS内而再也不内存里面),在这个地址中不管是AMI BIOS仍是Award BIOS,在这个地址中都会存储一条跳转命令,直接跳转到系统BIOS中真正的启动代码处(这个代码必定在 F0000H至 FFFFFH之间的某个地方),BIOS的代码都是在BIOS芯片ROM中的,那个跳转命令也是在ROM中的。  缓存

补充:为何是 FFFF0H的位置加入跳转指令呢?app

BIOS ROM芯片里面的程序是在计算机出厂的时候直接烧录在里面的,完成一些主机自检等操做,并提 供一些访问磁盘等基本输入输出服务,因为不一样的计算机厂商生产的计算机所带的外设不同,所以,这段程序大小也限机型的不一样而不同, 因此,不能把这个段代码的地址设置为从 00000H开始, 为了解决这个问题,8086规 定,CPU均从0xFFFF0处开始执行,而在0xFFFF0处,放一条无条件转移指令JMP,跳转到BIOS的代码处(这个都是厂商本身规定);模块化

 

2. 运行BISO的代码,干什么事呢?POST自检!
主要的工做就是执行主机自检(POST),当BIOS检查到硬件正常后,按照 CMOS 中对启动设备的设置顺序检测可用的启动设备。BIOS将相应启动设备的第一个扇区(也就是MBR扇区)读入内存地址为0000:7C00H 处,并检查MBR的结束标志位是否等于55AAH(活动盘的标志),若不等于则转去尝试其余启动设备,若是没有启动设备知足要求则显示"NO ROM BASIC"而后死机。函数

补充:为何是07C00H处呢?(http://blog.csdn.net/bkxiaoc/article/details/50380835工具

“0x7C00” 第一次出现是在 “IBM PC 5150” 的 BIOS 的 19号中断例程中。

IBM PC 5150 是现代 x86 PC 的鼻祖,为了保证向下兼容的原则,”0x7C00”得以保留。 19号中断例程 就是 “POST”(Power On Self Test) ,上电自检(包括检查是否存在驱动器),以后将启动盘的第一分区的第一扇区的 512b 数据拷贝到 0x7c00处。  0x7c00”是由 IBM PC 5150 BIOS开发团队决定(David Bradley博士)。 性能

“0x7C00 = 32KiB - 1024B” 有什么特殊含义? 是为了解决系统和 CPU 内存分布的需求!!

BIOS 决定这个地址的理由以下:
  1. 32kb是符合(DOS)系统加载的最小空间
  2. 8086/8088 0x0 - 0x3ff用于BIOS的中断向量和BIOS数据区域。
  3. 引导扇区是512字节,boot 程序须要的数据/堆栈 大于 512 字节。
  4. 所以,0x7c00, 32KB 的最后 1024B 被选中了。

系统加电启动后,能够自由使用 0x7c00起始的, 32KB 的最后 1024B空间。

 

3. 这时候就须要磁盘第一扇区上的MBR代码了,linux与windows的代码不必定同样, 以linux 为例,说明:

具体参考:http://www.javashuo.com/article/p-aignldhh-kh.html, 写的很明白;

 

 

 

 

相关文章
相关标签/搜索