问题标签 [xv6]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4167 浏览

c - 如何在 xv6 中实现内核级线程的克隆

在尝试测试我的克隆系统调用(下面的代码)时,我不断收到以下错误:

pid 4 thread_test: trap 13 err 0 on cpu 1 eip 0xc54 addr 0x0--kill proc pid 5 thread_test: trap 14 err 4 on cpu 1 eip 0x0 addr 0x28ec83e5--kill proc

分别对应一般保护错误和页面错误。有谁知道是什么导致新线程在创建后立即被杀死?

0 投票
1 回答
893 浏览

assembly - Clang 或 LLVM 中的 `-Wa,-divide` 选项

我正在将xv6从 GCC 移植到 Clang,并遇到以下错误消息:

请注意,-Wa它用于将参数传递给汇编器,我无法弄清楚该-divide选项是什么。

no-integrated-as作为修复,目前我通过将选项传递给 Clang 来关闭集成汇编器。但我想使用 Clang 的集成汇编。忽略此选项是否安全?或者是否有另一种方法可以将该选项提供给 Clang?

0 投票
1 回答
1095 浏览

inode - 在 XV6 中按名称获取目录/文件的 dinode/inode

我正在尝试遍历 xv6 文件系统中所有已分配的 inode,我想获取根目录的 dinode 并从那里开始,但我无法让它工作。我尝试使用 'dirlookup()' 但无论我导入什么,我都会收到错误消息,指出该函数未定义。

0 投票
0 回答
340 浏览

stack - xv6中如何访问栈顶?

我正在尝试访问 xv6 中主进程的堆栈顶部。我必须怎么做?

谢谢。

0 投票
2 回答
1972 浏览

c - Unix(在 C 中)试图为 XV6 编写尾部

嗨stackoverflow(ers)!

我正在使用 XV6 OS 学习 Unix(在此处找到的文档),并且一直在尝试用 C 编写尾部函数。预期输出:

  1. tail 是给出文件的最后 10 行
  2. tail - 给出文件的最后一行
  3. tail ... 就是给出文件的最后 10 行 ...
  4. tail - ... 是给出...的最后一行
  5. grep | tail 是给出最后 10 个句子,其中包含

我已经编写了两个版本的tail,一个使用char* [] 实现,另一个通过写入文件然后从中读取(都在下面发布)我使用char* [] 实现tail 的版本似乎更准确实际的命令。但是,在我写入临时文件然后从中读取的版本中,我得到更多行作为输出,我不确定为什么会发生这种情况。我的猜测是,在从一个文件读取并写入另一个文件时,'\n' 的位置会变得混乱。我非常感谢帮助解决这个问题!

如果我在做傻事,请不要生我的气。我是 Unix 中的 C 新手,只是想学习。

tail.c 使用 char* []

tail.c 使用写入

我将代码放在我的 Github 上(在此处找到)以及 tail_using_str.c 和 tail_using_file.c

0 投票
1 回答
667 浏览

c - 试图理解 XV6 上的 UNIX 系统调用

我正在尝试在 XV6 上编写一个简单的系统调用(此处提供文档,此处提供Github ,以了解它们是如何实现的。我已经使用了这些步骤

  1. syscall.c,声明extern int sys_hello(void)并添加[SYS_hello] sys_hellostatic int (*syscalls[])(void)数组中
  2. syscall.h中,定义SYS_hello为索书号 22
  3. user.h中,将函数原型声明为int hello (void);
  4. usys.S,添加SYSCALL(hello)到宏
  5. 中,在底部sysproc.c添加了函数sys_hello(void)

    /li>
  6. 创建hello.c它只是调用hello()系统调用

  7. 添加hello.cMakefile并运行代码

它按预期工作。

现在,我的问题是 syscall.c 中的数组似乎将命令的索引与 syscall.h 文件中的系统调用号相匹配但是,如果我将 hello 位置移动到 syscall.c 中的第二个位置并让syscall.h 中的系统命令号保持 22 系统命令和以前一样工作。在哪里,我预计它会坏掉。你能帮我理解数组 syscall.c 是如何映射到 syscall.h 系统调用号的吗?

我对 XV6 和 C 相当陌生,所以如果这个问题看起来很愚蠢,请不要生我的气,我只是想学习。

如果有帮助,这里是我的 XV6 存储库分支的 Github 链接:github.com/AdityaSingh/XV6

0 投票
0 回答
1473 浏览

assembly - x86 汇编语言:如何解释 CS 寄存器的值

背景信息:我在 QEMU 下运行 Xv6,并使用 GDB 作为调试器。我正在逐步浏览引导加载程序以查看它的功能。Xv6 旨在在加载内核之前切换为 32 位代码。

在汇编文件bootasm.S中,跳转到 32 位。进行转换的指令如下:

跳转之前的分段地址寄存器(由CSEIP连接的寄存器组成)的值,可以从GDB's info reg命令中读取,是CS=0x0:EIP=7c2c.

跳转之后,分段地址就是 now CS=0x8:EIP=0x7c31,这里0x7c31是 32 位代码的开始地址(包含在 bootasm.S 下start32)。.

我知道分段地址通过乘以CS16 并EIP作为偏移量添加到物理地址中。例如,当 时CS = 0x0,物理地址为(0x10 * 0xf000) + 0x7c2c = 0xf0000 + 0x7c2c = 0xf7c2c

我的问题是关于CS寄存器的内在价值。现在如何CS0x0等于0x8运行 32 位代码?如果我理解正确,基于如何0x0 * 16 = 0xf0000,那么0x8 * 16 = 0xf0080,对吗?但是这个分段地址如何等同于 32 位呢?还是我只是误解了CS寄存器的值代表什么?

编辑:感谢回复,我意识到LGDT在跳转之前执行的指令是相关的。这是跳转前的指令及其后续指令,可在以下位置找到bootasm.S

0 投票
1 回答
2074 浏览

c - 如何使用 GDB 调试带有 SMP(对称多处理器)的 QEMU?

我在研究生操作系统课上,我们正在使用 QEMU 模拟我们的内核,并使用 gdb 对其进行调试。到目前为止,调试已经足够简单了。如何将 gdb 连接到我在 QEMU 中运行的其他 CPU?

我们的 makefile 允许我们在一个终端中使用“make qemu-nox”或“make qemu-nox-gdb”启动 qemu,如果我们使用后者,则在另一个终端中使用“gdb”通过 gdb 连接到它(在同一目录中)。因此,我不太确定如何再次连接到同一个 QEMU,而是连接到不同的处理器(我现在总共运行 4 个)。

0 投票
0 回答
54 浏览

c - 如何在c中动态调用函数

我在 XV6 的内核模块中工作。我需要像这样进行动态调用:

但是得到一个错误:错误:被调用的对象不是函数或函数指针

0 投票
1 回答
3653 浏览

c - 如何将参数传递给 xv6 的系统调用?

我正在尝试在 xv6 上实现一个新的系统调用。在传递论点时遇到了一些麻烦。可以说这是我的系统调用。

如何在 sysproc.c 中获得这两个指针?谢谢,