Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
7837c71b
提交
7837c71b
7月 06, 2006
创建
作者:
kaashoek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
disable all interrupts when acquiring lock
user program that makes a blocking system call
上级
b22d8982
隐藏空白字符变更
内嵌
并排
正在显示
10 个修改的文件
包含
58 行增加
和
14 行删除
+58
-14
Makefile
Makefile
+7
-2
defs.h
defs.h
+1
-0
ide.c
ide.c
+11
-2
main.c
main.c
+5
-8
spinlock.c
spinlock.c
+3
-2
syscall.c
syscall.c
+17
-0
syscall.h
syscall.h
+1
-0
trap.c
trap.c
+4
-0
ulib.c
ulib.c
+8
-0
x86.h
x86.h
+1
-0
没有找到文件。
Makefile
浏览文件 @
7837c71b
...
@@ -20,12 +20,12 @@ bootblock : bootasm.S bootmain.c
...
@@ -20,12 +20,12 @@ bootblock : bootasm.S bootmain.c
$(OBJCOPY)
-S
-O
binary bootblock.o bootblock
$(OBJCOPY)
-S
-O
binary bootblock.o bootblock
./sign.pl bootblock
./sign.pl bootblock
kernel
:
$(OBJS) bootother.S user1 usertests
kernel
:
$(OBJS) bootother.S user1 usertests
userfs
$(CC)
-nostdinc
-I
.
-c
bootother.S
$(CC)
-nostdinc
-I
.
-c
bootother.S
$(LD)
-N
-e
start
-Ttext
0x7000
-o
bootother.out bootother.o
$(LD)
-N
-e
start
-Ttext
0x7000
-o
bootother.out bootother.o
$(OBJCOPY)
-S
-O
binary bootother.out bootother
$(OBJCOPY)
-S
-O
binary bootother.out bootother
$(OBJDUMP)
-S
bootother.o
>
bootother.asm
$(OBJDUMP)
-S
bootother.o
>
bootother.asm
$(LD)
-Ttext
0x100000
-e
main
-o
kernel
$(OBJS)
-b
binary bootother user1 usertests
$(LD)
-Ttext
0x100000
-e
main
-o
kernel
$(OBJS)
-b
binary bootother user1 usertests
userfs
$(OBJDUMP)
-S
kernel
>
kernel.asm
$(OBJDUMP)
-S
kernel
>
kernel.asm
vectors.S
:
vectors.pl
vectors.S
:
vectors.pl
...
@@ -41,6 +41,11 @@ usertests : usertests.c ulib.o
...
@@ -41,6 +41,11 @@ usertests : usertests.c ulib.o
$(LD)
-N
-e
main
-Ttext
0
-o
usertests usertests.o ulib.o
$(LD)
-N
-e
main
-Ttext
0
-o
usertests usertests.o ulib.o
$(OBJDUMP)
-S
usertests
>
usertests.asm
$(OBJDUMP)
-S
usertests
>
usertests.asm
userfs
:
userfs.c ulib.o
$(CC)
-nostdinc
-I
.
-c
userfs.c
$(LD)
-N
-e
main
-Ttext
0
-o
userfs userfs.o ulib.o
$(OBJDUMP)
-S
userfs
>
userfs.asm
ulib.o
:
ulib.c
ulib.o
:
ulib.c
$(CC)
-nostdinc
-I
.
-c
ulib.c
$(CC)
-nostdinc
-I
.
-c
ulib.c
...
...
defs.h
浏览文件 @
7837c71b
...
@@ -71,4 +71,5 @@ int fd_write(struct fd *fd, char *addr, int n);
...
@@ -71,4 +71,5 @@ int fd_write(struct fd *fd, char *addr, int n);
// ide.c
// ide.c
void
ide_init
(
void
);
void
ide_init
(
void
);
void
ide_intri
(
void
);
int
ide_read
(
uint32_t
secno
,
void
*
dst
,
unsigned
nsecs
);
int
ide_read
(
uint32_t
secno
,
void
*
dst
,
unsigned
nsecs
);
ide.c
浏览文件 @
7837c71b
...
@@ -39,6 +39,13 @@ ide_init(void)
...
@@ -39,6 +39,13 @@ ide_init(void)
ide_wait_ready
(
0
);
ide_wait_ready
(
0
);
}
}
void
ide_intr
(
void
)
{
cprintf
(
"ide_intr
\n
"
);
}
int
int
ide_probe_disk1
(
void
)
ide_probe_disk1
(
void
)
...
@@ -87,13 +94,15 @@ ide_read(uint32_t secno, void *dst, unsigned nsecs)
...
@@ -87,13 +94,15 @@ ide_read(uint32_t secno, void *dst, unsigned nsecs)
outb
(
0x1F5
,
(
secno
>>
16
)
&
0xFF
);
outb
(
0x1F5
,
(
secno
>>
16
)
&
0xFF
);
outb
(
0x1F6
,
0xE0
|
((
diskno
&
1
)
<<
4
)
|
((
secno
>>
24
)
&
0x0F
));
outb
(
0x1F6
,
0xE0
|
((
diskno
&
1
)
<<
4
)
|
((
secno
>>
24
)
&
0x0F
));
outb
(
0x1F7
,
0x20
);
// CMD 0x20 means read sector
outb
(
0x1F7
,
0x20
);
// CMD 0x20 means read sector
#if 0
for (; nsecs > 0; nsecs--, dst += 512) {
for (; nsecs > 0; nsecs--, dst += 512) {
if ((r = ide_wait_ready(1)) < 0)
if ((r = ide_wait_ready(1)) < 0)
return r;
return r;
insl(0x1F0, dst, 512/4);
insl(0x1F0, dst, 512/4);
}
}
#endif
return
0
;
return
0
;
}
}
...
...
main.c
浏览文件 @
7837c71b
...
@@ -13,6 +13,7 @@ extern char edata[], end[];
...
@@ -13,6 +13,7 @@ extern char edata[], end[];
extern
int
acpu
;
extern
int
acpu
;
extern
char
_binary_user1_start
[],
_binary_user1_size
[];
extern
char
_binary_user1_start
[],
_binary_user1_size
[];
extern
char
_binary_usertests_start
[],
_binary_usertests_size
[];
extern
char
_binary_usertests_start
[],
_binary_usertests_size
[];
extern
char
_binary_userfs_start
[],
_binary_userfs_size
[];
char
buf
[
512
];
char
buf
[
512
];
...
@@ -59,20 +60,16 @@ main()
...
@@ -59,20 +60,16 @@ main()
p
->
ppid
=
0
;
p
->
ppid
=
0
;
setupsegs
(
p
);
setupsegs
(
p
);
// become interruptable
write_eflags
(
read_eflags
()
|
FL_IF
);
write_eflags
(
read_eflags
()
|
FL_IF
);
// turn on
interrupts on boot processor
// turn on
timer and enable interrupts on the local APIC
lapic_timerinit
();
lapic_timerinit
();
lapic_enableintr
();
lapic_enableintr
();
#if 0
ide_init();
ide_read(0, buf, 1);
cprintf("sec0.0 %x\n", buf[0] & 0xff);
#endif
p
=
newproc
();
p
=
newproc
();
load_icode
(
p
,
_binary_usertests_start
,
(
unsigned
)
_binary_usertests_size
);
// load_icode(p, _binary_usertests_start, (unsigned) _binary_usertests_size);
load_icode
(
p
,
_binary_userfs_start
,
(
unsigned
)
_binary_userfs_size
);
swtch
();
swtch
();
...
...
spinlock.c
浏览文件 @
7837c71b
#include "types.h"
#include "types.h"
#include "defs.h"
#include "defs.h"
#include "x86.h"
#include "x86.h"
#include "mmu.h"
#define LOCK_FREE -1
#define LOCK_FREE -1
...
@@ -15,7 +16,7 @@ acquire_spinlock(uint32_t* lock)
...
@@ -15,7 +16,7 @@ acquire_spinlock(uint32_t* lock)
if
(
*
lock
==
cpu_id
)
if
(
*
lock
==
cpu_id
)
return
;
return
;
lapic_disableintr
(
);
write_eflags
(
read_eflags
()
&
~
FL_IF
);
while
(
cmpxchg
(
LOCK_FREE
,
cpu_id
,
lock
)
!=
cpu_id
)
{
;
}
while
(
cmpxchg
(
LOCK_FREE
,
cpu_id
,
lock
)
!=
cpu_id
)
{
;
}
// cprintf ("acquired: %d\n", cpu_id);
// cprintf ("acquired: %d\n", cpu_id);
}
}
...
@@ -28,7 +29,7 @@ release_spinlock(uint32_t* lock)
...
@@ -28,7 +29,7 @@ release_spinlock(uint32_t* lock)
if
(
*
lock
!=
cpu_id
)
if
(
*
lock
!=
cpu_id
)
panic
(
"release_spinlock: releasing a lock that i don't own
\n
"
);
panic
(
"release_spinlock: releasing a lock that i don't own
\n
"
);
*
lock
=
LOCK_FREE
;
*
lock
=
LOCK_FREE
;
lapic_enableintr
(
);
write_eflags
(
read_eflags
()
|
FL_IF
);
}
}
void
void
...
...
syscall.c
浏览文件 @
7837c71b
...
@@ -224,6 +224,20 @@ sys_cons_putc()
...
@@ -224,6 +224,20 @@ sys_cons_putc()
return
0
;
return
0
;
}
}
int
sys_block
(
void
)
{
char
buf
[
1
];
cprintf
(
"%d: call sys_block
\n
"
,
cpu
());
ide_init
();
ide_read
(
0
,
buf
,
1
);
// cprintf("sec0.0 %x\n", buf[0] & 0xff);
cprintf
(
"call sleep
\n
"
);
sleep
(
0
);
return
0
;
}
void
void
syscall
()
syscall
()
{
{
...
@@ -257,6 +271,9 @@ syscall()
...
@@ -257,6 +271,9 @@ syscall()
case
SYS_close
:
case
SYS_close
:
ret
=
sys_close
();
ret
=
sys_close
();
break
;
break
;
case
SYS_block
:
ret
=
sys_block
();
break
;
default:
default:
cprintf
(
"unknown sys call %d
\n
"
,
num
);
cprintf
(
"unknown sys call %d
\n
"
,
num
);
// XXX fault
// XXX fault
...
...
syscall.h
浏览文件 @
7837c71b
...
@@ -6,3 +6,4 @@
...
@@ -6,3 +6,4 @@
#define SYS_write 6
#define SYS_write 6
#define SYS_read 7
#define SYS_read 7
#define SYS_close 8
#define SYS_close 8
#define SYS_block 9
trap.c
浏览文件 @
7837c71b
...
@@ -60,6 +60,10 @@ trap(struct Trapframe *tf)
...
@@ -60,6 +60,10 @@ trap(struct Trapframe *tf)
lapic_timerintr
();
lapic_timerintr
();
return
;
return
;
}
}
if
(
v
==
(
IRQ_OFFSET
+
IRQ_IDE
)){
ide_intr
();
return
;
}
// XXX probably ought to lgdt on trap return
// XXX probably ought to lgdt on trap return
...
...
ulib.c
浏览文件 @
7837c71b
...
@@ -56,3 +56,11 @@ close(int fd)
...
@@ -56,3 +56,11 @@ close(int fd)
asm
(
"mov $8, %eax"
);
asm
(
"mov $8, %eax"
);
asm
(
"int $48"
);
asm
(
"int $48"
);
}
}
int
block
(
void
)
{
asm
(
"mov $9, %eax"
);
asm
(
"int $48"
);
}
x86.h
浏览文件 @
7837c71b
...
@@ -354,5 +354,6 @@ struct Trapframe {
...
@@ -354,5 +354,6 @@ struct Trapframe {
#define IRQ_OFFSET 32 // IRQ 0 corresponds to int IRQ_OFFSET
#define IRQ_OFFSET 32 // IRQ 0 corresponds to int IRQ_OFFSET
#define IRQ_IDE 14
#define IRQ_ERROR 19
#define IRQ_ERROR 19
#define IRQ_SPURIOUS 31
#define IRQ_SPURIOUS 31
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论