《操作系统真象还原》-阅读笔记(中)

第七章

操作系统是由中断驱动的。
中断分为外部中断和内部中断。
外部中断分为可屏蔽中断和不可屏蔽中断,内部中断分为软中断和异常。

外部中断

来自CPU外部的中断。
可屏蔽中断:通过INTR引脚进入CPU,外部设备如硬盘、网卡、打印机等发出的中断
CPU可以不理会,因为不会宕机。
Linux把中断分为上半部和下半部分开处理,把中断立即需要执行的部分划分到上半部,不紧急的部分划分到下半部。上半部是在关中断的情况下执行的。
不可屏蔽中断:通过NMI引脚进入CPU,它表示系统发生了致命的错误。
三种常见原因:1.内存读写错误 2电源掉电 3总线奇偶校验错误

内部中断

软中断:软件主动发起的中断
异常:指令执行期间CPU内部产生的错误引起的。

中断描述符表(IDT)
IDT中有中断描述符,还有任务门描述符和陷阱门描述符。
这些描述符都是门,门是通往另一段程序的入口。门描述符中添加了各种属性,就是进门的条件。
中断处理过程:
CPU外:
CPU内:
1.处理器根据中断向量号定位中断描述符
2.处理器进行特权级检查
3执行中断处理程序
如下图:
 

这里我突然想起个问题,访问内核地址空间不需要经过页表吗?因为内核地址空间一般是连续的。
答案是也需要,不过是内核页表。一旦CPU进入了保护模式,开启分页机制,不管在内核空间,还是用户空间,都是使用虚拟地址进行寻址了。
在32位的系统,内核页表记录内核对高端内存访问而进行的映射关系。因为现代 CPU 的寻址不能绕过 MMU。不过内核空间和用户空间不同,它一般不做 swap,也就没有 page fault,而且它一般不会把连续的虚拟地址空间映射成不连续的物理空间,一般只是做一个 offset。
8259A编程
一个中断控制器
8253编程
一个定时器,打节拍,最重要功能:定时向处理器发时间中断


第八章

makefile编写

实现ASSERT
因为要打印屏幕,所以最好关中断
开中断:原理是执行sti指令把eflags中的IF位置1
关中断:原理是执行cli指令把eflags中的IF位置0
实现字符串操作函数
包括memset、memcpy、strcpy、strlen、strcmp、strcat、strchr(从左到右查找字符串str中首次出现字符ch的地址)、strchrs(查找在字符串str中ch出现的次数)
位图实现

内存管理
每个任务(内核和用户)都要维护自己的虚拟地址池。

声明了一个叫virtual_addr的结构体用来表示虚拟内存池,存储一个位图结构和虚拟地址起始地址。
实现了malloc_page函数,2个参数,一个是pf,用来指明内存池(内核还是用户),一个是pg_cnt,用来指明页数,此函数的功能是在pf指向的内存池中分配pg_cnt个页,成功则返回虚拟地址,失败则返回NULL。
此函数干了三件事:
1.通过vaddr_get在虚拟内存池中申请虚拟地址
2.通过palloc在物理内存池中申请物理页
3.通过page_table_add将上两步得到的虚拟地址和物理地址在页表中完成映射
tips
在ubuntu下用gcc编译链接,出现错误
undefined reference to `__stack_chk_fail’
解决方法:
add -fno-stack-protector to your CFLAGS.

第九章

PCB
每个进程都有自己的PCB,所有PCB放到一张表格中维护,这就是进程表。调度器可以根据这张表选择处理器运行的进程。
这里写图片描述
寄存器映像用来保存进程的现场,用于进程切换。
PCB最顶端为线程在0特权级下所用的栈。
实现线程
两种实现方式
1.用户空间实现,线程表就在用户进程中,用户进程要专门写个线程用作线程调度器。
优点:
调度算法自己实现
线程切换不用陷入内核态装载寄存器映像
缺点:
某个线程出现阻塞,整个进程都会阻塞(操作系统不知道进程中存在线程)
2.内核空间实现,线程表就在内核中,该线程由操作系统一调度,无论线程属于内核还是用户空间。
优点:
内核提供的线程相当于让进程多占用了处理器资源(因为一个进程有多个线程可以放上调度器),提速明显。
进程中某一线程阻塞后,只会阻塞这一个线程,变相提速。
缺点:
会陷入内核态,增加了一些保护现场的操作,但比起提速可以忽略。
本文用第二种实现方法,Linux中严格来说,用户空间是没有Thread这个概念的,Thread的相关实现是gcc等提供的模拟thread, gcc是使用了clone这个系统调用,利用linux的轻量级进程实现了类似thread的库。下面的链接有详细介绍
http://www.360doc.com/content/13/1008/11/13047933_319789998.shtml

线程PCB由双向链表串联
 

任务调度
在 schedule 中要判断当前线程是出于什么原因才“沦落到”要被换下处理器
的地步 。 是线程的时间片到期了?还是线程时间片未到,但它被阻塞了,以至于不得不换下处理器?其实这就是查看线程的状态,如果线程的状态为TASK RUNNING ,这说明时间片到期了,将其 ticks 重新赋值为它的优先级 prio ,将其状态由 TASK_RUNNING 置为 TASK_READY ,并将其加入到就绪队列的末尾。如果状态为其他,这不需要任何操作,因为调度器是从就绪队列中取出下一个线程,而当前运行的钱程并不在就绪队列中。
完整的调度需要三部分的配合:
1.时钟中断函数
2.调度器schedule
3.任务切换函数switch_to

第十章

出现GP错误原因:多个线程访问光标寄存器,一个线程更新完高8位后被换下,另一个线程通知显卡马上要写来的是寄存器高8位,这时被换下,第一个线程继续写低8位,但显卡认为这是高8位。需要实现锁来同步
信号量
一个全局共享变量,变量的加减必须是原子操作,需要关中断来保证

本文的锁是用二元信号量实现的
---------------------  
作者:月黑风高云游诗人  
来源:CSDN  
原文:https://blog.csdn.net/lqygame/article/details/73824702  
版权声明:本文为博主原创文章,转载请附上博文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动手学无人驾驶(2):车辆检测

上一篇博客介绍了无人驾驶中深度学习在交通标志识别中的应用(动手学无人驾驶(1):交通标志识别)。 本文介绍如何使用深度学习进行车辆检测,使用到的模型是YOLO模型,关于YOLO模型的具体检测原理&a…

《操作系统真象还原》-阅读笔记(下)

第十一章 任意进程的页目录表第0~767个页目录项属于用户空间,指向用户页表。第768~1023个页目录项指向内核页表。每创建一个新的用户进程,就将内核页目录项复制到用户进程的页目录表,其次需要把用户页目录表中最后一个页目录项更新为用户进程自己的页目…

Apollo进阶课程㊱丨Apollo ROS深入介绍

原文链接:进阶课程㊱丨Apollo ROS深入介绍 ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架。ROS本身是基于消息机制的,可以根据功能把软件拆分成为各个模块,每…

一步步编写操作系统 31 cpu的分支预测 下

让我们说说预测的算法吧。 对于无条件跳转,没啥可犹豫的,直接跳过去就是了。所谓的预测是针对有条件跳转来说的,因为不知道条件成不成立。最简单的统计是根据上一次跳转的结果来预测本次,如果上一次跳转啦,这一次也预…

Apollo进阶课程㊲丨Apollo自动驾驶架构介绍

原文链接:进阶课程㊲丨Apollo自动驾驶架构介绍 自动驾驶硬件架构:一般采用激光雷达作为主要感知传感器,同时结合摄像头、GPS/IMU、毫米波雷达、超声波雷达等,以NVIDIA Drive PX2 或 Xavier作为主要计算平台,在工业PC机…

Apollo进阶课程㊳丨Apollo平台的快速入门

原文链接:进阶课程㊳丨Apollo平台的快速入门 Apollo是向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课…

一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存

咱们先介绍0xE820子功能,这是最灵活的内存获取方式。 bios中断 0x15的子功能0xE820能够获取系统的内存布局,由于系统内存各部分的类型属性不同,bios就按照类型属性来划分这片系统内存,所以这种查询则呈迭代式,每次bio…

16.深度学习练习:Building your Recurrent Neural Network - Step by Step

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。课程链接:https://www.deeplearning.ai/deep-learning-specialization/Building your Recurrent Neural Network - Step by Step1 - Forward propagation for the basic Recurrent Neur…

【2019icpc徐州站】Random Access Iterator(概率dp,有坑,tricks)

题干: Recently Kumiko learns to use containers in C standard template library. She likes to use the std::vector very much. It is very convenient for her to do operations like an ordinary array. However, she is concerned about the random-access…

一步步编写操作系统 34 内核利用bios中断获取物理内存大小

接上文,另一个获取内存容量的方法是bios 0x15中断的子功能0xE801。 此方法虽然简单,但功能也不强大,最大只能识别4G内存,不过这对咱们32位地址总线足够了。稍微有点不便的是,此方法检测到的内存是分别存放到两组寄存器…

17.深度学习练习:Character level language model - Dinosaurus land

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 文章目录1 - Problem Statement1.1 - Dataset and Preprocessing1.2 - Overview of the model2 - Building blo…

Apollo进阶课程㊴丨Apollo安装过程概述

原文链接:进阶课程㊴丨Apollo安装过程概述 Apollo是一个自动驾驶的平台,推荐的参考运行环境为:ThinkPAD X240、CPU:i5 、四核 、内存 8G、 硬盘容量40G以上。 上周阿波君为大家详细介绍了「进阶课程㊳丨Apollo平台的快速入门」。 …

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

继承、实现、依赖、关联、聚合、组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继…

CS231n(1):图片分类笔记与KNN编程作业

声明:本博客笔记部分为CS231n官网笔记,这里对其进行引用,在此表示感谢。 课程官网地址为:http://vision.stanford.edu/teaching/cs231n/syllabus.html 本次课程对应B站教学视频为: https://www.bilibili.com/video/av5…

【HDU - 6557】Justice(思维,模拟,套路,SETset)

题干: On the table there are n weights. On the body of the i-th weight carved a positive integer kiki , indicating that its weight is 12ki12ki gram. Is it possible to divide the n weights into two groups and make sure that the sum of the weight…

Apollo进阶课程㊵丨Azure仿真平台使用

原文链接:进阶课程㊵丨Azure仿真平台使用 Azure是一种灵活和支持互操作的平台,它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用。它开放式的架构给开发者提供了Web应用、互联设备的应用、个人电脑、服务器、或者提供最优在线复杂解决…

java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式…

动手学无人驾驶(3):基于激光雷达3D多目标追踪

上一篇博客介绍了无人驾驶中的车辆检测算法(YOLO模型),该检测是基于图像进行的2D目标检测。在无人驾驶环境感知传感器中还有另一种重要的传感器:激光雷达。今天就介绍一篇无人驾驶中基于激光雷达目标检测的3D多目标追踪论文&#…

换种方法学操作系统,轻松入门Linux内核

计算机已成为现代人日常工作、学习和生活中必不可少的工具。操作系统是计算机之魂,作为用户使用计算机的接口,它负责调度执行各个用户程序,使计算机完成特定的任务;作为计算机硬件资源的管理者,它负责协调计算机中各类…

Apollo进阶课程㊶丨Apollo实战——本机演示实战

原文链接:进阶课程㊶丨Apollo实战——本机演示实战 Apollo是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课程㊵丨A…