mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 11:16:47 +00:00
增加/dev/fb0,能够在用户程序读写帧缓冲区 (#485)
This commit is contained in:
parent
e7071df6a4
commit
02343d0b5b
@ -8,6 +8,11 @@ impl Major {
|
|||||||
|
|
||||||
/// 未命名的主设备
|
/// 未命名的主设备
|
||||||
pub const UNNAMED_MAJOR: Self = Self::new(0);
|
pub const UNNAMED_MAJOR: Self = Self::new(0);
|
||||||
|
|
||||||
|
pub const IDE0_MAJOR: Self = Self::new(3);
|
||||||
|
pub const HD_MAJOR: Self = Self::IDE0_MAJOR;
|
||||||
|
|
||||||
|
pub const INPUT_MAJOR: Self = Self::new(13);
|
||||||
/// /dev/fb* framebuffers
|
/// /dev/fb* framebuffers
|
||||||
pub const FB_MAJOR: Self = Self::new(29);
|
pub const FB_MAJOR: Self = Self::new(29);
|
||||||
|
|
||||||
|
@ -423,7 +423,7 @@ impl DeviceManager {
|
|||||||
/// https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c#3398
|
/// https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c#3398
|
||||||
///
|
///
|
||||||
/// todo: 完善错误处理逻辑:如果添加失败,需要将之前添加的内容全部回滚
|
/// todo: 完善错误处理逻辑:如果添加失败,需要将之前添加的内容全部回滚
|
||||||
#[inline]
|
#[inline(never)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn add_device(&self, device: Arc<dyn Device>) -> Result<(), SystemError> {
|
pub fn add_device(&self, device: Arc<dyn Device>) -> Result<(), SystemError> {
|
||||||
// 在这里处理与parent相关的逻辑
|
// 在这里处理与parent相关的逻辑
|
||||||
@ -547,6 +547,9 @@ impl DeviceManager {
|
|||||||
/// @brief: 卸载设备
|
/// @brief: 卸载设备
|
||||||
/// @parameter id_table: 总线标识符,用于唯一标识该设备
|
/// @parameter id_table: 总线标识符,用于唯一标识该设备
|
||||||
/// @return: None
|
/// @return: None
|
||||||
|
///
|
||||||
|
/// ## 注意
|
||||||
|
/// 该函数已废弃,不再使用
|
||||||
#[inline]
|
#[inline]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn remove_device(&self, _id_table: &IdTable) {
|
pub fn remove_device(&self, _id_table: &IdTable) {
|
||||||
@ -554,7 +557,7 @@ impl DeviceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#542
|
/// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#542
|
||||||
fn remove(&self, _dev: &Arc<dyn Device>) {
|
pub fn remove(&self, _dev: &Arc<dyn Device>) {
|
||||||
todo!("DeviceManager::remove")
|
todo!("DeviceManager::remove")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
use crate::driver::base::block::block_device::BlockDevice;
|
use crate::driver::base::block::block_device::BlockDevice;
|
||||||
|
use crate::driver::base::device::device_number::{DeviceNumber, Major};
|
||||||
use crate::filesystem::devfs::{DevFS, DeviceINode};
|
use crate::filesystem::devfs::{DevFS, DeviceINode};
|
||||||
use crate::filesystem::vfs::file::FileMode;
|
use crate::filesystem::vfs::file::FileMode;
|
||||||
use crate::filesystem::vfs::syscall::ModeType;
|
use crate::filesystem::vfs::syscall::ModeType;
|
||||||
use crate::filesystem::vfs::{
|
use crate::filesystem::vfs::{
|
||||||
core::generate_inode_id, make_rawdev, FilePrivateData, FileSystem, FileType, IndexNode,
|
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
||||||
Metadata,
|
|
||||||
};
|
};
|
||||||
use crate::{libs::spinlock::SpinLock, time::TimeSpec};
|
use crate::{libs::spinlock::SpinLock, time::TimeSpec};
|
||||||
use alloc::{
|
use alloc::{
|
||||||
@ -54,7 +54,7 @@ impl LockedAhciInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: make_rawdev(1, 3), // 这里用来作为device number
|
raw_dev: DeviceNumber::new(Major::HD_MAJOR, 0),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,7 +3,10 @@ use core::{ffi::c_void, sync::atomic::AtomicI32};
|
|||||||
use alloc::sync::{Arc, Weak};
|
use alloc::sync::{Arc, Weak};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
driver::tty::tty_device::TTY_DEVICES,
|
driver::{
|
||||||
|
base::device::device_number::{DeviceNumber, Major},
|
||||||
|
tty::tty_device::TTY_DEVICES,
|
||||||
|
},
|
||||||
filesystem::{
|
filesystem::{
|
||||||
devfs::{devfs_register, DevFS, DeviceINode},
|
devfs::{devfs_register, DevFS, DeviceINode},
|
||||||
vfs::{
|
vfs::{
|
||||||
@ -65,7 +68,7 @@ impl LockedPS2KeyBoardInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0, // 这里用来作为device number
|
raw_dev: DeviceNumber::new(Major::INPUT_MAJOR, 0), // 这里用来作为device number
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ use core::intrinsics::unlikely;
|
|||||||
use alloc::{
|
use alloc::{
|
||||||
string::{String, ToString},
|
string::{String, ToString},
|
||||||
sync::{Arc, Weak},
|
sync::{Arc, Weak},
|
||||||
|
vec::Vec,
|
||||||
};
|
};
|
||||||
|
|
||||||
use system_error::SystemError;
|
use system_error::SystemError;
|
||||||
@ -22,11 +23,19 @@ use crate::{
|
|||||||
kset::KSet,
|
kset::KSet,
|
||||||
subsys::SubSysPrivate,
|
subsys::SubSysPrivate,
|
||||||
},
|
},
|
||||||
filesystem::{kernfs::KernFSInode, sysfs::AttributeGroup},
|
filesystem::{
|
||||||
|
devfs::{devfs_register, DevFS, DeviceINode},
|
||||||
|
kernfs::KernFSInode,
|
||||||
|
sysfs::AttributeGroup,
|
||||||
|
vfs::{
|
||||||
|
file::FileMode, syscall::ModeType, FilePrivateData, FileSystem, FileType, IndexNode,
|
||||||
|
Metadata,
|
||||||
|
},
|
||||||
|
},
|
||||||
init::initcall::INITCALL_SUBSYS,
|
init::initcall::INITCALL_SUBSYS,
|
||||||
libs::{
|
libs::{
|
||||||
rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
|
rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
|
||||||
spinlock::SpinLock,
|
spinlock::{SpinLock, SpinLockGuard},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -141,6 +150,16 @@ impl FrameBufferManager {
|
|||||||
fb.set_fb_device(Some(fb_device.clone()));
|
fb.set_fb_device(Some(fb_device.clone()));
|
||||||
|
|
||||||
device_manager().add_device(fb_device.clone() as Arc<dyn Device>)?;
|
device_manager().add_device(fb_device.clone() as Arc<dyn Device>)?;
|
||||||
|
// 添加到devfs
|
||||||
|
devfs_register(&fb_device.name(), fb_device.clone()).map_err(|e| {
|
||||||
|
kerror!(
|
||||||
|
"register fb device '{}' to devfs failed: {:?}",
|
||||||
|
fb_device.name(),
|
||||||
|
e
|
||||||
|
);
|
||||||
|
device_manager().remove(&(fb_device.clone() as Arc<dyn Device>));
|
||||||
|
e
|
||||||
|
})?;
|
||||||
|
|
||||||
// todo: 从Modedb中获取信息
|
// todo: 从Modedb中获取信息
|
||||||
// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1584
|
// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1584
|
||||||
@ -195,7 +214,7 @@ pub struct FbDevice {
|
|||||||
impl FbDevice {
|
impl FbDevice {
|
||||||
pub const BASENAME: &'static str = "fb";
|
pub const BASENAME: &'static str = "fb";
|
||||||
fn new(fb: Weak<dyn FrameBuffer>, id: FbId) -> Arc<Self> {
|
fn new(fb: Weak<dyn FrameBuffer>, id: FbId) -> Arc<Self> {
|
||||||
Arc::new(Self {
|
let r = Arc::new(Self {
|
||||||
inner: SpinLock::new(InnerFbDevice {
|
inner: SpinLock::new(InnerFbDevice {
|
||||||
fb,
|
fb,
|
||||||
kern_inode: None,
|
kern_inode: None,
|
||||||
@ -203,14 +222,36 @@ impl FbDevice {
|
|||||||
kset: None,
|
kset: None,
|
||||||
ktype: None,
|
ktype: None,
|
||||||
fb_id: id,
|
fb_id: id,
|
||||||
|
device_inode_fs: None,
|
||||||
|
devfs_metadata: Metadata::new(
|
||||||
|
FileType::FramebufferDevice,
|
||||||
|
ModeType::from_bits_truncate(0o666),
|
||||||
|
),
|
||||||
}),
|
}),
|
||||||
kobj_state: LockedKObjectState::new(None),
|
kobj_state: LockedKObjectState::new(None),
|
||||||
})
|
});
|
||||||
|
|
||||||
|
let mut inner_guard = r.inner.lock();
|
||||||
|
|
||||||
|
inner_guard.devfs_metadata.raw_dev = r.do_device_number(&inner_guard);
|
||||||
|
drop(inner_guard);
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn framebuffer(&self) -> Option<Arc<dyn FrameBuffer>> {
|
pub fn framebuffer(&self) -> Option<Arc<dyn FrameBuffer>> {
|
||||||
self.inner.lock().fb.upgrade()
|
self.inner.lock().fb.upgrade()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 获取设备号
|
||||||
|
pub fn device_number(&self) -> DeviceNumber {
|
||||||
|
let inner_guard = self.inner.lock();
|
||||||
|
self.do_device_number(&inner_guard)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_device_number(&self, inner_guard: &SpinLockGuard<'_, InnerFbDevice>) -> DeviceNumber {
|
||||||
|
DeviceNumber::new(Major::FB_MAJOR, inner_guard.fb_id.data())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -222,6 +263,10 @@ struct InnerFbDevice {
|
|||||||
ktype: Option<&'static dyn KObjType>,
|
ktype: Option<&'static dyn KObjType>,
|
||||||
/// 帧缓冲区id
|
/// 帧缓冲区id
|
||||||
fb_id: FbId,
|
fb_id: FbId,
|
||||||
|
|
||||||
|
/// device inode要求的字段
|
||||||
|
device_inode_fs: Option<Weak<DevFS>>,
|
||||||
|
devfs_metadata: Metadata,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl KObject for FbDevice {
|
impl KObject for FbDevice {
|
||||||
@ -288,13 +333,7 @@ impl Device for FbDevice {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn id_table(&self) -> IdTable {
|
fn id_table(&self) -> IdTable {
|
||||||
IdTable::new(
|
IdTable::new(Self::BASENAME.to_string(), Some(self.device_number()))
|
||||||
Self::BASENAME.to_string(),
|
|
||||||
Some(DeviceNumber::new(
|
|
||||||
Major::FB_MAJOR,
|
|
||||||
self.inner.lock().fb_id.data(),
|
|
||||||
)),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
|
fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
|
||||||
@ -336,3 +375,66 @@ impl Device for FbDevice {
|
|||||||
Some(&[&FbDeviceAttrGroup])
|
Some(&[&FbDeviceAttrGroup])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl DeviceINode for FbDevice {
|
||||||
|
fn set_fs(&self, fs: Weak<DevFS>) {
|
||||||
|
self.inner.lock().device_inode_fs = Some(fs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IndexNode for FbDevice {
|
||||||
|
fn open(&self, _data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
fn read_at(
|
||||||
|
&self,
|
||||||
|
offset: usize,
|
||||||
|
len: usize,
|
||||||
|
buf: &mut [u8],
|
||||||
|
_data: &mut FilePrivateData,
|
||||||
|
) -> Result<usize, SystemError> {
|
||||||
|
let fb = self.inner.lock().fb.upgrade().unwrap();
|
||||||
|
return fb.fb_read(&mut buf[0..len], offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write_at(
|
||||||
|
&self,
|
||||||
|
offset: usize,
|
||||||
|
len: usize,
|
||||||
|
buf: &[u8],
|
||||||
|
_data: &mut FilePrivateData,
|
||||||
|
) -> Result<usize, SystemError> {
|
||||||
|
let fb = self.inner.lock().fb.upgrade().unwrap();
|
||||||
|
return fb.fb_write(&buf[0..len], offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fs(&self) -> Arc<dyn FileSystem> {
|
||||||
|
self.inner
|
||||||
|
.lock()
|
||||||
|
.device_inode_fs
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.upgrade()
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_any_ref(&self) -> &dyn core::any::Any {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn list(&self) -> Result<Vec<String>, SystemError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn metadata(&self) -> Result<Metadata, SystemError> {
|
||||||
|
Ok(self.inner.lock().devfs_metadata.clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resize(&self, _len: usize) -> Result<(), SystemError> {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -295,6 +295,48 @@ impl FrameBufferOps for VesaFb {
|
|||||||
fn fb_destroy(&self) {
|
fn fb_destroy(&self) {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fb_read(&self, buf: &mut [u8], pos: usize) -> Result<usize, SystemError> {
|
||||||
|
let bp = boot_params().read();
|
||||||
|
|
||||||
|
let vaddr = bp.screen_info.lfb_virt_base.ok_or(SystemError::ENODEV)?;
|
||||||
|
let size = self.current_fb_fix().smem_len;
|
||||||
|
drop(bp);
|
||||||
|
if pos >= size {
|
||||||
|
return Ok(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
let pos = pos as i64;
|
||||||
|
let size = size as i64;
|
||||||
|
|
||||||
|
let len = core::cmp::min(size - pos, buf.len() as i64) as usize;
|
||||||
|
|
||||||
|
let slice = unsafe { core::slice::from_raw_parts(vaddr.as_ptr::<u8>(), size as usize) };
|
||||||
|
buf[..len].copy_from_slice(&slice[pos as usize..(pos as usize + len)]);
|
||||||
|
|
||||||
|
return Ok(len);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fb_write(&self, buf: &[u8], pos: usize) -> Result<usize, SystemError> {
|
||||||
|
let bp = boot_params().read();
|
||||||
|
|
||||||
|
let vaddr = bp.screen_info.lfb_virt_base.ok_or(SystemError::ENODEV)?;
|
||||||
|
let size = self.current_fb_fix().smem_len;
|
||||||
|
|
||||||
|
if pos >= size {
|
||||||
|
return Ok(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
let pos = pos as i64;
|
||||||
|
let size = size as i64;
|
||||||
|
|
||||||
|
let len = core::cmp::min(size - pos, buf.len() as i64) as usize;
|
||||||
|
|
||||||
|
let slice = unsafe { core::slice::from_raw_parts_mut(vaddr.as_ptr::<u8>(), size as usize) };
|
||||||
|
slice[pos as usize..(pos as usize + len)].copy_from_slice(&buf[..len]);
|
||||||
|
|
||||||
|
return Ok(len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FrameBufferInfo for VesaFb {
|
impl FrameBufferInfo for VesaFb {
|
||||||
|
@ -91,15 +91,15 @@ impl VideoRefreshManager {
|
|||||||
);
|
);
|
||||||
boot_params().write_irqsave().screen_info.lfb_virt_base = Some(buf_vaddr);
|
boot_params().write_irqsave().screen_info.lfb_virt_base = Some(buf_vaddr);
|
||||||
|
|
||||||
let mut frame_buffer_info_graud = self.device_buffer.write();
|
let mut frame_buffer_info_guard = self.device_buffer.write();
|
||||||
if let ScmBuffer::DeviceBuffer(vaddr) = &mut (frame_buffer_info_graud).buf {
|
if let ScmBuffer::DeviceBuffer(vaddr) = &mut (frame_buffer_info_guard).buf {
|
||||||
*vaddr = buf_vaddr;
|
*vaddr = buf_vaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 地址映射
|
// 地址映射
|
||||||
let mut paddr = boot_params().read().screen_info.lfb_base;
|
let mut paddr = boot_params().read().screen_info.lfb_base;
|
||||||
let count = PageFrameCount::new(
|
let count = PageFrameCount::new(
|
||||||
page_align_up(frame_buffer_info_graud.buf_size()) / MMArch::PAGE_SIZE,
|
page_align_up(frame_buffer_info_guard.buf_size()) / MMArch::PAGE_SIZE,
|
||||||
);
|
);
|
||||||
let page_flags: PageFlags<MMArch> = PageFlags::new().set_execute(true).set_write(true);
|
let page_flags: PageFlags<MMArch> = PageFlags::new().set_execute(true).set_write(true);
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ use super::vfs::{
|
|||||||
FileSystem, FileType, FsInfo, IndexNode, Metadata,
|
FileSystem, FileType, FsInfo, IndexNode, Metadata,
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
|
driver::base::device::device_number::DeviceNumber,
|
||||||
kerror, kinfo,
|
kerror, kinfo,
|
||||||
libs::{
|
libs::{
|
||||||
once::Once,
|
once::Once,
|
||||||
@ -154,6 +155,11 @@ impl DevFS {
|
|||||||
.add_dev(name, device.clone())
|
.add_dev(name, device.clone())
|
||||||
.expect("DevFS: Failed to register /dev/kvm");
|
.expect("DevFS: Failed to register /dev/kvm");
|
||||||
}
|
}
|
||||||
|
FileType::FramebufferDevice => {
|
||||||
|
dev_root_inode
|
||||||
|
.add_dev(name, device.clone())
|
||||||
|
.expect("DevFS: Failed to register /dev/fb");
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
||||||
}
|
}
|
||||||
@ -254,7 +260,7 @@ impl DevFSInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: data_,
|
raw_dev: DeviceNumber::from(data_ as u32),
|
||||||
},
|
},
|
||||||
fs: Weak::default(),
|
fs: Weak::default(),
|
||||||
};
|
};
|
||||||
@ -344,7 +350,7 @@ impl LockedDevFSInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: data,
|
raw_dev: DeviceNumber::from(data as u32),
|
||||||
},
|
},
|
||||||
fs: guard.fs.clone(),
|
fs: guard.fs.clone(),
|
||||||
})));
|
})));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
use crate::driver::base::device::device_number::DeviceNumber;
|
||||||
use crate::filesystem::vfs::file::FileMode;
|
use crate::filesystem::vfs::file::FileMode;
|
||||||
use crate::filesystem::vfs::make_rawdev;
|
|
||||||
use crate::filesystem::vfs::syscall::ModeType;
|
use crate::filesystem::vfs::syscall::ModeType;
|
||||||
use crate::filesystem::vfs::{
|
use crate::filesystem::vfs::{
|
||||||
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
||||||
@ -49,7 +49,7 @@ impl LockedNullInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: make_rawdev(1, 3), // 这里用来作为device number
|
raw_dev: DeviceNumber::default(), // 这里用来作为device number
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
use crate::driver::base::device::device_number::DeviceNumber;
|
||||||
use crate::filesystem::vfs::file::FileMode;
|
use crate::filesystem::vfs::file::FileMode;
|
||||||
use crate::filesystem::vfs::make_rawdev;
|
|
||||||
use crate::filesystem::vfs::syscall::ModeType;
|
use crate::filesystem::vfs::syscall::ModeType;
|
||||||
use crate::filesystem::vfs::{
|
use crate::filesystem::vfs::{
|
||||||
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
||||||
@ -49,7 +49,7 @@ impl LockedZeroInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: make_rawdev(1, 3), // 这里用来作为device number
|
raw_dev: DeviceNumber::default(), // 这里用来作为device number
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ impl LockedFATInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
},
|
},
|
||||||
special_node: None,
|
special_node: None,
|
||||||
})));
|
})));
|
||||||
@ -321,7 +321,7 @@ impl FATFileSystem {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
},
|
},
|
||||||
special_node: None,
|
special_node: None,
|
||||||
})));
|
})));
|
||||||
|
@ -9,6 +9,7 @@ use hashbrown::HashMap;
|
|||||||
use system_error::SystemError;
|
use system_error::SystemError;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
driver::base::device::device_number::DeviceNumber,
|
||||||
libs::{
|
libs::{
|
||||||
casting::DowncastArc,
|
casting::DowncastArc,
|
||||||
rwlock::RwLock,
|
rwlock::RwLock,
|
||||||
@ -84,7 +85,7 @@ impl KernFS {
|
|||||||
inode_id: generate_inode_id(),
|
inode_id: generate_inode_id(),
|
||||||
file_type: FileType::Dir,
|
file_type: FileType::Dir,
|
||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
};
|
};
|
||||||
let root_inode = Arc::new(KernFSInode {
|
let root_inode = Arc::new(KernFSInode {
|
||||||
name: String::from(""),
|
name: String::from(""),
|
||||||
@ -507,7 +508,7 @@ impl KernFSInode {
|
|||||||
inode_id: generate_inode_id(),
|
inode_id: generate_inode_id(),
|
||||||
file_type: file_type.into(),
|
file_type: file_type.into(),
|
||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let new_inode: Arc<KernFSInode> = Self::new(
|
let new_inode: Arc<KernFSInode> = Self::new(
|
||||||
|
@ -12,6 +12,7 @@ use system_error::SystemError;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
arch::mm::LockedFrameAllocator,
|
arch::mm::LockedFrameAllocator,
|
||||||
|
driver::base::device::device_number::DeviceNumber,
|
||||||
filesystem::vfs::{
|
filesystem::vfs::{
|
||||||
core::{generate_inode_id, ROOT_INODE},
|
core::{generate_inode_id, ROOT_INODE},
|
||||||
FileType,
|
FileType,
|
||||||
@ -298,7 +299,7 @@ impl ProcFS {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
},
|
},
|
||||||
fs: Weak::default(),
|
fs: Weak::default(),
|
||||||
fdata: InodeInfo {
|
fdata: InodeInfo {
|
||||||
@ -559,7 +560,7 @@ impl IndexNode for LockedProcFSInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: data,
|
raw_dev: DeviceNumber::from(data as u32),
|
||||||
},
|
},
|
||||||
fs: inode.fs.clone(),
|
fs: inode.fs.clone(),
|
||||||
fdata: InodeInfo {
|
fdata: InodeInfo {
|
||||||
|
@ -100,7 +100,7 @@ impl RamFS {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
},
|
},
|
||||||
fs: Weak::default(),
|
fs: Weak::default(),
|
||||||
special_node: None,
|
special_node: None,
|
||||||
@ -287,7 +287,7 @@ impl IndexNode for LockedRamFSInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: data,
|
raw_dev: DeviceNumber::from(data as u32),
|
||||||
},
|
},
|
||||||
fs: inode.fs.clone(),
|
fs: inode.fs.clone(),
|
||||||
special_node: None,
|
special_node: None,
|
||||||
@ -508,7 +508,7 @@ impl IndexNode for LockedRamFSInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
},
|
},
|
||||||
fs: inode.fs.clone(),
|
fs: inode.fs.clone(),
|
||||||
special_node: None,
|
special_node: None,
|
||||||
|
@ -40,6 +40,8 @@ pub enum FileType {
|
|||||||
BlockDevice,
|
BlockDevice,
|
||||||
/// 字符设备
|
/// 字符设备
|
||||||
CharDevice,
|
CharDevice,
|
||||||
|
/// 帧缓冲设备
|
||||||
|
FramebufferDevice,
|
||||||
/// kvm设备
|
/// kvm设备
|
||||||
KvmDevice,
|
KvmDevice,
|
||||||
/// 管道文件
|
/// 管道文件
|
||||||
@ -99,6 +101,7 @@ impl FileType {
|
|||||||
FileType::Pipe => DT_FIFO,
|
FileType::Pipe => DT_FIFO,
|
||||||
FileType::SymLink => DT_LNK,
|
FileType::SymLink => DT_LNK,
|
||||||
FileType::Socket => DT_SOCK,
|
FileType::Socket => DT_SOCK,
|
||||||
|
FileType::FramebufferDevice => DT_CHR,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -536,7 +539,7 @@ pub struct Metadata {
|
|||||||
pub gid: usize,
|
pub gid: usize,
|
||||||
|
|
||||||
/// 文件指向的设备的id(对于设备文件系统来说)
|
/// 文件指向的设备的id(对于设备文件系统来说)
|
||||||
pub raw_dev: usize,
|
pub raw_dev: DeviceNumber,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Metadata {
|
impl Default for Metadata {
|
||||||
@ -555,7 +558,7 @@ impl Default for Metadata {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -587,11 +590,6 @@ pub struct FsInfo {
|
|||||||
pub max_name_len: usize,
|
pub max_name_len: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief 整合主设备号+次设备号
|
|
||||||
pub fn make_rawdev(major: usize, minor: usize) -> usize {
|
|
||||||
((major & 0xffffff) << 8) | (minor & 0xff)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief
|
/// @brief
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -619,7 +617,7 @@ impl Metadata {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0,
|
raw_dev: DeviceNumber::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -775,7 +775,7 @@ impl Syscall {
|
|||||||
kstat.nlink = metadata.nlinks as u64;
|
kstat.nlink = metadata.nlinks as u64;
|
||||||
kstat.uid = metadata.uid as i32;
|
kstat.uid = metadata.uid as i32;
|
||||||
kstat.gid = metadata.gid as i32;
|
kstat.gid = metadata.gid as i32;
|
||||||
kstat.rdev = metadata.raw_dev as i64;
|
kstat.rdev = metadata.raw_dev.data() as i64;
|
||||||
kstat.mode = metadata.mode;
|
kstat.mode = metadata.mode;
|
||||||
match file.lock().file_type() {
|
match file.lock().file_type() {
|
||||||
FileType::File => kstat.mode.insert(ModeType::S_IFREG),
|
FileType::File => kstat.mode.insert(ModeType::S_IFREG),
|
||||||
@ -786,6 +786,7 @@ impl Syscall {
|
|||||||
FileType::Socket => kstat.mode.insert(ModeType::S_IFSOCK),
|
FileType::Socket => kstat.mode.insert(ModeType::S_IFSOCK),
|
||||||
FileType::Pipe => kstat.mode.insert(ModeType::S_IFIFO),
|
FileType::Pipe => kstat.mode.insert(ModeType::S_IFIFO),
|
||||||
FileType::KvmDevice => kstat.mode.insert(ModeType::S_IFCHR),
|
FileType::KvmDevice => kstat.mode.insert(ModeType::S_IFCHR),
|
||||||
|
FileType::FramebufferDevice => kstat.mode.insert(ModeType::S_IFCHR),
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(kstat);
|
return Ok(kstat);
|
||||||
|
@ -125,7 +125,7 @@ impl LockedPipeInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: 0,
|
raw_dev: Default::default(),
|
||||||
},
|
},
|
||||||
reader: 0,
|
reader: 0,
|
||||||
writer: 0,
|
writer: 0,
|
||||||
|
@ -33,4 +33,8 @@ impl Syscall {
|
|||||||
drop(irq_guard);
|
drop(irq_guard);
|
||||||
return Ok(0);
|
return Ok(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn sched_yield() -> Result<usize, SystemError> {
|
||||||
|
return Syscall::sched(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -956,6 +956,14 @@ impl Syscall {
|
|||||||
Self::fchmodat(dirfd, pathname, mode)
|
Self::fchmodat(dirfd, pathname, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYS_SCHED_GETAFFINITY => {
|
||||||
|
// todo: 这个系统调用还没有实现
|
||||||
|
|
||||||
|
Err(SystemError::ENOSYS)
|
||||||
|
}
|
||||||
|
|
||||||
|
SYS_SCHED_YIELD => Self::sched_yield(),
|
||||||
|
|
||||||
_ => panic!("Unsupported syscall ID: {}", syscall_num),
|
_ => panic!("Unsupported syscall ID: {}", syscall_num),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
|
use crate::driver::base::device::device_number::DeviceNumber;
|
||||||
use crate::filesystem::devfs::{DevFS, DeviceINode};
|
use crate::filesystem::devfs::{DevFS, DeviceINode};
|
||||||
use crate::filesystem::vfs::{
|
use crate::filesystem::vfs::{
|
||||||
core::generate_inode_id,
|
core::generate_inode_id,
|
||||||
file::{File, FileMode},
|
file::{File, FileMode},
|
||||||
make_rawdev, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
||||||
};
|
};
|
||||||
use crate::process::ProcessManager;
|
use crate::process::ProcessManager;
|
||||||
use crate::{arch::KVMArch, libs::spinlock::SpinLock, time::TimeSpec};
|
use crate::{arch::KVMArch, libs::spinlock::SpinLock, time::TimeSpec};
|
||||||
@ -65,7 +66,7 @@ impl LockedKvmInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: make_rawdev(1, 4), // 这里用来作为device number
|
raw_dev: DeviceNumber::default(), // 这里用来作为device number
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
use crate::arch::kvm::vmx::vcpu::VcpuContextFrame;
|
use crate::arch::kvm::vmx::vcpu::VcpuContextFrame;
|
||||||
use crate::arch::KVMArch;
|
use crate::arch::KVMArch;
|
||||||
|
use crate::driver::base::device::device_number::DeviceNumber;
|
||||||
use crate::filesystem::devfs::DevFS;
|
use crate::filesystem::devfs::DevFS;
|
||||||
use crate::filesystem::vfs::{
|
use crate::filesystem::vfs::{
|
||||||
core::generate_inode_id, file::FileMode, make_rawdev, FilePrivateData, FileSystem, FileType,
|
core::generate_inode_id, file::FileMode, FilePrivateData, FileSystem, FileType, IndexNode,
|
||||||
IndexNode, Metadata,
|
Metadata,
|
||||||
};
|
};
|
||||||
use crate::mm::VirtAddr;
|
use crate::mm::VirtAddr;
|
||||||
use crate::syscall::user_access::copy_from_user;
|
use crate::syscall::user_access::copy_from_user;
|
||||||
@ -76,7 +77,7 @@ impl LockedVcpuInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: make_rawdev(1, 4), // 这里用来作为device number
|
raw_dev: DeviceNumber::default(), // 这里用来作为device number
|
||||||
},
|
},
|
||||||
// fdata: InodeInfo {
|
// fdata: InodeInfo {
|
||||||
// kvm: kvm,
|
// kvm: kvm,
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
|
use crate::driver::base::device::device_number::DeviceNumber;
|
||||||
use crate::filesystem::devfs::DevFS;
|
use crate::filesystem::devfs::DevFS;
|
||||||
use crate::filesystem::vfs::{
|
use crate::filesystem::vfs::{
|
||||||
core::generate_inode_id,
|
core::generate_inode_id,
|
||||||
file::{File, FileMode},
|
file::{File, FileMode},
|
||||||
make_rawdev, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
|
||||||
};
|
};
|
||||||
use crate::mm::VirtAddr;
|
use crate::mm::VirtAddr;
|
||||||
use crate::process::ProcessManager;
|
use crate::process::ProcessManager;
|
||||||
@ -74,7 +75,7 @@ impl LockedVmInode {
|
|||||||
nlinks: 1,
|
nlinks: 1,
|
||||||
uid: 0,
|
uid: 0,
|
||||||
gid: 0,
|
gid: 0,
|
||||||
raw_dev: make_rawdev(1, 4), // 这里用来作为device number
|
raw_dev: DeviceNumber::default(), // 这里用来作为device number
|
||||||
},
|
},
|
||||||
// fdata: InodeInfo {
|
// fdata: InodeInfo {
|
||||||
// kvm: kvm,
|
// kvm: kvm,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user