问题标签 [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 投票
2 回答
2038 浏览

unix - xv6 中的上下文是什么?

contextxv6 OS中的用途是什么?每个寄存器的工作是什么context

0 投票
0 回答
1824 浏览

c - xv6 中的彩票调度程序 - 导致内核失败的随机数生成器

我正在尝试在 xv6 中实现彩票调度,我似乎遇到了一个错误。我需要有关调试方向的帮助。这是我的代码:

在proc.c中

我修改了函数 void scheduler 并添加了一个用于生成随机数的新函数:

当我尝试使用 qemu 启动模拟器和内核时,按继续后,我收到此错误:

恐慌:初始化退出 80104478 80106210 80105461 80106729 8010651d 0 0 0 0 0

它似乎来自 log.c

0 投票
2 回答
3338 浏览

unix - xv6 KERNBASE limitation of process memory

There is a question in the xv6 book which bothers me for a long time, and I wondered if anyone would like to clarify on this

KERNBASE limits the amount of memory a single process can use, which might be irritating on a machine with a full 4 GB of RAM. Would raising KERNBASE allow a process to use more memory?

In my opinion the answer to this question is no, since the whole mechanism around xv6 is designed to work with KERNBASE on a specific address space.

Thanks for any answer.

0 投票
1 回答
50 浏览

c - 自调用模块中的全局静态 int

(免责声明:这是作业)

我正在创建一个 shell 程序,我们称之为fancysh。我正在尝试将 PATH(和其他环境变量)功能添加到我的 shell 中,到目前为止一切都很好。我天真的方法是将所有这些变量作为静态变量存储在 fancysh.c 中。但是现在我正在尝试实现环境变量 SHLVL ,它保存了当前的“深度”外壳。例如,我可以在 fancysh 的第一个实例中运行,并且 SHLVL 应该读取 1,在再次调用 fancysh 时,SHVLL 应该增加(并且在退出 shell 时减少)。

我尝试过的...

花哨的.h

花式的.c

我在这里这里使用了答案作为这个解决方案的一部分。

那么我将如何实现花哨的代码来确定 SHLVL 是否已初始化?我对使用 and 的组合有一些想法#ifdef#define但我不是 100% 确定如何做到这一点。

0 投票
1 回答
904 浏览

c - 将结构数组从用户空间传递到内核空间然后再返回时遇到问题

我正在尝试创建一个简单的顶级实用程序 xv6。为此,我创建了一个允许我访问内核空间的系统调用。我遵循了许多关于如何创建系统调用的指南,并且我的代码编译没有问题。

当我尝试在 qemu 中运行 top 时,我的问题存在。每当我尝试访问我的结构数组时,无论它是在内核空间还是用户空间,都会出现陷阱 14 错误。

为了稍微分解一下,我有一个top.c文件:

在 sysproc.c 中:

然后在 procs.c

同样,我的假设是,当我将表从用户传递到内核时,它会被损坏,但话虽如此,我不确定如何正确传递它。

0 投票
1 回答
501 浏览

unix - xv6 中的比赛条件

我是操作系统领域的新手,并试图通过侵入 xv6 来学习它。我的疑问是我们能否在调用 fork 之前决定是使用系统调用运行父级还是子级。i,ei 可以让一个函数传递一个参数给内核空间,并决定是先运行parent还是child先运行。参数可以是:1-parent 0-child。

0 投票
1 回答
965 浏览

c - x86 add 和 addl 操作数添加错误?

我使用 xv6,它在 x86 机器上实现了原始 UNIX。我在 C 程序中编写了非常简单的内联汇编:

我通常会得到第二个打印语句打印的 434 之类的值。但是,在添加命令之后它会打印 2。如果我改用 addl 命令,它也会打印 2。我使用的是 xv6 的最新稳定版本。所以,我真的不怀疑这是问题所在。有没有其他方法可以在内联汇编中添加两个数字?

本质上,我需要将 16(%esp) 增加 4。


将代码编辑为:

__asm__("addl $8, 16(%esp)\t\n");

0 投票
1 回答
1083 浏览

c - xv6 中的堆栈帧操作仅适用于 printf()?

我正在尝试为我的操作系统类扩展 xv6 内核,但我遇到了一个奇怪的错误,它占用了我 5 个小时的时间却无济于事。我实现了一个信号处理系统,该系统将信号处理函数和参数手动插入到指令指针中,现在我试图通过将易失性寄存器值推送到用户堆栈中来保存它们,然后在信号处理程序之后将它们弹出到它们的原始寄存器中返回。

这是我设置堆栈框架的方式:

所以我将堆栈底部设置为旧指令指针,推送易失性寄存器,推送信号处理程序参数,推送将弹出寄存器的函数,然后最后将 eip(指令指针)设置为等于信号处理程序的地址。

这是我用来弹出寄存器的函数。真正奇怪的是,如果我在内联汇编之前有 sleep(5) 或 printf() 语句,我的程序会做正确的事情(正确保存寄存器的值),但如果我删除它,我会得到我假设的“越界代码”语句是分段错误的 xv6 等效项。即使它确实正确保存了寄存器的值,我也可以说堆栈正在变得混乱,因为处理程序在以后的信号处理调用中失败了。

我正在努力解决这个问题,因为我真的不知道如何很好地调试程序集 - 有人知道可能会发生什么吗?

0 投票
0 回答
794 浏览

c - Xv6 堆栈帧 - eip 的返回值被破坏?

我有以下代码试图在 xv6 中运行:

信号处理程序被推入堆栈,如下所示:

所以我将堆栈底部设置为旧指令指针,在这种情况下应该是指令

然后我推送易失性寄存器,推送信号处理程序参数,推送将弹出寄存器的函数,最后将 eip(指令指针)设置为等于信号处理程序的地址。

这是我的弹出功能:

通常,这段代码应该运行并陷入 SIGFPE 调用的无限循环,因为每次处理程序运行时我都将指令指针设置回 x = x/y 调用。但是,由于某种原因,它会向前跳过并完成程序,然后以非常不准确的 EIP 值出现分段错误。

真正让我困惑的是,如果我在下面添加另一条指令 x = x/z,它会完美运行。当我尝试打印出程序的 EIP 时,它正确指向 x = x/y,因此它甚至没有执行 x/z 部分。

有人可以帮我理解这一点吗?我正在努力理解堆栈中可能发生的事情

0 投票
1 回答
155 浏览

c - 静态链接到 newlib 的程序无法在 xv6 中运行

在 xv6 中运行 newlib 链接程序时遇到了一些问题。(是我使用的 newlib 端口)

我使用这个工具链来编译 newlib。编译没有任何问题,我确实得到了 libc.a、libm.a 和其他库文件。

然后我编写了一个 hello world 程序并将它与 newlib 静态链接。该程序就像这样:

但是生成的可执行文件对于 xv6 文件系统来说太大了(这是设计的限制),所以我把它剥离了。剥离后文件大小为 53k,所以现在可以将其放入 fs.

当我运行“make qemu”时,我能够进入系统,并且其他程序运行良好。但是当我运行我的测试程序时,它卡住了几秒钟,然后它说“panic:loaduvm:addr must be page aligned”。是因为我剥离了我的程序,还是我必须对 xv6 源代码应用补丁或修改,或者其他一些原因?

PS 我使用的是来自官方 Github 存储库的最新版本的 xv6,下面是我用来编译测试程序的标志: