Open h888866j opened 1 year ago
http://rcore-os.cn/rCore-Tutorial-Book-v3/chapter8/1thread.html#id7 中Comnents中提出的问题未见修复
章节链接:用户态的线程管理 - rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档
当应用要创建一个线程时,会调用 runtime.spawn 函数。这个函数主要完成的功能是: 第4~12行,在线程向量中查找一个状态为 Available 的空闲线程控制块; 第14~20行,初始化该空闲线程的线程控制块; x1 寄存器:老的返回地址 – guard 函数地址 nx1 寄存器:新的返回地址 – 输入参数 f 函数地址 x2 寄存器:新的栈地址 – available.stack+size 1 impl Runtime { 2 pub fn spawn(&mut self, f: fn()) { 3 let available = self 4 .tasks 5 .iter_mut() 6 .find(|t| t.state == State::Available) 7 .expect("no available task."); 8 9 let size = available.stack.len(); 10 unsafe { 11 let s_ptr = available.stack.as_mut_ptr().offset(size as isize); 12 let s_ptr = (s_ptr as usize & !7) as *mut u8; 13 14 available.ctx.x1 = guard as u64; //ctx.x1 is old return address 15 available.ctx.nx1 = f as u64; //ctx.nx1 is new return address 16 available.ctx.x2 = s_ptr.offset(32) as u64; //cxt.x2 is sp <<< clone的仓库代码中这里是 -32 17 18 } 19 available.state = State::Ready; 20 } 21 }
当应用要创建一个线程时,会调用 runtime.spawn 函数。这个函数主要完成的功能是:
第4~12行,在线程向量中查找一个状态为 Available 的空闲线程控制块;
第14~20行,初始化该空闲线程的线程控制块;
x1 寄存器:老的返回地址 – guard 函数地址
nx1 寄存器:新的返回地址 – 输入参数 f 函数地址
x2 寄存器:新的栈地址 – available.stack+size
1 impl Runtime { 2 pub fn spawn(&mut self, f: fn()) { 3 let available = self 4 .tasks 5 .iter_mut() 6 .find(|t| t.state == State::Available) 7 .expect("no available task."); 8 9 let size = available.stack.len(); 10 unsafe { 11 let s_ptr = available.stack.as_mut_ptr().offset(size as isize); 12 let s_ptr = (s_ptr as usize & !7) as *mut u8; 13 14 available.ctx.x1 = guard as u64; //ctx.x1 is old return address 15 available.ctx.nx1 = f as u64; //ctx.nx1 is new return address 16 available.ctx.x2 = s_ptr.offset(32) as u64; //cxt.x2 is sp <<< clone的仓库代码中这里是 -32 17 18 } 19 available.state = State::Ready; 20 } 21 }
详见comments: https://github.com/rcore-os/rCore-Tutorial-Book-v3/issues/95#issuecomment-1500826664
http://rcore-os.cn/rCore-Tutorial-Book-v3/chapter8/1thread.html#id7 中Comnents中提出的问题未见修复
章节链接:用户态的线程管理 - rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档
详见comments: https://github.com/rcore-os/rCore-Tutorial-Book-v3/issues/95#issuecomment-1500826664