任何人都可以告诉我/指出如何在XV6中添加系统调用/实用程序
谷歌上的详尽搜索是徒劳的,而且通过艰难的方式进行黑客攻击到目前为止还没有成效.
参考书也没有任何帮助世界的例子,从任何帮助开始,非常感谢
有人可以向我解释一下这个函数的语法吗?其中SYS_fork是常量,sys_fork是一个函数.
static int (*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,
};
Run Code Online (Sandbox Code Playgroud)
谢谢!
我们正在课程中教授xv6.目前我们使用windows中的putty登录我们学校的linux服务器.
在那里,我们使XV6的源代码更改(使用vim)然后编译并在运行QEMU简单
make clean
make
make qemu-nox
Run Code Online (Sandbox Code Playgroud)
它并不总是可以连接到他们的服务器,因此我希望能够编译和运行带有Windows的xv6(显然在一些模拟器中).
我可以用什么模拟器进行上述工作?(编辑代码,编译和运行)以及如何?
我正在做一个基于xv6的操作系统类,我编写了一个需要在其上运行的程序.
我知道我可以调试内核代码,make qemu-gdb
但我不确定如何调试我自己的用户程序.
可以说我想调试cat
,我该怎么做呢?
谢谢
PS是不是有xv6标签?这个问题是否应该在这里?
我试图在XV6中创建一个简单的基于优先级的调度程序.为此,我还必须创建一个允许进程设置其优先级的系统调用.我已经完成了创建系统调用所需的所有内容,如此处和其他地方所述:
问题是,当我调用函数时,我无法传递任何变量,或者更确切地说,它运行时没有任何错误,但正确的值不会显示在函数内部.
外部声明(syscall.c):
...
extern int sys_setpty(void);
static int (*syscalls[])(void) = {
...
[SYS_setpty] sys_setpty,
};
Run Code Online (Sandbox Code Playgroud)
系统调用向量(syscall.h):
#define SYS_setpty 22
Run Code Online (Sandbox Code Playgroud)
实现(sysproc.c):
void
sys_setpty(int pid, int pty)
{
cprintf("function pid: %d \n", pid);
cprintf("function pty: %d \n", pty);
}
Run Code Online (Sandbox Code Playgroud)
(defs.h和user.h):
void setpty(int, int);
Run Code Online (Sandbox Code Playgroud)
宏(usys.S):
SYSCALL(setpty)
Run Code Online (Sandbox Code Playgroud)
功能调用:
setpty(3, 50);
Run Code Online (Sandbox Code Playgroud)
输出:
function pid: 16843009
function pty: 16843009
Run Code Online (Sandbox Code Playgroud)
这些值始终是完全相同的确定数字:16843009.我已经通过为pid和pty分配值来检查cprintf是否正常工作.我花了大约6个小时尝试了我能想到的所有可能的组合,并且我开始认为没有内置的机制来通过XV6中的系统调用传递值.我错过了什么吗?先感谢您.
当我正在阅读xv6源代码时,我对下面声明的语法感到困惑.有谁可以向我解释一下?
extern struct cpu *cpu asm("%gs:0");
Run Code Online (Sandbox Code Playgroud) 我是一个研究生操作系统类,我们使用QEMU模拟我们的内核,并使用gdb进行调试.调试已经足够直截了当......直到现在.如何将gdb连接到我在QEMU中运行的其他CPU?
我们的makefile允许我们在一个终端中使用"make qemu-nox"或"make qemu-nox-gdb"启动qemu,如果我们使用后者,那么使用gdb在另一个终端中使用"gdb"连接到它(在同一目录中).因此,我不太确定如何再次连接到同一个QEMU,而是连接到另一个处理器(我现在一共运行4个).
我正在听 MIT 操作系统工程讲座。我已经安装了 Qemu 并成功运行了它,我可以在该文件夹中使用这些命令 "make clean" "make" 和 "make qemu" 。Labs 还有一个单独的文件夹...根据说明,我们必须在 labs 文件夹中使用“make”命令,但是当我在 labs 文件夹中使用 make 命令时,我收到以下错误
*** Error: Couldn't find a working QEMU executable.
*** Is the directory containing the qemu binary in your PATH
*** or have you tried setting the QEMU variable in conf/env.mk?
***
***
*** Error: Couldn't find a working QEMU executable.
*** Is the directory containing the qemu binary in your PATH
*** or have you tried setting the QEMU variable in …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 qemu 启动 xv6,但每当我运行时make qemu
,我都会收到以下错误
usertests.c: In function \xe2\x80\x98sbrktest\xe2\x80\x99:\nusertests.c:1461:13: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]\n 1461 | *lastaddr = 99;\n | ~~~~~~~~~~^~~~\ncc1: all warnings being treated as errors\nmake: *** [<builtin>: usertests.o] Error 1\n
Run Code Online (Sandbox Code Playgroud)\n运行make qemu-nox
导致同样的错误。我正在使用Kubuntu 21.10
操作系统。这里是一种解决方法,但如果有人发现,我正在寻找解决方案。
我正在运行xv6
- 由 MIT 制造的操作系统。我正在运行 gdb 来检查堆栈指针(?)。我正在运行gdb
以查看堆栈指针寄存器的值。
我的教授说“让我们看看堆栈”然后输入x/24x $esp
.
问题:什么是x
, /
, 24
, $esp
??? $esp 只是一个显示堆栈寄存器当前地址的堆栈指针?
我得到的输出是:
(gdb) x/24x $esp
0x7bdc: 0x00007db4 0x00000000 0x00000000 0x00000000
0x7bec: 0x00000000 0x00000000 0x00000000 0x00000000
0x7bfc: 0x00007c4d 0x8ec031fa 0x8ec08ed8 0xa864e4d0
0x7c0c: 0xb0fa7502 0xe464e6d1 0x7502a864 0xe6dfb0fa
0x7c1c: 0x16010f60 0x200f7c78 0xc88366c0 0xc0220f01
0x7c2c: 0x087c31ea 0x10b86600 0x8ed88e00 0x66d08ec0
Run Code Online (Sandbox Code Playgroud)
我从谷歌找到了一些参考:
x/6x $esp 以查看 int 放入堆栈中的内容。
(gdb) x/6x $esp
0x7bdc: 0x00007db4 0x00000000 0x00000000 0x00000000
0x7bec: 0x00000000 0x00000000
Run Code Online (Sandbox Code Playgroud)
这对我来说没有意义。
PS此时我需要找到堆栈的开头和堆栈上的项目。(一旦我理解了这个命令!)
参考: …