操作系统学习(1)-概述

简介

操作系统对硬件进行管理和抽象,提供易用的接口同硬件一起为应用程序提供服务,从而使得上层应用程序无需关注硬件的具体操作方法

  1. 操作系统将不同功能的硬件设备进行统一管理,将I/O设备抽象为文件,将物理内存抽象为连续的虚拟内存,可以使应用程序通过简单而统一的接口操作底层复杂的硬件,同时保护硬件不被失控或恶意应用滥用
  2. 操作系统为应用提供不同功能的接口,应用通过接口实现对底层复杂设备的操作,使得应用程序只关注于应用的实现,而无需关注具体的硬件型号等。同时也管理应用的加载、启动、切换、调度和销毁,访问控制、应用之间的交互等

操作系统定义

现代操作系统分为操作系统内核与操作系统框架

  • 内核对硬件资源进行管理与抽象,为操作系统框架提供基础的些系统服务
  • 操作系统框架为应用提供多种编程接口与运行环境

硬件

上面提到硬件与操作系统协同一起为应用程序提供服务,所以简单了解相关硬件结构也是必要的

总线(Bus)

总线就像血管一样贯穿整个计算机硬件系统,连接着处理器、主存、I/O设备等硬件部件,传送定长的字节块(32位机器是4个字节,64位机器是8个字节)

I/O(Input and Output)设备

键盘、鼠标、显示器、网卡、磁盘均属于I/O设备。I/O设备通过控制器(设备本身或主板上的芯片组)或适配器(插在主板上的卡)与I/O总线相连,负责从外界获取输入,将结果输出到外界

存储器(memory unit)

存储器包括寄存器、CPU缓存、内存等。在处理器执行程序时,负责存放程序和程序处理的数据,保存程序执行的中间结果和最终结果。从逻辑上来讲,存储器是一个线性字节数组,数组索引为每个字节的地址

中央处理器(Central Processing Unit,CPU)

CPU包括寄存器、程序计数器(PC)、算术/逻辑单元(ALU)。寄存器用来存储一个字节;PC指向存储器中要执行的一条指令,由处理器执行这条指令;ALU负责运算,处理器的常见操作:

  • 加载:从内存复制一个字节到寄存器,覆盖寄存器原来的内容
  • 存储:从寄存器复制一个字节到内存的某个位置,覆盖内存原来的内容
  • 操作:把两个寄存器的内容复制到ALU,ALU对这两个字节做算术运算,并将结果放到一个寄存器中覆盖寄存器原来的内容
  • 跳转:将跳转指令复制到PC中,覆盖原有的值,处理器执行该指令

运行一个Hello World

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
    return 0;
}

这是一个通过编辑器创建并保存的文本文件hello.c,但这个文件并不能运行,需要被编译器转化为机器语言指令并按照可执行目标程序的格式打包好,以二进制文件的形式存储在磁盘上。

执行gcc -o hello hello.c

  1. 预处理:通过预处理器将头文件stdio.h的内容插入到hello.c程序文本中,输出为hello.i
  2. 编译:编译器将hello.i翻译成汇编语言程序,输出位hello.s
  3. 汇编:汇编器将hello.s翻译成机器语言指令,并打包为二进制文件hello.o
  4. 链接:hello程序调用c标准库提供的printf函数存在于预编译好的printf.o文件中,连接器将printf.o合并到hello.o中,得到可执行文件hello,hello才可以被加载到内存中由系统执行

运行hello程序

  1. 在键盘输入”./hello”,shell程序将字符读入寄存器后放到内存中

  1. 敲击回车,shell开始执行指令,加载可执行文件hello,这些指令将hello中的代码和数据(”Hello World!\n”)从磁盘复制到内存

  1. 程序加载完成后,处理器执行hello程序main函数中的机器指令,这些指令将”Hello World!\n”从内存复制到寄存器,再从寄存器复制到显示器

总结

沉寂了一段时间,在处理问题的时候,总是知其然而不知其所以然(可能因为大学时候划水严重吧=、=),感觉需要提升一下内力了,工作之余蜻蜓点水般过了一些操作系统网络和数据结构的知识,回来再对重点内容各个击破,做下笔记与分享,先从操作系统开始吧~

学习自:
《现代操作系统:原理与实现》陈海波,夏虞斌
《深入理解计算机系统》(美)兰德尔·E.布莱恩特(Randal E.Bryant)

Tags: