xv6---Lab4 traps

2023-05-16

参考:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xv6---Lab4 traps 的相关文章

  • 写字机器人使用教程

    一次制作写字机器人的过程 xff08 含制作教程 xff09 arduino 写字机器人制作教程 写字机器人制作教程2 0 购买链接 资料下载地址 xff1a 智宇科技 写字机器人 光盘资料 xff08 A盘资料 xff09 解压密码 xf
  • Inter RealSenseT265测试总结

    1 光线对定位有影响 xff0c 在一定范围内 xff0c 光线越充足 xff0c 定位精度越高 xff0c 但是当光线达到一定条件之后 xff0c 光照强度就不再跟定位精度成正比了 xff1b 2 周围环境对定位有影响 xff0c 周围的
  • 论文小技巧

    文件 选项 LM3405AXMKE NOPB與LM3405AXMK NOPB LM3405AXMKX NOPB對比 激光二极管 期刊查询 在word里面插入图片时怎样才成是100 比例的 文献 封装与功率 高手支招 xff1a 教你利用裸露
  • 激光啄木鸟使用教程

    软件下载地址 1 红色方框内的按钮长按开机 2 红色方框内的按钮轻触自动对焦 3 打开手机APP选择要雕刻的素材 4 设置要雕刻区域的大小 xff0c 开始预览可以查看雕刻的位置 5 打开蓝牙 xff0c 点击连接设备 6 选择被雕刻物件的
  • STM32 HAL库

    STM32 HAL库 第三章 MDK5 软件入门bug解决关键文件介绍程序仿真User Keywords语法提示代码编辑 查看技巧 第四章 STM32F1 基础知识入门MDK 下 C 语言基础复习STM32F103 时钟系统STM32F10
  • LWIP网络-基于STM32平台

    LWIP P1无操作系统移植RAW UDP实验RAW TCP实验Webserver实验 P1无操作系统移植 MAC 43 PHY 通过符合 IEEE802 3的MII和RMII接口与外接快速以太网PHY进行通信 MII和RMII实现数据交换
  • 树莓派学习

    树莓派学习教程 系统安装数据源的更新与配置命令设定固定IP网络地址 xff1a 法一法二 给树莓派安装中文环境和中文输入法远程控制树莓派SSH方式 xff1a 通过putty软件实现 xff08 不需要屏幕 xff09 VNC方式 xff0
  • C++学习教程

    C 43 43 学习教程 C 43 43 内存分区模型数据类型循环语句for循环语句 跳转语句指针指针 数组 函数 结构体指针 内存分区模型 工具vs codeDEV C 43 43 C 43 43 内存分区模型 程序运行前 全局区和代码区
  • core dumped ?完了?

    微信公众号 xff1a linux码头 core dumped xff1a 当程序在运行过程中发生异常 xff0c 这时linux系统可以把程序出错的内存 内容存储在一个core文件中 xff0c 又叫核心转存 应用程序在运行过程汇总经常会
  • Ubuntu18.04安装网络调试助手 NetAssist

    下载地址 链接 xff1a https pan baidu com s 1DUqZBtxFh pGTsRR2kXaPA 提取码 xff1a fp32 安装步骤 1 xff09 建立依赖关系 sudo apt get install f 2

随机推荐

  • C语言中左移(<<)和右移(>>)的理解

    lt lt 左移 xff1a 相当于乘法 a lt lt b 61 a 2 b 举例 xff1a 1 lt lt 5 xff0c 相当于1 2 5 61 32 1 lt lt 0 xff0c 相当于1 2 0 61 1 gt gt 右移 x
  • 《Linux运维总结:firewalld防火墙使用教程》

    文章目录 一 firewalld基础知识1 1 firewalld基本介绍1 2 firewalld与iptables关系与区别1 3 firewalld默认策略1 4 firewalld配置模式1 5 firewalld配置方法1 6 f
  • ROS常用的功能包

    坐标系 坐标变换 xff08 tf xff09 tf功能包提供了一个基于ROS的分布式框架 xff0c 可以随着时间的推移计算多个坐标系的位置 3D可视化工具 xff08 rviz xff09 机器人模型的可视化 图像数据的可视化 地图数据
  • 树莓派4B+Ubuntu 18.04 LTS + 桌面desktop + ros安装@树莓派4B、Ubuntu、desktop、ros

    树莓派4B 43 Ubuntu 18 04 LTS 43 桌面desktop 43 ros安装 64 树莓派4B Ubuntu desktop ros 久违的一篇博客 xff0c 说实话CSDN的编辑器还是用不太习惯 xff0c 记录一下树
  • 云台控制协议总结(VISCA/PELCOD/PELCOP)

  • error: #20: identifier "TIM_TimeBaseInitTypeDef" is undefined

    如果出现多句错误 xff1a identifier 34 34 is undefined 解决问题方法一 xff1a C C 43 43 include paths 把文件路径添加进去 解决问题方法二 xff1a 在stm32f10x co
  • 使用pyqt5实现键盘(含组合键)鼠标事件响应

    使用pyqt5实现键盘 xff08 含组合键 xff09 鼠标事件响应 使用python3 6 xff0c pyqt5 xff0c 在macOS上测试有效 span class hljs keyword import span sys sp
  • 递归思想刷题总结

    核心思想 我们在调用递归函数的时候 xff0c 把递归函数当做普通函数 xff08 黑箱 xff09 来调用 xff0c 即明白该函数的输入输出是什么 xff0c 而不用管此函数内部在做什么 xff08 千万不要跳进去了 xff0c 你脑袋
  • anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions

    在keil工程下移植代码 xff0c 编译出现了这个问题 xff0c 字面上解决办法有 xff1a 1 打开GNU模式 option gt GNU extensions 2 在代码前加上 pragma anon union 就是代表支持匿名
  • 串口的深入理解

    1 串口是如何发送数据的 xff1f 一般说来 xff0c 串口发送数据是往数据寄存器sbuf填写数据 xff0c 一个字节一个字节的写入 xff0c 如果有串口中断 xff0c 那么发送完一个字节的数据 xff0c 就会进入串口中断一次
  • CMakeLists.txt的简单使用

    Makefile和CMakeLists的关系 环境准备 xff1a 需要安装gcc xff0c g 43 43 xff0c make sudo apt get install gcc g 43 43 sudo apt get isntall
  • .so文件的基本理解,使用。

    一 基本概念 Linux下的 so是基于Linux下的动态链接 其功能和作用类似与windows下 dll文件 代码编译 xff0c 链接 xff0c 最后生成可执行文件 xff1b 这个可执行文件就可看作是一个静态链接 xff0c 因为代
  • jz2440:QT控制LED灯点亮熄灭(11)

    1 LED灯的驱动 xff1a 首先要准备好在驱动文件 xff0c 通过insmod led ko来加载模块 xff0c 然后在QT的代码里面配合调用open xff0c write read函数来点亮 xff0c 关闭LED灯 这一步 x
  • win10下安装ubuntu双系统

    本文章记录自己在Win10系统下安装ubuntu双系统的过程 xff0c 以及注意事项 另一个不错的安装教程 1 下载系统镜像 在官网或清华镜像 xff0c 根据需要的ubuntu版本下载需要的ubuntu镜像文件 这里要注意 xff0c
  • C++ shared_ptr的reset 用法

    include lt iostream gt include lt memory gt class Tmp public Tmp int a Tmp void print a std cout lt lt 34 value 61 34 lt
  • C++ 模板类的继承

    模板类 xff1a template lt typename T gt 说白了就是向之后的内容传递参数类型 xff0c 把T当作一个数据类型传递 xff0c 而在声明一个变量的时候 xff0c 通过base lt xxxx gt pp xx
  • linuxptp源码研究

    目录 1 检查网卡是否支持相应的时间戳 2 linuxptp的目录架构 3 ptp4l的大致流程分析 4 gptp协议对应的sync follow up delay request delay response消息在代码的位置 5 slav
  • xv6---Lab3: page tables

    目录 参考资料 RISC V页表的简化图如下所示 编辑 多级页表 xv6内核页表 3 6 Process Address Space 3 7 Code Sbrk 3 8 Code Exec Print a page table A kern
  • 内存管理---分页机制

    目录 物理内存管理带来的问题 直接映射 一级页表 二级页表 参考 xff1a xff08 C语言内存七 xff09 分页机制究竟是如何实现的 xff1f Smah 博客园 物理内存管理带来的问题 比如4GB的flash 如果应用程序可直接访
  • xv6---Lab4 traps

    参考 xff1a Lab Traps 关于寄存器s0和堆栈 https pdos csail mit edu 6 828 2020 lec l riscv slides pdf RISC V assembly Q 哪些寄存器包含函数的参数