问题标签 [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.
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
分别对应一般保护错误和页面错误。有谁知道是什么导致新线程在创建后立即被杀死?
assembly - Clang 或 LLVM 中的 `-Wa,-divide` 选项
我正在将xv6从 GCC 移植到 Clang,并遇到以下错误消息:
请注意,-Wa
它用于将参数传递给汇编器,我无法弄清楚该-divide
选项是什么。
no-integrated-as
作为修复,目前我通过将选项传递给 Clang 来关闭集成汇编器。但我想使用 Clang 的集成汇编。忽略此选项是否安全?或者是否有另一种方法可以将该选项提供给 Clang?
inode - 在 XV6 中按名称获取目录/文件的 dinode/inode
我正在尝试遍历 xv6 文件系统中所有已分配的 inode,我想获取根目录的 dinode 并从那里开始,但我无法让它工作。我尝试使用 'dirlookup()' 但无论我导入什么,我都会收到错误消息,指出该函数未定义。
stack - xv6中如何访问栈顶?
我正在尝试访问 xv6 中主进程的堆栈顶部。我必须怎么做?
谢谢。
c - Unix(在 C 中)试图为 XV6 编写尾部
嗨stackoverflow(ers)!
我正在使用 XV6 OS 学习 Unix(在此处找到的文档),并且一直在尝试用 C 编写尾部函数。预期输出:
- tail 是给出文件的最后 10 行
- tail - 给出文件的最后一行
- tail ... 就是给出文件的最后 10 行 ...
- tail - ... 是给出...的最后一行
- grep | tail 是给出最后 10 个句子,其中包含
我已经编写了两个版本的tail,一个使用char* [] 实现,另一个通过写入文件然后从中读取(都在下面发布)我使用char* [] 实现tail 的版本似乎更准确实际的命令。但是,在我写入临时文件然后从中读取的版本中,我得到更多行作为输出,我不确定为什么会发生这种情况。我的猜测是,在从一个文件读取并写入另一个文件时,'\n' 的位置会变得混乱。我非常感谢帮助解决这个问题!
如果我在做傻事,请不要生我的气。我是 Unix 中的 C 新手,只是想学习。
tail.c 使用 char* []
tail.c 使用写入
我将代码放在我的 Github 上(在此处找到)以及 tail_using_str.c 和 tail_using_file.c
c - 试图理解 XV6 上的 UNIX 系统调用
我正在尝试在 XV6 上编写一个简单的系统调用(此处提供文档,此处提供Github ),以了解它们是如何实现的。我已经使用了这些步骤
- 在
syscall.c
,声明extern int sys_hello(void)
并添加[SYS_hello] sys_hello
到static int (*syscalls[])(void)
数组中 - 在
syscall.h
中,定义SYS_hello
为索书号 22 - 在
user.h
中,将函数原型声明为int hello (void);
- 在
usys.S
,添加SYSCALL(hello)
到宏 中,在底部
/li>sysproc.c
添加了函数sys_hello(void)
创建
hello.c
它只是调用hello()
系统调用- 添加
hello.c
到Makefile
并运行代码
它按预期工作。
现在,我的问题是 syscall.c 中的数组似乎将命令的索引与 syscall.h 文件中的系统调用号相匹配但是,如果我将 hello 位置移动到 syscall.c 中的第二个位置并让syscall.h 中的系统命令号保持 22 系统命令和以前一样工作。在哪里,我预计它会坏掉。你能帮我理解数组 syscall.c 是如何映射到 syscall.h 系统调用号的吗?
我对 XV6 和 C 相当陌生,所以如果这个问题看起来很愚蠢,请不要生我的气,我只是想学习。
如果有帮助,这里是我的 XV6 存储库分支的 Github 链接:github.com/AdityaSingh/XV6
assembly - x86 汇编语言:如何解释 CS 寄存器的值
背景信息:我在 QEMU 下运行 Xv6,并使用 GDB 作为调试器。我正在逐步浏览引导加载程序以查看它的功能。Xv6 旨在在加载内核之前切换为 32 位代码。
在汇编文件bootasm.S
中,跳转到 32 位。进行转换的指令如下:
跳转之前的分段地址寄存器(由CS
和EIP
连接的寄存器组成)的值,可以从GDB's info reg
命令中读取,是CS=0x0:EIP=7c2c
.
跳转之后,分段地址就是 now CS=0x8:EIP=0x7c31
,这里0x7c31
是 32 位代码的开始地址(包含在 bootasm.S 下start32
)。.
我知道分段地址通过乘以CS
16 并EIP
作为偏移量添加到物理地址中。例如,当 时CS = 0x0
,物理地址为(0x10 * 0xf000) + 0x7c2c = 0xf0000 + 0x7c2c = 0xf7c2c
。
我的问题是关于CS
寄存器的内在价值。现在如何CS
从0x0
等于0x8
运行 32 位代码?如果我理解正确,基于如何0x0 * 16 = 0xf0000
,那么0x8 * 16 = 0xf0080
,对吗?但是这个分段地址如何等同于 32 位呢?还是我只是误解了CS
寄存器的值代表什么?
编辑:感谢回复,我意识到LGDT
在跳转之前执行的指令是相关的。这是跳转前的指令及其后续指令,可在以下位置找到bootasm.S
:
c - 如何使用 GDB 调试带有 SMP(对称多处理器)的 QEMU?
我在研究生操作系统课上,我们正在使用 QEMU 模拟我们的内核,并使用 gdb 对其进行调试。到目前为止,调试已经足够简单了。如何将 gdb 连接到我在 QEMU 中运行的其他 CPU?
我们的 makefile 允许我们在一个终端中使用“make qemu-nox”或“make qemu-nox-gdb”启动 qemu,如果我们使用后者,则在另一个终端中使用“gdb”通过 gdb 连接到它(在同一目录中)。因此,我不太确定如何再次连接到同一个 QEMU,而是连接到不同的处理器(我现在总共运行 4 个)。
c - 如何在c中动态调用函数
我在 XV6 的内核模块中工作。我需要像这样进行动态调用:
但是得到一个错误:错误:被调用的对象不是函数或函数指针
c - 如何将参数传递给 xv6 的系统调用?
我正在尝试在 xv6 上实现一个新的系统调用。在传递论点时遇到了一些麻烦。可以说这是我的系统调用。
如何在 sysproc.c 中获得这两个指针?谢谢,