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 如何添加系统调用
在 user/user.h
中添加系统调用函数的定义. 比如:
struct stat ;
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 ) ;
在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" ) ;
在 kernel/syscall.h
中定义系统调用号
# define SYS_mkdir 20
# define SYS_close 21
# define SYS_trace 22