- 求職 : 通訊/電信開(kāi)
- 論壇徽章:
- 2
|
本帖最后由 九陽(yáng)神功愛(ài)喝茶 于 2015-06-16 19:28 編輯
小弟研究copy_thread函數(shù)的時(shí)候遇到些問(wèn)題,還要麻煩各位前輩多多指導(dǎo),萬(wàn)分感謝。問(wèn)題見(jiàn)紅色標(biāo)注的地方
- int copy_thread(unsigned long clone_flags, unsigned long sp,
- unsigned long unused,
- struct task_struct *p, struct pt_regs *regs)
- {
- struct pt_regs *childregs;
- struct task_struct *tsk;
- int err;
- //這兒是在內(nèi)核棧的棧頂開(kāi)辟8個(gè)字節(jié)的內(nèi)存空間,我很不理解這里有什么作用?
- childregs = task_pt_regs(p);
- //保存父寄存器的值到自己存器中;
- *childregs = *regs;
- //修改子進(jìn)程寄存器的相關(guān)值;childregs占用了17*4個(gè)字節(jié),但是只開(kāi)辟了8字節(jié)的內(nèi)核空間,這樣的話不是破壞了原來(lái)的thread_info結(jié)構(gòu)體的內(nèi)容了嗎?
- childregs->ax = 0;
- childregs->sp = sp;
- p->thread.sp = (unsigned long) childregs;
- p->thread.sp0 = (unsigned long) (childregs+1);
- p->thread.ip = (unsigned long) ret_from_fork;
- task_user_gs(p) = get_user_gs(regs);
- tsk = current;
- if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
- p->thread.io_bitmap_ptr = kmemdup(tsk->thread.io_bitmap_ptr,
- IO_BITMAP_BYTES, GFP_KERNEL);
- if (!p->thread.io_bitmap_ptr) {
- p->thread.io_bitmap_max = 0;
- return -ENOMEM;
- }
- set_tsk_thread_flag(p, TIF_IO_BITMAP);
- }
- err = 0;
- /*
- * Set a new TLS for the child thread?
- */
- if (clone_flags & CLONE_SETTLS)
- err = do_set_thread_area(p, -1,
- (struct user_desc __user *)childregs->si, 0);
- if (err && p->thread.io_bitmap_ptr) {
- kfree(p->thread.io_bitmap_ptr);
- p->thread.io_bitmap_max = 0;
- }
- clear_tsk_thread_flag(p, TIF_DS_AREA_MSR);
- p->thread.ds_ctx = NULL;
- clear_tsk_thread_flag(p, TIF_DEBUGCTLMSR);
- p->thread.debugctlmsr = 0;
- return err;
- }
復(fù)制代碼 代碼里面的文字不能標(biāo)示紅色,只能在最后寫(xiě)下問(wèn)題了:
//這你是在內(nèi)核棧的棧頂開(kāi)辟8個(gè)字節(jié)的內(nèi)存空間,我很不理解這里有什么作用?
childregs = task_pt_regs(p);
第二個(gè)是:
//修改子進(jìn)程寄存器的相關(guān)值;childregs占用了17*4個(gè)字節(jié),但是只開(kāi)辟了8字節(jié)的內(nèi)核空間,這樣的話不是破壞了原來(lái)的thread_info結(jié)構(gòu)體的內(nèi)容了嗎?
childregs->ax = 0;
childregs->sp = sp;
還請(qǐng)各位多多指導(dǎo)。
|
|