欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

操作系统(HIT *军先生) ----- 学习笔记

最编程 2024-05-12 21:37:22
...

操作系统哈工大

启动

图灵机一条带(取指执行) ==>> 冯诺依曼包装起来,一整个程序通过PC交由CPU计算。加载到内存才能取指执行

打开电源执行的第一条指令 PC = ???内存中有什么 ???

X86的PC ==>> CS << 4 + IP

PC由硬件决定

开机后取指执行,检查硬件情况,把磁盘0磁道0扇区(引导扇区)读入0x7c00处,设置PC,执行bootsect.s汇编代码(把引导扇区的代码移动,让出位置),代码继续执行,通过中断(int 0x13)载入setup模块, setup模块记录硬件信息,通过中断向屏幕打印字符。控制权交由setup模块,bootsect.s退出舞台。

setup初始化,获取内存大小(管理内存得先获取内存大小才能用数据结构管理),获取硬件参数信息,并把操作系统移动到0的位置,之前让出的位置就是以免这里的移动覆盖了setup,因为setup还没工作完。最后一个关键是进入保护模式改变寻址方式扩大寻址范围。之前都是16位寻址,15位最大寻址为1M所以得扩大。

跳转到head.s操作系统模块的第一个汇编,初始化GDT和IDT表项,跳转到main.c(第一个c程序)启动后初始化各项管理硬件的数据结构,一直在跑。操作系统代码放在了内存的零地址,应用程序在上端,通过系统调用的中断进入操作系统。

bootsect.s

中断读入setup模块(4个扇区)再读入操作系统模块

setup模块

加载和打印字符logo

初始化完成后,进入保护模式

间接寻址,查找中间表

head.s

初始化gdt和idt表

启动中用到了3种汇编

main.c

清空内存非系统使用的地方变为零

进入操作系统

通过系统调用中的中断代码进入到内核

操作系统在后台跑着,并开启shell等待用户的输入执行进程

消息队列 + 消息处理程序

统一系统调用接口标准,可以实现夸平台

为了安全需要区分用户态和内核态

通过硬件设计,目标端寄存器和源寄存器,进入的时候区分内核端还是用户段

中断把目的寄存器权限位改成3,进入到系统后把源寄存器权限位改成0

中断是进入系统的唯一方式,系统调用通过宏展开包涵里面的int0x80 (进入到操作系统)

进入中断的关键代码(在call表,找到对应的系统调用)

历史

简单的取指执行cpu利用率会大大降低,遇到IO操作需要等很久

出现了多道程序,交替执行提高利用率

多进程的视图

系统管理多个进程向前推荐,操作系统的重要部分

进程运行

进程切换

进程的状态队列,(就绪、等待、执行),切换的策略

出现的问题

内存地址相同时有问题

出现了对内存的管理MMU,虚拟内存映射,每个PCB有一个映射表

进程的合作会出现竞争(生产者,消费者模型)

当还没执行完就切换的时候导致两个进程读取的数据不一致,需要加锁

引入用户级线程

进程切换需要保存上下文,消耗时间久。拆成多个指令序列。线程比进程的切换少切了内存的映射表。

例如一个服务器可以拆开多个指令做不同任务,并且他们共享同一资源

通过yield切换让出cpu,切换也得保存上下文,所以得需要栈保存切出去的时候的返回地址。

如果这个栈共用的话,切回来的时候就找不到对应线程的返回地址,所以抽出一个和进程一样的数据结构(PCB, TCB)

create的时候创建数据结构,把数据结构初始化,切出去的时候保存上下文

引入内核级线程

进程的切换是在内核中的(因为要分配资源,访问内存文件等),进程的切换就是内核级线程切换加上一些资源表的切换,不像用户级线程一样可以随意切换。

用户级线程,不用管操作系统,是内核级的一个子部分(因为了解了指令序列怎么切换)

用户级线程,操作系统感知不到,当其中一个线程需要IO时,操作系统因为时间问题会切换另一个进程,那么刚刚那个进程里面的多个线程就没作用了

![](https://img2020.cnblogs.com/blog/1740453/202201/174045

3-20220104160457490-1285647731.png)

因为内核级线程,多核才有了意义。

TCB切换内核和用户态都要切