纯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…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
