问题标签 [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.
fork - os161中fork系统调用的实现
我正在尝试在 os161 中实现 fork 调用,但运行内核后出现以下错误:
我的 sys_fork 函数的伪流程:
创建新地址空间,陷阱帧
声明新的线程指针——ptrthread——我这里没有分配内存
as_copy(源->目标)
thread fork(name , new trapframe, (unsigned long)ptrthread->vmspace, forkentry 函数, ptrthread)
返回 pid()
伪分叉:
1.new trapframe = forkentry 的陷阱帧 arg
curthread->vmspace = forkentry 的 addrspace arg
激活(curthread->vmspace)
在新的陷阱框中设置一些变量
mips_usermode....
当我运行内核时发生以下错误并且内核停止执行:
sys161: System/161 release 1.14, compiled Aug 24 2011 10:55:58
OS/161 base system version 1.11
Copyright (c) 2000, 2001, 2002, 2003
President and Fellows of Harvard College. All rights rescheduler: Dropping thread <boot/menu>.
panic: Assertion failed: SAME_STACK(curkstack-1, (vaddr_t)tf), at ../../arch/mips/mips/trap.c:220 (mips_trap)
sys161: 930837 cycles (827682k, 0u, 103155i)
sys161: 130 irqs 20 exns 0r/0w disk 0r/279w console 0r/0w/1m emufs 0r/0w net
sys161: Elapsed real time: 0.087962 seconds (10.5823 mhz)
sys161: Elapsed virtual time: 0.037233480 seconds (25 mhz)
process - 系统调用开销
我刚开始研究系统调用。我想知道进行系统调用时导致开销的原因。
例如,如果我们考虑 getpid(),当对 getpid() 进行系统调用时,我的猜测是,如果控件当前在子进程中,则必须进行上下文切换才能进入父进程以获取 pid . 这会增加开销吗?
另外当getpid()被调用时,会有一些元数据跨越用户空间边界进出内核。那么用户空间和内核之间不断的切换会不会也造成一些开销呢?
semaphore - How semaphore value is checked using '==' operator?
A semaphore is declared and created like this --
Now what happens when,
the if condition is executed above ? since done was set to 0 do the statements inside the if block get executed ?
c - 如何在 2 个 .c 文件之间共享一个变量?
考虑一个变量 abulo。我正在尝试在 2 个 .c 文件之间共享 abulo。这是我所做的——
- 创建啊。此文件包含行 extern int abulo;
- ac 包含这样的语句,int abulo = 0;
- 在bc中,ah已经包括在内。然后只有一个 kprintf 函数打印你的值。
但是当我尝试运行代码时,它会向我显示这样的输出——
尝试使用此处给出的公认答案的想法-如何在不同的 .c 文件之间共享变量?
我在这里做错了什么?如何摆脱这个错误?
eclipse - ***缺少分隔符。停止。eclipse 尝试运行 OS/161 时
在第 13 行 .include "$(TOP)/mk/os161.config.mk" 我安装了 OS161 工具并尝试在 Eclipse 上运行 OS161 并正在编译依赖项。
os161 - OS/161 中的系统调用
关于如何执行系统调用,我一直在浏览 OS/161 中的代码。据我所知,系统调用(例如reboot()
)实际上由 OS/161 内核转换为对sys_reboot()
. 类似地,调用 tofork()
将被转换为调用sys_fork()
.
我的理解正确吗?
谢谢。
c - Why is the pointer changing for no reason?
I am working on Assignment 2 of ops-class.
The following function bootstraps a file handler array for the process that is being created (eg. user processes for test programs provided here).
If I use os161-gdb to step through this function, I notice the following:
This is the strange part. After stepping through the second call to kmalloc (to init stdoutfh), the stdinfh->fh_vnode pointer changes value!
And even stranger, after proceeding to the following line
The value of *stdoutfh->fh_vnode and *stdinfh->fh_vnode IS THE SAME
1 possible explanation: Does the OS not have enough heap memory. I find it unlikely and even after assuming this, I can't exactly explain what is happening here.
Some extra code
- _fh_create
struct fh definition
struct fh { uint32_t fd; // file descriptor int flag; // File handler mode off_t fh_seek; // seek position in file struct vnode **fh_vnode; // File object of the file }
Definition of struct vnode can be found here.
Please let me know if you need more info and thanks for the help!
linux - Makefile 错误 - “***缺少分隔符”和“***recipe 在第一个目标之前开始”
我正在尝试为 os161 构建用户空间。当我在命令行中键入 make 时,出现以下错误:
Makefile 24:***缺少分隔符(您的意思是 TAB 而不是 8 个空格?)。停止。
我在第 24 行检查了 Makefile 并尝试在该行的开头添加一个 TAB,但这没有用,因为我得到了另一个错误:
Makefile 24: ***recipe 在第一个目标之前开始。停止。
这是完整的makefile供参考:
该行是问题(24)是:
任何帮助,将不胜感激。我检查了类似的 makefile 错误,但似乎找不到问题所在。
gdb - 使用 DDD 为 OS-161 设置 GDB
我正在设置 gdb 来调试 OS-161,并且我计划使用 DDD 作为可视化前端。我正在遵循官方 CS-161 课程页面的说明:http ://www.eecs.harvard.edu/~cs161/resources/eclipse.html (向下滚动到 DDD)。
在切换到我构建内核的内核/编译/DUMBVM 后,我启动 DDD ddd -debugger mips-harvard-os161-gdb --gdb kernel
(因为 OS161 内核作为内核安装)。当我这样做时,DDD 会打开我的操作系统树的一个源文件。
然后在使用调试模式启动 sys161 后sys161 -w kernel
,我输入target remote unix:os161/root/.sockets/gdb
DDD,这给了我以下错误:unix:os161/root/.sockets/gdb: No such file or directory
什么可能导致此错误?我可以使用 .gdbinit 中的目标远程命令成功设置 gdb 而无需 DDD,因此我知道 .sockets 目录中的 gdb 文件存在并且有效。我怀疑的一件事是为什么启动 ddd 的初始命令会打开一个特定的源文件(每次都一样),这可以链接吗?
如果任何有 OS161 经验的人都知道如何使用 GUI 前端设置 gdb(不必严格使用 DDD)以简化调试(我不想使用 vim :/),那就太好了。
顺便说一句,如果有帮助,我正在使用 Debian Jessie。
os161 - os161 的良好调试器,如 IntelliJ IDEA
我正在使用 os161,但找不到像 IntelliJ IDEA 这样漂亮的调试器
你有什么想法吗?
我用 emacs 尝试过 gdb、ddd 和 gdb,但它们不如 IntelliJ