mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
实现uname系统调用 (#614)
* 实现uname系统调用 Co-authored-by: longjin <longjin@DragonOS.org>
This commit is contained in:
parent
82df0a1310
commit
8c6f21840f
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "dragonos_kernel"
|
||||
version = "0.1.0"
|
||||
version = "0.1.9"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
@ -29,6 +29,51 @@ use crate::{
|
||||
},
|
||||
};
|
||||
|
||||
//参考资料:https://code.dragonos.org.cn/xref/linux-6.1.9/include/uapi/linux/utsname.h#17
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct PosixOldUtsName {
|
||||
pub sysname: [u8; 65],
|
||||
pub nodename: [u8; 65],
|
||||
pub release: [u8; 65],
|
||||
pub version: [u8; 65],
|
||||
pub machine: [u8; 65],
|
||||
}
|
||||
|
||||
impl PosixOldUtsName {
|
||||
pub fn new() -> Self {
|
||||
const SYS_NAME: &[u8] = b"DragonOS";
|
||||
const NODENAME: &[u8] = b"DragonOS";
|
||||
const RELEASE: &[u8] = env!("CARGO_PKG_VERSION").as_bytes();
|
||||
const VERSION: &[u8] = env!("CARGO_PKG_VERSION").as_bytes();
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
const MACHINE: &[u8] = b"x86_64";
|
||||
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
const MACHINE: &[u8] = b"aarch64";
|
||||
|
||||
#[cfg(target_arch = "riscv64")]
|
||||
const MACHINE: &[u8] = b"riscv64";
|
||||
|
||||
let mut r = Self {
|
||||
sysname: [0; 65],
|
||||
nodename: [0; 65],
|
||||
release: [0; 65],
|
||||
version: [0; 65],
|
||||
machine: [0; 65],
|
||||
};
|
||||
|
||||
r.sysname[0..SYS_NAME.len()].copy_from_slice(SYS_NAME);
|
||||
r.nodename[0..NODENAME.len()].copy_from_slice(NODENAME);
|
||||
r.release[0..RELEASE.len()].copy_from_slice(RELEASE);
|
||||
r.version[0..VERSION.len()].copy_from_slice(VERSION);
|
||||
r.machine[0..MACHINE.len()].copy_from_slice(MACHINE);
|
||||
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
impl Syscall {
|
||||
pub fn fork(frame: &TrapFrame) -> Result<usize, SystemError> {
|
||||
ProcessManager::fork(frame, CloneFlags::empty()).map(|pid| pid.into())
|
||||
@ -341,4 +386,12 @@ impl Syscall {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn uname(name: *mut PosixOldUtsName) -> Result<usize, SystemError> {
|
||||
let mut writer =
|
||||
UserBufferWriter::new(name, core::mem::size_of::<PosixOldUtsName>(), true)?;
|
||||
writer.copy_one_to_user(&PosixOldUtsName::new(), 0)?;
|
||||
|
||||
return Ok(0);
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ use crate::{
|
||||
libs::align::page_align_up,
|
||||
mm::{verify_area, MemoryManagementArch, VirtAddr},
|
||||
net::syscall::SockAddr,
|
||||
process::{fork::CloneFlags, Pid},
|
||||
process::{fork::CloneFlags, syscall::PosixOldUtsName, Pid},
|
||||
time::{
|
||||
syscall::{PosixTimeZone, PosixTimeval},
|
||||
TimeSpec,
|
||||
@ -949,7 +949,10 @@ impl Syscall {
|
||||
}
|
||||
|
||||
SYS_SCHED_YIELD => Self::sched_yield(),
|
||||
|
||||
SYS_UNAME => {
|
||||
let name = args[0] as *mut PosixOldUtsName;
|
||||
Self::uname(name)
|
||||
}
|
||||
_ => panic!("Unsupported syscall ID: {}", syscall_num),
|
||||
};
|
||||
|
||||
|
@ -53,6 +53,7 @@
|
||||
#define SYS_EXIT 60
|
||||
#define SYS_WAIT4 61
|
||||
#define SYS_KILL 62
|
||||
#define SYS_UNAME 63
|
||||
|
||||
#define SYS_FCNTL 72
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user