Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
rcore-os
RCore Tutorial V3
提交
4bf40e76
R
RCore Tutorial V3
项目概览
rcore-os
/
RCore Tutorial V3
上一次同步 1 年多
通知
15
Star
793
Fork
260
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
RCore Tutorial V3
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
4bf40e76
编写于
6月 23, 2022
作者:
chyyuu1972
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'ch9' into main
上级
410ee6c6
aee2000f
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
99 addition
and
9 deletion
+99
-9
.github/workflows/doc-and-test.yml
.github/workflows/doc-and-test.yml
+3
-0
os/src/console.rs
os/src/console.rs
+8
-1
os/src/drivers/chardev/mod.rs
os/src/drivers/chardev/mod.rs
+3
-3
os/src/drivers/mod.rs
os/src/drivers/mod.rs
+5
-0
os/src/fs/stdio.rs
os/src/fs/stdio.rs
+29
-1
os/src/main.rs
os/src/main.rs
+5
-1
os/src/sbi.rs
os/src/sbi.rs
+5
-1
os/src/syscall/mod.rs
os/src/syscall/mod.rs
+39
-1
os/src/task/mod.rs
os/src/task/mod.rs
+2
-1
未找到文件。
.github/workflows/doc-and-test.yml
浏览文件 @
4bf40e76
...
...
@@ -64,3 +64,6 @@ jobs:
-
name
:
Run usertests
run
:
cd os && make run TEST=1
timeout-minutes
:
10
-
name
:
Build for k210
run
:
cd os && make build BOARD=k210
\ No newline at end of file
os/src/console.rs
浏览文件 @
4bf40e76
use
crate
::
drivers
::
chardev
::{
CharDevice
,
UART
};
use
crate
::
drivers
::
chardev
::
CharDevice
;
#[cfg(feature
=
"board_qemu"
)]
use
crate
::
drivers
::
chardev
::
UART
;
#[cfg(feature
=
"board_k210"
)]
use
crate
::
sbi
::
console_putchar
;
use
core
::
fmt
::{
self
,
Write
};
struct
Stdout
;
...
...
@@ -6,7 +10,10 @@ struct Stdout;
impl
Write
for
Stdout
{
fn
write_str
(
&
mut
self
,
s
:
&
str
)
->
fmt
::
Result
{
for
c
in
s
.chars
()
{
#[cfg(feature
=
"board_qemu"
)]
UART
.write
(
c
as
u8
);
#[cfg(feature
=
"board_k210"
)]
console_putchar
(
c
as
usize
);
}
Ok
(())
}
...
...
os/src/drivers/chardev/mod.rs
浏览文件 @
4bf40e76
mod
ns16550a
;
pub
use
ns16550a
::
NS16550a
;
#[cfg(feature
=
"board_qemu"
)]
use
crate
::
board
::
CharDeviceImpl
;
use
alloc
::
sync
::
Arc
;
use
lazy_static
::
*
;
pub
use
ns16550a
::
NS16550a
;
pub
trait
CharDevice
{
fn
read
(
&
self
)
->
u8
;
fn
write
(
&
self
,
ch
:
u8
);
fn
handle_irq
(
&
self
);
}
#[cfg(feature
=
"board_qemu"
)]
lazy_static!
{
pub
static
ref
UART
:
Arc
<
CharDeviceImpl
>
=
Arc
::
new
(
CharDeviceImpl
::
new
());
}
os/src/drivers/mod.rs
浏览文件 @
4bf40e76
pub
mod
block
;
pub
mod
chardev
;
#[cfg(feature
=
"board_qemu"
)]
pub
mod
gpu
;
#[cfg(feature
=
"board_qemu"
)]
pub
mod
input
;
pub
mod
plic
;
pub
use
block
::
BLOCK_DEVICE
;
#[cfg(feature
=
"board_qemu"
)]
pub
use
chardev
::
UART
;
#[cfg(feature
=
"board_qemu"
)]
pub
use
gpu
::
*
;
#[cfg(feature
=
"board_qemu"
)]
pub
use
input
::
*
;
os/src/fs/stdio.rs
浏览文件 @
4bf40e76
use
super
::
File
;
use
crate
::
drivers
::
chardev
::{
CharDevice
,
UART
};
use
crate
::
drivers
::
chardev
::
CharDevice
;
#[cfg(feature
=
"board_qemu"
)]
use
crate
::
drivers
::
chardev
::
UART
;
use
crate
::
mm
::
UserBuffer
;
#[cfg(feature
=
"board_k210"
)]
use
crate
::
sbi
::
console_getchar
;
#[cfg(feature
=
"board_k210"
)]
use
crate
::
task
::
suspend_current_and_run_next
;
pub
struct
Stdin
;
pub
struct
Stdout
;
...
...
@@ -12,6 +18,7 @@ impl File for Stdin {
fn
writable
(
&
self
)
->
bool
{
false
}
#[cfg(feature
=
"board_qemu"
)]
fn
read
(
&
self
,
mut
user_buf
:
UserBuffer
)
->
usize
{
assert_eq!
(
user_buf
.len
(),
1
);
//println!("before UART.read() in Stdin::read()");
...
...
@@ -21,6 +28,27 @@ impl File for Stdin {
}
1
}
#[cfg(feature
=
"board_k210"
)]
fn
read
(
&
self
,
mut
user_buf
:
UserBuffer
)
->
usize
{
assert_eq!
(
user_buf
.len
(),
1
);
// busy loop
let
mut
c
:
usize
;
loop
{
c
=
console_getchar
();
if
c
==
0
{
suspend_current_and_run_next
();
continue
;
}
else
{
break
;
}
}
let
ch
=
c
as
u8
;
unsafe
{
user_buf
.buffers
[
0
]
.as_mut_ptr
()
.write_volatile
(
ch
);
}
1
}
fn
write
(
&
self
,
_u
ser_buf
:
UserBuffer
)
->
usize
{
panic!
(
"Cannot write to stdin!"
);
}
...
...
os/src/main.rs
浏览文件 @
4bf40e76
...
...
@@ -2,7 +2,7 @@
#![no_main]
#![feature(panic_info_message)]
#![feature(alloc_error_handler)]
#[cfg(feature
=
"board_qemu"
)]
use
crate
::
drivers
::{
GPU_DEVICE
,
KEYBOARD_DEVICE
,
MOUSE_DEVICE
};
extern
crate
alloc
;
...
...
@@ -22,6 +22,7 @@ mod console;
mod
config
;
mod
drivers
;
mod
fs
;
#[cfg(feature
=
"board_qemu"
)]
mod
gui
;
mod
lang_items
;
mod
mm
;
...
...
@@ -60,10 +61,13 @@ pub fn rust_main() -> ! {
clear_bss
();
mm
::
init
();
println!
(
"KERN: init gpu"
);
#[cfg(feature
=
"board_qemu"
)]
GPU_DEVICE
.clone
();
println!
(
"KERN: init keyboard"
);
#[cfg(feature
=
"board_qemu"
)]
KEYBOARD_DEVICE
.clone
();
println!
(
"KERN: init mouse"
);
#[cfg(feature
=
"board_qemu"
)]
MOUSE_DEVICE
.clone
();
println!
(
"KERN: init trap"
);
trap
::
init
();
...
...
os/src/sbi.rs
浏览文件 @
4bf40e76
...
...
@@ -40,9 +40,13 @@ pub fn console_getchar() -> usize {
sbi_call
(
SBI_CONSOLE_GETCHAR
,
0
,
0
,
0
)
}
#[cfg(feature
=
"board_qemu"
)]
use
crate
::
board
::
QEMUExit
;
pub
fn
shutdown
(
exit_code
:
usize
)
->
!
{
//sbi_call(SBI_SHUTDOWN, exit_code, 0, 0);
#[cfg(feature
=
"board_k210"
)]
sbi_call
(
SBI_SHUTDOWN
,
exit_code
,
0
,
0
);
#[cfg(feature
=
"board_qemu"
)]
crate
::
board
::
QEMU_EXIT_HANDLE
.exit_failure
();
#[cfg(feature
=
"board_k210"
)]
panic!
(
"It should shutdown!"
);
}
os/src/syscall/mod.rs
浏览文件 @
4bf40e76
...
...
@@ -27,18 +27,22 @@ const SYSCALL_CONDVAR_SIGNAL: usize = 1031;
const
SYSCALL_CONDVAR_WAIT
:
usize
=
1032
;
const
SYSCALL_CREATE_DESKTOP
:
usize
=
2000
;
mod
fs
;
#[cfg(feature
=
"board_qemu"
)]
mod
gui
;
mod
process
;
mod
sync
;
mod
thread
;
#[cfg(feature
=
"board_qemu"
)]
pub
use
self
::
gui
::
create_desktop
;
use
fs
::
*
;
#[cfg(feature
=
"board_qemu"
)]
pub
use
gui
::
PAD
;
use
process
::
*
;
use
sync
::
*
;
use
thread
::
*
;
#[cfg(feature
=
"board_qemu"
)]
pub
fn
syscall
(
syscall_id
:
usize
,
args
:
[
usize
;
3
])
->
isize
{
match
syscall_id
{
SYSCALL_DUP
=>
sys_dup
(
args
[
0
]),
...
...
@@ -72,3 +76,37 @@ pub fn syscall(syscall_id: usize, args: [usize; 3]) -> isize {
_
=>
panic!
(
"Unsupported syscall_id: {}"
,
syscall_id
),
}
}
#[cfg(feature
=
"board_k210"
)]
pub
fn
syscall
(
syscall_id
:
usize
,
args
:
[
usize
;
3
])
->
isize
{
match
syscall_id
{
SYSCALL_DUP
=>
sys_dup
(
args
[
0
]),
SYSCALL_OPEN
=>
sys_open
(
args
[
0
]
as
*
const
u8
,
args
[
1
]
as
u32
),
SYSCALL_CLOSE
=>
sys_close
(
args
[
0
]),
SYSCALL_PIPE
=>
sys_pipe
(
args
[
0
]
as
*
mut
usize
),
SYSCALL_READ
=>
sys_read
(
args
[
0
],
args
[
1
]
as
*
const
u8
,
args
[
2
]),
SYSCALL_WRITE
=>
sys_write
(
args
[
0
],
args
[
1
]
as
*
const
u8
,
args
[
2
]),
SYSCALL_EXIT
=>
sys_exit
(
args
[
0
]
as
i32
),
SYSCALL_SLEEP
=>
sys_sleep
(
args
[
0
]),
SYSCALL_YIELD
=>
sys_yield
(),
SYSCALL_KILL
=>
sys_kill
(
args
[
0
],
args
[
1
]
as
u32
),
SYSCALL_GET_TIME
=>
sys_get_time
(),
SYSCALL_GETPID
=>
sys_getpid
(),
SYSCALL_FORK
=>
sys_fork
(),
SYSCALL_EXEC
=>
sys_exec
(
args
[
0
]
as
*
const
u8
,
args
[
1
]
as
*
const
usize
),
SYSCALL_WAITPID
=>
sys_waitpid
(
args
[
0
]
as
isize
,
args
[
1
]
as
*
mut
i32
),
SYSCALL_THREAD_CREATE
=>
sys_thread_create
(
args
[
0
],
args
[
1
]),
SYSCALL_GETTID
=>
sys_gettid
(),
SYSCALL_WAITTID
=>
sys_waittid
(
args
[
0
])
as
isize
,
SYSCALL_MUTEX_CREATE
=>
sys_mutex_create
(
args
[
0
]
==
1
),
SYSCALL_MUTEX_LOCK
=>
sys_mutex_lock
(
args
[
0
]),
SYSCALL_MUTEX_UNLOCK
=>
sys_mutex_unlock
(
args
[
0
]),
SYSCALL_SEMAPHORE_CREATE
=>
sys_semaphore_create
(
args
[
0
]),
SYSCALL_SEMAPHORE_UP
=>
sys_semaphore_up
(
args
[
0
]),
SYSCALL_SEMAPHORE_DOWN
=>
sys_semaphore_down
(
args
[
0
]),
SYSCALL_CONDVAR_CREATE
=>
sys_condvar_create
(
args
[
0
]),
SYSCALL_CONDVAR_SIGNAL
=>
sys_condvar_signal
(
args
[
0
]),
SYSCALL_CONDVAR_WAIT
=>
sys_condvar_wait
(
args
[
0
],
args
[
1
]),
_
=>
panic!
(
"Unsupported syscall_id: {}"
,
syscall_id
),
}
}
os/src/task/mod.rs
浏览文件 @
4bf40e76
...
...
@@ -56,7 +56,7 @@ pub fn block_current_and_run_next() {
let
task_cx_ptr
=
block_current_task
();
schedule
(
task_cx_ptr
);
}
#[cfg(feature
=
"board_qemu"
)]
use
crate
::
board
::
QEMUExit
;
pub
fn
exit_current_and_run_next
(
exit_code
:
i32
)
{
...
...
@@ -75,6 +75,7 @@ pub fn exit_current_and_run_next(exit_code: i32) {
// the process should terminate at once
if
tid
==
0
{
let
pid
=
process
.getpid
();
#[cfg(feature
=
"board_qemu"
)]
if
pid
==
IDLE_PID
{
println!
(
"[kernel] Idle process exit with exit_code {} ..."
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录