当前位置: 首页 > news >正文

纯x86汇编实现的多线程操作系统实践 - 第五章 AP的守护执行

AP的32位保护模式代码的后半部分从0x8001C000开始执行,完成的工作主要有:

  1. 初始化必要的中断

  1. 给BSP发送启动成功的消息

  1. 创建各AP的系统进程

  1. 创建各AP的用户进程

  1. 循环显示各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段的内容,主要包括:

  1. 系统态下的SS段选择子和esp地址

  1. eip值(起始执行代码在code页中的偏移)

  1. Eflag的值

  1. 用户态下的esp地址

  1. 用户态下CS/SS/DS段的选择子(在LDT段中的偏移)

  1. 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.制定《中华人民共和国食品安全法》的目的是为了保证食品安全&#xf…...

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…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...