问题标签 [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 回答
20575 浏览

c - 如何将值传递给 XV6 中的系统调用函数?

我正在尝试在 XV6 中创建一个简单的基于优先级的调度程序。为此,我还必须创建一个允许进程设置其优先级的系统调用。正如这里和其他地方所讨论的,我已经完成了创建系统调用所需的一切:

如何在 xv6 中添加系统调用/实用程序

问题是,当我调用函数时,我不能传递任何变量,或者更确切地说,它运行起来好像没有错,但正确的值没有显示在函数内部。

外部声明(syscall.c):

系统调用向量 (syscall.h):

实现(sysproc.c):

(defs.h & user.h):

宏(usys.S):

函数调用:

输出:

这些值始终是相同的确切数字:16843009。我通过将值分配给 pid 和 pty 来检查 cprintf 是否正常工作。我花了大约 6 个小时尝试所有我能想到的所有可能的组合,我开始认为在 XV6 中没有通过系统调用传递值的内置机制。我错过了什么吗?先感谢您。

0 投票
2 回答
436 浏览

process - 杀死一个进程时,我可以使用它的'`eax`来保存退出状态吗?

我正在学习 OS 课程,我们需要扩展 XV6exit()以支持退出状态,因此我们正在编写exit2(int).

为了保存被杀死进程的退出状态,我想到了两个候选者。

  1. 第一个选项是struct proc为退出状态添加一个变量。我对这个解决方案的问题是,它涉及到一个很小的原因改变操作系统的基本结构,而且这意味着我将为每个进程都有一个垃圾整数,这不是最好的主意。

  2. 第二个想法是将退出状态保存在被杀死进程的陷阱帧寄存器中,但是我内心有一些东西说我不应该相信eax被杀死进程中的值。

有什么更好的主意?(或更糟)

0 投票
1 回答
1059 浏览

assembly - CS:EIP 比较

我正在尝试使用 gdb 了解在 xv6(教学操作系统)中的引导。

初始引导期间的指令之一是(AT&T 语法):

接着,

现在,据我了解,cmpl 比较两个值并设置标志,如果刚刚比较的值不相等,jne 会查看标志并跳转。

但我不明白 %cs:0x65a4 作为操作数的含义。这是指地址的值 (cs*16 + 65a4),还是该内存位置的实际内容?

我问是因为系统最终不会在 jne 指令之后跳转,这意味着第二个操作数 (%cs:0x65a4) 评估为零。但这不应该是,因为地址和它的内容都不是零。

0 投票
1 回答
5338 浏览

unix - 如何实现具有结构参数的系统调用?

我想实现一个系统调用,在其中传递对结构变量的引用,然后我想在同一个文件中显示这些值。

例如我有以下结构。

假设我要实现的系统调用是int getProcessIds(struct procInfo*),我在一个名为pcid.c.

我希望系统调用从proc.c文件内部的调度程序中获取进程 ID,以便我可以在文件中打印它们pcid.c

我知道如何创建没有输入参数的常规系统调用。我也知道如何在文件中使用这个系统调用来打印进程 ID proc.c,但是我不知道如何在pcid.c文件中打印它们。我不明白 strucutre 指针是如何返回的,所以我可以在pcid.c.

我遵循了一个类似的系统调用int fstat(int fd, struct stat*),但我没有看到结构指针是如何返回的。

我希望我的问题很清楚,我使用的是 XV6 操作系统,谢谢!

更新

我能够让它工作,我不需要使用 malloc 来分配内存。奇怪的是,我在结构中添加了另一个变量,所以它变成了这样。

proc.c文件内的系统调用之后,这是我打印值的方式。

但奇怪的是我得到了trap 14 err 4 on cpu 1 eip 0x510 addr 0x7417ba08--kill proc,但是我尝试只打印一个值并且它有效。

或者

为什么当我只打印其中一个时它会起作用?我打印正确吗?

0 投票
2 回答
454 浏览

c - 需要帮助来理解 xv6 内核中的语法

我正在阅读 xv6 内核的文件,但我无法理解以下内容的含义:

谁可以给我解释一下这个?尤其是方括号(例如 [SYS_fork])的含义。谢谢

0 投票
1 回答
2755 浏览

system-calls - 如何在 xv6 中检索系统调用的名称?

有没有办法检索在 syscall() 中进行的系统调用的名称?我看到我们可以访问该号码;我可以以某种方式使用它吗?

0 投票
1 回答
1972 浏览

c - xv6 中的上下文切换和定时器中断

我正在尝试修改 xv6 中的调度策略,其中 Parent 在分叉后首先运行。

由于 xv6 的调度程序总是先运行 Parent,我需要先将上下文切换到 child,以便 child 先运行,然后再运行 parent。我曾尝试在代码中使用 wait() 但等待会失败,我不想使用失败。当我的用户级程序执行 fork 时,我需要修改上下文切换。

在 xv6 fork() 系统调用中,我做了以下更改

但这似乎不起作用。它是否与定时器中断有关。在进行上下文切换后,如何实现在 fork 中首先运行 child。

0 投票
1 回答
6056 浏览

c - 如何在 xv6 中实现优先级调度程序?

在 xv6 中实现优先级调度算法?

但我无法理解如何处理调度。我可以使用此代码设置优先级。

0 投票
2 回答
233 浏览

c - 在函数内的父子之间传输管道

我在以下事情上遇到了一些困难:
我正在尝试将管道发送到函数中的子节点,然后让子节点写入其中。
以下代码部分将更好地解释它:

并且 runcmd 将具有以下代码:

可悲的是,预期的结果应该是 - 父级将打印 id (getpid 是一个返回当前正在运行的进程 id 的函数),但它没有,它在唤起时什么也不打印。我做错了什么?

0 投票
1 回答
577 浏览

c - 从 1 个管道读取多个写入器

我们正在尝试从提供给多个子进程的管道中读取 char* 数据。
每个子进程将 char* 写入共享管道,父进程从中读取。
我们要做的是解析在 xv6 中运行的子进程的信息。
当解析单个进程时,我们没有任何问题,但是当解析一个对“runcmd”递归调用的管道进程时,会出现以下问题:
我们在父端使用了以下代码:

在孩子们的最后:

当我们用“ls|cat”运行这段代码时,它会打印:

而不是从每个孩子那里阅读并打印

为什么不单独发送?