HIT_OS_LAB1 调试分析 Linux 0.00 引导程序
操作系统实验一
- 姓名:董帅
- 学号:2021111547
- 班级:21R0312
1.1 实验目的
- 熟悉实验环境
- 掌握如何手写Bochs虚拟机的配置文件
- 掌握Bochs虚拟机的调试技巧
- 掌握操作系统启动的步骤
1.2 实验内容
1.2.1 掌握如何手写Bochs虚拟机的配置文件
-
boot: floppy: 这一行指定了虚拟机会从软盘介质 (boot.img) 启动。这意味着虚拟机会模拟加载软盘中的操作系统来启动。
-
floppya: 1_44=boot.img, status=inserted, write_protected=0: 这一行配置了虚拟软盘驱动器A。它指定了软盘的属性,包括大小(1.44M)、文件路径(boot.img)、状态为已插入、以及写保护状态为关闭。
-
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest: 这行配置了虚拟机使用的VGA BIOS的路径。VGA BIOS是用于虚拟机图形显示的基本输入输出系统。
-
romimage: file=$BXSHARE/BIOS-bochs-latest: 这行配置了虚拟机使用的BIOS ROM的路径。BIOS提供了虚拟机启动时的基本输入输出系统。
-
display_library: x, options=“gui_debug”: 这个选项指定了Bochs使用X窗口系统进行显示,并开启了调试选项。这允许你在图形用户界面中进行虚拟机的调试。
-
cpu: cpuid: 这个选项启用了CPU的CPUID指令,这是一条用于获取CPU信息的指令。
-
megs: 128: 这个选项指定了虚拟机可用的物理内存容量,大小为128MB。
-
log: 这个选项可以指定调试日志的位置,允许你保存虚拟机运行时的日志信息。
-
mouse: 这个选项用于指定鼠标的启用情况,但在提供的配置文件中没有具体的数值。
1.2.2 掌握Bochs虚拟机的调试技巧
-
设置断点 (b): 可以在指定的内存地址处设置断点,当程序执行到该地址时,会中断执行,方便用户进行调试。
-
显示断点状态 (blist): 可以查看当前所有断点的状态,包括断点地址和是否启用。
-
读/写断点 (unwatch/watch): 可以设置或清除读或写的断点,当指定内存地址被读取或写入时,会触发断点中断。
-
显示寄存器状态 (trace-reg on): 在单步调试时,会显示每个寄存器的状态,帮助用户了解程序执行的过程。
-
打印当前堆栈 (print-stack): 可以打印当前的堆栈信息,帮助用户跟踪函数调用和返回。
-
继续向下执行 ( c): 用于继续执行程序,直到遇到下一个断点或程序结束。
-
单步执行 (s): 逐步执行程序,一次执行一条指令,方便用户逐行跟踪代码执行流程。
-
查看寄存器信息 (info cpu/r/sreg/creg): 可以查看CPU寄存器、段寄存器和控制寄存器的信息,帮助用户了解当前的CPU状态。
-
查看内存内容 (xp /nuf): 可以查看指定内存地址处的内容,用户可以指定显示的单元数量、单元大小和显示格式。支持十六进制、十进制、无符号十进制、八进制和二进制等不同的显示格式。
-
反汇编指定范围的内存 (u): 可以对指定范围的内存进行反汇编,帮助用户查看内存中的指令内容。
1.2.3 计算机引导程序
如何查看 0x7c00 处被装载了什么?
使用 b 0x7c00 设置断点

如何把真正的内核程序从硬盘或软驱装载到自己想要放的地方
利用bios中断 INT 13 从启动盘中读取head代码


如何查看实模式的中断程序
int 13 指令处单步运行,跳转到中断子程序, out 指令输出

一次执行后,将栈指针增加4,call 调用中断搬运程序,搬运数据到0x1000, head程序完成搬运。

如何静态创建 gdt 与 idt
加载gdt的地址和idt的地址到GDT寄存器和LDT寄存器

如何从实模式切换到保护模式
设CR0标志位,使用 jmpi 指令跳转到0x0000地址

调试跟踪 jmpi 0,8 ,解释如何寻址

在指令执行时,CS 寄存器存储了代码段的选择子(selector),而 DS 寄存器则存储了数据段的选择子。在保护模式下,这些选择子不是直接指向内存地址,而是通过全局描述符表(GDT)中的描述符来确定对应的段基地址。
在给 CS 寄存器赋值为 0x0008 时,它实际上是在告诉处理器使用 GDT 表中的第二项描述符,这个描述符通常用于指向代码段。GDT 中的每一项描述符包括了段的起始地址、段的大小、访问权限等信息。因此,当 CS 被设置为 0x0008 时,处理器知道它应该使用 GDT 中第二项描述符的内容,从而找到代码段的起始地址。
在跳转完成后,eip 寄存器的值变为 0x00,这是相对于所选择的代码段的偏移量。处理器使用 GDT 中第二项描述符的基地址(起始地址)加上 eip 的值(即 0x00),得到了代码段中的实际内存地址。这个内存地址就是程序下一条要执行的指令的地址。
1.请简述 head.s 的工作原理
head.s 是一个操作系统引导程序,其中包含了32位保护模式的初始化设置代码、时钟中断处理代码、系统调用中断处理代码以及两个任务的执行代码。
它的工作原理可以被描述为以下几个关键步骤:
-
初始化设置: 在32位保护模式初始化设置代码中,首先设置全局描述符表(GDT)和中断描述符表(IDT),包括定时器中断和系统调用中断的处理。
-
时钟中断和任务切换: 通过外部时钟中断(每10ms触发一次),实现任务0和任务1之间的切换。时钟中断触发时,中断处理程序将执行任务切换的逻辑。任务0和任务1分别打印字符’A’和字符’B’,然后通过循环延迟,等待下一次时钟中断触发。
-
系统调用中断处理: 通过系统调用中断(中断向量0x80),实现字符的打印。当系统调用中断触发时,中断处理程序将打印字符’A’或字符’B’,然后继续执行任务的循环。
-
其他中断处理: 除了时钟中断和系统调用中断外的其他中断,都会导致打印字符’C’,然后返回。
-
任务切换逻辑: 在时钟中断处理程序中,通过长跳转指令(ljmp)和任务状态段(TSS)的切换,实现了任务0和任务1之间的无缝切换。当时钟中断触发时,当前任务被保存,然后加载下一个任务的TSS,控制权被转移到下一个任务,实现了多任务的轮转执行。
2.请记录 head.s 的内存分布状况,写明每个数据段,代码段,栈段的起始与终止的内存地址
- 数据段
| 名称 | 起始地址 | 终止地址 |
|---|---|---|
| current | 0x17d | 0x180 |
| scr_loc | 0x181 | 0x184 |
| lidt_opcode | 0x186 | 0x18b |
| lgdt_opcode | 0x18c | 0x191 |
| idt | 0x198 | 0x997 |
| gdt | 0x998 | 0x9d7 |
| ldt0 | 0xbe0 | 0xbf7 |
| tss0 | 0xbf8 | 0xc5f |
| ldt1 | 0xc60 | 0xe77 |
| tss1 | 0xe78 | 0xedf |
- 代码段
| 名称 | 起始地址 | 终止地址 |
|---|---|---|
| startup_32 | 0x00 | 0xac |
| setup_gdt | 0xad | 0xb4 |
| setup_idt | 0xb5 | 0xe4 |
| write_char | 0xe5 | 0x113 |
| ignore_int | 0x114 | 0x129 |
| timer_interrupt | 0x12b | 0x165 |
| system_interrupt | 0x166 | 0x17c |
| task0 | 0x10e0 | 0x10f3 |
| task1 | 0x10f4 | 0x1107 |
- 栈段
| 名称 | 起始地址 | 终止地址 |
|---|---|---|
| init_stack | 0x9d8 | 0xbd8 |
| krn_stk0 | 0xc60 | 0xe60 |
| krn_stk1 | 0xee0 | 0x10e0 |
| usr_stk1 | 0x1108 | 0x1308 |
3.简述 head.s 57 至 62 行在做什么?
| 行数 | 代码 | 说明 |
|---|---|---|
| 57 | pushl $0x17 | 把任务 0 当前局部空间数据段(堆栈段)选择符入栈 |
| 58 | pushl $init_stack | 把堆栈指针入栈(也可以直接把 ESP 入栈) |
| 59 | pushfl | 把标志寄存器值入栈 |
| 60 | pushl $0x0f | 把当前局部空间代码段选择符入栈 |
| 61 | pushl $task0 | 把代码指针入栈 |
| 62 | iret | 执行中断返回指令,从而切换到特权级 3 的任务 0 中执行 |
为任务0的切换做准备。它将任务0的局部数据段选择子、堆栈指针、标志寄存器值、局部代码段选择子和入口地址压入堆栈。然后通过IRET指令,切换到任务0的特权级,开始执行任务0的代码,实现了任务的切换。
4.简述 iret 执行后, pc 如何找到下一条指令?
-
恢复IP(指令指针寄存器)状态: IRET指令会从堆栈中弹出保存的IP值(中断发生前的指令指针),并将该值存入IP寄存器。
-
恢复CS(代码段寄存器)状态: IRET指令会从堆栈中弹出保存的CS值(中断发生前的代码段选择子),并将该值存入CS寄存器。
-
恢复标志寄存器状态: IRET指令会从堆栈中弹出保存的标志寄存器(EFLAGS)的值,并将该值存入标志寄存器。
-
恢复ESP(堆栈指针寄存器)状态: IRET指令会从堆栈中弹出保存的ESP值(中断发生前的堆栈指针),并将该值存入ESP寄存器。
-
恢复SS(堆栈段寄存器)状态: IRET指令会从堆栈中弹出保存的SS值(中断发生前的堆栈段选择子),并将该值存入SS寄存器。
在程序执行时可能会触发中断,导致进入中断处理函数。在进入中断处理函数之前,当前程序的状态被保存到堆栈中。当中断处理函数执行IRET指令时,它从堆栈中恢复之前保存的状态信息,包括指令指针、代码段选择子、标志寄存器等。通过这些恢复的信息,程序回到中断发生前的状态,并继续执行导致中断的指令的下一条指令。这个过程中,程序计数器(PC)找到了下一条指令的执行地址。
5.记录 iret 执行前后,栈是如何变化的?
关注head.s的57至62行代码

执行前,0x0BC4-0x0BD4地址,栈内的内容就是57至61行代码执行时压入栈内的内容,与指令对应

执行后,0x0BC4-0x0BD4地址,栈内的内容都已被弹出,栈为空,最上方的为栈底(0x0BD8)的内容。
6.当任务进行系统调用时,即 int 0x80 时,记录栈的变化情况。

执行前,栈内为空,最上方为栈底(0x0BD8)的内容。

执行后,会发生栈的切换,选择的栈从init_stack切换为krn_stk0,栈底的地址会从0x0BD8切换为0x0E60,中断前的状态信息被压入栈内。
相关文章:
HIT_OS_LAB1 调试分析 Linux 0.00 引导程序
操作系统实验一 姓名:董帅学号:2021111547班级:21R0312 1.1 实验目的 熟悉实验环境掌握如何手写Bochs虚拟机的配置文件掌握Bochs虚拟机的调试技巧掌握操作系统启动的步骤 1.2 实验内容 1.2.1 掌握如何手写Bochs虚拟机的配置文件 boot: f…...
C语言每日一题(18)数组匹配
牛客网 BC156 牛牛的数组匹配 题目描述 描述 牛牛刚学会数组不久,他拿到两个数组 a 和 b,询问 b 的哪一段连续子数组之和与数组 a 之和最接近。 如果有多个子数组之和同样接近,输出起始点最靠左的数组。 输入描述: 第一行输…...
redroid11 集成 nvidia gpu hals
前言 此篇文章中使用 nvidia 相关aosp 库、510.155_Android_R_aarch64_release文件来于原厂提供基础资料,可供 aosp 移植库基本思路。 本文记录 redroid11(aosp11) 集成 nvidia gpu 驱动库、 nvidia_omx 驱动库实践记录,以作备忘。 1>. Apply the p…...
在 Visual Studio 中远程调试 C++ 项目
目录 一、说明二、下载远程工具1. 官网下载2. 自己电脑上拷贝 三、 运行远程工具四、本机Visual Studio配置五、自动部署 一、说明 参考官方文档:https://learn.microsoft.com/zh-cn/visualstudio/debugger/remote-debugging-cpp?viewvs-2022 二、下载远程工具 …...
AAOS CarMediaService 问题分析
文章目录 问题描述车载蓝牙音乐流程Music 监听焦点变化流程BT请求焦点的流程MediaSession 服务端的流程BT和music 之间的相互影响 问题描述 问题 AAOS界面连接蓝牙的情况下,Music应用播放音乐会暂停。 分析 暂停是应用的行为,Music应用会监听focus的变化…...
06-Flask-蓝图的使用
蓝图的使用 前言蓝图使用方式 前言 本篇来学习下Flask中蓝图的使用 蓝图 在Flask中使用蓝图(Blurprint)来分模块组织管理蓝图可以理解为存储一组视图方法的容器对象,特点如下: 一个应用可以具有多个Blueprint可以将一个Blueprint注册到任何一个未使用…...
【LeetCode力扣】189 53 轮转数组 | 最大子数组和
目录 1、189. 轮转数组 1.1、题目介绍 1.2、解题思路 2、53. 最大子数组和 2.1、题目介绍 2.2、解题思路 1、189. 轮转数组 1.1、题目介绍 原题链接:189. 轮转数组 - 力扣(LeetCode) 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3输…...
Go学习第十七章——Gin中间件与路由
Go web框架——Gin中间件与路由 1 单独注册中间件1.1 入门案例1.2 多个中间件1.3 中间件拦截响应1.4 中间件放行 2 全局注册中间件3 自定义参数传递4 路由分组4.1 入门案例4.2 路由分组注册中间件4.3 综合使用 5 使用内置的中间件6 中间件案例权限验证耗时统计 1 单独注册中间件…...
真实感渲染的非正式调研与近期热门研究分享
真实感渲染的非正式调研与近期热门研究分享 1 期刊1 Top2 Venues 2 Rendering Reserach1 Material2 BRDF3 Appearance Modeling4 Capture5 Light Transport光线传播6 Differetiable Rendring-可微渲染7 Ray Tracing8 Denoising降噪9 NeRF 3 VR/AR4 Non-Photorealistic Renderin…...
matlab中字符串转换为数字(str2double函数)
str2double函数 将 str 中的文本转换为双精度值。str 包含表示实数或复数值的文本。str 可以是字符向量、字符向量元胞数组或字符串数组。如果 str 是字符向量或字符串标量,则 X 是数值标量。如果 str 是字符向量元胞数组或字符串数组,则 X 是与 str 具…...
基于java的ssm框架农夫果园管理系统设计与实现
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...
ctf md5爆破
1.知道组成的字符为数字,然后知道加密后的MD5,求组成的字符 import hashlibimport stringdef crackMd5(dst):dst dst.lower()for a in range(0,10):for b in range(0,10):for c in range(0,10):for d in range(0,10):word str(a) str(b) str(c) str(d) "_heetian&q…...
不同碳化硅晶体面带来的可能性
对于非立方晶体,它们天生具有各向异性,即不同方向具有不同的性质。以碳化硅晶体面为例: 4H-SIC和6H-SIC的空间群是P63mc,点群是6mm。两者都属于六方晶系,具有各向异性。3C-SIC的空间群是F-43m,点群是-43m。…...
Kafka集群
Kafka集群 1、Kafka 概述1.1消息队列背景1.2类型1.3Kafka 定义1.4Kafka 简介 2、消息队列好处3、消息队列的模式4、Kafka 的特性5、Kafka 系统架构4、部署 kafka 集群4.1下载安装包4.2 安装 Kafka4.2.1 修改配置文件4.2.2 修改环境变量4.2.3 配置 zookeeper启动脚本4.2.4 设置…...
国腾GM8775C完全替代CS5518 MIPIDSI转2 PORT LVDS
集睿致远CS5518描述: CS5518是一款MIPI DSI输入、LVDS输出转换芯片。MIPI DSI 支持多达4个局域网,每条通道以最 大 1Gbps 的速度运行。LVDS支持18位或24位像素,25Mhz至154Mhz,采用VESA或JEIDA格 式。它只能使用单个1.8v电源&am…...
搜索与图论:匈牙利算法
将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图 二分图:一定不含有奇数个点数的环;可能包含长度为偶数的环, 不一定是连通图 二分图的最大匹配: #include<iostream> #include<cs…...
明星艺人类的百度百科怎么创建 ?
明星艺人们的知名度对于其事业的成功至关重要,而作为国内最大的中文百科全书网站,百度百科成为了人们获取信息的重要来源。一线明星当然百科不用自己操心,平台和网友就给维护了,但是刚刚走红的明星艺人应提早布局百科词条…...
类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)
在之前的系列文章里,我们介绍了EEMD、CEEMD、CEEMDAN、VMD、ICEEMDAN、LMD、EWT,我们继续补完该系列。 今天要讲到的是小波分解,通常也就是指离散小波变换(Discrete Wavelet Transform, DWT)。在网上有一些介绍该方法…...
python随手小练10(南农作业题)
题目1: 编写程序,输出1~1000之间所有能被4整除,但是不能被5整除的数 具体操作: for i in range(1,1000): #循环遍历1~999,因为range是左闭右开if (i % 4 0) and (i % 5 ! 0) :print(i) 结果展示: 题目2&…...
How to install mongodb-7.0 as systemd service with podman
How to install mongodb-7.0 as systemd service with podman 1、安装1.1、创建卷1.2、配置文件1.3、创建容器1.4、服务管理1.5、容器管理 2、客户端管理 1、安装 1.1、创建卷 配置卷 podman volume create --label typemongo-7.0 --label envdev mongo-7.0-conf数据卷 pod…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
