纯x86汇编实现的多线程操作系统实践 - 第一章 系统整体结构说明

news2024/11/24 0:07:00

现代CPU都是多核系统,拥有多个执行内核(即计算引擎),可并发执行不同的代码。

在CPU众多的执行内核中,有一个为主执行内核(BSP),在CPU上电后,该主执行内核会率先启动,执行硬盘0扇区的启动代码;其它执行内核为从执行内核(AP),上电后,从执行内核会处于stand by状态,等待被唤醒的信号。

BSP从硬盘读取AP的启动代码装入内存,再将代码首地址写入唤醒信号的数据段中。BSP在完成自身的初始化后,会向所有AP群发启动信号。

启动流程见下图:

各执行内核拥有独立的执行环境(GDT、IDT、eip、esp、段寄存器、通用寄存器、段式管理、页式管理等),可以将一个执行内核简单对应为一个单核CPU。

宗上所述,我们需要分别为BSP和AP提供启动和运行代码。下表描述了我们准备的代码的名字、存放的位置、主要的功能:

序号

文件名

存放位置

主要功能

1

mbr.bin

0扇区

BSP使用,使BSP从实模式进入32位保护模式

2

bp_32.bin

2~17扇区

BSP使用,32位保护模式下,初始化中断,使能键盘和鼠标,最后作为系统的监护线程持续运行

3

ap_16.bin

18扇区

AP使用,使AP从实模式进入32位保护模式

4

ap_32.bin

20~35扇区

AP使用,32位保护模式下,初始化中断,再进入用户态执行用户代码

5

task1.bin

36~37扇区

AP1的用户进程代码

6

Task2.bin

44~45扇区

AP2的用户进程代码

整体系统的内存部署如下图所示。由于系统段代码的虚拟地址,在BSP进入32位保护模式之前,被映射到虚拟地址的2G处,所以下表中的各段地址有两个,一个是映射前的虚拟地址,一个是映射后的虚拟地址:

段命名

页面

虚拟地址

说明

bios_int_page

0x0~0x0fff

0x0/0x80000000

实模式下BIOS的中断向量

gdt_global_addr

0x1000~0x1fff

0x1000/0x80001000

存放全局GDT段数据,所有执行内核都使用该GDT段

idt_global_addr

0x2000~0x2fff

0x2000/0x80002000

存放IDT段数据,所有执行内核都使用该IDT段

page_dir_addr

0x3000~0x3fff

0x3000/0x80003000

该页为所有执行内核的页目录

page_t0_addr

0x4000~0x4fff

0x4000/0x80004000

该页为为所有执行内核的0号页表

page_t380_addr

0x5000~0x5fff

0x5000/0x80005000

该页为为所有执行内核的第0x380号页表

page_t3BF_addr

0x6000~0x6fff

0x6000/0x80006000

该页为为所有执行内核的第0x3BF号页表

bios_setup_page

0x7000~0x7fff

0x7000/0x80007000

该页的0x7c00~0x7e00为BSP实模式启动代码

sys_share_page

0x8000~0x8fff

0x8000/0x80008000

该页用于进程间通信,存放AP间信号量、高精度时钟timer0的ticks值、AP到AP间的控制命令队列等

sys_backup_page1

0x9000~0x9fff

0x9000/0x80009000

备份页(1页),等待后续扩充

ap1_sys_stack_page

0xa000~0xafff

0xa000/0x8000a000

该页为AP1系统代码使用的堆栈

ap1_usr_page_dir

0xb000~0xbfff

0xb000/0x8000b000

该页为AP1用户进程的页目录

ap1_usr_page_t0

0xc000~0xcfff

0xc000/0x8000c000

该页为AP1用户进程的页表0

ap1_usr_sys_stack

0xd000~0xdfff

0xd000/0x8000d000

该页为AP1用户进程的系统堆栈

ap1_usr_code_page

0xe000~0xefff

0xe000/0x8000e000

该页为AP1用户进程的用户代码页

ap1_usr_stack_page

0xf000~0xffff

0xf000/0x8000f000

该页为AP1用户进程的用户堆栈页

ap2_sys_stack_page

0x10000~0x10fff

0x10000/0x80010000

该页为AP2线程系统代码使用的堆栈

ap2_usr_page_dir

0x11000~0x11fff

0x11000/0x80011000

该页为AP2用户进程的页目录

ap2_usr_page_t0

0x12000~0x12fff

0x12000/0x80012000

该页为AP2用户进程的页表0

ap2_usr_sys_stack

0x13000~0x13fff

0x13000/0x80013000

该页为AP2用户进程的系统堆栈

ap2_usr_code_page

0x14000~0x14fff

0x14000/0x80014000

该页为AP2用户进程的用户代码页

ap2_usr_stack_page

0x15000~0x15fff

0x15000/0x80015000

该页为AP2用户进程的用户堆栈页

bp_sys_code_page

0x16000~0x16fff

0x16000/0x80016000

该页为BSP线程的32位系统代码

bp_sys_code_page2

0x17000~0x17fff

0x17000/0x80017000

该页为BSP线程的32位系统代码备份页

bp_sys_stack_addr

0x18000~0x18fff

0x18000/0x80018000

该页用于BSP 32位保护模式下系统代码栈

bp_sys_mouse_data

0x19000~0x19fff

0x19000/0x80019000

该页为BSP线程使用,保存鼠标输入数据

bp_sys_keyboard

0x1a000~0x1afff

0x1a000/0x8001a000

该页为BSP线程使用,保存键盘输入数据

ap_setup_page

0x1b000~0x1bfff

0x1b000/0x8001b000

该页为AP线程实模式启动代码,由所有AP共用

ap_sys_code_page

0x1c000~0x1cfff

0x1c000/0x8001c000

该页为AP线程32位保护模式下系统代码,由所有AP共用

ap_sys_code_page2

0x1d000~0x1dfff

0x1d000/0x8001d000

该页为AP线程32位保护模式下系统代码备份页

sys_pic_save_addr

0x1e000~0x45fff

0x1e000/0x8001e000

保存字符图像数据的起始地址,当前使用了40K

sys_backup_page3

0x46000~0x9ffff

0x46000/0x80046000

备份页(90页,360K)

bios_sys_page

0xa0000~0xfffff

0xa0000/0x800a0000

BIOS使用。其中,文本模式显示区域起始地址0xb8000

该操作系统中,BSP和各个AP都使用了相同的GDT段、IDT段、页目录,因此,在BSP和AP向GDT、IDT以及页目录中写入数据时,一定要使用原子操作,否则写入错误数据的概率极高!

该操作系统支持一个BSP加上2个AP的内核模式,可自行在VirtualBox中设置:

本章对操作系统的整体结构进行了简要的说明,具体的执行代码将在后面的章节进行详细讲解。

《纯x86汇编实现的多线程操作系统实践》全书及全源代码下载:https://download.csdn.net/download/hanspruce_bird/87502318

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lighthouse-自定义Gatherer与Audits

这篇文章是Lighthouse的后续,之前介绍了 lighthouse的介绍和基本使用方法 Lighthouse组合Puppeteer检测页面 这两篇文章,在这两篇文章中介绍了lighthouse的整体架构和基本运行的逻辑,lighthouse默认也采集了足够丰富的数据供我们去分析页面的…

都在用 AI 生成美少女,而我却。。。

最近 AI 画画特别的火,你能从网上看到非常多好看的图片,于是我就开始了我的安装之旅,我看到的图是这样的。这样的。还有这样的。然后我就开始了我的 AI 安装生成计划。安装环境首先我们需要安装 Python 环境,因为这个需要显卡&…

NCRE计算机等级考试Python真题(二)

第二套试题1、关于算法的描述,以下选项中错误的是A.算法具有可行性、确定性、有穷性的基本特征B.算法的复杂度主要包括时间复杂度和数据复杂度C.算法的基本要素包括数据对象的运算和操作及算法的控制结构D.算法是指解题方案的准确而完整的描述正确答案: …

Java基础之日志

2.日志 2.1概述【理解】 概述 程序中的日志可以用来记录程序在运行的时候点点滴滴。并可以进行永久存储。 日志与输出语句的区别 输出语句日志技术取消日志需要修改代码,灵活性比较差不需要修改代码,灵活性比较好输出位置只能是控制台可以将日志信息写…

用于C++的对象关系映射库—YB.ORM

1 介绍YB.ORM YB.ORM 旨在简化与关系数据库交互的 C 应用程序的开发。 对象关系映射器(ORM) 通过将数据库表映射到类并将表行映射到应用程序中的对象来工作,这种方法可能不是对每个数据库应用程序都是最佳的,但它被证明在需要复杂逻辑和事务处理的应用程…

不怕被AirTag跟踪?苹果Find My技术越来越普及

苹果的 AirTag 自推出以来,如何有效遏制用户用其进行非法跟踪,是摆在苹果面前的一大难题。一家为执法部门制造无线扫描设备的公司近日通过 KickStarter 平台,众筹了一款消费级产品,可帮助用户检测周围是否存在追踪的 AirTag 等设备…

Spring中的FactoryBean 和 BeanFactory、BeanPostProcessor 和BeanFactoryPostProcessor解析

文章目录FactoryBean 和 BeanFactory后置处理器BeanPostProcessor 和 BeanFactoryPostProcessorBeanPostProcessorBeanFactoryPostProcessorFactoryBean 和 BeanFactory BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的…

python元编程详解

什么是元编程 软件开发中很重要的一条原则就是“不要重复自己的工作(Don’t repeat youself)”,也就是说当我们需要复制粘贴代码时候,通常都需要寻找一个更加优雅的解决方案,在python中,这类问题常常会归类…

C++015-C++函数

文章目录C015-C函数函数目标char[]和stringchar[]char*string字符常量与字符串常量字符串的输入题目描述 字符串输出题目描述在线练习:总结C015-C函数 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 函数 目标 函数是指一段可以直接被…

SVG实例详解系列(一)(svg概述、位图和矢量图区别(图解)、SVG应用实例)

SVG实例详解系列(一) (svg概述、位图和矢量图区别(图解)、SVG应用实例) 目录 一、什么是SVG? (1)、位图和矢量图概念(图解) (2)、SVG的小例子…

Flutter入门进阶之旅 -开源Flutter项目

开源Flutter项目 该项目为纯flutter端项目,采用aar方式寄生在原生APP中,作为APP中的一个独立模块 在业务逻辑上做到与原生APP完全隔离,Flutter端开发者,可完全不用关注原生端的业务模块 两端开发彼此业务隔离,缩小了对…

数字IC手撕代码--小米科技(除法器设计)

前言: 本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。目录如下:1.数字IC手撕代码-分频器(任意偶数分频)2.数字IC手撕…

wondows10系统python2.7兼容安装python3.10

假设已安装好python2.7和pyhon3.10。 python命令只需要应用程序改名即可,需要修改的有python.exe和pythonw.exe pip命令麻烦点,需要用改名后的程序名 重新安装,命令如下: python3 -m pip install --upgrade pip --force-reinst…

说说 Pluma 插件管理框架

1. 概述 Pluma 是一个用 C 开发的可用于管理插件的开源架构,其官网地址为:http://pluma-framework.sourceforge.net/。该架构是个轻量级架构,非常易于理解。 Pluma 架构有以下基本概念: 1)插件的外在行为体现为一个…

【C++的OpenCV】第七课-OpenCV图像常用操作(四):图像形态学-图像侵蚀和扩散的原理

让我们来深化前边学习的内容前言一、图像形态学是什么?二、侵蚀和扩张的原理2.1 图像的侵蚀2.1.1 概念2.1.2 原理解释2.2 图像的扩张2.2.1 概念2.2.2 原理解释相关链接:【C的OpenCV】第六课-OpenCV图像常用操作(三):Op…

RK3568镜像的拆包和打包

文章目录 前言一、window上分包和打包分包打包二、Linux上分包和打包分包打包总结前言 本文记录在win10上利用瑞芯微提供的工具进行分包和打包,同样也有Linux教程 提示:以下是本篇文章正文内容,下面案例可供参考 一、window上分包和打包 分包 window下一般直接利用工具即…

【正点原子FPGA连载】 第十八章基于BRAM的PS和PL的数据交互 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十八章基于BRA…

在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理

大家好,我是 17。 Flutter WebView 一共写了四篇文章 在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理在 Flutter 中使用 webview_flutter 4.0 | js 交互Flutter WebView 性能优化,让 h5 像原生页面一样优秀,已入选 掘金一周 …

AI绘画进军三次元,有人用它打造赛博女友?(diffusion)

目录0 写在前面1 AI绘画技术飞跃2 效果展示3 环境配置3.1 下载基础模型3.2 更新.NET和模型3.3 下载绘画模型3.4 启动项目3.5 标签配置4 结语0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&a…

内存数据库-4-[redis]在ubuntu中离线安装

Ubuntu20.04(linux)离线安装redis 官网redis下载地址 下载安装包redis-6.0.9.tar.gz。 1 下载安装 (1)解压 sudo tar -xzvf redis-6.0.9.tar.gz -C /usr/local/ cd /usr/local/redis-6.0.9/(2)编译 sudo make(3)测试 sudo dpkg -i libtcl8.6_8.6.10dfsg-1_amd64.deb sudo d…