Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
17a85657
提交
17a85657
8月 11, 2006
创建
作者:
rtm
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
init creates console, opens 0/1/2, runs sh
sh accepts 0-argument commands (like userfs) reads from console
上级
5be0039c
显示空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
163 行增加
和
39 行删除
+163
-39
Makefile
Makefile
+13
-5
console.c
console.c
+29
-3
defs.h
defs.h
+3
-2
dev.h
dev.h
+2
-2
fs.c
fs.c
+6
-5
init.c
init.c
+32
-0
main.c
main.c
+4
-4
sh.c
sh.c
+31
-0
syscall.c
syscall.c
+12
-5
ulib.c
ulib.c
+28
-11
user.h
user.h
+3
-2
没有找到文件。
Makefile
浏览文件 @
17a85657
...
...
@@ -46,12 +46,12 @@ bootblock : bootasm.S bootmain.c
$(OBJCOPY)
-S
-O
binary bootblock.o bootblock
./sign.pl bootblock
kernel
:
$(OBJS) bootother.S user
1 usertests userfs
kernel
:
$(OBJS) bootother.S user
fs init
$(CC)
-nostdinc
-I
.
-c
bootother.S
$(LD)
-N
-e
start
-Ttext
0x7000
-o
bootother.out bootother.o
$(OBJCOPY)
-S
-O
binary bootother.out bootother
$(OBJDUMP)
-S
bootother.o
>
bootother.asm
$(LD)
-Ttext
0x100000
-e
main0
-o
kernel
$(OBJS)
-b
binary bootother user
1 usertests userfs
$(LD)
-Ttext
0x100000
-e
main0
-o
kernel
$(OBJS)
-b
binary bootother user
fs init
$(OBJDUMP)
-S
kernel
>
kernel.asm
vectors.S
:
vectors.pl
...
...
@@ -79,15 +79,23 @@ userfs : userfs.o $(ULIB)
$(LD)
-N
-e
main
-Ttext
0
-o
userfs userfs.o
$(ULIB)
$(OBJDUMP)
-S
userfs
>
userfs.asm
init
:
init.o $(ULIB)
$(LD)
-N
-e
main
-Ttext
0
-o
init init.o
$(ULIB)
$(OBJDUMP)
-S
init
>
init.asm
sh
:
sh.o $(ULIB)
$(LD)
-N
-e
main
-Ttext
0
-o
sh sh.o
$(ULIB)
$(OBJDUMP)
-S
sh
>
sh.asm
mkfs
:
mkfs.c fs.h
cc
-o
mkfs mkfs.c
fs.img
:
mkfs user
tests echo cat README
./mkfs fs.img user
tests
echo cat
README
fs.img
:
mkfs user
fs usertests echo cat README init sh
./mkfs fs.img user
fs usertests
echo cat
README init sh
-include
*.d
clean
:
rm
-f
*
.o
*
.d
*
.asm vectors.S parport.out
\
bootblock kernel xv6.img user1 userfs usertests
\
fs.img mkfs
echo
fs.img mkfs
echo
init
console.c
浏览文件 @
17a85657
...
...
@@ -169,15 +169,14 @@ panic(char *s)
}
int
console_write
(
int
minor
,
void
*
buf
,
int
n
)
console_write
(
int
minor
,
char
*
buf
,
int
n
)
{
int
i
;
uchar
*
b
=
buf
;
acquire
(
&
console_lock
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
cons_putc
(
(
int
)
b
[
i
]
);
cons_putc
(
buf
[
i
]
&
0xff
);
}
release
(
&
console_lock
);
...
...
@@ -349,6 +348,7 @@ kbd_intr()
kbd_buf
[
kbd_w
++
]
=
c
;
if
(
kbd_w
>=
KBD_BUF
)
kbd_w
=
0
;
wakeup
(
&
kbd_r
);
}
else
{
cprintf
(
"kbd overflow
\n
"
);
}
...
...
@@ -356,6 +356,31 @@ kbd_intr()
release
(
&
kbd_lock
);
}
int
console_read
(
int
minor
,
char
*
dst
,
int
n
)
{
uint
target
=
n
;
acquire
(
&
kbd_lock
);
while
(
kbd_w
==
kbd_r
)
sleep
(
&
kbd_r
,
&
kbd_lock
);
while
(
n
>
0
&&
kbd_w
!=
kbd_r
){
*
dst
=
kbd_buf
[
kbd_r
];
cons_putc
(
*
dst
&
0xff
);
dst
++
;
--
n
;
kbd_r
++
;
if
(
kbd_r
>=
KBD_BUF
)
kbd_r
=
0
;
}
release
(
&
kbd_lock
);
return
target
-
n
;
}
void
console_init
()
{
...
...
@@ -363,6 +388,7 @@ console_init()
initlock
(
&
kbd_lock
,
"kbd"
);
devsw
[
CONSOLE
].
d_write
=
console_write
;
devsw
[
CONSOLE
].
d_read
=
console_read
;
ioapic_enable
(
IRQ_KBD
,
1
);
...
...
defs.h
浏览文件 @
17a85657
...
...
@@ -115,6 +115,7 @@ void iunlock(struct inode *ip);
void
idecref
(
struct
inode
*
ip
);
void
iput
(
struct
inode
*
ip
);
struct
inode
*
namei
(
char
*
path
);
int
readi
(
struct
inode
*
ip
,
void
*
xdst
,
uint
off
,
uint
n
);
int
writei
(
struct
inode
*
ip
,
void
*
addr
,
uint
off
,
uint
n
);
int
readi
(
struct
inode
*
ip
,
char
*
xdst
,
uint
off
,
uint
n
);
int
writei
(
struct
inode
*
ip
,
char
*
addr
,
uint
off
,
uint
n
);
struct
inode
*
mknod
(
struct
inode
*
,
char
*
,
short
,
short
,
short
);
void
iupdate
(
struct
inode
*
ip
);
dev.h
浏览文件 @
17a85657
struct
devsw
{
int
(
*
d_open
)(
char
*
,
int
);
int
(
*
d_read
)(
int
,
void
*
,
int
);
int
(
*
d_write
)(
int
,
void
*
,
int
);
int
(
*
d_read
)(
int
,
char
*
,
int
);
int
(
*
d_write
)(
int
,
char
*
,
int
);
int
(
*
d_close
)(
int
);
};
...
...
fs.c
浏览文件 @
17a85657
...
...
@@ -101,6 +101,7 @@ iget(uint dev, uint inum)
goto
loop
;
}
ip
->
count
++
;
ip
->
busy
=
1
;
release
(
&
inode_table_lock
);
return
ip
;
}
...
...
@@ -269,16 +270,15 @@ bmap(struct inode *ip, uint bn)
#define min(a, b) ((a) < (b) ? (a) : (b))
int
readi
(
struct
inode
*
ip
,
void
*
x
dst
,
uint
off
,
uint
n
)
readi
(
struct
inode
*
ip
,
char
*
dst
,
uint
off
,
uint
n
)
{
char
*
dst
=
(
char
*
)
xdst
;
uint
target
=
n
,
n1
;
struct
buf
*
bp
;
if
(
ip
->
type
==
T_DEV
)
{
if
(
ip
->
major
<
0
||
ip
->
major
>=
NDEV
||
!
devsw
[
ip
->
major
].
d_read
)
return
-
1
;
return
devsw
[
ip
->
major
].
d_read
(
ip
->
minor
,
x
dst
,
n
);
return
devsw
[
ip
->
major
].
d_read
(
ip
->
minor
,
dst
,
n
);
}
while
(
n
>
0
&&
off
<
ip
->
size
){
...
...
@@ -298,7 +298,7 @@ readi(struct inode *ip, void *xdst, uint off, uint n)
#define MIN(a, b) ((a < b) ? a : b)
int
writei
(
struct
inode
*
ip
,
void
*
addr
,
uint
off
,
uint
n
)
writei
(
struct
inode
*
ip
,
char
*
addr
,
uint
off
,
uint
n
)
{
if
(
ip
->
type
==
T_DEV
)
{
if
(
ip
->
major
<
0
||
ip
->
major
>=
NDEV
||
!
devsw
[
ip
->
major
].
d_write
)
...
...
@@ -404,7 +404,8 @@ mknod(struct inode *dp, char *cp, short type, short major, short minor)
int
i
;
struct
buf
*
bp
=
0
;
cprintf
(
"mknod: %s %d %d %d
\n
"
,
cp
,
type
,
major
,
minor
);
cprintf
(
"mknod: dir %d %s %d %d %d
\n
"
,
dp
->
inum
,
cp
,
type
,
major
,
minor
);
ip
=
ialloc
(
dp
->
dev
,
type
);
if
(
ip
==
0
)
return
0
;
...
...
init.c
0 → 100644
浏览文件 @
17a85657
#include "user.h"
#include "types.h"
#include "fs.h"
#include "fcntl.h"
char
*
sh_args
[]
=
{
"sh"
,
0
};
int
main
(
void
)
{
int
pid
;
if
(
open
(
"console"
,
0
)
<
0
){
mknod
(
"console"
,
T_DEV
,
1
,
1
);
open
(
"console"
,
0
);
}
open
(
"console"
,
1
);
open
(
"console"
,
1
);
write
(
1
,
"init...
\n
"
,
8
);
while
(
1
){
write
(
1
,
"running sh...
\n
"
,
14
);
pid
=
fork
();
if
(
pid
==
0
){
exec
(
"sh"
,
sh_args
);
exit
();
}
if
(
pid
>
0
)
wait
();
}
}
main.c
浏览文件 @
17a85657
...
...
@@ -11,9 +11,8 @@
#include "spinlock.h"
extern
char
edata
[],
end
[];
extern
uchar
_binary_user1_start
[],
_binary_user1_size
[];
extern
uchar
_binary_usertests_start
[],
_binary_usertests_size
[];
extern
uchar
_binary_userfs_start
[],
_binary_userfs_size
[];
extern
uchar
_binary_init_start
[],
_binary_init_size
[];
// CPU 0 starts running C code here.
// This is called main0 not main so that it can have
...
...
@@ -96,9 +95,10 @@ main0(void)
p
=
copyproc
(
&
proc
[
0
]);
//load_icode(p, _binary_usertests_start, (uint) _binary_usertests_size);
load_icode
(
p
,
_binary_userfs_start
,
(
uint
)
_binary_userfs_size
);
//load_icode(p, _binary_userfs_start, (uint) _binary_userfs_size);
load_icode
(
p
,
_binary_init_start
,
(
uint
)
_binary_init_size
);
p
->
state
=
RUNNABLE
;
cprintf
(
"loaded
userfs
\n
"
);
cprintf
(
"loaded
init
\n
"
);
scheduler
();
}
...
...
sh.c
0 → 100644
浏览文件 @
17a85657
#include "user.h"
#include "types.h"
#include "fs.h"
#include "fcntl.h"
char
*
args
[
100
];
int
main
(
void
)
{
char
buf
[
128
];
int
pid
;
while
(
1
){
write
(
1
,
"$ "
,
2
);
gets
(
buf
,
sizeof
(
buf
));
if
(
buf
[
0
]
==
'\0'
)
continue
;
pid
=
fork
();
if
(
pid
==
0
){
args
[
0
]
=
buf
;
args
[
1
]
=
0
;
exec
(
buf
,
args
);
write
(
1
,
buf
,
strlen
(
buf
));
write
(
1
,
": not found
\n
"
,
12
);
exit
();
}
if
(
pid
>
0
)
wait
();
}
}
syscall.c
浏览文件 @
17a85657
...
...
@@ -319,14 +319,19 @@ sys_mknod(void)
return
-
1
;
dp
=
iget
(
rootdev
,
1
);
// XXX should parse name
if
(
dp
->
type
!=
T_DIR
)
if
(
dp
->
type
!=
T_DIR
)
{
iput
(
dp
);
return
-
1
;
}
nip
=
mknod
(
dp
,
cp
->
mem
+
arg0
,
(
short
)
arg1
,
(
short
)
arg2
,
(
short
)
arg3
);
iput
(
dp
);
if
(
nip
==
0
)
return
-
1
;
iput
(
nip
);
iput
(
dp
);
return
0
;
}
...
...
@@ -376,7 +381,7 @@ sys_exec(void)
if
(
ip
==
0
)
return
-
1
;
if
(
readi
(
ip
,
&
elf
,
0
,
sizeof
(
elf
))
<
sizeof
(
elf
))
if
(
readi
(
ip
,
(
char
*
)
&
elf
,
0
,
sizeof
(
elf
))
<
sizeof
(
elf
))
goto
bad
;
if
(
elf
.
magic
!=
ELF_MAGIC
)
...
...
@@ -384,7 +389,8 @@ sys_exec(void)
sz
=
0
;
for
(
i
=
0
;
i
<
elf
.
phnum
;
i
++
){
if
(
readi
(
ip
,
&
ph
,
elf
.
phoff
+
i
*
sizeof
(
ph
),
sizeof
(
ph
))
!=
sizeof
(
ph
))
if
(
readi
(
ip
,
(
char
*
)
&
ph
,
elf
.
phoff
+
i
*
sizeof
(
ph
),
sizeof
(
ph
))
!=
sizeof
(
ph
))
goto
bad
;
if
(
ph
.
type
!=
ELF_PROG_LOAD
)
continue
;
...
...
@@ -450,7 +456,8 @@ sys_exec(void)
mem
=
0
;
for
(
i
=
0
;
i
<
elf
.
phnum
;
i
++
){
if
(
readi
(
ip
,
&
ph
,
elf
.
phoff
+
i
*
sizeof
(
ph
),
sizeof
(
ph
))
!=
sizeof
(
ph
))
if
(
readi
(
ip
,
(
char
*
)
&
ph
,
elf
.
phoff
+
i
*
sizeof
(
ph
),
sizeof
(
ph
))
!=
sizeof
(
ph
))
goto
bad2
;
if
(
ph
.
type
!=
ELF_PROG_LOAD
)
continue
;
...
...
ulib.c
浏览文件 @
17a85657
...
...
@@ -3,17 +3,7 @@
int
puts
(
char
*
s
)
{
return
cons_puts
(
s
);
}
int
puts1
(
char
*
s
)
{
int
i
;
for
(
i
=
0
;
s
[
i
];
i
++
)
cons_putc
(
s
[
i
]);
return
i
;
return
write
(
1
,
s
,
strlen
(
s
));
}
char
*
...
...
@@ -26,3 +16,30 @@ strcpy(char *s, char *t)
;
return
os
;
}
unsigned
int
strlen
(
char
*
s
)
{
int
n
=
0
;
for
(
n
=
0
;
s
[
n
];
n
++
)
;
return
n
;
}
char
*
gets
(
char
*
buf
,
int
max
)
{
int
i
=
0
,
cc
;
char
c
;
while
(
i
+
1
<
max
){
cc
=
read
(
0
,
&
c
,
1
);
if
(
cc
<
1
)
break
;
if
(
c
==
'\n'
||
c
==
'\r'
)
break
;
buf
[
i
++
]
=
c
;
}
buf
[
i
]
=
'\0'
;
return
buf
;
}
user.h
浏览文件 @
17a85657
...
...
@@ -14,8 +14,9 @@ int exec(char *, char **);
int
open
(
char
*
,
int
);
int
mknod
(
char
*
,
short
,
short
,
short
);
int
unlink
(
char
*
);
int
puts
(
char
*
);
int
puts1
(
char
*
);
char
*
strcpy
(
char
*
,
char
*
);
void
printf
(
int
fd
,
char
*
fmt
,
...);
char
*
gets
(
char
*
,
int
max
);
unsigned
int
strlen
(
char
*
);
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论