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

第七章

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

外部中断

来自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…

【HDU - 5922】Minimum’s Revenge(思维,最小生成树变形)

题干: There is a graph of n vertices which are indexed from 1 to n. For any pair of different vertices, the weight of the edge between them is the least common multiple of their indexes. Mr. Frog is wondering about the total weight of the minim…

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

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

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

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

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

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

【HDU - 5493】Queue(思维,贪心,线段树)

题干: NN people numbered from 1 to NN are waiting in a bank for service. They all stand in a queue, but the queue never moves. It is lunch time now, so they decide to go out and have lunch first. When they get back, they don’t remember the exa…

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

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

一步步编写操作系统 32 linux内核获取内存容量的方法

操作系统是计算机硬件的管家,它不仅要知道自己的安装了哪些硬件,还得给出有效得当的管理措施,按照预定的一套管理策略使硬件资源得到合理的运用。但管理策略只是逻辑上的东西,是操作系统自圆其说的一套管理资源的方法,…

【HDU - 5489】Removed Interval(离散化,权值线段树,思维,最长上升子序列)

题干&#xff1a; Given a sequence of numbers Aa1,a2,…,aNAa1,a2,…,aN, a subsequence b1,b2,…,bkb1,b2,…,bk of AA is referred as increasing if b1<b2<…<bkb1<b2<…<bk. LY has just learned how to find the longest increasing subsequence (LI…

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

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

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

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

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

本文节选自吴恩达老师《深度学习专项课程》编程作业&#xff0c;在此表示感谢。课程链接&#xff1a;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)

题干&#xff1a; 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中断获取物理内存大小

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

【HDU - 5777】domino(贪心)

题干&#xff1a; Little White plays a game.There are n pieces of dominoes on the table in a row. He can choose a domino which hasnt fall down for at most k times, let it fall to the left or right. When a domino is toppled, it will knock down the erect dom…

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

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

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

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

【HDU - 6574】Rng(概率,古典概型)

题干&#xff1a; Avin is studying how to synthesize data. Given an integer n, he constructs an interval using the following method: he first generates a integer r between 1 and n (both inclusive) uniform-randomly, and then generates another integer l betw…

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

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

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

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