文章目录
这是我听过讲解最清楚的操作系统课程了,之前断断续续也听过一些课程,对于系统调用,多进程的理解停留在表面,知道有那么个知识点。在准备面试相关的知识点的时候,也是硬背,李老师用生活举例类比操作系统中的概念,通过李老师的讲解有种豁然开朗的感觉。
一、什么是操作系统
操作系统连接计算机的应用软件和计算机硬件。它是管理和控制计算机硬件资源,并为用户和应用程序提供服务的软件系统。操作系统充当计算机系统和用户之间的接口,负责协调和管理系统中的各种软件和硬件资源。
二、出现启动页面之前进行了哪些操作
上图是计算机启动页面,这神秘的黑色背后到底发生了什么?
答:将磁盘上的OS载入到内存。
上图体现了冯·诺依曼存储程序思想,把程序放在存储器里,用一个PC指针指向程序,取值执行(自动)。计算机是取值执行的,计算机上电后,执行的第一句指令是什么呢?
操作系统也是程序,存储在磁盘上。从BIOS磁盘上(0磁道,0扇区)读取bootsect.s代码放到0x7c0处,bootsect首先读取setup,在屏幕上打出一个logo,然后调用13号中断,读取system部分,进行内存函数硬件管理等初始化操作。
1、读取引导扇区的代码
- 实模式寻址CS:IP,CS左移4位+IP。CS: 段寄存器,IP:偏移地址
- ROM BIOS是计算机中刚上电后有代码的区域。
- 0磁道0扇区是引导扇区,引导扇区是启动设备的第一个扇区,存放着开机后执行的第一段我们可以控制的程序(bootsect.s)。0x7c00处存放的代码就是从磁盘引导扇区读入的512个字节
bootsect.s 被移动的过程:0xFFFF0 -> 0x7c0->0x9000
2、bootsect.s将setup模块载入内存
setup将完成OS启动前的设置
- 扩展内存
- 把system模块移动到0地址处
- 使硬件进入保护模式(实模式和保护模式寻址方式不同,实模式的16位寻址已经不能满足计算机的需求了,要切换为保护模式的32位寻址方式)
- 初始化GDT表(GDT表包含了一系列的描述符,每个描述符对应一个内存段,描述了该段的基地址、段限长、访问权限等信息)
- 跳转到0地址的system模块
3、system模块进行一系列初始化操作
- head.s:system第一个模块,再次初始化IDT和GDT表
- main.c: 内存、中断、设备、时钟、CPU等内容的初始化
- mem_init():将内存分页,记录内存的使用情况(使用未使用)
到这儿,计算机已经完成启动过程,OS已经被载入内存,并进行一些列初始化操作。
三、上层应用如何穿过OS到达硬件层——系统调用
从键盘输入一个hello,如何显示在键盘上,有以下方式
- 命令行
cst:/home/rong# ./output "hello"
ECHO:hello
为什么键入./output "hello"回车就能出现ECHO:hello呢?命令输入后发生了什么?
操作系统进行一系列初始化操作后,会执行/bin/sh(也是一段程序)启动shell程序,shell程序的核心代码如上图3所示,从代码中看出它的作用是不断等着用户敲入命令,然后运行命令。
通过这两个函数if(!fork()){exec(cmd);} 申请CPU,并让CPU执行output.c代码,并通过printf(“ECHO:%s\n”,argv[1]);最终将键入的字符打印在屏幕上。命令行就是一在程序中加入一些重要的函数来对计算机硬件来进行一些重要的使用。
- 图形化界面
一个循环从内核里调用函数,内核队列里的消息依次被取出,根据消息的内容(鼠标点击,键盘按下等)调用对应的函数。消息程序框架+消息处理程序
上面两种方式用户都是通过程序(应用软件)使用计算机。操作系统接口通过C语言程序连接操作系统和应用软件。C语言程序是由普通C代码加上一些重要的函数组成。操作系统提供重要的函数,这些重要函数名就是操作系统的接口,表现为函数的调用,又由系统提供,所以称为系统调用。