问题标签 [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 中的系统调用函数?
我正在尝试在 XV6 中创建一个简单的基于优先级的调度程序。为此,我还必须创建一个允许进程设置其优先级的系统调用。正如这里和其他地方所讨论的,我已经完成了创建系统调用所需的一切:
问题是,当我调用函数时,我不能传递任何变量,或者更确切地说,它运行起来好像没有错,但正确的值没有显示在函数内部。
外部声明(syscall.c):
系统调用向量 (syscall.h):
实现(sysproc.c):
(defs.h & user.h):
宏(usys.S):
函数调用:
输出:
这些值始终是相同的确切数字:16843009。我通过将值分配给 pid 和 pty 来检查 cprintf 是否正常工作。我花了大约 6 个小时尝试所有我能想到的所有可能的组合,我开始认为在 XV6 中没有通过系统调用传递值的内置机制。我错过了什么吗?先感谢您。
process - 杀死一个进程时,我可以使用它的'`eax`来保存退出状态吗?
我正在学习 OS 课程,我们需要扩展 XV6exit()
以支持退出状态,因此我们正在编写exit2(int)
.
为了保存被杀死进程的退出状态,我想到了两个候选者。
第一个选项是
struct proc
为退出状态添加一个变量。我对这个解决方案的问题是,它涉及到一个很小的原因改变操作系统的基本结构,而且这意味着我将为每个进程都有一个垃圾整数,这不是最好的主意。第二个想法是将退出状态保存在被杀死进程的陷阱帧寄存器中,但是我内心有一些东西说我不应该相信
eax
被杀死进程中的值。
有什么更好的主意?(或更糟)
assembly - CS:EIP 比较
我正在尝试使用 gdb 了解在 xv6(教学操作系统)中的引导。
初始引导期间的指令之一是(AT&T 语法):
接着,
现在,据我了解,cmpl 比较两个值并设置标志,如果刚刚比较的值不相等,jne 会查看标志并跳转。
但我不明白 %cs:0x65a4 作为操作数的含义。这是指地址的值 (cs*16 + 65a4),还是该内存位置的实际内容?
我问是因为系统最终不会在 jne 指令之后跳转,这意味着第二个操作数 (%cs:0x65a4) 评估为零。但这不应该是,因为地址和它的内容都不是零。
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
,但是我尝试只打印一个值并且它有效。
或者
为什么当我只打印其中一个时它会起作用?我打印正确吗?
c - 需要帮助来理解 xv6 内核中的语法
我正在阅读 xv6 内核的文件,但我无法理解以下内容的含义:
谁可以给我解释一下这个?尤其是方括号(例如 [SYS_fork])的含义。谢谢
system-calls - 如何在 xv6 中检索系统调用的名称?
有没有办法检索在 syscall() 中进行的系统调用的名称?我看到我们可以访问该号码;我可以以某种方式使用它吗?
c - xv6 中的上下文切换和定时器中断
我正在尝试修改 xv6 中的调度策略,其中 Parent 在分叉后首先运行。
由于 xv6 的调度程序总是先运行 Parent,我需要先将上下文切换到 child,以便 child 先运行,然后再运行 parent。我曾尝试在代码中使用 wait() 但等待会失败,我不想使用失败。当我的用户级程序执行 fork 时,我需要修改上下文切换。
在 xv6 fork() 系统调用中,我做了以下更改
但这似乎不起作用。它是否与定时器中断有关。在进行上下文切换后,如何实现在 fork 中首先运行 child。
c - 如何在 xv6 中实现优先级调度程序?
在 xv6 中实现优先级调度算法?
但我无法理解如何处理调度。我可以使用此代码设置优先级。
c - 在函数内的父子之间传输管道
我在以下事情上遇到了一些困难:
我正在尝试将管道发送到函数中的子节点,然后让子节点写入其中。
以下代码部分将更好地解释它:
并且 runcmd 将具有以下代码:
可悲的是,预期的结果应该是 - 父级将打印 id (getpid 是一个返回当前正在运行的进程 id 的函数),但它没有,它在唤起时什么也不打印。我做错了什么?
c - 从 1 个管道读取多个写入器
我们正在尝试从提供给多个子进程的管道中读取 char* 数据。
每个子进程将 char* 写入共享管道,父进程从中读取。
我们要做的是解析在 xv6 中运行的子进程的信息。
当解析单个进程时,我们没有任何问题,但是当解析一个对“runcmd”递归调用的管道进程时,会出现以下问题:
我们在父端使用了以下代码:
在孩子们的最后:
当我们用“ls|cat”运行这段代码时,它会打印:
而不是从每个孩子那里阅读并打印
为什么不单独发送?