Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
97ac612f
提交
97ac612f
8月 24, 2007
创建
作者:
rsc
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
nits
上级
ffa58d36
显示空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
49 行增加
和
50 行删除
+49
-50
bootmain.c
bootmain.c
+24
-27
console.c
console.c
+18
-16
proc.c
proc.c
+4
-5
proc.h
proc.h
+1
-1
syscall.c
syscall.c
+2
-1
没有找到文件。
bootmain.c
浏览文件 @
97ac612f
...
...
@@ -31,31 +31,35 @@
#include "x86.h"
#define SECTSIZE 512
#define ELFHDR ((struct elfhdr*) 0x10000) // scratch space
void
readseg
(
uint
,
uint
,
uint
);
void
cmain
(
void
)
{
struct
elfhdr
*
elf
;
struct
proghdr
*
ph
,
*
eph
;
void
(
*
entry
)(
void
);
// read 1st page off disk
readseg
((
uint
)
ELFHDR
,
SECTSIZE
*
8
,
0
);
elf
=
(
struct
elfhdr
*
)
0x10000
;
// scratch space
// is this a valid ELF?
if
(
ELFHDR
->
magic
!=
ELF_MAGIC
)
// Read 1st page off disk
readseg
((
uint
)
elf
,
SECTSIZE
*
8
,
0
);
// Is this an ELF executable?
if
(
elf
->
magic
!=
ELF_MAGIC
)
goto
bad
;
//
load each program segment (ignores ph flags)
ph
=
(
struct
proghdr
*
)
((
uchar
*
)
ELFHDR
+
ELFHDR
->
phoff
);
eph
=
ph
+
ELFHDR
->
phnum
;
//
Load each program segment (ignores ph flags).
ph
=
(
struct
proghdr
*
)
((
uchar
*
)
elf
+
elf
->
phoff
);
eph
=
ph
+
elf
->
phnum
;
for
(;
ph
<
eph
;
ph
++
)
readseg
(
ph
->
va
,
ph
->
memsz
,
ph
->
offset
);
// call the entry point from the ELF header
// note: does not return!
((
void
(
*
)(
void
))
(
ELFHDR
->
entry
&
0xFFFFFF
))();
// Call the entry point from the ELF header.
// Does not return!
entry
=
(
void
(
*
)(
void
))(
elf
->
entry
&
0xFFFFFF
);
entry
();
bad:
outw
(
0x8A00
,
0x8A00
);
...
...
@@ -67,7 +71,7 @@ bad:
void
waitdisk
(
void
)
{
//
wait for disk reaady
//
Wait for disk ready.
while
((
inb
(
0x1F7
)
&
0xC0
)
!=
0x40
)
;
}
...
...
@@ -76,9 +80,8 @@ waitdisk(void)
void
readsect
(
void
*
dst
,
uint
offset
)
{
//
wait for disk to be ready
//
Issue command.
waitdisk
();
outb
(
0x1F2
,
1
);
// count = 1
outb
(
0x1F3
,
offset
);
outb
(
0x1F4
,
offset
>>
8
);
...
...
@@ -86,10 +89,8 @@ readsect(void *dst, uint offset)
outb
(
0x1F6
,
(
offset
>>
24
)
|
0xE0
);
outb
(
0x1F7
,
0x20
);
// cmd 0x20 - read sectors
//
wait for disk to be ready
//
Read data.
waitdisk
();
// read a sector
insl
(
0x1F0
,
dst
,
SECTSIZE
/
4
);
}
...
...
@@ -98,24 +99,20 @@ readsect(void *dst, uint offset)
void
readseg
(
uint
va
,
uint
count
,
uint
offset
)
{
uint
e
nd_
va
;
uint
eva
;
va
&=
0xFFFFFF
;
e
nd_
va
=
va
+
count
;
eva
=
va
+
count
;
//
round down to sector boundary
//
Round down to sector boundary.
va
&=
~
(
SECTSIZE
-
1
);
//
translate from bytes to sectors, and kernel starts at sector 1
//
Translate from bytes to sectors; kernel starts at sector 1.
offset
=
(
offset
/
SECTSIZE
)
+
1
;
// If this is too slow, we could read lots of sectors at a time.
// We'd write more to memory than asked, but it doesn't matter --
// we load in increasing order.
while
(
va
<
end_va
)
{
readsect
((
uchar
*
)
va
,
offset
);
va
+=
SECTSIZE
;
offset
++
;
}
for
(;
va
<
eva
;
va
+=
SECTSIZE
,
offset
++
)
readsect
((
uchar
*
)
va
,
offset
);
}
console.c
浏览文件 @
97ac612f
...
...
@@ -9,7 +9,11 @@
#include "proc.h"
#include "kbd.h"
struct
spinlock
console_lock
;
#define CRTPORT 0x3d4
#define LPTPORT 0x378
static
ushort
*
crt
=
(
ushort
*
)
0xb8000
;
// CGA memory
static
struct
spinlock
console_lock
;
int
panicked
=
0
;
int
use_console_lock
=
0
;
...
...
@@ -21,18 +25,16 @@ lpt_putc(int c)
{
int
i
;
for
(
i
=
0
;
!
(
inb
(
0x378
+
1
)
&
0x80
)
&&
i
<
12800
;
i
++
)
for
(
i
=
0
;
!
(
inb
(
LPTPORT
+
1
)
&
0x80
)
&&
i
<
12800
;
i
++
)
;
outb
(
0x378
+
0
,
c
);
outb
(
0x378
+
2
,
0x08
|
0x04
|
0x01
);
outb
(
0x378
+
2
,
0x08
);
outb
(
LPTPORT
+
0
,
c
);
outb
(
LPTPORT
+
2
,
0x08
|
0x04
|
0x01
);
outb
(
LPTPORT
+
2
,
0x08
);
}
static
void
cons_putc
(
int
c
)
{
int
crtport
=
0x3d4
;
// io port of CGA
ushort
*
crt
=
(
ushort
*
)
0xB8000
;
// base of CGA memory
int
ind
;
if
(
panicked
){
...
...
@@ -44,10 +46,10 @@ cons_putc(int c)
lpt_putc
(
c
);
// cursor position, 16 bits, col + 80*row
outb
(
crtport
,
14
);
ind
=
inb
(
crtport
+
1
)
<<
8
;
outb
(
crtport
,
15
);
ind
|=
inb
(
crtport
+
1
);
outb
(
CRTPORT
,
14
);
ind
=
inb
(
CRTPORT
+
1
)
<<
8
;
outb
(
CRTPORT
,
15
);
ind
|=
inb
(
CRTPORT
+
1
);
c
&=
0xff
;
if
(
c
==
'\n'
){
...
...
@@ -66,17 +68,17 @@ cons_putc(int c)
memset
(
crt
+
ind
,
0
,
sizeof
(
crt
[
0
])
*
((
24
*
80
)
-
ind
));
}
outb
(
crtport
,
14
);
outb
(
crtport
+
1
,
ind
>>
8
);
outb
(
crtport
,
15
);
outb
(
crtport
+
1
,
ind
);
outb
(
CRTPORT
,
14
);
outb
(
CRTPORT
+
1
,
ind
>>
8
);
outb
(
CRTPORT
,
15
);
outb
(
CRTPORT
+
1
,
ind
);
}
void
printint
(
int
xx
,
int
base
,
int
sgn
)
{
static
char
digits
[]
=
"0123456789ABCDEF"
;
char
buf
[
16
];
char
digits
[]
=
"0123456789ABCDEF"
;
int
i
=
0
,
neg
=
0
;
uint
x
;
...
...
proc.c
浏览文件 @
97ac612f
...
...
@@ -65,15 +65,14 @@ growproc(int n)
return
cp
->
sz
-
n
;
}
// Set up CPU's segment descriptors and task state for a
// given process.
// If p==0, set up for "idle" state for when scheduler()
// is idling, not running any process.
// Set up CPU's segment descriptors and task state for a given process.
// If p==0, set up for "idle" state for when scheduler() is running.
void
setupsegs
(
struct
proc
*
p
)
{
struct
cpu
*
c
=
&
cpus
[
cpu
()]
;
struct
cpu
*
c
;
c
=
&
cpus
[
cpu
()];
c
->
ts
.
ss0
=
SEG_KDATA
<<
3
;
if
(
p
)
c
->
ts
.
esp0
=
(
uint
)(
p
->
kstack
+
KSTACKSIZE
);
...
...
proc.h
浏览文件 @
97ac612f
...
...
@@ -12,7 +12,7 @@
// Save all the regular registers so we don't need to care
// which are caller save.
// Don't save %eax, because that's the return register.
// The layout of jmpbuf
is known to
setjmp.S.
// The layout of jmpbuf
must match code in
setjmp.S.
struct
jmpbuf
{
int
ebx
;
int
ecx
;
...
...
syscall.c
浏览文件 @
97ac612f
...
...
@@ -133,8 +133,9 @@ static int (*syscalls[])(void) = {
void
syscall
(
void
)
{
int
num
=
cp
->
tf
->
eax
;
int
num
;
num
=
cp
->
tf
->
eax
;
if
(
num
>=
0
&&
num
<
NELEM
(
syscalls
)
&&
syscalls
[
num
])
cp
->
tf
->
eax
=
syscalls
[
num
]();
else
{
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论