纯x86汇编实现的多线程操作系统实践 - 第五章 AP的守护执行
AP的32位保护模式代码的后半部分从0x8001C000开始执行,完成的工作主要有:
初始化必要的中断
给BSP发送启动成功的消息
创建各AP的系统进程
创建各AP的用户进程
循环显示各AP中用户进程执行的时间比例
5.1 初始化中断
5.1.1总体初始化
各AP调用init_interrupt_function进行中断的初始化。

设置线程锁,保证对IDT段的操作是原子执行。

初始化IO APIC寄存器,使能IO APIC功能。将AP对应的IO APIC寄存器的基地址设置为0,同时使能该AP的IO APIC功能。

不同的BSP、AP需对应不同的IO APIC的ID。这里,将AP1对应的IO APIC的ID设置为0x0E,AP2对应的IO APIC的ID设置为0x0C。

屏蔽LINT0,所有外部中断由IO APIC产生。

打开SVR寄存器的APIC enable位(第8位)。这里需要注意:该位在BSP中自动被设置为使能,而在AP中该位默认是关闭的。

IDT段的地址设置为0x80002000。

设置0x31号中断,用于AP1接收BSP的HPET0发送过来的消息,10ms一次。

设置0x32号中断,用于AP2接收BP的HPET0发送过来的消息,10ms一次。

设置0x38号中断,用于设置AP用户进程休眠的时间。

设置0x39号中断,用于AP用户进程读取硬盘的对应扇区数据。
5.1.2接收BSP的时钟消息
AP通过接收BSP发过来的时钟消息来实现系统进程和用户进程的切换(BSP在do_hpet_timer0_handler接口中向AP1和AP2发送IPI消息)。其中,0x31号中断由AP1使用,0x32号中断由AP2使用。下面通过0x31中断对应的中断接口do_int31h_handler来进行说明。

通过ap1_running_usr标志判断当前运行的是系统进程(0)还是用户进程(1)。如果是系统进程,系统进程的ticks加一(ap1_sys_whole_ticks)。
之后,当前进程的运行时隙减一。如果当前进程的时隙还大于0,退出本接口。

执行到这里,说明当前进程的时隙已经使用完毕,需要切换到另一个进程。需要判断是从系统进程切换到用户进程,还是从用户进程切换到系统进程。(一个AP仅运行一个系统进程和一个用户进程)
如果ap1_running_usr标志不为0,说明当前运行的是用户进程,需要切换到系统进程。

ap1_usr_pro_enable标志指示用户进程是否能够被运行。ap1_usr_pro_enable可以通过命令行:“ap1 run“ 以及 “ap1 stop”来设置。“ap1 run“设置ap1_usr_pro_enable标志为1,“ap1 stop” 设置ap1_usr_pro_enable标志为0。
如果ap1_usr_pro_enable标志指示用户进程不能被运行,重新设置当前进程的时隙,并退出接口。

这里是从系统进程切换到用户进程。用户进程运行的ticks值加一,当前运行状态改为“用户进程”。将用户进程运行的时隙写入ap1_switch,再通过AP1用户进程的TSS段在GDT中的选择子切换到AP1的用户进程。

这里是从用户进程切换到系统进程。系统进程运行的ticks值加一,当前运行状态改为“系统进程”。将系统进程运行的时隙写入ap1_switch,再通过AP1系统进程的TSS段在GDT中的选择子切换到AP1的系统进程。
5.1.3进程休眠
AP通过0x38号中断提供用户进程休眠的系统调用,对应的函数是:do_int38h_handler。

首先判断是AP1还是AP2使用该系统调用。

如果是AP1调用的,ap1_running_usr标志改为0,表示当前运行的是系统进程,重新设置进程的运行时隙,再通过AP1系统进程的TSS段在GDT中的选择子切换到AP1的系统进程。

对AP2的处理与上面的AP1一致。
5.1.4读取硬盘扇区
AP通过0x39号中断提供读取硬盘扇区的系统调用,对应的函数是:do_int39h_handler。do_int39h_handler直接调用read_hard_disk_0函数来获取对应扇区的数据,一次读取一个扇区,512字节。其中,eax对应读取的扇区号,ebx对应数据读取到的地址。
5.2 返回启动成功的消息

AP在中断初始化完毕之后,都会向BSP发送“启动成功”的消息。以上指令对应:目标CPU对应的ID号为0x00, 交付模式为Fixed,目标CPU的中断号为0x30。
5.3 创建系统进程和用户进程

通过获取APIC ID号判断当前运行的是AP1还是AP2。

初始化AP1对应的系统进程和用户进程的配置参数。
系统进程的配置参数结构在“global_vars_for_all.inc”文件中定义:

该结构用于记录系统进程的TSS段地址以及系统进程TSS段在GDT中的选择子。
用户进程的配置参数结构也在“global_vars_for_all.inc”文件中定义:

该结构记录参数的功能已在参数后面注明。
init_ap1_configs函数将填写系统进程结构以及用户进程结构中的各个参数,这些参数在创建系统进程和用户进程时被使用。
Load_Sys_Task函数用于创建各AP的系统进程:

使用线程锁,避免AP1和AP2在这里同时操作。

将系统进程的TSS段清空。

将当前页目录地址写入系统进程TSS段的0x1c偏移处,该处记录系统进程对应的页目录。注意,此处写入TSS段页目录地址的代码必须要有,在系统进程向用户进程切换时,系统不会主动将页目录地址保存到TSS段中。

在GDT中写入TSS段描述符,再将TSS在GDT中的偏移写入TR寄存器。
Load_Usr_Task函数用于创建各AP的用户进程:

使用线程锁,避免AP1和AP2在这里同时操作。

将系统进程使用的页目录的数据,拷贝到用户进程对应的页目录页。其中,usr_task_confg.page_dir写入的是页面的实地址,加上0x80000000为页面对应的虚拟地址。

将用户进程页目录的第0项指向页表0。其中,usr_task_confg.page_dir写入的是页面的实地址,加上0x80000000为页面对应的虚拟地址。

向用户进程的页表0的第1项指向虚拟地址0x0~0x0FFF,该区域对应的页的实地址为0x0000E000,用户进程的code代码将写入这一页。

向用户进程的页表0的第2项指向虚拟地址0x1000~0x1FFF,该区域对应的页的实地址为0x0000F000,用户进程的堆栈指向这一页。

将用户进程对应的code代码,从硬盘扇区读取到用户进程code代码页。

初始化用户进程的LDT段,代码描述符和数据描述符都设置为平坦模式。

将设置好的用户LDT段加入DGT段,LDT段在GDT段中的偏移在usr_task_confg.ldt_sel中已经设置好,这样的目的是为了减少判断时使用的代码,但是灵活性更差。

将用户进程的TSS段清空。

逐项填写用户进程TSS段的内容,主要包括:
系统态下的SS段选择子和esp地址
eip值(起始执行代码在code页中的偏移)
Eflag的值
用户态下的esp地址
用户态下CS/SS/DS段的选择子(在LDT段中的偏移)
ldt选择子

将填写好的用户TSS段加入GDT段,TSS在GDT中的偏移为usr_task_confg.tss_sel。
后面,系统将根据系统进程TSS段在GDT中的偏移,以及用户进程TSS段在GDT中的偏移,来切换系统进程和用户进程。
5.4 用户进程执行时间比例的显示
在AP最后的循环中,通过调用do_ap1_usr_ratio和do_ap2_usr_ratio来显示AP1和AP2中,用户进程执行时间与总运行时间的比例。我们通过do_ap1_usr_ratio来讲解。

首先判断ap1_usr_whole_ticks是否为0,为0说明AP1的用户进程还没有运行起来,直接退出本函数。

系统当前ticks值减去上一次记录的ticks值,大于100说明超过1秒钟,可以进行计算,并记录本次当前系统的ticks值用于下一次计算。

计算相比1秒钟前,AP1用户进程增加的ticks数值。

计算相比1秒钟前,AP1系统进程增加的ticks数值。

计算在1秒的间隔中,AP1系统进程和用户进程总增加的ticks数。AP1用户进程增加的ticks数乘以100,再除以总增加的ticks数,得到1秒间隔内,AP1用户进程执行的比例。该结果再除以10,商在ax,余数在dx。

调用0x82系统调用,显示AP1用户进程在1秒间隔中运行的比率(数字)。
ap_32.asm源代码地址:https://download.csdn.net/download/hanspruce_bird/87502148
相关文章:

纯x86汇编实现的多线程操作系统实践 - 第五章 AP的守护执行
AP的32位保护模式代码的后半部分从0x8001C000开始执行,完成的工作主要有:初始化必要的中断给BSP发送启动成功的消息创建各AP的系统进程创建各AP的用户进程循环显示各AP中用户进程执行的时间比例5.1 初始化中断5.1.1总体初始化各AP调用init_interrupt_fun…...
2023年全国最新高校辅导员精选真题及答案7
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 71.在北京曾经发现一处战国时期的遗址,从中出土了燕、韩、赵、魏等国铸币3876…...

使用windwow windbg 吃透64位分页内存管理
前言 分页基础概念是操作系统基础知识,网上已经有太多太多了。所以本文记录使用windwow内核调试工具验证理论知识。 具体可以参阅intel volume3的 4.1.1 Four Paging Modes章节。 简而言之:CR0.PG 0表示不开启分页.并且根据CR4各种标志开启不同类别的…...

Java知识复习(五)JVM虚拟机
1、虚拟机的自动内存管理和C/C的区别 C/C开发程序时需要为每一个new操作去写对应的delete/free操作,不容易出现内存泄漏和溢出问题。而Java程序将内存控制权交给了Java虚拟机 2、JVM的运行机制 1、Java程序的具体运行过程如下: Java源文件被编译器编…...

房屋出租管理系统
1. 铺垫 1.1 项目真实开发的过程 上来要做什么???? 有电脑—》配环境(JDK、IDEA、MAVEN……) 这个项目:房屋管理系统 从什么角度出发,第一步做什么?? 架构 …...
2023年全国最新食品安全管理员精选真题及答案6
百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 51.制定《中华人民共和国食品安全法》的目的是为了保证食品安全…...
C++中的文件操作
文件操作 所有数据程序运行结束后都会释放通过文件可以将数据持久化头文件文件类型分为两种 文本文件—文件以文本的ASCII码形式存储在计算机中二进制文件—文件以文本的二进制存储在计算机中 操作文件的三大类 ofstream—写操作ifstream—读操作fstream—读写操作 文本文件 写…...
监控生产环境中的机器学习模型
简介 一旦您将机器学习模型部署到生产环境中,很快就会发现工作还没有结束。 在许多方面,旅程才刚刚开始。你怎么知道你的模型的行为是否符合你的预期?下周/月/年,当客户(或欺诈者)行为发生变化并且您的训练…...
15s了解什么是物联网技术
目录 15s了解什么是物联网技术 15s了解什么是物联网技术 什么是物联网技术。 简单地说,物联网就是把所有的物体连接起来,相互作用,形成一个互联互通的网络,这就是物联网。如果说互联网是我们身体的虚拟大脑,那么物联网就是我们身体的感知系统,就像眼睛和耳朵-样,让我们…...
敲出来的真理-mysql备份大全,备份命令,还原命令,定时备份
mysqldump命令全量备份数据全量标准语句格式mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql 1.备份全部数据库的数据和结构mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql2.备份全部数据库的结构(加 -d 参数&#x…...

ATTCK实战系列-红队评估(一)
from ATT&CK实战系列-红队评估(一) 环境搭建 下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 将三个虚拟机启动起来 除了windows 7那个主机,其他都只设置成仅主机模式 windows 7添加两个网卡,一个是仅主机,一个是NAT …...

学python的第二天---差分
一、改变数组元素(差分)方法一:差分数组map(int,input().split())for b in arr[:n]:print(1 if b else 0,end )方法二:区间合并interval.sort(keylambda x:x[0])二、差分a [0] list(map(int, input().split())) a[n 1:]三、差…...

数据结构入门5-2(数和二叉树)
目录 注: 树的存储结构 1. 双亲表示法 2. 孩子表示法 3. 重要:孩子兄弟法(二叉树表示法) 森林与二叉树的转换 树和森林的遍历 1. 树的遍历 2. 森林的遍历 哈夫曼树及其应用 基本概念 哈夫曼树的构造算法 1. 构造过程 …...
把Redis当作队列来用,到底合适吗?
文章目录 前言从最简单的开始:List 队列发布/订阅模型:Pub/Sub趋于成熟的队列:Stream1) Stream 是否支持「阻塞式」拉取消息?2) Stream 是否支持发布 / 订阅模式?3) 消息处理时异常,Stream 能否保证消息不丢失,重新消费?4) Stream 数据会写入到 RDB 和 AOF 做持久化吗?…...

Python学习-----项目设计1.0(设计思维和ATM环境搭建)
目录 前言: 项目开发流程 MVC设计模式 什么是MVC设计模式? ATM项目要求 ATM项目的环境搭建 前言: 我个人学习Python大概也有一个月了,在这一个月中我发布了许多关于Python的文章,建立了一个Python学习起步的专栏…...
(九)python网络爬虫(理论+实战)——爬虫实战:指定关键词的百度新闻爬取
系列文章目录 (1)python网络爬虫—快速入门(理论+实战)(一) (2)python网络爬虫—快速入门(理论+实战)(二) (3) python网络爬虫—快速入门(理论+实战)(三) (4)python网络爬虫—快速入门(理论+实战)(四) (5)...

数据分析面试、笔试题汇总+解析(六)
(接上篇) 面试题(MySQL篇) 3. 如何提高MySQL的查询速度? 考点解析: 考察面试者对MySQL查询优化的理解 参考答案: (因为这个问题如果回答的详细一点可以写上一整篇,…...

vue3+rust个人博客建站日记3-编写主页
内容 绘制了主页的基本布局设置了封装了header栏组件并设置了全局黑夜模式. 选择一个组件库-Naive UI 如果没有设计能力,又想开发出风格统一的前端页面。就一定要选择一个漂亮的组件库。 本次项目选择使用Naive UI,NaivUI库曾被Vue框架作者尤雨溪推荐…...

前端常考react面试题(持续更新中)
react diff 算法 我们知道React会维护两个虚拟DOM,那么是如何来比较,如何来判断,做出最优的解呢?这就用到了diff算法 diff算法的作用 计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而…...

C++11多线程编程 二:多线程通信,同步,锁
C11多线程编程 一:多线程概述 C11多线程编程 二:多线程通信,同步,锁 C11多线程编程 三:锁资源管理和条件变量 2.1 多线程的状态及其切换流程分析 线程状态说明: 初始化(Init)&am…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...