纯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…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
