问题标签 [os161]
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.
exec - 如何在execv中的Os / 161中获取指向用户内存地址空间的指针
我正在写execv(char *program, char **args)
电话Os/161。
因此,我得到了程序和内核空间的 args 中提供的数据用户的副本。然后我创建全新的地址空间,加载带有 args 的程序。
问题是如何找到指向用户空间虚拟内存的适当指针,以便在切换到用户空间之前将数据从内核空间复制到用户空间?
c - 如何让子进程通过 sys_fork() 分叉以使其内核堆栈包含陷阱帧?
我正在内核级别上实现系统调用 sys_fork() 。我根据要求将父进程复制到子进程。问题是如何将孩子的trapframe(父trapframe的副本)复制到孩子的内核堆栈上以传递mips_usermode()中的断言?
c - 增量同步原语
我是一个学习线程的初学者,我有一个作业来解决 os161 的互斥问题,通过启动几个增加一个公共计数器的线程来从 0 计数到 10000。我不知道如何使用同步原语来改进它,请帮忙。
operating-system - os161 父子线程pid
有谁熟悉os/161可以帮我回答几个问题吗?
子 pid,父 pid 究竟是如何工作的。
我知道,当您调用时,thread_fork()
您正在基于当前线程创建另一个线程,新线程应该具有自己的唯一 ID 和不同的文件描述符表。在从 中sys_fork
创建一个孩子时curthread
,除了pid之外,孩子与父母相同。但我对 pid 和父 pid 的工作方式感到困惑。
这是我对进程表的解释。整个系统只有一个进程表。现在我有parent_pid
每个my_pid
线程。
- 一个父线程可以有多个子线程(通过不断调用sys_fork
)。
-一个孩子只能有一个父母。
- 每当sys_fork
被调用时,都会创建一个孩子,并将parent_pid
这个孩子的 pid 设置为创建这个孩子的线程的 pid。
-pid of 1 用于引导/菜单线程。
在理解进程表的工作原理方面,我是否走在正确的轨道上?
最后一个问题:对于sys_waitpid()
:只有父母可以使用waitpid
?他们只能等待他们的孩子吗?孩子可以waitpid
在父母身上使用(或者这会导致死锁)吗?
我一直在用谷歌搜索,但我发现了很多矛盾,直到现在我仍然找不到我的问题的明确答案。
operating-system - 为什么每个进程一个页表
起初我以为整个系统只有一个页表。但实际上每个进程只有一个页表?拥有多个页表而不是一个页表有什么意义。
我正在实施os161的一部分
c - C 编程 - 线程,以及什么是 void (*func)(void*, unsigned long)
我正在考虑修改一个玩具操作系统系统,我只是想了解一些代码及其作用。我得到了一个“线程”结构,它作为一个成员有一个“pcb”结构,它是一个进程控制块,它将线程连接到我猜的底层物理硬件。
无论如何,在这个“pcb”结构中,有一个初始化函数,它初始化一个新创建的线程的 pcb。这是函数定义:
关于代码,最后一个参数的含义是什么?是否与代码或指令有关
从概念上讲,我对事物如何融入更大的图景感到困惑。据我所知,线程是代码的执行单元;例如,它可能与用户程序有关,因此在线程之间快速切换会产生并行运行进程的错觉。好吧,所以这个线程需要它自己的堆栈、寄存器(不明白)和一些控制(pcb)。
对不起,如果这有点到处都是。作为参考,我正在启动OS161 项目。
谢谢。
c - OS161 在错误之前需要 '='、','、';'、'asm' 或 '__attribute__'
我正在做 os161 项目。我创建了一个包含 src/kern/include 中提供的 array.h 的文件。编译时,出现如下错误:./../include/array.h:85: error: expected '=', ',', ';', 'asm' or ' attribute ' before 'unsigned' ../../include/array.h:91:错误:在 'void' 之前应有 '='、','、';'、'asm' 或 ' attribute '
代码是这样的:
这种错误发生在每一行都有类似 INLINE 或 ARRAYINLINE 的东西。提供了这个 array.h 文件,我没有对其进行任何更改。实在想不通为什么。
c - OS161:加载时 TLB 未命中
当我运行 fork 测试时,我有一个 TLB 未命中错误,我知道这是由于将错误的 stackptr 传递给 mips_usermode ,我的实现似乎围绕这里的一些建议,如果我得到纠正她将不胜感激。我下面的代码作为 thread_fork 中的入口点函数提供。我错过了什么吗?
inline - sfs_inode (OS161) 的内联数据扩展
嗨,我正在使用 OS161,我正在尝试扩展我的 inode 结构,以便当我写入磁盘时,我将第一块文件数据写入实际的 inode 结构,因为目前它的设置使得大量结构被浪费了。
我想用 char sfi_inlinedata[INLINE_SIZE]; 替换上面的 sfi_waste 这样我的磁盘 io 将始终将第一个 INLINE_SIZE 数据写入/读取到 sfs_inode 结构。以下是我为相关 io 功能工作的来源。我知道我需要在这里更改偏移量映射到 io 函数中实际地址的方式,但是我无法提出具体的解决方案。 https://github.com/rbui/projectJailBait/blob/master/os161-1.11/kern/fs/sfs/sfs_vnode.c
任何帮助将非常感激!
synchronization - 线程如何在禁用中断的情况下休眠?
我试图了解下面的代码是如何工作的。这直接来自我的教授讲座幻灯片。这个 P() 和 V() 函数是我们在类 (OS161) 中使用的操作系统中信号量实现的一部分。我认为您可能需要了解 OS161 才能回答我的问题,因为它被广泛使用,希望有人可以回答这个问题。
我通过讲义对这段代码的理解:
X:P() 函数的流程
1. 当线程调用 P() 时,我们禁用中断
2. 检查 sem->count 上是否有可用资源
3.a) 如果count 为 0 然后我们进入睡眠
3.b) 如果 count != 0 然后我们递减 count 并允许调用线程继续到临界区
4. 启用 V() 函数的中断
Y:Flow
1. 当一个线程调用 V() 时,我们禁用中断
2. 增加计数器,这意味着现在还有 1 个资源可用于抓取
3. 现在我们继续唤醒我们发送到睡眠的所有线程 P( ),因为在线程试图抓住关键部分的锁时没有足够的可用资源
4. 启用中断
我的问题:
1. “禁用中断”部分是否禁用特定线程上的中断,还是禁用所有中断?
2.在V()函数上,当我们唤醒所有线程时,P()函数中休眠在while循环内的线程开始执行while循环。在讲座中,它说一个线程抓住锁并休息回去睡觉。我的问题是为什么“sem->count == 0”条件不会对其他线程评估为假,而对其他线程只有一个。
我真的很想知道中断禁用部分是如何工作的。这是我的第一个问题。它会停止线程调度程序吗?它会停止系统中的上下文切换吗?
为什么线程在中断禁用的情况下进入睡眠状态?是不是很危险,因为它可能会错过 I/O 完成信号和其他东西?
谢谢你。