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

MIT6.828 Lab2-1 Using gdb

Using gdb

gdb使用:
xv6 gdb调试方法

问题1:

  • Looking at the backtrace output, which function called syscall?
    按照提示开启gdb后键入:
b syscall
c
layout src
backtrace

输出结果:

(gdb) backtrace
#0  syscall () at kernel/syscall.
#1  0x0000000080001d70 in usertra
#2  0x0505050505050505 in ?? ()
(gdb)

usertra调用了syscall

问题2:

  • What is the value of p->trapframe->a7 and what does that value represent?
  • (线索: look user/initcode.S, the first user program xv6 starts.)
  • proc结构体源码:
// Per-process state
struct proc {struct spinlock lock;// p->lock must be held when using these:enum procstate state;        // Process statevoid *chan;                  // If non-zero, sleeping on chanint killed;                  // If non-zero, have been killedint xstate;                  // Exit status to be returned to parent's waitint pid;                     // Process ID// wait_lock must be held when using this:struct proc *parent;         // Parent process// these are private to the process, so p->lock need not be held.uint64 kstack;               // Virtual address of kernel stackuint64 sz;                   // Size of process memory (bytes)pagetable_t pagetable;       // User page tablestruct trapframe *trapframe; // data page for trampoline.Sstruct context context;      // swtch() here to run processstruct file *ofile[NOFILE];  // Open filesstruct inode *cwd;           // Current directorychar name[16];               // Process name (debugging)
};
  • trapframe结构体:
// the entire kernel call stack.
struct trapframe {/*   0 */ uint64 kernel_satp;   // kernel page table/*   8 */ uint64 kernel_sp;     // top of process's kernel stack/*  16 */ uint64 kernel_trap;   // usertrap()/*  24 */ uint64 epc;           // saved user program counter/*  32 */ uint64 kernel_hartid; // saved kernel tp/*  40 */ uint64 ra;/*  48 */ uint64 sp;/*  56 */ uint64 gp;/*  64 */ uint64 tp;/*  72 */ uint64 t0;/*  80 */ uint64 t1;/*  88 */ uint64 t2;/*  96 */ uint64 s0;/* 104 */ uint64 s1;/* 112 */ uint64 a0;/* 120 */ uint64 a1;/* 128 */ uint64 a2;/* 136 */ uint64 a3;/* 144 */ uint64 a4;/* 152 */ uint64 a5;/* 160 */ uint64 a6;/* 168 */ uint64 a7;/* 176 */ uint64 s2;/* 184 */ uint64 s3;/* 192 */ uint64 s4;/* 200 */ uint64 s5;/* 208 */ uint64 s6;/* 216 */ uint64 s7;/* 224 */ uint64 s8;/* 232 */ uint64 s9;/* 240 */ uint64 s10;/* 248 */ uint64 s11;/* 256 */ uint64 t3;/* 264 */ uint64 t4;/* 272 */ uint64 t5;/* 280 */ uint64 t6;
}
  • initcode.S源码:
# Initial process that execs /init.
# This code runs in user space.#include "syscall.h"# exec(init, argv)
.globl start
start:la a0, initla a1, argvli a7, SYS_exececall# for(;;) exit();
exit:li a7, SYS_exitecalljal exit# char init[] = "/init\0";
init:.string "/init\0"# char *argv[] = { init, 0 };
.p2align 2
argv:.long init.long 0

键入n数次使gdb越过struct proc *p = myproc();,此后键入p /x *p,此命令打印了进程的proc struct
打印输出:

$1 = {lock = {locked = 0x0, name = 0x800081b8, cpu = 0x0},state = 0x4, chan = 0x0, killed = 0x0, xstate = 0x0, pid = 0x1,parent = 0x0, kstack = 0x3fffffd000, sz = 0x1000,pagetable = 0x87f73000, trapframe = 0x87f74000, context = {ra = 0x800014c2, sp = 0x3fffffde80, s0 = 0x3fffffdeb0,s1 = 0x80008d50, s2 = 0x80008920, s3 = 0x1, s4 = 0x0,s5 = 0x3, s6 = 0x800199f0, s7 = 0x8, s8 = 0x80019b18,s9 = 0x4, s10 = 0x1, s11 = 0x0}, ofile = {0x0 <repeats 16 times>}, cwd = 0x80016e60, name = {0x69, 0x6e,0x69, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0,0x0, 0x0, 0x0}}
(gdb)

p->trapframe->a7为proc结构体中trapframe指针指向的结构体中a7的值

(gdb) p /x p->trapframe->a7
$8 = 0x7
(gdb)

所以a7中存放值为0x07,此值代表exec系统调用的编号,后续用于调用 ecall 重新进入内核。

问题3:

  • What was the previous mode that the CPU was in?
(gdb) p /x $sstatus
$9 = 0x22
(gdb)

十进制为100010,查询RISC-V privileged instructions可知:
在这里插入图片描述
此时第八位为0,代表CPU之前处于用户态

问题4:(错误测试)

  • Write down the assembly instruction the kernel is panicing at. Which register corresponds to the variable num?

相关文章:

MIT6.828 Lab2-1 Using gdb

Using gdb gdb使用&#xff1a; xv6 gdb调试方法 问题1&#xff1a; Looking at the backtrace output, which function called syscall? 按照提示开启gdb后键入&#xff1a; b syscall c layout src backtrace输出结果&#xff1a; (gdb) backtrace #0 syscall () at k…...

mysqldump提示Using a password on the command line interface can be insecured的解决办法

mysql数据库备份一句话执行命令 mysqldump --all-databases -h127.0.0.1 -uroot -p123456 > allbackupfile.sql 提示如下提示 [rootyfvyy5b2on3knb8q opt]# mysqldump --all-databases -h127.0.0.1 > allbackupfile.sql mysqldump: Couldnt execute SELECT COLUMN_NA…...

Java毕业设计 基于springboot vue考勤管理系统

Java毕业设计 基于springboot vue考勤管理系统 SpringBoot 考勤管理系统 功能介绍 员工 登录 个人中心 修改密码 个人信息 员工请假管理 员工出差管理 薪资管理 员工签到管理 公告管理 管理员 登录 个人中心 修改密码 个人信息 员工管理 员工请假管理 员工出差管理 薪资管理…...

C数据结构:二叉树

目录 二叉树的数据结构 前序遍历 中序遍历 后序遍历 二叉树的创建 二叉树的销毁 二叉树的节点个数 二叉树叶子节点个数 二叉树第K层节点个数 二叉树的查找 层序遍历 判断二叉树是否为完全二叉树 完整代码 二叉树的数据结构 typedef char BTDataType; typedef str…...

使用Nginx作为反向代理实现MQTT内外网通信

使用Nginx作为反向代理实现MQTT内外网通信 步骤1: 安装Nginx 确保你的服务器上已安装Nginx。如果未安装&#xff0c;可以通过以下命令在Ubuntu上安装Nginx&#xff1a; sudo apt update sudo apt install nginx步骤2: 配置Nginx 编辑Nginx的配置文件&#xff0c;通常是/etc…...

SpringBoot 上传文件示例

示例效果&#xff1a; 前端代码&#xff1a; <html> <head><title>上传文件示例</title></head> <body> <h2>方式一&#xff1a;普通表单上传</h2> <form action"/admin/upload" method"post" enctyp…...

9.js函数

函数是js复杂数据类型的一种---可以理解为存放代码的盒子 用来帮助我们封装、复用、扩展以及调用代码的工具 函数的两个阶段 &#xff08;1&#xff09;声明函数&#xff08;理解为创造&#xff09; ——声明式声明 语法&#xff1a;function 函数名(参数){...代码} ——赋值时…...

关于数据库和数据表的基础SQL

目录 一. 数据库的基础SQL 1. 创建数据库 2. 查看当前有哪些数据库 3. 选中数据库 4. 删除数据库 5. 小结 二. 数据表的基础SQL 1. 创建数据表 2. 查看当前数据库中有哪些表 3. 查看指定表的详细情况(查看表的结构) 4. 删除表 5. 小结 一. 数据库的基础SQL 1. 创建…...

【C语言深度解剖】(14):结构体内存对齐(详细配图讲解)

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏链接查看&…...

学习笔记:C语言的32个关键字

一、标准C语言的32个关键字 1、基本数据类型&#xff1a; signed unsigned char int float double short long void 2、构造数据类型&#xff1a; struct union enum 3、数据存储类别&#xff1a; auto static extern register 4、数据优化&#xff1a; const volatile 5、9条…...

嵌入式学习 (Day:27 IPC --- 进程间通信)

IPC 进程间通信 interprocess communicate &#xff08;即&#xff1a;进程间进行数据交换&#xff09; 三大类&#xff1a; 进程间通信的方式&#xff08;共8种&#xff09; 1、古老的通信方式&#xff08;Linux设计时就有的&#xff09; 无名管道 有名…...

Python考试复习--day2

1.出租车计费 mile,waitmap(int,input().split(,)) if mile<3:money13wait*1 elif mile>3 and mile<15:money13(mile-3)*2.3wait*1 else:money1312*2.3(mile-15)*2.3*(10.5)wait*1 print({:.0f}.format(money)) 【知识点1】&#xff1a; map() 函数 【知识点1】&…...

整理好了!2024年最常见 20 道 Redis面试题(九)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道 Redis面试题&#xff08;八&#xff09;-CSDN博客 十七、Redis 的过期策略有哪些&#xff1f; Redis 的过期策略主要有三种&#xff1a; 定时删除&#xff1a;当为一个键设置了过期时间后&#xff0c;Redis 会…...

IDEA使用Maven打包项目的所有的依赖

要使用 Maven 命令将 Spring Boot 项目的依赖打包到 lib 文件夹中&#xff0c;你可以在终端中运行以下命令&#xff1a; mvn dependency:copy-dependencies -DoutputDirectory./lib这个命令会将项目的所有依赖&#xff08;包括运行时依赖&#xff09;复制到当前目录的 lib 文件…...

【C++ 】学习问题及补充

一.自定义类型不初始化直接就赋值&#xff0c;比如string类会怎么样 vectr<string>里已经给每个string对象已经分配好空间&#xff0c;为什么不初始化再赋值会报错 在C中&#xff0c;std::string类是一个动态字符串类&#xff0c;它内部管理着一个字符数组&#xff0c;用…...

内存泄漏案例分享3-view的内存泄漏

案例3——view内存泄漏 前文提到&#xff0c;profile#Leaks视图无法展示非Activity、非Fragment的内存泄漏&#xff0c;换言之&#xff0c;除了Activity、Fragment的内存泄漏外&#xff0c;其他类的内存问题我们只能自己检索hprof文件查询了。 下面有一个极佳的view内存泄漏例子…...

红外超声波雷达测距

文章目录 一HC-SR04介绍1HC-SR04简介及工作原理 二用HAL库实现HC-SR04测量距离1STM32CubeMX配置2keil53代码的添加 三效果 一HC-SR04介绍 1HC-SR04简介及工作原理 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等…...

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文介绍了 IP-Adapter&#xff0c;一种 高效地将预训练的图像到图像转换模型适应到新领域 的方法。它通过在预训练模型的 输入端 添加一个…...

Java入门基础学习笔记50——ATM系统

1、项目演示&#xff1b; 2、项目技术实现&#xff1b; 1&#xff09;面向对象编程&#xff1a; 每个账户都是一个对象&#xff0c;所以要设计账户类Account&#xff0c;用于创建账户对象封装账户信息。ATM同样是一个对象&#xff0c;需要设计ATM类&#xff0c;代表ATM管理系…...

# linux 中使用 visudo 命令,怎么保存退出?

linux 中使用 visudo 命令&#xff0c;怎么保存退出&#xff1f; 在 visudo 中保存并退出的方法取决于您使用的文本编辑器。通常情况下&#xff0c;visudo 会使用 vim 或 vi 或 Nano 作为默认的文本编辑器。 1、使用 Vim 或 vi 编辑器&#xff1a; 按下 Esc 键退出编辑模式&…...

3步解锁Mac隐藏技能:Whisky让你的苹果电脑运行Windows应用

3步解锁Mac隐藏技能&#xff1a;Whisky让你的苹果电脑运行Windows应用 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 你是否曾经在Mac上收到一个.exe文件&#xff0c;却只能无奈地告…...

实战指南:5个技巧高效部署BBS-Go开源社区平台

实战指南&#xff1a;5个技巧高效部署BBS-Go开源社区平台 【免费下载链接】bbs-go A lightweight community and Q&A platform for forums, knowledge bases, and discussions. 项目地址: https://gitcode.com/gh_mirrors/bb/bbs-go 想快速搭建一个功能完备的在线社…...

解析IFC:BIM领域的“通用语言”,好而不完美的开放标准

在建筑信息模型&#xff08;BIM&#xff09;的数字化协同体系中&#xff0c;IFC&#xff08;Industry Foundation Classes&#xff0c;工业基础类&#xff09;无疑是最具影响力的开放文件格式。它就像建筑行业的“通用语言”&#xff0c;打破了不同BIM软件之间的壁垒&#xff0…...

用GoC画图搞定2018年5月那道‘场记板’编程题,附完整代码和思路拆解

用GoC画图还原2018年场记板编程题的完整解题思路 第一次看到这道场记板题目时&#xff0c;许多同学会被"n条竖线"的要求难住。其实只要拆解图形结构&#xff0c;用GoC的基础命令就能轻松实现。本文将从零开始&#xff0c;带你用分治法拆解这个经典考题&#xff0c;不…...

QMCDecode:3步解锁你的QQ音乐收藏,告别格式限制的烦恼

QMCDecode&#xff1a;3步解锁你的QQ音乐收藏&#xff0c;告别格式限制的烦恼 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#…...

Rainmeter桌面美化终极指南:轻松打造个性化Windows桌面的完整教程

Rainmeter桌面美化终极指南&#xff1a;轻松打造个性化Windows桌面的完整教程 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter Rainmeter是一款功能强大的Windows桌面自定义工具&#xff0c…...

工业电伴热系统安全防护:微型热保护器选型、安装与维护全解析

1. 工业电伴热保温套与热保护器&#xff1a;一个被低估的安全基石在工业现场&#xff0c;尤其是化工、石油、食品加工这些对温度敏感或存在防冻需求的行业&#xff0c;管道和储罐的伴热保温是维持生产连续性的生命线。想象一下&#xff0c;一条输送高凝点原油的管道&#xff0c…...

海光3330E工控机实战:工业边缘计算与国产x86平台部署指南

1. 项目概述&#xff1a;当工业智能化遇见“中国芯”最近在为一个工业视觉检测的项目选型硬件平台&#xff0c;客户的要求很明确&#xff1a;稳定、可靠、能长时间在产线恶劣环境下跑&#xff0c;还得有足够的算力处理实时图像分析。在对比了市面上常见的几款基于x86或ARM架构的…...

Axure RP 9汉化后,这些高效原型设计技巧让你事半功倍

Axure RP 9汉化后高效原型设计实战指南 当你终于完成Axure RP 9的安装与汉化&#xff0c;面对熟悉的中文界面&#xff0c;是否感到一丝茫然&#xff1f;从"能用"到"善用"这个强大的原型设计工具&#xff0c;中间隔着一道效率的鸿沟。本文将带你跨越这道鸿沟…...

什么是占位符

占位符就是字符串里预留空位&#xff0c;后面填上真实数据&#xff0c;PyCharm里直接写代码就能运行调试1.%格式化占位符&#xff08;旧式格式化&#xff09;语法格式&#xff1a;"模板字符串"%(数据1&#xff0c;数据2...)基础类型占位符1.%s &#xff1a;适配字符串…...