【xv6-labs】02 Lab: system calls

GDB

如何启动gdb

  • 启动 make CPUs=1 qemu-gdb
  • 在另一个终端启动 gdb-multiarch kernel/kernel
  • 进入gdb后输入 target remote localhost:26000

GDB 的一些命令

  • shell clear # 清屏
  • layout src # 显示源码
  • layout regs # 显示寄存器
  • layout split # 同时显示源码和寄存器
  • backtrace # 显示函数调用栈

在XV6 如何添加系统调用

  1. user/user.h 中添加系统调用函数的定义. 比如:
struct stat;// system calls
int fork(void);
int exit(int) __attribute__((noreturn));
int wait(int*);
int pipe(int*);
int write(int, const void*, int);
int read(int, void*, int);
int close(int);
  1. user/usys.pl 中添加入口, 这个文件会在 make 后生成 user/usys.S 文件, 在该汇编文件中,每个函数就只有三行,将系统调用号通过 li(load imm) 存入 a7 寄存器,之后使用 ecall 进入内核态,最后返回。
sub entry {my $name = shift;print ".global $name\n";print "${name}:\n";print " li a7, SYS_${name}\n";print " ecall\n";print " ret\n";
}entry("fork");
entry("exit");
  1. kernel/syscall.h中定义系统调用号
#define SYS_mkdir  20
#define SYS_close  21
#define SYS_trace  22
  1. kernel/syscall.csyscalls 函数指针数值中添加对应的函数。
// An array mapping syscall numbers from syscall.h
// to the function that handles the system call.
// 这里的static uint64 (*syscalls[])(void)
// 表示定义一个 静态函数指针的数组
// 函数指针参数是void, 返回值是 uint64
// [SYS_fork]    sys_fork, 表示将第 SYS_fork 设置为 sys_fork
static uint64 (*syscalls[])(void) = {
[SYS_fork]    sys_fork,
[SYS_exit]    sys_exit,
[SYS_wait]    sys_wait,
[SYS_pipe]    sys_pipe,
[SYS_read]    sys_read,
[SYS_kill]    sys_kill,
[SYS_exec]    sys_exec,
[SYS_fstat]   sys_fstat,
[SYS_chdir]   sys_chdir,
[SYS_dup]     sys_dup,
[SYS_getpid]  sys_getpid,
[SYS_sbrk]    sys_sbrk,
[SYS_sleep]   sys_sleep,
[SYS_uptime]  sys_uptime,
[SYS_open]    sys_open,
[SYS_write]   sys_write,
[SYS_mknod]   sys_mknod,
[SYS_unlink]  sys_unlink,
[SYS_link]    sys_link,
[SYS_mkdir]   sys_mkdir,
[SYS_close]   sys_close,
[SYS_trace]   sys_trace,
};
  1. syscall 函数中,先读取 trapframe->a7 获取系统调用号之后,根据系统调用号查找syscalls数组中的对应的处理函数并调用。
  2. 获取传入的参数。

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

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

相关文章

Transformer实战-系列教程15:DETR 源码解读2(整体架构:DETR类)

🚩🚩🚩Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 DETR 算法解读 DETR 源码解读1(项目配置/CocoDetection类/ConvertCocoP…

什么是485远程水表?

485远程水表是一种利用RS485通信协议进行数据传输的智能水表,它具有远程读数、实时监控、数据存储等功能,为水资源管理和居民用水提供了便捷。在我国,随着物联网、大数据等技术的发展,485远程水表得到了广泛的应用,为智…

引领企业服务新篇章,纷享销客揽获4项大奖

近日,连接型CRM的开创者纷享销客,凭借其卓越的整体实力,分别荣获《互联网周刊》&eNet研究院“2023年度最佳企业服务产品奖”、携手盈建科荣获中国工业报社“数字化转型优秀案例”、入选产业家“2023产业数字化金铲奖”以及KVBrand“2023年…

BUUCTF第二十二、二十三题解题思路

第二十二题[WUSTCTF2020]level1 查壳 64位ELF文件,用64位IDA打开。 在函数界面可以看到一个“flag”,跟进该函数。 int __cdecl main(int argc, const char **argv, const char **envp) {int i; // [rsp4h] [rbp-2Ch]FILE *stream; // [rsp8h] [rbp-2…

Java项目中,值的对应问题

数据库表 实体类&#xff08;对应数据库的字段&#xff0c;可以驼峰命名&#xff09; 封装的查询方法sql List<Student> getAllStudents(String name,String studentId,Integer classId,String className); 这里的值一一对应。 在多表查询时&#xff0c;查询到的指定字段…

备战蓝桥杯 Day3

目录 搜索与回溯 1222&#xff1a;放苹果 1221&#xff1a;分成互质组 1218&#xff1a;取石子游戏 数组 1126&#xff1a;矩阵转置 1127&#xff1a;图像旋转 1128&#xff1a;图像模糊处理 1120&#xff1a;同行列对角线的格 string 2046&#xff1a;【例5.15】替换…

JAVA高并发——核心知识点

文章目录 1、重要概念1.1、同步(Synchronous)和异步(Asynchronous)1.2、并发(Concurrency)和并行(Parallelism)1.3、临界区1.4、阻塞(Blocking)和非阻塞(Non-Blocking)1.5、死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)1.6、并发级别1.6.1、阻塞1.6.2、无饥饿(Starvation…

2011-2022年上市公司ESG表现、制造业高质量发展与数字化转型原始数据计算结果do代码

2011-2022年上市公司ESG表现、制造业高质量发展与数字化转型 原始数据(exceldta)计算结果do代码 参照王丹&#xff08;2023&#xff09;的做法&#xff0c;对来自统计与决策《ESG表现、制造业高质量发展与数字化转型》一文中的基准回归部分进行复刻&#xff1a; 1、数据时间&a…

java 单例模式

单例模式是最简单的设计模式之一。即一个类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建&#xff0c;提供一种访问其唯一的对象的方式&#xff0c;可以直接访问&#xff0c;不需要实例化该类的对象。 1、懒汉式&#xff0c;线程不安全 public class Singleton …

两个发散级数的和是否发散?

1、两个发散级数的和可能是收敛的也可能是发散的。 例子&#xff1a; 发散级数 ∑ 1 n \sum\frac{1}{n} ∑n1​和发散级数 ∑ ( 1 n 2 − 1 n ) \sum(\frac{1}{n^{2}}-\frac{1}{n}) ∑(n21​−n1​)的和是收敛级数&#xff1b; 发散级数∑(1/n) 和发散级数 ∑(1/n1/n) 的和是…

为什么你用的redis没有出现雪崩,击穿,穿透

一、前言 在大规模并发访问系统中&#xff0c;如果你的系统用到redis&#xff0c;在面试的时候面试官往往会问你的系统有没有出现雪崩&#xff0c;击穿&#xff0c;穿透这样的场景&#xff0c;然后是怎样解决的。博主也经常反复温习redis的特性&#xff0c;总是被雪崩&#xf…

不懂咱就学,记不住多看几遍(二)

一、Redis分布式锁中加锁与解锁、过期如何续命 实现要点&#xff1a; 互斥性&#xff0c;同一时刻&#xff0c;只能有一个客户端持有锁。防止死锁发生&#xff0c;如果持有锁的客户端因崩溃而没有主动释放锁&#xff0c;也要保证锁可以释放并且其他客户端可以正常加锁。加锁和…

请解释 C++ 中的析构函数,并说明它们的作用。

请解释 C 中的析构函数&#xff0c;并说明它们的作用。 在C中&#xff0c;析构函数&#xff08;Destructor&#xff09;是一种特殊类型的成员函数&#xff0c;用于在对象被销毁时执行特定的清理工作。析构函数的名称与类名相同&#xff0c;前面加上一个波浪号&#xff08;~&am…

【C++开篇 -- 入门语法篇】

C学习笔记---001 C知识开篇1、介绍C的背景以及与C语言的区别1.1、什么是C?1.2、C的背景 2、C与C语言的区别3、C优化命名空间3.1、C中的问题3.2、命名空间的应用 4、总结 C知识开篇 前言&#xff1a; 首先&#xff0c;C兼容C&#xff0c;C在C语言范畴上增添了一些优化&#xf…

WPF中样式

WPF中样式:类似于winform中控件的属性 <Grid><!-- Button属性 字体大小 字体颜色 内容 控件宽 高 --><Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/></Grid&g…

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计&#xff0c;比7.8版本方便多了&#xff0c;有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包&#xff0c;解压如下&#xff0c;右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…

UE5 动态加载资源和类

// Called when the game starts or when spawned void AMyActor::BeginPlay() {Super::BeginPlay();if (MyActor){UE_LOG(LogTemp,Warning,TEXT("MyActor is %s"),*MyActor->GetName());}//动态加载资源UStaticMesh* MyTmpStaticMesh LoadObject<UStaticMesh…

什么时候会触发FullGC?描述一下JVM加载class文件的原理机制?

什么时候会触发 FullGC&#xff1f; 除直接调用 System.gc 外&#xff0c;触发 Full GC 执行的情况有如下四种。 1. 旧生代空间不足 旧生代空间只有 在新生代对象转入及创建为大对象、大数组时才会出现不足的现象&#xff0c;当执行 Full GC 后空间仍然不 足&#xff0c;则…

ALINX黑金AXU3EGB 开发板用户手册RS485通信接口图示DI RO信号方向标识错误说明

MAX3485这类RS485芯片&#xff0c;DI是TTL信号输入&#xff0c;RO是TTL信号输出 如下图是MAX3485手册规格书。 因此 ALINX黑金AXU3EGB 用户手册 Page 43页 图 3-11-1 PL 端 485 通信的连接示意图&#xff0c;MAX3485芯片的DI RO信号输入输出标识方向是错误的&#xff0c;应为蓝…

Redis 只会用缓存?16种妙用让同事直呼牛X

1、缓存2、数据共享分布式3、分布式锁4、全局ID5、计数器6、限流7、位统计8、购物车9、用户消息时间线timeline10、消息队列11、抽奖12、点赞、签到、打卡13、商品标签14、商品筛选15、用户关注、推荐模型16、排行榜图片 1、缓存 String类型 例如:热点数据缓存(例如报表、明…