Skip to content

Commit 80ca935

Browse files
committed
20240524 3:40
1 parent b941261 commit 80ca935

File tree

21 files changed

+366
-111
lines changed

21 files changed

+366
-111
lines changed

kernel/src/arch/riscv64/mm/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::{
1212
page_frame::{FrameAllocator, PageFrameCount, PageFrameUsage, PhysPageFrame},
1313
},
1414
kernel_mapper::KernelMapper,
15-
page::{PageEntry, PageFlags, PAGE_1G_SHIFT},
15+
page::{PageEntry, EntryFlags, PAGE_1G_SHIFT},
1616
ucontext::UserMapper,
1717
MemoryManagementArch, PageTableKind, PhysAddr, VirtAddr,
1818
},
@@ -270,8 +270,8 @@ impl VirtAddr {
270270
}
271271

272272
/// 获取内核地址默认的页面标志
273-
pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(_virt: VirtAddr) -> PageFlags<A> {
274-
PageFlags::from_data(RiscV64MMArch::ENTRY_FLAG_DEFAULT_PAGE)
273+
pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(_virt: VirtAddr) -> EntryFlags<A> {
274+
EntryFlags::from_data(RiscV64MMArch::ENTRY_FLAG_DEFAULT_PAGE)
275275
.set_user(false)
276276
.set_execute(true)
277277
}

kernel/src/arch/x86_64/kvm/vmx/ept.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::arch::mm::LockedFrameAllocator;
22
use crate::arch::mm::PageMapper;
33
use crate::arch::MMArch;
4-
use crate::mm::page::PageFlags;
4+
use crate::mm::page::EntryFlags;
55
use crate::mm::{PageTableKind, PhysAddr, VirtAddr};
66
use crate::smp::core::smp_get_processor_id;
77
use crate::smp::cpu::AtomicProcessorId;
@@ -92,7 +92,7 @@ impl EptMapper {
9292
&mut self,
9393
gpa: u64,
9494
hpa: u64,
95-
flags: PageFlags<MMArch>,
95+
flags: EntryFlags<MMArch>,
9696
) -> Result<(), SystemError> {
9797
if self.readonly {
9898
return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);

kernel/src/arch/x86_64/kvm/vmx/mmu.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::{
22
arch::kvm::vmx::ept::EptMapper,
33
kdebug,
44
libs::mutex::Mutex,
5-
mm::{page::PageFlags, syscall::ProtFlags},
5+
mm::{page::EntryFlags, syscall::ProtFlags},
66
virt::kvm::host_mem::{__gfn_to_pfn, kvm_vcpu_gfn_to_memslot, PAGE_MASK, PAGE_SHIFT},
77
};
88
use bitfield_struct::bitfield;
@@ -218,7 +218,7 @@ pub fn __direct_map(
218218
}
219219
// 把gpa映射到hpa
220220
let mut ept_mapper = EptMapper::lock();
221-
let page_flags = PageFlags::from_prot_flags(ProtFlags::from_bits_truncate(0x7_u64), false);
221+
let page_flags = EntryFlags::from_prot_flags(ProtFlags::from_bits_truncate(0x7_u64), false);
222222
unsafe {
223223
assert!(ept_mapper.walk(gpa, pfn << PAGE_SHIFT, page_flags).is_ok());
224224
}

kernel/src/arch/x86_64/mm/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::{
2727
};
2828

2929
use crate::mm::kernel_mapper::KernelMapper;
30-
use crate::mm::page::{PageEntry, PageFlags, PAGE_1G_SHIFT};
30+
use crate::mm::page::{PageEntry, EntryFlags, PAGE_1G_SHIFT};
3131
use crate::mm::{MemoryManagementArch, PageTableKind, PhysAddr, VirtAddr};
3232
use crate::{kdebug, kinfo, kwarn};
3333
use system_error::SystemError;
@@ -651,17 +651,17 @@ impl FrameAllocator for LockedFrameAllocator {
651651
}
652652

653653
/// 获取内核地址默认的页面标志
654-
pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(virt: VirtAddr) -> PageFlags<A> {
654+
pub unsafe fn kernel_page_flags<A: MemoryManagementArch>(virt: VirtAddr) -> EntryFlags<A> {
655655
let info: X86_64MMBootstrapInfo = BOOTSTRAP_MM_INFO.unwrap();
656656

657657
if virt.data() >= info.kernel_code_start && virt.data() < info.kernel_code_end {
658658
// Remap kernel code execute
659-
return PageFlags::new().set_execute(true).set_write(true);
659+
return EntryFlags::new().set_execute(true).set_write(true);
660660
} else if virt.data() >= info.kernel_data_end && virt.data() < info.kernel_rodata_end {
661661
// Remap kernel rodata read only
662-
return PageFlags::new().set_execute(true);
662+
return EntryFlags::new().set_execute(true);
663663
} else {
664-
return PageFlags::new().set_write(true).set_execute(true);
664+
return EntryFlags::new().set_write(true).set_execute(true);
665665
}
666666
}
667667

kernel/src/driver/net/dma.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::arch::mm::kernel_page_flags;
33
use crate::arch::MMArch;
44

55
use crate::mm::kernel_mapper::KernelMapper;
6-
use crate::mm::page::{page_manager_lock_irqsave, PageFlags};
6+
use crate::mm::page::{page_manager_lock_irqsave, EntryFlags};
77
use crate::mm::{
88
allocator::page_frame::{
99
allocate_page_frames, deallocate_page_frames, PageFrameCount, PhysPageFrame,
@@ -25,7 +25,7 @@ pub fn dma_alloc(pages: usize) -> (usize, NonNull<u8>) {
2525
// 清空这块区域,防止出现脏数据
2626
core::ptr::write_bytes(virt.data() as *mut u8, 0, count.data() * MMArch::PAGE_SIZE);
2727

28-
let dma_flags: PageFlags<MMArch> = PageFlags::mmio_flags();
28+
let dma_flags: EntryFlags<MMArch> = EntryFlags::mmio_flags();
2929

3030
let mut kernel_mapper = KernelMapper::lock();
3131
let kernel_mapper = kernel_mapper.as_mut().unwrap();

kernel/src/driver/video/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
spinlock::SpinLock,
1212
},
1313
mm::{
14-
allocator::page_frame::PageFrameCount, kernel_mapper::KernelMapper, page::PageFlags,
14+
allocator::page_frame::PageFrameCount, kernel_mapper::KernelMapper, page::EntryFlags,
1515
MemoryManagementArch,
1616
},
1717
time::timer::{Timer, TimerFunction},
@@ -95,7 +95,7 @@ impl VideoRefreshManager {
9595
let count = PageFrameCount::new(
9696
page_align_up(frame_buffer_info_guard.buf_size()) / MMArch::PAGE_SIZE,
9797
);
98-
let page_flags: PageFlags<MMArch> = PageFlags::new().set_execute(true).set_write(true);
98+
let page_flags: EntryFlags<MMArch> = EntryFlags::new().set_execute(true).set_write(true);
9999

100100
let mut kernel_mapper = KernelMapper::lock();
101101
let mut kernel_mapper = kernel_mapper.as_mut();

kernel/src/driver/virtio/virtio_impl.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::arch::mm::kernel_page_flags;
33
use crate::arch::MMArch;
44

55
use crate::mm::kernel_mapper::KernelMapper;
6-
use crate::mm::page::{page_manager_lock_irqsave, PageFlags};
6+
use crate::mm::page::{page_manager_lock_irqsave, EntryFlags};
77
use crate::mm::{
88
allocator::page_frame::{
99
allocate_page_frames, deallocate_page_frames, PageFrameCount, PhysPageFrame,
@@ -32,7 +32,7 @@ unsafe impl Hal for HalImpl {
3232
// 清空这块区域,防止出现脏数据
3333
core::ptr::write_bytes(virt.data() as *mut u8, 0, count.data() * MMArch::PAGE_SIZE);
3434

35-
let dma_flags: PageFlags<MMArch> = PageFlags::mmio_flags();
35+
let dma_flags: EntryFlags<MMArch> = EntryFlags::mmio_flags();
3636

3737
let mut kernel_mapper = KernelMapper::lock();
3838
let kernel_mapper = kernel_mapper.as_mut().unwrap();

kernel/src/filesystem/vfs/file.rs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,27 @@ use alloc::{
55
sync::{Arc, Weak},
66
vec::Vec,
77
};
8+
use hashbrown::HashMap;
89
use system_error::SystemError;
910

1011
use crate::{
1112
driver::{
1213
base::{block::SeekFrom, device::DevicePrivateData},
1314
tty::tty_device::TtyFilePrivateData,
1415
},
15-
filesystem::procfs::ProcfsFilePrivateData,
16+
filesystem::{fat::fs::LockedFATInode, procfs::ProcfsFilePrivateData},
1617
ipc::pipe::{LockedPipeInode, PipeFsPrivateData},
1718
kerror,
1819
libs::{rwlock::RwLock, spinlock::SpinLock},
20+
mm::page::Page,
1921
net::{
2022
event_poll::{EPollItem, EPollPrivateData, EventPoll},
2123
socket::SocketInode,
2224
},
2325
process::ProcessManager,
2426
};
2527

26-
use super::{Dirent, FileType, IndexNode, InodeId, Metadata, SpecialNodeData};
28+
use super::{mount::MountFSInode, Dirent, FileType, IndexNode, InodeId, Metadata, SpecialNodeData};
2729

2830
/// 文件私有信息的枚举类型
2931
#[derive(Debug, Clone)]
@@ -118,6 +120,54 @@ impl FileMode {
118120
return self.bits() & FileMode::O_ACCMODE.bits();
119121
}
120122
}
123+
124+
pub struct PageCache {
125+
inode_ref: Weak<dyn IndexNode>,
126+
map: HashMap<usize, Arc<Page>>,
127+
}
128+
129+
impl PageCache {
130+
pub fn new(inode_ref: Weak<dyn IndexNode>) -> PageCache {
131+
Self {
132+
inode_ref,
133+
map: HashMap::new(),
134+
}
135+
}
136+
137+
pub fn set_page(&mut self, offset: usize, page: Arc<Page>) {
138+
self.map.insert(offset, page);
139+
}
140+
141+
pub fn get_page(&self, offset: usize) -> Option<Arc<Page>> {
142+
self.map.get(&offset).map(|page| page.clone())
143+
}
144+
145+
// pub fn get_pages(&self, start_pgoff: usize, end_pgoff: usize) -> Vec<Arc<Page>> {
146+
// let mut vec = Vec::new();
147+
// for pgoff in start_pgoff..=end_pgoff {
148+
// if let Some(page) = self.map.get(&pgoff) {
149+
// vec.push(page.clone());
150+
// }
151+
// }
152+
// vec
153+
// }
154+
}
155+
156+
pub trait PageCacheOperations: IndexNode {
157+
fn write_page(&self, page: Page);
158+
fn read_ahead(&self);
159+
}
160+
161+
impl PageCacheOperations for LockedFATInode {
162+
fn write_page(&self, page: Page) {
163+
todo!()
164+
}
165+
166+
fn read_ahead(&self) {
167+
todo!()
168+
}
169+
}
170+
121171
/// @brief 抽象文件结构体
122172
#[derive(Debug)]
123173
pub struct File {

kernel/src/filesystem/vfs/mod.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ use crate::{
2323
time::PosixTimeSpec,
2424
};
2525

26-
use self::{core::generate_inode_id, file::FileMode, syscall::ModeType, utils::DName};
26+
use self::{
27+
core::generate_inode_id,
28+
file::{FileMode, PageCache},
29+
syscall::ModeType,
30+
utils::DName,
31+
};
2732
pub use self::{core::ROOT_INODE, file::FilePrivateData, mount::MountFS};
2833

2934
/// vfs容许的最大的路径名称长度
@@ -548,6 +553,10 @@ pub trait IndexNode: Any + Sync + Send + Debug + CastFromSync {
548553
fn parent(&self) -> Result<Arc<dyn IndexNode>, SystemError> {
549554
return self.find("..");
550555
}
556+
557+
fn page_cache(&self) -> Option<PageCache> {
558+
None
559+
}
551560
}
552561

553562
impl DowncastArc for dyn IndexNode {

kernel/src/filesystem/vfs/mount.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ impl IndexNode for MountFSInode {
296296

297297
#[inline]
298298
fn fs(&self) -> Arc<dyn FileSystem> {
299+
kdebug!("{}", self.inner_inode.fs().name());
299300
return self.mount_fs.clone();
300301
}
301302

0 commit comments

Comments
 (0)