xv6---Lab4 traps

news2025/2/4 18:45:03

参考:

Lab: Traps

  • 关于寄存器s0和堆栈

https://pdos.csail.mit.edu/6.828/2020/lec/l-riscv-slides.pdf  

RISC-V assembly

Q: 哪些寄存器包含函数的参数?例如,哪个寄存器在main对printf的调用中保存了传参13 ?

A: a2保存13(通过gdb调试可看出寄存器a2的值)

Q:在main的程序集代码中,函数f的调用在哪里?调用g在哪里?(提示:编译器可能内联函数。)

A:查看asm文件,发现没有对f,g的调用,g被内联f函数,f函数被内联到main函数

Q:printf函数的地址在哪里?

A:34:   600080e7            jalr    1536(ra)

    # 630 <printf>可知0x630是printf函数入口

Q:main中,jalr跳转到printf之后,ra的值是多少?

A:ra的值是0x38, 对应的0x34的下一条指令

  当printf执行完成后,会让pc=寄存器ra的值,然后程序会执行main函数中的0x38这行的代码


 

Q: xv6是小端的,如果要实现一样的输出:HE110 World,大端模式下该如何实现?

小端:低地址在前

    0x00000064用字符串打出来,发现解释的方向是64 00 00 00 即r\0\0\0 而不是 \0\0\0r这就是小端

1. 所以如果大端需要输出r ,int c = 0x64000000; 即可输出r.

2. 而对于int的数据,则无论大小端用%d输出的值都一样

Q: printf("x=%d y=%d", 3); 输出结果是什么?

y输出的是寄存器a2的值

Backtrace 

首先

static inline uint64
r_fp()
{
  uint64 x;
  asm volatile("mv %0, s0" : "=r" (x) );
  return x;
} // 返回的是寄存器s0的值

寄存器s0的值代表Frame pointer

  • 栈指针fp:代表当前函数的入口地址
  • fp - 8: 代表返回地址,代表当前栈帧执行结束后,下一行该执行的代码地址
  • fp - 16代表调用当前栈帧的栈帧(比如函数A调用函数B,那么B的fp -16就代表A),所以可通过prev.Frame的地址打印,即可得到调用当前函数的Frame pointer, 在通过addr2line工具即可得到代码执行的情况。
  • stack frame: 函数的调用栈

  • xv6为每一个stack分配4K的页,于是可通fp = r_fp(); 得到当前栈帧,PGROUNDDOWN(fp) and PGROUNDUP(fp) 来得到当前stack的函数调用界限。
  • 根据fp得到Return Address , 即fp - 8 ;

  •  比如调用顺序是:
  1. bttest函数的sleep(1);系统调用
  2. trap.c的usertrap()函数
  3. syscall.c的syscall()函数
  4. sysproc.c的sys_sleep()函数
  5. 调用backtrace()函数: 可通过fp--->得到return adrees,即可向上递归,得到调用栈
void
backtrace(void)
{
  printf("backtrace:\n");
  uint64 fp = r_fp();
  uint64 *frame = (uint64*) fp;

  uint64  up = PGROUNDUP(fp);
  uint64  down = PGROUNDDOWN(fp);
// xv6为每个堆栈分配一个页。大小为4K,
// 通过PGROUNDUP和PGROUNDDOWN可计算出这个页的边界
  while (fp < up && fp > down)
  {
    printf("%p\n", frame[-1]);  // 返回地址
    fp = frame[-2]; // 上一个fp
    frame = (uint64* )fp;
  }
  
}

结果如下:

a123@ubuntu:~/Public/repo/xv6-labs-2020$ make qemu
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

xv6 kernel is booting

hart 2 starting
hart 1 starting
init: starting sh
$ bttest
backtrace:
0x0000000080002d56
0x0000000080002bb8
0x00000000800028a2
$ QEMU: Terminated
a123@ubuntu:~/Public/repo/xv6-labs-2020$ addr2line -e kernel/kernel
0x0000000080002d56
/home/a123/Public/repo/xv6-labs-2020/kernel/sysproc.c:76
0x0000000080002bb8
/home/a123/Public/repo/xv6-labs-2020/kernel/syscall.c:140
0x00000000800028a2
/home/a123/Public/repo/xv6-labs-2020/kernel/trap.c:76
^C
a123@ubuntu:~/Public/repo/xv6-labs-2020$ 

test0: invoke handler

实现参考:Mit6.S081-实验4-Traps_解析Ta的博客-CSDN博客

目标:调用signalarm(n, f)函数,实现间隔n秒,执行一次f函数

  • 首先实现sigalarm和sigalreturn的系统调用,便于alarmtest.c执行系统调用
  • 在sigalarm函数:
  1. 得到当前进程
  2. 在struct proc中添加函数指针handler, 间隔时间,消耗时间。
  3. 在当前进程的表示struct proc中去记下回调函数handler和alarm间隔时间
  • 在中断产生:会进入usertrap()函数,而其中which_dev == 2表示是滴答中断,于是在此中断检查是否时间到了,到了就执行定时回调函数

test1/test2(): resume interrupted code

MIT 6.S081 Lab4: traps_rocketeerLi的博客-CSDN博客_mit 6.s081 traps

目标:在执行signal_alarm函数前后,希望可以保持trapframe不变。

  • 在调用signal_alarm(n,f);设定的f函数前,先保存trapframe
  • 在usertraps中调用完成设定的函数之后,将trapframe设置为保存的trapframe

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

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

相关文章

【设备管理系统】如何助力制造企业实现精益生产?

随着企业对于机械设备的依赖性越来越高&#xff0c;生产设备日益大型化、自动化&#xff0c;流程线生产流程问题逐渐浮于表面&#xff0c;现阶段设备管理的各项制度已经不能够满足日常的生产工作。企业逐渐都面临着设备管理的复杂问题&#xff0c;尤其是设备的保养、维修、日常…

JMeter—HTTP压测

目录&#xff1a;导读 一、创建线程组 二、添加HTTP 三、查看结果树 四、响应断言 五、聚合报告 六、自定义变量 七、CSV可变参数压测 结语 一、创建线程组 右击-->添加-->Threads(Users)-->线程组 下面对比较重要的几个参数&#xff0c;讲解下&#xff1a; …

Vue基础7

Vue基础7生命周期引出生命周期用css animation实现用定时器实现错误&#xff1a;用methods实现使用生命周期函数mounted实现生命周期定义分析生命周期挂载流程beforeCreate()created()beforeMount()mounted()template的作用更新流程beforeUpdate()updated()销毁流程beforeDestr…

【数据库】二阶段锁

Two-phase locking (2PL) is a concurrency controlprotocol that determines whether a txn can access an object in the database on the fly. The protocol does not need to know all the queriesthat a txn will execute ahead of time. 分为两个阶段&#xff1a; 一阶…

颅内EEG记录揭示人类DMN网络的电生理基础

使用无创功能磁共振成像&#xff08;fMRI&#xff09;的研究为人类默认模式网络&#xff08;DMN&#xff09;的独特功能组织和深远重要性提供了重要的见解&#xff0c;但这些方法在跨多个时间尺度上解决网络动力学的能力有限。电生理技术对于应对这些挑战至关重要&#xff0c;但…

RAID 0 添加新磁盘

1&#xff1a;查看当前可用挂载磁盘 lsblk 2&#xff1a;可见 sda 与 sdb 已被挂载&#xff0c;需要挂载 sdc 和 sdd 由于硬盘的默认分区格式是MBR&#xff0c;这种格式的硬盘支持的最大挂载容量为2T&#xff0c;为了满足我们的要求&#xff0c;需要将硬盘格式转化为MBR&…

Node.js 编写接口入门学习(GET、POST)

一、简介 nvm 安装、卸载与使用&#xff08;详细步骤&#xff09;&#xff0c;用于管理/切换 Node 多版本环境。 node 是否安装成功 $ node -v安装完成之后&#xff0c;通过 node 直接运行 test.js。 // test.js console.log(Hello Node)# 命令行执行 $ node test.js二、简单的…

[ 数据结构 -- 手撕排序算法第七篇 ] 归并排序

文章目录前言一、常见的排序算法二、归并排序的基本思想三、归并排序3.1 归并排序的递归版本3.2 归并排序的非递归版本四、归并排序的特性总结前言 手撕排序算法第七篇&#xff1a;归并排序&#xff01; 从本篇文章开始&#xff0c;我会介绍并分析常见的几种排序&#xff0c;例…

深度学习秘籍

显式构造 隐式构造 loss通常是一个标量 batchsize越小其实越好 回归 预测的是一个连续 softmax回归是一个多分类问题 分类 预测是一个离散值 Huber RoBust Loss, 也就是通常所说SmoothL1损失 常用命令 import torch import torchvision from torchvision import transformsso…

ContentProvider的介绍和使用

文章目录ContentProviderContentProvider简介运行时权限Android权限机制详解在程序运行时申请权限访问其他程序当中数据ContentResolver的基本用法读取系统联系人信息创建自己的ContentProvider创建ContentProvider的步骤实现跨程序数据共享ContentProvider 如果我们想要实现跨…

浅拷贝深拷贝递归

常见的基本数据类型&#xff1a;Number、String 、Boolean、Null和Undefined 引用数据类型&#xff1a;Object、Array、Function 1&#xff09;基本数据类型&#xff1a;存储在栈内存中,可以直接访问到该变量的值。 2&#xff09;引用数据类型&#xff1a;存储在堆内存中,每…

有哪些数据统计软件适合初学者使用?

前段时间写过一篇“数据分析工具”的内容&#xff0c;周末有伙伴私信问我有没有什么适合初学者、业务人员的&#xff0c;更简单一点的数据可视化软件。 所以今天来分享下我在做数据分析时用过的几个简单易上手的数据可视化软件。 先放上目录&#xff1a; 数据统计收集类——简…

谷粒学院——Day12【整合阿里云短信服务、首页登录和注册】

用户登录业务介绍 一、单一服务器模式 早期单一服务器&#xff0c;用户认证。 缺点&#xff1a;单点性能压力&#xff0c;无法扩展。 二、SSO(single sign on)模式 分布式&#xff0c;SSO(single sign on)模式 优点&#xff1a; 用户身份信息独立管理&#xff0c;更好的…

关于安科瑞电气安全产品在医药工业洁净厂房的电气工程设计与应用

摘要&#xff1a; 近年来&#xff0c;医药工业洁净厂房的电气工程设计得到了快速发展和广泛关注&#xff0c;研究其相关课题有着重要意义。首先介绍了供电系统与配电设备的设置&#xff0c;分析了洁净厂房的电气照明设计&#xff0c;并结合相关实践经验&#xff0c;从探测器选…

智能无障碍轮椅——ESP8266总体介绍及ESP-01S入门调试

文章目录ESP8266 介绍ESP8266的多种型号1. DT-062. ESP-01和ESP-01S【左边ESP-01S&#xff0c;右边ESP-01】3. ESP-12F两种开发方式1. AT指令开发方式2. SDK开发方式固件烧录方法1. 硬件烧录工具2. 软件烧录工具WiFi模块工作模式&#xff1a;1. AP模式2. STA模式3. STAAP共存ES…

宏、条件编译(#ifdef)、#include(头文件包含)、#error和 #pragma的区别、#和##的含义和应用

1、在C语言预处理阶段&#xff0c;编译器首先对代码的处理时&#xff1a;先去注释&#xff0c;再宏替换。 2、在源文件的任何地方&#xff0c;宏都是可以定义的&#xff0c;与是否在函数内外无关。 3、宏的作用范围是&#xff1a;从定义处开始&#xff0c;往后的直到程序结束…

C++(老百科)

学了这么久的c,你们有没有想过一个问题:什么是c?(这还用问么,不大街上随便抓一个陌生人都知道)(那你现在给我抓个看看) C简介 C是一种计算机高级程序设计语言&#xff0c;由C语言扩展升级而产生 &#xff0c;最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。––…

easyexcel读取excel将数据存到mysql【一个简单的例子】

读取excel 1 xml里面增加maven <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> </depen…

项目管理软件适用于初创公司吗

我注意到关于小型团队的一件事是&#xff0c;在这种热情的背后隐藏着一家需要帮助的公司。他们通常缺乏职责结构&#xff0c;但这可能不是他们的主要需求。太多的结构会扼杀那些在较小的初创型公司中经营节目的企业家精神的努力&#xff0c;但他们几乎总是需要更有效的流程和一…

分布式理论之CAP定理

CAP定理介绍 CAP定理&#xff08;CAP theorem&#xff09;&#xff0c;又被称作布鲁尔定理&#xff08;Brewers theorem&#xff09;&#xff0c;它指出对于一个分布式计算系统来说&#xff0c;不可能同时满足以下三点 选项具体意义一致性&#xff08;Consistency&#xff09…