Parcourir la source

auxv添加随机数指针;修复AtType序号错误

MemoryShore il y a 8 mois
Parent
commit
16c4232251

+ 5 - 1
kernel/src/arch/x86_64/process/syscall.rs

@@ -72,6 +72,10 @@ impl Syscall {
         param.init_info_mut().args = argv;
         param.init_info_mut().envs = envp;
 
+        // 生成16字节随机数
+        // TODO 暂时设为0
+        param.init_info_mut().rand_num = [0; 16];
+
         // 把proc_init_info写到用户栈上
         let mut ustack_message = unsafe {
             address_space
@@ -82,7 +86,7 @@ impl Syscall {
         };
         let (user_sp, argv_ptr) = unsafe {
             param
-                .init_info()
+                .init_info_mut()
                 .push_at(
                     // address_space
                     //     .write()

+ 2 - 2
kernel/src/process/abi.rs

@@ -38,7 +38,7 @@ pub enum AtType {
     /// Frequency at which times() increments.
     ClkTck,
     /// Secure mode boolean.
-    Secure,
+    Secure = 23,
     /// String identifying real platform, may differ from AT_PLATFORM.
     BasePlatform,
     /// Address of 16 random bytes.
@@ -46,7 +46,7 @@ pub enum AtType {
     /// Extension of AT_HWCAP.
     HwCap2,
     /// Filename of program.
-    ExecFn,
+    ExecFn = 31,
     /// Minimal stack size for signal delivery.
     MinSigStackSize,
 }

+ 8 - 1
kernel/src/process/exec.rs

@@ -206,6 +206,7 @@ pub struct ProcInitInfo {
     pub args: Vec<CString>,
     pub envs: Vec<CString>,
     pub auxv: BTreeMap<u8, usize>,
+    pub rand_num: [u8; 16],
 }
 
 impl ProcInitInfo {
@@ -215,6 +216,7 @@ impl ProcInitInfo {
             args: Vec::new(),
             envs: Vec::new(),
             auxv: BTreeMap::new(),
+            rand_num: [0; 16],
         }
     }
 
@@ -225,7 +227,7 @@ impl ProcInitInfo {
     ///
     /// 返回值是一个元组,第一个元素是最终的用户栈顶地址,第二个元素是环境变量pointer数组的起始地址     
     pub unsafe fn push_at(
-        &self,
+        &mut self,
         ustack: &mut UserStack,
     ) -> Result<(VirtAddr, VirtAddr), SystemError> {
         // TODO: 实现栈的16字节对齐
@@ -256,6 +258,11 @@ impl ProcInitInfo {
             })
             .collect::<Vec<_>>();
 
+        // 压入随机数,把指针放入auxv
+        self.push_slice(ustack, &self.rand_num)?;
+        self.auxv
+            .insert(super::abi::AtType::Random as u8, ustack.sp().data());
+
         // 压入auxv
         self.push_slice(ustack, &[null::<u8>(), null::<u8>()])?;
         for (&k, &v) in self.auxv.iter() {