Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
0f218772
提交
0f218772
10月 22, 2011
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
The start of some CGA console code.
上级
f037a9b1
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
102 行增加
和
16 行删除
+102
-16
Makefile
Makefile
+3
-1
cga.c
cga.c
+62
-0
kernel.h
kernel.h
+13
-0
main.c
main.c
+4
-2
string.c
string.c
+10
-11
uart.c
uart.c
+1
-1
vmx.h
vmx.h
+0
-1
x86.h
x86.h
+9
-0
没有找到文件。
Makefile
浏览文件 @
0f218772
...
...
@@ -2,7 +2,9 @@
OBJS
=
\
asm.o
\
cga.o
\
main.o
\
string.o
\
uart.o
\
trap.o
...
...
@@ -45,7 +47,7 @@ clean:
ifndef
CPUS
CPUS
:=
2
endif
QEMUOPTS
=
-smp
$(CPUS)
-m
512
-nographic
QEMUOPTS
=
-smp
$(CPUS)
-m
512
qemu
:
kernel
$(QEMU)
$(QEMUOPTS)
-kernel
kernel
cga.c
0 → 100644
浏览文件 @
0f218772
#include "types.h"
#include "kernel.h"
static
volatile
u16
*
screen
=
(
u16
*
)(
KBASE
+
0xb8000
);
// Black background, (high intensity) white foreground
static
int
color
=
((
0
<<
4
)
|
15
)
<<
8
;
static
int
cursor
;
extern
void
setcursor
(
int
);
void
putsn
(
const
char
*
s
,
int
n
)
{
int
i
;
uint8
*
p
,
*
ep
;
p
=
(
uint8
*
)
s
;
ep
=
p
+
n
;
for
(;
p
<
ep
;
p
++
)
{
if
(
*
p
==
'\n'
)
{
cursor
+=
80
-
cursor
%
80
;
}
else
{
screen
[
cursor
]
=
color
|
*
p
;
cursor
++
;
}
if
(
cursor
==
25
*
80
)
{
memmove
((
void
*
)
screen
+
80
*
2
,
(
void
*
)
screen
+
80
*
3
,
80
*
(
25
-
3
)
*
2
);
for
(
i
=
0
;
i
<
80
;
i
++
)
screen
[(
24
*
80
+
i
)]
=
color
|
' '
&
0xff
;
cursor
-=
80
;
}
}
}
static
void
cgaputs
(
const
char
*
s
)
{
putsn
(
s
,
strlen
(
s
));
}
void
panic
(
const
char
*
s
)
{
cgaputs
(
"panic: "
);
cgaputs
(
s
);
cgaputs
(
"
\n
"
);
setcursor
(
cursor
);
for
(;;)
screen
[
0
]
=
screen
[
0
];
}
void
initcga
(
void
)
{
// Assume boot.S set up the screen.
// We're just taking over the cursor position.
cursor
=
2
*
80
;
setcursor
(
cursor
);
cgaputs
(
"booting...
\n
"
);
setcursor
(
cursor
);
}
kernel.h
浏览文件 @
0f218772
#include "types.h"
#define KBASE 0xFFFFFFFF80000000ull
#define KADDR(x) ((void*)(KBASE+(uintptr)(x)))
#define PADDR(x) ((uintptr)(x) - KBASE)
#define PGSIZE (2*1024*1024ull)
#define KCSEG (2<<3)
/* kernel code segment */
#define KDSEG (3<<3)
/* kernel data segment */
#define nil ((void*)0)
void
memmove
(
void
*
dst
,
void
*
src
,
int64
n
);
int
strlen
(
const
char
*
);
main.c
浏览文件 @
0f218772
#include "types.h"
#include "multiboot.h"
extern
void
uartinit
(
void
);
extern
void
inituart
(
void
);
extern
void
initcga
(
void
);
void
cmain
(
void
)
{
uartinit
();
inituart
();
initcga
();
}
string.c
浏览文件 @
0f218772
...
...
@@ -2,16 +2,16 @@
#include "x86.h"
void
*
memset
(
void
*
dst
,
int
c
,
u
int
n
)
memset
(
void
*
dst
,
int
c
,
u
32
n
)
{
stosb
(
dst
,
c
,
n
);
return
dst
;
}
int
memcmp
(
const
void
*
v1
,
const
void
*
v2
,
u
int
n
)
memcmp
(
const
void
*
v1
,
const
void
*
v2
,
u
32
n
)
{
const
u
char
*
s1
,
*
s2
;
const
u
8
*
s1
,
*
s2
;
s1
=
v1
;
s2
=
v2
;
...
...
@@ -25,7 +25,7 @@ memcmp(const void *v1, const void *v2, uint n)
}
void
*
memmove
(
void
*
dst
,
const
void
*
src
,
u
int
n
)
memmove
(
void
*
dst
,
const
void
*
src
,
u
32
n
)
{
const
char
*
s
;
char
*
d
;
...
...
@@ -46,23 +46,23 @@ memmove(void *dst, const void *src, uint n)
// memcpy exists to placate GCC. Use memmove.
void
*
memcpy
(
void
*
dst
,
const
void
*
src
,
u
int
n
)
memcpy
(
void
*
dst
,
const
void
*
src
,
u
32
n
)
{
return
memmove
(
dst
,
src
,
n
);
}
int
strncmp
(
const
char
*
p
,
const
char
*
q
,
u
int
n
)
strncmp
(
const
char
*
p
,
const
char
*
q
,
u
32
n
)
{
while
(
n
>
0
&&
*
p
&&
*
p
==
*
q
)
n
--
,
p
++
,
q
++
;
if
(
n
==
0
)
return
0
;
return
(
u
char
)
*
p
-
(
uchar
)
*
q
;
return
(
u
8
)
*
p
-
(
u8
)
*
q
;
}
char
*
strncpy
(
char
*
s
,
const
char
*
t
,
int
n
)
strncpy
(
char
*
s
,
const
char
*
t
,
u32
n
)
{
char
*
os
;
...
...
@@ -76,7 +76,7 @@ strncpy(char *s, const char *t, int n)
// Like strncpy but guaranteed to NUL-terminate.
char
*
safestrcpy
(
char
*
s
,
const
char
*
t
,
int
n
)
safestrcpy
(
char
*
s
,
const
char
*
t
,
u32
n
)
{
char
*
os
;
...
...
@@ -104,6 +104,5 @@ strcmp(const char *p, const char *q)
{
while
(
*
p
&&
*
p
==
*
q
)
p
++
,
q
++
;
return
(
u
char
)
*
p
-
(
uchar
)
*
q
;
return
(
u
8
)
*
p
-
(
u8
)
*
q
;
}
uart.c
浏览文件 @
0f218772
...
...
@@ -19,7 +19,7 @@ uartputc(int c)
}
void
uartini
t
(
void
)
inituar
t
(
void
)
{
char
*
p
;
...
...
vmx.h
浏览文件 @
0f218772
...
...
@@ -19,7 +19,6 @@ uint8 inb(uint16);
void
outb
(
uint16
,
uint8
);
void
microdelay
(
int
);
uint32
readeflags
(
void
);
void
setcursor
(
int
);
void
memmove
(
void
*
dst
,
void
*
src
,
int64
n
);
int
memcmp
(
const
void
*
,
const
void
*
,
int64
);
void
hlt
(
void
);
...
...
x86.h
浏览文件 @
0f218772
...
...
@@ -17,6 +17,15 @@ outb(u16 port, u8 data)
}
static
inline
void
stosb
(
void
*
addr
,
int
data
,
int
cnt
)
{
__asm
volatile
(
"cld; rep stosb"
:
"=D"
(
addr
),
"=c"
(
cnt
)
:
"0"
(
addr
),
"1"
(
cnt
),
"a"
(
data
)
:
"memory"
,
"cc"
);
}
static
inline
void
microdelay
(
u32
delay
)
{
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论