操作系统

2023-03-16  本文已影响0人  霹雳解锋镝

基础

1、计算机粗分四个部分:硬件、操作系统、应用程序和用户
2、操作系统的基本特征包括并发、共享(互斥共享方式、同时访问方式)、虚拟(时分复用技术、空分复用技术)和异步
3、操作系统可以分为五大管理功能部分:
(1)设备管理:主要是负责内核与外围设备的数据交互,实质是对硬件设备的管理,包括对输入输出设备的分配,初始化,维护与回收等。例如管理音频输入输出。
(2)作业管理:这部分功能主要是负责人机交互,图形界面或者系统任务的管理。
(3)文件管理:这部分功能涉及文件的逻辑组织和物理组织,目录结构和管理等。从操作系统的角度来看,文件系统是系统对文件存储器的存储空间进行分配,维护和回收,同时负责文件的索引,共享和权限保护。而从用户的角度来说,文件系统是按照文件目录和文件名来进行存取的。
(4)进程管理:说明一个进程存在的唯一标志是 pcb(进程控制块),负责维护进程的信息和状态。进程管理实质上是系统采取某些进程调度算法来使处理合理的分配给每个任务使用。
(5)存储管理:数据的存储方式和组织结构。
4、I/O操作可以分为四类
(1)直接访问:直接访问由用户进程直接控制主存或CPU和外围设备之间的信息传送。直接程序控制方式又称为忙/等待方式。
(2)中断驱动:为了减少程序直接控制方式下CPU的等待时间以及提高系统的并行程度,系统引入了中断机制。中断机制引入后,外围设备仅当操作正常结束或异常结束时才向CPU发出中断请求。
(3)DMA直接内存访问:为了进一步减少CPU对I/O操作的干预,防止因并行操作设备过多使CPU来不及处理或因速度不匹配而造成的数据丢失现象,引入了DMA控制方式。
(4)通道控制方式:通道,独立于CPU的专门负责输入输出控制的处理机,它控制设备与内存直接进行数据交换。有自己的通道指令,这些指令由CPU启动,并在操作结束时向CPU发出中断信号。
5、操作系统结构
(1)单体系统:在大多数系统中,整个系统在内核态以单一程序的方式运行。整个操作系统是以程序集合来编写的,链接在一块形成一个大的二进制可执行程序,这种系统称为单体系统。
(2)分层系统:分层系统使用层来分隔不同的功能单元。每一层只与该层的上层和下层通信。每一层都使用下面的层来执行其功能。层之间的通信通过预定义的固定接口通信。
(3)微内核:只有一个模块—微内核—运行在内核态,其余模块可以作为普通用户进程运行。每个设备驱动和文件系统分别作为普通用户进程,这些模块中的错误虽然会使这些模块崩溃,但是不会使整个系统死机。
(4)客户-服务器模式:服务器,每个服务器用来提供服务;客户端,使用这些服务。这个模式就是所谓的客户-服务器模式。
6、用户态和内核态
(1)内核态:处于内核态的CPU可以访问任意的数据,包括外围设备,处于内核态的CPU可以从一个程序切换到另外一个程序,并且占用CPU不会发生抢占情况,一般处于特权级0的状态我们称之为内核态。
(2)用户态:处于用户态的CPU只能受限的访问内存,并且不允许访问外围设备,用户态下的CPU不允许独占,也就是说CPU能够被其他程序获取。
 用户态->内核态的转换我们都称之为trap进内核,也被称之为陷阱指令(trap instruction)。流程如下:
(1)用户程序会调用glibc库,glibc是一个标准库,同时也是一套核心库,库中定义了很多关键API。
(2)glibc库知道针对不同体系结构调用系统调用的正确方法,它会根据体系结构应用程序的二进制接口设置用户进程传递的参数,来准备系统调用。
(3)glibc库调用软件中断指令(SWI),这个指令通过更新CPSR寄存器将模式改为超级用户模式,然后跳转到地址0x08处。
(4)整个过程仍处于用户态下,在执行SWI指令后,允许进程执行内核代码,MMU现在允许内核虚拟内存访问
(5)从地址0x08开始,进程执行加载并跳转到中断处理程序,这个程序就是ARM中的vector_swi()
(6)在vector_swi()处,从SWI指令中提取系统调用号SCNO,然后使用SCNO作为系统调用表sys_call_table的索引,调转到系统调用函数。
(7)执行系统调用完成后,将还原用户模式寄存器,然后再以用户模式执行
7、Linux 操作系统的启动过程
(1)计算机电源通电后, BIOS 会进行 开机自检(Power-On-Self-Test, POST) ,对硬件进行检测和初始化。因为操作系统的启动会使用到磁盘、屏幕、键盘、鼠标等设备。
(2)导入MBR(Master Boot Record) 主引导记录(磁盘中的第一个分区)到一个固定的内存区域并执行
(3)程序从磁盘中调入boot独立程序,boot程序将自身复制到高位地址的内存从而为操作系统释放低位地址的内存。
(4)复制完成后,boot程序读取启动设备的根目录。boot程序要理解文件系统和目录格式。然后 boot程序被调入内核,把控制权移交给内核。直到这里,boot完成了它的工作。系统内核开始运行。
(5)内核启动代码是使用汇编语言完成的,主要包括创建内核堆栈、识别CPU类型、计算内存、禁用中断、启动内存管理单元等,然后调用C语言的main函数执行操作系统部分。
(6)首先会分配一个消息缓冲区来存放调试出现的问题,调试信息会写入缓冲区。如果调试出现错误,这些信息可以通过诊断程序调出来。
(7)然后操作系统会进行自动配置,检测设备,加载配置文件,被检测设备如果做出响应,就会被添加到已链接的设备表中,如果没有相应,就归为未连接直接忽略。
(8)配置完所有硬件后,接下来要做的就是仔细手工处理进程0,设置其堆栈,然后运行它,执行初始化、配置时钟、挂载文件系统。创建init进程(进程1)和守护进程(进程2) 。
(9)init进程会检测它的标志以确定它是否为单用户还是多用户服务。在前一种情况中,它会调用fork函数创建一个shell进程,并且等待这个进程结束。后一种情况调用fork函数创建一个运行系统初始化的shell脚本(即/etc/rc)的进程,这个进程可以进行文件系统一致性检测、挂载文件系统、开启守护进程等。
(10)然后/etc/rc这个进程会从/etc/ttys中读取数据,/etc/ttys列出了所有的终端和属性。对于每一个启用的终端,这个进程调用fork 函数创建一个自身的副本,进行内部处理并运行一个名为getty的程序。
(11)等待用户输入用户名,在输入用户名后,getty程序结束,登陆程序/bin/login开始运行。login程序需要输入密码,并与保存在/etc/passwd中的密码进行对比,如果输入正确,login程序以用户shell程序替换自身,等待第一个命令。如果不正确,login程序要求输入另一个用户名。
启动流程.png
上一篇下一篇

猜你喜欢

热点阅读