From 421d3ae6f448f428d68e1281391996f9d956525a Mon Sep 17 00:00:00 2001 From: MemoryShore <1353318529@qq.com> Date: Wed, 28 Aug 2024 23:17:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8D=95=E5=AE=9E=E7=8E=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=A0=88=E7=9A=8416=E5=AD=97=E8=8A=82=E5=AF=B9?= =?UTF-8?q?=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/arch/x86_64/process/syscall.rs | 2 +- kernel/src/process/exec.rs | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/kernel/src/arch/x86_64/process/syscall.rs b/kernel/src/arch/x86_64/process/syscall.rs index e91a99852..add3c6692 100644 --- a/kernel/src/arch/x86_64/process/syscall.rs +++ b/kernel/src/arch/x86_64/process/syscall.rs @@ -74,7 +74,7 @@ impl Syscall { // 生成16字节随机数 // TODO 暂时设为0 - param.init_info_mut().rand_num = [0; 16]; + param.init_info_mut().rand_num = 0; // 把proc_init_info写到用户栈上 let mut ustack_message = unsafe { diff --git a/kernel/src/process/exec.rs b/kernel/src/process/exec.rs index 31c202689..9004e61ba 100644 --- a/kernel/src/process/exec.rs +++ b/kernel/src/process/exec.rs @@ -206,7 +206,7 @@ pub struct ProcInitInfo { pub args: Vec, pub envs: Vec, pub auxv: BTreeMap, - pub rand_num: [u8; 16], + pub rand_num: u128, } impl ProcInitInfo { @@ -216,7 +216,7 @@ impl ProcInitInfo { args: Vec::new(), envs: Vec::new(), auxv: BTreeMap::new(), - rand_num: [0; 16], + rand_num: 0, } } @@ -230,15 +230,9 @@ impl ProcInitInfo { &mut self, ustack: &mut UserStack, ) -> Result<(VirtAddr, VirtAddr), SystemError> { - // TODO: 实现栈的16字节对齐 - // self.push_slice( - // ustack, - // vec![0u8; 0x10 - (ustack.sp().data() & 0b1111)].as_slice(), - // )?; - self.push_slice(ustack, vec![0u8; 8].as_slice())?; - // 先把程序的名称压入栈中 self.push_str(ustack, &self.proc_name)?; + // 然后把环境变量压入栈中 let envps = self .envs @@ -248,6 +242,7 @@ impl ProcInitInfo { ustack.sp() }) .collect::>(); + // 然后把参数压入栈中 let argps = self .args @@ -259,13 +254,20 @@ impl ProcInitInfo { .collect::>(); // 压入随机数,把指针放入auxv - self.push_slice(ustack, &self.rand_num)?; + self.push_slice(ustack, &[self.rand_num])?; self.auxv .insert(super::abi::AtType::Random as u8, ustack.sp().data()); + // 实现栈的16字节对齐,如果argv、envp、argc在栈中的长度加起来不能对齐16字节,则手动填充一个空字节 + // TODO 感觉这样对齐有点简陋,后续可能要完善一下 + if (envps.len() + argps.len() + 1) * core::mem::align_of::() % 0x10 != 0 { + self.push_slice(ustack, &vec![0u8; 1])?; + } + // 压入auxv self.push_slice(ustack, &[null::(), null::()])?; for (&k, &v) in self.auxv.iter() { + log::debug!("auxv: {:?}", ustack.sp()); self.push_slice(ustack, &[k as usize, v])?; } @@ -276,7 +278,6 @@ impl ProcInitInfo { // 把参数指针压入栈中 self.push_slice(ustack, &[null::()])?; self.push_slice(ustack, argps.as_slice())?; - let argv_ptr = ustack.sp(); // 把argc压入栈中