亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 36086 | 回復(fù): 4
打印 上一主題 下一主題

[進(jìn)程管理] copy_thread函數(shù)的一些不理解的地方,求助大家? [復(fù)制鏈接]

求職 : 通訊/電信開(kāi)
論壇徽章:
2
2015亞冠之鹿島鹿角
日期:2015-07-08 11:58:2615-16賽季CBA聯(lián)賽之佛山
日期:2015-12-21 17:28:04
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-06-16 19:19 |只看該作者 |倒序?yàn)g覽
本帖最后由 九陽(yáng)神功愛(ài)喝茶 于 2015-06-16 19:28 編輯

小弟研究copy_thread函數(shù)的時(shí)候遇到些問(wèn)題,還要麻煩各位前輩多多指導(dǎo),萬(wàn)分感謝。問(wèn)題見(jiàn)紅色標(biāo)注的地方

  1. int copy_thread(unsigned long clone_flags, unsigned long sp,
  2.         unsigned long unused,
  3.         struct task_struct *p, struct pt_regs *regs)
  4. {
  5.         struct pt_regs *childregs;
  6.         struct task_struct *tsk;
  7.         int err;
  8.     //這兒是在內(nèi)核棧的棧頂開(kāi)辟8個(gè)字節(jié)的內(nèi)存空間,我很不理解這里有什么作用?
  9.         childregs = task_pt_regs(p);
  10.         //保存父寄存器的值到自己存器中;
  11.         *childregs = *regs;
  12.         //修改子進(jìn)程寄存器的相關(guān)值;childregs占用了17*4個(gè)字節(jié),但是只開(kāi)辟了8字節(jié)的內(nèi)核空間,這樣的話不是破壞了原來(lái)的thread_info結(jié)構(gòu)體的內(nèi)容了嗎?
  13.         childregs->ax = 0;
  14.         childregs->sp = sp;
  15.         p->thread.sp = (unsigned long) childregs;
  16.         p->thread.sp0 = (unsigned long) (childregs+1);

  17.         p->thread.ip = (unsigned long) ret_from_fork;

  18.         task_user_gs(p) = get_user_gs(regs);

  19.         tsk = current;
  20.         if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
  21.                 p->thread.io_bitmap_ptr = kmemdup(tsk->thread.io_bitmap_ptr,
  22.                                                 IO_BITMAP_BYTES, GFP_KERNEL);
  23.                 if (!p->thread.io_bitmap_ptr) {
  24.                         p->thread.io_bitmap_max = 0;
  25.                         return -ENOMEM;
  26.                 }
  27.                 set_tsk_thread_flag(p, TIF_IO_BITMAP);
  28.         }

  29.         err = 0;

  30.         /*
  31.          * Set a new TLS for the child thread?
  32.          */
  33.         if (clone_flags & CLONE_SETTLS)
  34.                 err = do_set_thread_area(p, -1,
  35.                         (struct user_desc __user *)childregs->si, 0);

  36.         if (err && p->thread.io_bitmap_ptr) {
  37.                 kfree(p->thread.io_bitmap_ptr);
  38.                 p->thread.io_bitmap_max = 0;
  39.         }

  40.         clear_tsk_thread_flag(p, TIF_DS_AREA_MSR);
  41.         p->thread.ds_ctx = NULL;

  42.         clear_tsk_thread_flag(p, TIF_DEBUGCTLMSR);
  43.         p->thread.debugctlmsr = 0;

  44.         return err;
  45. }
復(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)。


論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2016-12-21 17:16 |只看該作者

cu發(fā)博文進(jìn)編譯頁(yè)面無(wú)法顯示文字內(nèi)容

本帖最后由 wangcong02345 于 2016-12-21 17:17 編輯

1. 樓主的這幾個(gè)問(wèn)題其實(shí)是一個(gè)問(wèn)題,就是childreg指代的內(nèi)存是什么的問(wèn)題。

2. 上面 childregs = task_pt_regs(p);  實(shí)際上是--> childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p)) - 1;
也就是說(shuō)childregs指向 “子進(jìn)程的棧頂 減去 一個(gè)sizeof(struct pt_regs)的大小 的地方”,如下圖所示:

​上圖出自《linux內(nèi)核情景分析》P306


3. 其它的都好理解了:
這里參數(shù)p=0xf7dee000,在do_fork中新分配的2頁(yè)內(nèi)存用作子進(jìn)程的task_struct
  • int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
  •     unsigned long unused, struct task_struct * p, struct pt_regs * regs)
  • {
  •     struct pt_regs * childregs;
  • //這兒稍不留神就會(huì)看錯(cuò)-->這兒是先轉(zhuǎn)為struct pt_regs后再減1
  • //這是在棧頂留出一個(gè)struct pt_regs的大
  •     childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p)) - 1;
  • //先將父進(jìn)程的全部regs復(fù)制過(guò)來(lái),然后再作調(diào)整
  •     struct_cpy(childregs, regs);    //即memcpy(childregs, regs, sizeof(*(regs)));
  •     childregs->eax = 0;             //child的eax=0,這也就是為什么fork后子進(jìn)程返回0的原因
  •     childregs->esp = esp;           //這個(gè)esp是在sys_clone時(shí)的regs.ecx=0x78
  •     p->thread.esp = (unsigned long) childregs;       //執(zhí)行后p->thread.esp=0xf7deffc4=(p-sizeof(pt_regs))​
  •     p->thread.esp0 = (unsigned long) (childregs+1);  //執(zhí)行后p->thread.esp0=0xf7df0000=(p),即將兩頁(yè)內(nèi)存的最高端作為棧​頂
  •     p->thread.eip = (unsigned long) ret_from_fork;   //下次調(diào)度時(shí)子進(jìn)程執(zhí)行的命令是ret_form_fork
  •     savesegment(fs,p->thread.fs);
  •     savesegment(gs,p->thread.gs);
  •     unlazy_fpu(current);
  •     struct_cpy(&p->thread.i387, &current->thread.i387);
  •     return 0;
  • }

為啥從博客復(fù)制過(guò)來(lái)就變成這個(gè)樣子了?

論壇徽章:
9
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-13 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-06-15 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-06-16 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-06-18 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-06-27 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-09 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-15 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-27 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-08-18 06:20:00
3 [報(bào)告]
發(fā)表于 2016-12-25 16:24 |只看該作者
頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂 頂

論壇徽章:
20
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-08-17 12:21:08
4 [報(bào)告]
發(fā)表于 2016-12-26 16:06 |只看該作者
有圖就好理解多了,贊!

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2021-05-04 09:52 |只看該作者
本帖最后由 aweii 于 2021-05-04 10:12 編輯

內(nèi)核堆棧頂部留出8字節(jié),是保證內(nèi)核態(tài)下發(fā)生中斷時(shí),regs->esp、regs->xss是可訪問(wèn)的。否則,由于此時(shí)ess、esp不壓棧(ring0->ring0),所以*regs實(shí)際包含了thread_union以外的8字節(jié)。我觀察了下,2.6.11以前的內(nèi)核都沒(méi)有這個(gè)8字節(jié)預(yù)留,當(dāng)然也沒(méi)出什么問(wèn)題(因?yàn)槎荚趦?nèi)核的892M空間內(nèi),有映射)。2.6.24有了這個(gè)task_pt_regs(p),也許是防患于未然吧。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP