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,中断前的状态信息被压入栈内。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.MySQL的调控按钮——启动选项和系统变量

2.MySQL的调控按钮——启动选项和系统变量 1.启动选项和配置文件1.1 在命令行上使用选项1.2 配置文件中使用选项1.2.1 配置文件路径1.2.2 配置文件的内容1.2.3 特定 MySQL 版本的专用选项组1.2.4 配置文件的优先级1.2.5 同一个配置文件中多个组的优先级1.2.6 defaults-file 的使…

回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测

回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期神经网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiLSTM贝叶斯优化双向长…

mysql源码安装

Linux环境 1、mysql下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载参考: 2、把下载的 MySQL 压缩包上传到 Linux 服务器 3、解压mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.39-linux-glibc2.12-x86…

【Linux】解决缓存锁问题:无法获得锁 /var/lib/dpkg/lock-frontend

今天在运行apt-get update更新软件包后,突然发现安装新的软件出现了这个报错:正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1855(unattended-upgr)持有。如图。 这个错误通常是由于其他进程正在…

Word批量删除文档属性和个人信息方法图解

投标文件中设计敏感信息,在投标前必须删除,Word批量删除文档属性和个人信息方法图解: 右键word文件属性--详细信息,可以查看如下信息; 删除上述信息的办法: 1.打开word文件---文件 2.检查文档、检查文档 检…

竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐…

Linux操作系统 - 从概念上认识进程

目录 前置知识 冯诺依曼和现代计算机结构 操作系统的理解 进程的概念 进程和PCB 查看进程信息的指令 - ps 进程的一些特性 进程标识符 - PID 进程状态 进程状态的概念 Linux下的进程状态 父子进程 子进程的创建 - fork 僵尸进程 孤儿进程 进程切换 CPU上下文切…

分享54个ASP.NET源码总有一个是你想要的

分享54个ASP.NET源码总有一个是你想要的 链接:https://pan.baidu.com/s/1khPzxtOFP0wUHpg7TBDitg?pwd8888 提取码:8888 项目名称 (ASP.Net)基于三层架构的企业信息管理系统 asp .net mvc编写的房产管理系统 asp.net core mvc 病人管理后台 asp.ne…

【表面缺陷检测】钢轨表面缺陷检测数据集介绍(2类,含xml标签文件)

一、介绍 钢轨表面缺陷检测是指通过使用各种技术手段和设备,对钢轨表面进行检查和测量,以确定是否存在裂纹、掉块、剥离、锈蚀等缺陷的过程。这些缺陷可能会对铁路运输的安全和稳定性产生影响,因此及时进行检测和修复非常重要。钢轨表面缺陷…

pytorch-fastrcnn识别王者荣耀敌方英雄血条

文章目录 前言效果如下实现训练数据获得训练数据和测试数据yaml文件训练py画框文件的修改py测试py 前言 最近看王者荣耀视频看到了一个别人提供的一个百里自动设计解决方案,使用一个外设放在百里的二技能上,然后拖动外设在屏幕上滑动,当外设检测到有敌方英雄时外设自动松开百里…

05、SpringCloud -- 秒杀按钮、秒杀请求流程(各种请求到后台的判断、减库存、下单数据和次数保存)

目录 秒杀按钮代码实现:vue的JS实现:秒杀请求需求:代码前端后端Seckill-apidomainSeckill-serverWebConfig1、秒杀请求判断controller2、重复下单判断MapperService 接口Impl 实现类controller3、库存判断4、秒杀涉及到的操作_01、减库存_02、创建订单对象并保存_03、用户下…

buuctf_练[CSAWQual 2019]Web_Unagi

[CSAWQual 2019]Web_Unagi 文章目录 [CSAWQual 2019]Web_Unagi掌握知识解题思路关键payload 掌握知识 ​ XXE漏洞利用,xml文件转换编码绕过WAF(UTF-8 --> UTF-16),xml文件格式的书写 ​ 再遇到上传xml文件被拦截,就尝试修改编码再上传&a…

openpnp - 汇川伺服和冰沙主板的连接

文章目录 openpnp - 汇川伺服和冰沙主板的连接概述笔记X轴伺服X轴步进电机X伺服 - 电源进线X轴伺服 - 步进控制线X轴步进电机 - 步进控制线X轴伺服 - 编码器反馈线X轴步进电机 - 编码器反馈线X伺服 - 主板端来的控制信号线主板端 - 主板端来的控制信号线X伺服控制信号线 - 主板…

驱动作业10.28

驱动程序 #include <linux/init.h> #include <linux/module.h> #include<linux/of.h> #include<linux/of_gpio.h> #include<linux/gpio.h> #include<linux/timer.h> #include <linux/fs.h> #include <linux/io.h> #include &…

R-FCN: Object Detection via Region-based Fully Convolutional Networks(2016.6)

文章目录 AbstractIntroduction当前最先进目标检测存在的问题针对上述问题&#xff0c;我们提出... Our approachOverviewBackbone architecturePosition-sensitive score maps & Position-sensitive RoI pooling Related WorkExperimentsConclusion 原文链接 源代码 Abstr…

【RTOS学习】互斥管理 | 调试 | 信息统计

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 互斥管理 | 调试 | 信息统计 &#x1f349;互斥管理&#x1f330;屏蔽中断&#x1f330;暂停调度器…

Android问题笔记四十二:signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 的解决方法

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

阿里云服务器—ECS快速入门

这里对标阿里云的课程&#xff0c;一步步学习&#xff0c;链接在下面&#xff0c;学习完考试及格即可获取阿里云开发认证和领取证书&#xff0c;大家可以看看这个&#xff0c;这里我当作笔记&#xff0c;记一下提升印象&#xff01; 内容很长&#xff0c;请耐心看完&#xff0…

论文-分布式-并发控制-并发控制问题的解决方案

目录 参考文献 问题 解法与证明 易读版本 参考文献 Dijkstra于1965年发表文章Solution of a Problem in Concurrent Programming Control&#xff0c;引出并发系统下的互斥(mutual exclusion)问题&#xff0c;自此开辟了分布式计算领域Dijkstra在文中给出了基于共享存储原子…

论文阅读——ELECTRA

论文下载&#xff1a;https://openreview.net/pdf?idr1xMH1BtvB 另一篇分析文章&#xff1a;ELECTRA 详解 - 知乎 一、概述 对BERT的token mask 做了改进。结合了GAN生成对抗模型的思路&#xff0c;但是和GAN不同。 不是对选择的token直接用mask替代&#xff0c;而是替换为…