Эх сурвалжийг харах

实现uname系统调用 (#614)

* 实现uname系统调用

Co-authored-by: longjin <[email protected]>
sspphh 11 сар өмнө
parent
commit
8c6f21840f

+ 1 - 1
kernel/Cargo.toml

@@ -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

+ 53 - 0
kernel/src/process/syscall.rs

@@ -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);
+    }
 }

+ 5 - 2
kernel/src/syscall/mod.rs

@@ -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),
         };
 

+ 1 - 0
kernel/src/syscall/syscall_num.h

@@ -53,6 +53,7 @@
 #define SYS_EXIT 60
 #define SYS_WAIT4 61
 #define SYS_KILL 62
+#define SYS_UNAME 63
 
 #define SYS_FCNTL 72