Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
rcore-os
RCore Tutorial V3
提交
c351635e
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 搜索 >>
提交
c351635e
编写于
12月 19, 2020
作者:
Y
Yifan Wu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Create two files and list them.
上级
459efec5
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
104 addition
and
36 deletion
+104
-36
easy-fs/Cargo.toml
easy-fs/Cargo.toml
+3
-1
easy-fs/src/bin/main.rs
easy-fs/src/bin/main.rs
+1
-2
easy-fs/src/block_cache.rs
easy-fs/src/block_cache.rs
+86
-0
easy-fs/src/dirty.rs
easy-fs/src/dirty.rs
+10
-29
easy-fs/src/layout.rs
easy-fs/src/layout.rs
+1
-1
easy-fs/src/lib.rs
easy-fs/src/lib.rs
+3
-1
easy-fs/src/vfs.rs
easy-fs/src/vfs.rs
+0
-2
未找到文件。
easy-fs/Cargo.toml
浏览文件 @
c351635e
...
...
@@ -7,4 +7,6 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
spin
=
"0.7.0"
\ No newline at end of file
spin
=
"0.7.0"
#lazy_static = { version = "1.4.0", features = ["spin_no_std"] }
lazy_static
=
"1.4.0"
\ No newline at end of file
easy-fs/src/bin/main.rs
浏览文件 @
c351635e
...
...
@@ -4,7 +4,6 @@ extern crate alloc;
use
easy_fs
::{
BlockDevice
,
EasyFileSystem
,
Inode
,
};
use
std
::
fs
::{
File
,
OpenOptions
};
use
std
::
io
::{
Read
,
Write
,
Seek
,
SeekFrom
};
...
...
@@ -54,7 +53,7 @@ fn easy_fs_pack() -> std::io::Result<()> {
root_inode
.create
(
"filea"
);
root_inode
.create
(
"fileb"
);
for
name
in
root_inode
.ls
()
{
println!
(
"
name"
);
println!
(
"
{}"
,
name
);
}
Ok
(())
}
\ No newline at end of file
easy-fs/src/block_cache.rs
0 → 100644
浏览文件 @
c351635e
use
super
::{
BlockDevice
,
BLOCK_SZ
,
};
use
alloc
::
sync
::{
Arc
,
Weak
};
use
alloc
::
collections
::
BTreeMap
;
use
lazy_static
::
*
;
use
spin
::
Mutex
;
pub
struct
BlockCache
{
cache
:
[
u8
;
BLOCK_SZ
],
block_id
:
usize
,
block_device
:
Arc
<
dyn
BlockDevice
>
,
}
impl
BlockCache
{
pub
fn
new
(
block_id
:
usize
,
block_device
:
Arc
<
dyn
BlockDevice
>
)
->
Self
{
let
mut
cache
=
[
0u8
;
BLOCK_SZ
];
block_device
.read_block
(
block_id
,
&
mut
cache
);
Self
{
cache
,
block_id
,
block_device
,
}
}
pub
fn
start_addr
(
&
self
,
offset
:
usize
)
->
usize
{
&
self
.cache
[
offset
]
as
*
const
_
as
usize
}
}
impl
Drop
for
BlockCache
{
fn
drop
(
&
mut
self
)
{
// write back
self
.block_device
.write_block
(
self
.block_id
,
&
self
.cache
);
// invalid in block cache manager
BLOCK_CACHE_MANAGER
.lock
()
.invalid
(
self
.block_id
);
}
}
pub
struct
BlockCacheManager
{
map
:
BTreeMap
<
usize
,
Weak
<
BlockCache
>>
,
}
lazy_static!
{
static
ref
BLOCK_CACHE_MANAGER
:
Mutex
<
BlockCacheManager
>
=
Mutex
::
new
(
BlockCacheManager
::
new
()
);
}
impl
BlockCacheManager
{
pub
fn
new
()
->
Self
{
Self
{
map
:
BTreeMap
::
new
()
}
}
pub
fn
get
(
&
mut
self
,
block_id
:
usize
,
block_device
:
Arc
<
dyn
BlockDevice
>
)
->
Arc
<
BlockCache
>
{
if
let
Some
(
block_cache
)
=
self
.map
.get
(
&
block_id
)
{
// return cloned
block_cache
.upgrade
()
.unwrap
()
.clone
()
}
else
{
// fetch from disk
let
block_cache
=
Arc
::
new
(
BlockCache
::
new
(
block_id
,
block_device
.clone
()
));
self
.map
.insert
(
block_id
,
Arc
::
downgrade
(
&
block_cache
),
);
// return
block_cache
}
}
pub
fn
invalid
(
&
mut
self
,
block_id
:
usize
)
{
assert
!
(
self
.map
.remove
(
&
block_id
)
.is_some
());
}
}
pub
fn
get_block_cache
(
block_id
:
usize
,
block_device
:
Arc
<
dyn
BlockDevice
>
)
->
Arc
<
BlockCache
>
{
BLOCK_CACHE_MANAGER
.lock
()
.get
(
block_id
,
block_device
)
}
\ No newline at end of file
easy-fs/src/dirty.rs
浏览文件 @
c351635e
use
super
::
BlockDevice
;
use
super
::
BLOCK_SZ
;
use
super
::{
BlockDevice
,
BLOCK_SZ
,
BlockCache
,
get_block_cache
,
};
use
alloc
::
sync
::
Arc
;
use
core
::
marker
::
PhantomData
;
pub
struct
Dirty
<
T
>
{
block_id
:
usize
,
block_cache
:
[
u8
;
BLOCK_SZ
],
block_cache
:
Arc
<
BlockCache
>
,
offset
:
usize
,
dirty
:
bool
,
block_device
:
Arc
<
dyn
BlockDevice
>
,
phantom
:
PhantomData
<
T
>
,
}
impl
<
T
>
Dirty
<
T
>
where
T
:
Sized
{
pub
fn
new
(
block_id
:
usize
,
offset
:
usize
,
block_device
:
Arc
<
dyn
BlockDevice
>
)
->
Self
{
Self
{
block_id
,
block_cache
:
{
let
mut
cache
=
[
0u8
;
BLOCK_SZ
];
block_device
.read_block
(
block_id
as
usize
,
&
mut
cache
);
cache
},
block_cache
:
get_block_cache
(
block_id
,
block_device
.clone
()),
offset
,
dirty
:
false
,
block_device
,
phantom
:
PhantomData
,
}
}
pub
fn
get_mut
(
&
mut
self
)
->
&
mut
T
{
self
.dirty
=
true
;
let
type_size
=
core
::
mem
::
size_of
::
<
T
>
();
// assert that the struct is inside a block
assert
!
(
self
.offset
+
type_size
<=
BLOCK_SZ
);
let
start_addr
=
&
self
.block_cache
[
self
.offset
]
as
*
const
_
as
usize
;
let
start_addr
=
self
.block_cache
.start_addr
(
self
.offset
)
;
unsafe
{
&
mut
*
(
start_addr
as
*
mut
T
)
}
}
pub
fn
get_ref
(
&
self
)
->
&
T
{
let
type_size
=
core
::
mem
::
size_of
::
<
T
>
();
// assert that the struct is inside a block
assert
!
(
self
.offset
+
type_size
<=
BLOCK_SZ
);
let
start_addr
=
&
self
.block_cache
[
self
.offset
]
as
*
const
_
as
usize
;
let
start_addr
=
self
.block_cache
.start_addr
(
self
.offset
)
;
unsafe
{
&*
(
start_addr
as
*
const
T
)
}
}
pub
fn
read
<
V
>
(
&
self
,
f
:
impl
FnOnce
(
&
T
)
->
V
)
->
V
{
...
...
@@ -48,16 +41,4 @@ impl<T> Dirty<T> where T: Sized {
pub
fn
modify
(
&
mut
self
,
f
:
impl
FnOnce
(
&
mut
T
))
{
f
(
self
.get_mut
());
}
pub
fn
write_back
(
&
mut
self
)
{
if
self
.dirty
{
self
.block_device
.write_block
(
self
.block_id
as
usize
,
&
self
.block_cache
);
}
}
}
impl
<
T
>
Drop
for
Dirty
<
T
>
{
fn
drop
(
&
mut
self
)
{
self
.write_back
();
}
}
\ No newline at end of file
easy-fs/src/layout.rs
浏览文件 @
c351635e
...
...
@@ -247,7 +247,7 @@ pub struct DirEntry {
pub
const
DIRENT_SZ
:
usize
=
32
;
pub
type
DirentBlock
=
[
DirEntry
;
BLOCK_SZ
/
DIRENT_SZ
];
//
pub type DirentBlock = [DirEntry; BLOCK_SZ / DIRENT_SZ];
pub
type
DirentBytes
=
[
u8
;
DIRENT_SZ
];
impl
DirEntry
{
...
...
easy-fs/src/lib.rs
浏览文件 @
c351635e
...
...
@@ -6,6 +6,7 @@ mod efs;
mod
dirty
;
mod
bitmap
;
mod
vfs
;
mod
block_cache
;
pub
const
BLOCK_SZ
:
usize
=
512
;
pub
use
block_dev
::
BlockDevice
;
...
...
@@ -13,4 +14,5 @@ pub use efs::EasyFileSystem;
pub
use
vfs
::
Inode
;
use
layout
::
*
;
use
dirty
::
Dirty
;
use
bitmap
::
Bitmap
;
\ No newline at end of file
use
bitmap
::
Bitmap
;
use
block_cache
::{
BlockCache
,
get_block_cache
};
\ No newline at end of file
easy-fs/src/vfs.rs
浏览文件 @
c351635e
...
...
@@ -6,13 +6,11 @@ use super::{
DirEntry
,
DirentBytes
,
EasyFileSystem
,
BLOCK_SZ
,
DIRENT_SZ
,
};
use
alloc
::
sync
::
Arc
;
use
alloc
::
string
::
String
;
use
alloc
::
vec
::
Vec
;
use
crate
::
layout
::
DiskInodeType
::
Directory
;
use
spin
::{
Mutex
,
MutexGuard
};
pub
struct
Inode
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录