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

HIT_OS_LAB1 调试分析 Linux 0.00 引导程序

操作系统实验一

  • 姓名:董帅
  • 学号:2021111547
  • 班级:21R0312

1.1 实验目的

  1. 熟悉实验环境
  2. 掌握如何手写Bochs虚拟机的配置文件
  3. 掌握Bochs虚拟机的调试技巧
  4. 掌握操作系统启动的步骤

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 的内存分布状况,写明每个数据段,代码段,栈段的起始与终止的内存地址

  • 数据段
名称起始地址终止地址
current0x17d0x180
scr_loc0x1810x184
lidt_opcode0x1860x18b
lgdt_opcode0x18c0x191
idt0x1980x997
gdt0x9980x9d7
ldt00xbe00xbf7
tss00xbf80xc5f
ldt10xc600xe77
tss10xe780xedf
  • 代码段
名称起始地址终止地址
startup_320x000xac
setup_gdt0xad0xb4
setup_idt0xb50xe4
write_char0xe50x113
ignore_int0x1140x129
timer_interrupt0x12b0x165
system_interrupt0x1660x17c
task00x10e00x10f3
task10x10f40x1107
  • 栈段
名称起始地址终止地址
init_stack0x9d80xbd8
krn_stk00xc600xe60
krn_stk10xee00x10e0
usr_stk10x11080x1308

3.简述 head.s 57 至 62 行在做什么?

行数代码说明
57pushl $0x17把任务 0 当前局部空间数据段(堆栈段)选择符入栈
58pushl $init_stack把堆栈指针入栈(也可以直接把 ESP 入栈)
59pushfl把标志寄存器值入栈
60pushl $0x0f把当前局部空间代码段选择符入栈
61pushl $task0把代码指针入栈
62iret执行中断返回指令,从而切换到特权级 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…...

搜索与图论:匈牙利算法

将所有点分成两个集合&#xff0c;使得所有边只出现在集合之间&#xff0c;就是二分图 二分图&#xff1a;一定不含有奇数个点数的环&#xff1b;可能包含长度为偶数的环&#xff0c; 不一定是连通图 二分图的最大匹配&#xff1a; #include<iostream> #include<cs…...

明星艺人类的百度百科怎么创建 ?

明星艺人们的知名度对于其事业的成功至关重要&#xff0c;而作为国内最大的中文百科全书网站&#xff0c;百度百科成为了人们获取信息的重要来源。一线明星当然百科不用自己操心&#xff0c;平台和网友就给维护了&#xff0c;但是刚刚走红的明星艺人应提早布局百科词条&#xf…...

类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)

在之前的系列文章里&#xff0c;我们介绍了EEMD、CEEMD、CEEMDAN、VMD、ICEEMDAN、LMD、EWT&#xff0c;我们继续补完该系列。 今天要讲到的是小波分解&#xff0c;通常也就是指离散小波变换&#xff08;Discrete Wavelet Transform, DWT&#xff09;。在网上有一些介绍该方法…...

python随手小练10(南农作业题)

题目1&#xff1a; 编写程序&#xff0c;输出1~1000之间所有能被4整除&#xff0c;但是不能被5整除的数 具体操作&#xff1a; for i in range(1,1000): #循环遍历1~999&#xff0c;因为range是左闭右开if (i % 4 0) and (i % 5 ! 0) :print(i) 结果展示&#xff1a; 题目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…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

【Android】Android 开发 ADB 常用指令

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

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...