Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
rcore-os
RCore Tutorial V3
提交
109d3339
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 搜索 >>
未验证
提交
109d3339
编写于
9月 02, 2022
作者:
Y
Yifan Wu
提交者:
GitHub
9月 02, 2022
1
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #87 from DeathWish5/ch6
上级
3f0d1aba
066ec932
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
34 addition
and
31 deletion
+34
-31
os/src/drivers/block/virtio_blk.rs
os/src/drivers/block/virtio_blk.rs
+34
-31
未找到文件。
os/src/drivers/block/virtio_blk.rs
浏览文件 @
109d3339
...
...
@@ -6,12 +6,12 @@ use crate::mm::{
use
crate
::
sync
::
UPSafeCell
;
use
alloc
::
vec
::
Vec
;
use
lazy_static
::
*
;
use
virtio_drivers
::{
VirtIOBlk
,
VirtIOHeader
};
use
virtio_drivers
::{
Hal
,
VirtIOBlk
,
VirtIOHeader
};
#[allow(unused)]
const
VIRTIO0
:
usize
=
0x10001000
;
pub
struct
VirtIOBlock
(
UPSafeCell
<
VirtIOBlk
<
'static
>>
);
pub
struct
VirtIOBlock
(
UPSafeCell
<
VirtIOBlk
<
'static
,
VirtioHal
>>
);
lazy_static!
{
static
ref
QUEUE_FRAMES
:
UPSafeCell
<
Vec
<
FrameTracker
>>
=
unsafe
{
UPSafeCell
::
new
(
Vec
::
new
())
};
...
...
@@ -37,44 +37,47 @@ impl VirtIOBlock {
pub
fn
new
()
->
Self
{
unsafe
{
Self
(
UPSafeCell
::
new
(
VirtIOBlk
::
new
(
&
mut
*
(
VIRTIO0
as
*
mut
VirtIOHeader
))
.unwrap
(),
VirtIOBlk
::
<
VirtioHal
>
::
new
(
&
mut
*
(
VIRTIO0
as
*
mut
VirtIOHeader
))
.unwrap
(),
))
}
}
}
#[no_mangle]
pub
extern
"C"
fn
virtio_dma_alloc
(
pages
:
usize
)
->
PhysAddr
{
let
mut
ppn_base
=
PhysPageNum
(
0
);
for
i
in
0
..
pages
{
let
frame
=
frame_alloc
()
.unwrap
();
if
i
==
0
{
ppn_base
=
frame
.ppn
;
pub
struct
VirtioHal
;
impl
Hal
for
VirtioHal
{
fn
dma_alloc
(
pages
:
usize
)
->
usize
{
let
mut
ppn_base
=
PhysPageNum
(
0
);
for
i
in
0
..
pages
{
let
frame
=
frame_alloc
()
.unwrap
();
if
i
==
0
{
ppn_base
=
frame
.ppn
;
}
assert_eq!
(
frame
.ppn
.0
,
ppn_base
.0
+
i
);
QUEUE_FRAMES
.exclusive_access
()
.push
(
frame
);
}
assert_eq!
(
frame
.ppn
.0
,
ppn_base
.0
+
i
);
QUEUE_FRAMES
.exclusive_access
()
.push
(
frame
);
let
pa
:
PhysAddr
=
ppn_base
.into
(
);
pa
.0
}
ppn_base
.into
()
}
#[no_mangle]
pub
extern
"C"
fn
virtio_dma_dealloc
(
pa
:
PhysAddr
,
pages
:
usize
)
->
i32
{
let
mut
ppn_base
:
PhysPageNum
=
pa
.into
();
for
_
in
0
..
pages
{
frame_dealloc
(
ppn_base
);
ppn_base
.step
();
fn
dma_dealloc
(
pa
:
usize
,
pages
:
usize
)
->
i32
{
let
pa
=
PhysAddr
::
from
(
pa
);
let
mut
ppn_base
:
PhysPageNum
=
pa
.into
();
for
_
in
0
..
pages
{
frame_dealloc
(
ppn_base
);
ppn_base
.step
();
}
0
}
0
}
#[no_mangle]
pub
extern
"C"
fn
virtio_phys_to_virt
(
paddr
:
PhysAddr
)
->
VirtAddr
{
VirtAddr
(
paddr
.0
)
}
fn
phys_to_virt
(
addr
:
usize
)
->
usize
{
addr
}
#[no_mangle]
pub
extern
"C"
fn
virtio_virt_to_phys
(
vaddr
:
VirtAddr
)
->
PhysAddr
{
PageTable
::
from_token
(
kernel_token
())
.translate_va
(
vaddr
)
.unwrap
()
fn
virt_to_phys
(
vaddr
:
usize
)
->
usize
{
PageTable
::
from_token
(
kernel_token
())
.translate_va
(
VirtAddr
::
from
(
vaddr
))
.unwrap
()
.0
}
}
Miykael_xxm
🚴
@xiongjiamu
mentioned in commit
6baca796
·
9月 05, 2022
mentioned in commit
6baca796
mentioned in commit 6baca79663e4b292bb324177b50c9e1e134e8155
开关提交列表
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录