Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
af1ff963
提交
af1ff963
2月 22, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
x
上级
8b817997
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
109 行增加
和
0 行删除
+109
-0
idle.cc
kernel/idle.cc
+109
-0
没有找到文件。
kernel/idle.cc
0 → 100644
浏览文件 @
af1ff963
#include "types.h"
#include "kernel.hh"
#include "mmu.h"
#include "amd64.h"
#include "spinlock.h"
#include "condvar.h"
#include "queue.h"
#include "proc.hh"
#include "cpu.hh"
#include "bits.hh"
#include "kmtrace.hh"
#include "sched.hh"
#include "kalloc.h"
#include "vm.hh"
#include "ns.hh"
static
int
__mpalign__
idle
[
NCPU
];
static
struct
proc
*
the_idle
[
NCPU
]
__mpalign__
;
void
idleloop
(
void
)
{
extern
void
forkret
(
void
);
struct
proc
*
idlep
=
the_idle
[
cpunum
()];
// Test the work queue
//extern void testwq(void);
//testwq();
// Enabling mtrace calls in scheduler generates many mtrace_call_entrys.
// mtrace_call_set(1, cpu->id);
mtstart
(
scheduler
,
idlep
);
for
(;;){
// Enable interrupts on this processor.
sti
();
struct
proc
*
p
=
schednext
();
if
(
p
)
{
acquire
(
&
p
->
lock
);
if
(
p
->
state
!=
RUNNABLE
)
{
release
(
&
p
->
lock
);
}
else
{
if
(
idle
[
mycpu
()
->
id
])
idle
[
mycpu
()
->
id
]
=
0
;
// Switch to chosen process. It is the process's job
// to release proc->lock and then reacquire it
// before jumping back to us.
mycpu
()
->
proc
=
p
;
switchuvm
(
p
);
p
->
state
=
RUNNING
;
p
->
tsc
=
rdtsc
();
mtpause
(
idlep
);
if
(
p
->
context
->
rip
!=
(
uptr
)
forkret
&&
p
->
context
->
rip
!=
(
uptr
)
threadstub
)
{
mtresume
(
p
);
}
mtrec
();
swtch
(
&
mycpu
()
->
scheduler
,
myproc
()
->
context
);
mtresume
(
idlep
);
mtign
();
switchkvm
();
// Process is done running for now.
// It should have changed its p->state before coming back.
mycpu
()
->
proc
=
idlep
;
if
(
p
->
state
!=
RUNNABLE
)
delrun
(
p
);
release
(
&
p
->
lock
);
}
}
else
{
if
(
steal
())
{
if
(
idle
[
mycpu
()
->
id
])
idle
[
mycpu
()
->
id
]
=
0
;
}
else
{
if
(
!
idle
[
mycpu
()
->
id
])
idle
[
mycpu
()
->
id
]
=
1
;
}
}
if
(
idle
[
mycpu
()
->
id
])
{
int
worked
;
do
{
assert
(
mycpu
()
->
ncli
==
0
);
worked
=
wq_trywork
();
}
while
(
worked
);
sti
();
}
}
}
void
initidle
(
void
)
{
// allocate a fake PID for each scheduler thread
struct
proc
*
p
=
allocproc
();
if
(
!
p
)
panic
(
"initidle allocproc"
);
snprintf
(
p
->
name
,
sizeof
(
p
->
name
),
"idle_%u"
,
cpunum
());
mycpu
()
->
proc
=
p
;
myproc
()
->
cpu_pin
=
1
;
the_idle
[
cpunum
()]
=
p
;
idle
[
cpunum
()]
=
1
;
}
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论