【发布时间】:2021-06-20 13:50:18
【问题描述】:
我最近购买了这本书,以更好地了解操作系统的工作原理。我在第二章,我被这个问题困住了,我的操作系统无法使用我添加的代码启动。下面的代码是在 pic_proc 函数开始时添加到 proc.c 中的,以尝试修改调度程序。
修改。
int realtime;
clock_t recent_time[NR_TASKS + NR_PROCS];
clock_t stopwatch;
realtime = getuptime();
recent_time[proc_ptr->p_nr + NR_TASKS] = realtime - stopwatch;
stopwatch = realtime;
原代码:
PRIVATE void pick_proc()
{
register struct proc *rp; /* process to run */
int q; /* iterate over queues */
/* Modified Code here */
for (q=0; q < NR_SCHED_QUEUES; q++) {
if ( (rp = rdy_head[q]) != NIL_PROC) {
next_ptr = rp;
if (priv(rp)->s_flags & BILLABLE)
bill_ptr = rp;
return;
}
}
}
书籍操作系统设计和实现。第 3 版,Minix 书,P219,#45。 修改 Minix 3 调度程序以跟踪每个用户进程最近有多少 CPU 时间。当没有任务或服务器想要运行时,选择 CPU 份额最小的用户进程。
【问题讨论】:
-
如何“不启动”? Segfault,保护异常等?调用您的代码时,
proc_ptr有效 吗?可能是NULL。proc_ptr->p_nr是否在 0 到NR_PROC - 1的范围内?如果没有,你有 UB [未定义的行为] 并且你正在破坏堆栈 [我假设recent_time在堆栈上] 因为你的索引超出了recent_time的末尾。您应该添加if语句检查有效性并添加 [minux equiv of]printk以显示值。也许realtime应该是unsigned[和/或clock_t作为您将stopwatch设置为它的值]。recent_time可以放入堆栈吗? -
我已经添加了我修改过的 pic_proc 函数,如果有帮助的话。进行全新安装后,它将编译新映像。当我尝试从该映像启动时,它会死锁,我必须将其关闭并返回到上一个映像文件。
标签: c operating-system minix