• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0
            Linux通過(guò)slab分配器動(dòng)態(tài)分配task_struct結(jié)構(gòu),該結(jié)構(gòu)定義在了<include/linux/sched.h>文件中,進(jìn)程描述符中包含一個(gè)具體進(jìn)程的所有信息,各個(gè)進(jìn)程的task_struct存放在它們內(nèi)核棧的尾端。在棧底(對(duì)于向下增長(zhǎng)的棧)或棧頂(對(duì)于向上增長(zhǎng)的棧)創(chuàng)建一個(gè)新的結(jié)構(gòu)struct thread_info。利用這個(gè)新的機(jī)構(gòu)來(lái)迅速的找到task_struct的位置。
              下面是kernel2.6.32.10里task_struct的定義(對(duì)于x86類(lèi)型的CPU來(lái)說(shuō)文件位于:arch/x86/include/asm /include/asm/thread_info.h):
            1. struct thread_info {
            2.         struct task_struct        *task;                /* main task structure */
            3.         struct exec_domain        *exec_domain;        /* execution domain */
            4.         __u32                        flags;                /* low level flags */
            5.         __u32                        status;                /* thread synchronous flags */
            6.         __u32                        cpu;                /* current CPU */
            7.         int                        preempt_count;        /* 0 => preemptable, <0 => BUG */
            8.         mm_segment_t                addr_limit;
            9.         struct restart_block    restart_block;
            10.         void __user                *sysenter_return;
            11. #ifdef CONFIG_X86_32
            12.         unsigned long           previous_esp;   /* ESP of the previous stack in   case of nested (IRQ) stacks*/
            13.         __u8                        supervisor_stack[0];
            14. #endif
            15.         int                        uaccess_err;
            16. };
            其中的task的值就為task_struct的位置。
            kernel利用current宏尋找task_struct的位置,假設(shè)棧的大小為8k(13個(gè)二進(jìn)制位),我們可以將進(jìn)程棧的地址的后13位屏蔽掉,這樣得到的剛好就是進(jìn)程棧的起始地址,而thread_info剛好就是位于進(jìn)程棧的底部,所以進(jìn)程棧的起始地址就是struct thread_info的地址,得到了thread_info的地址,我們就很容易找到task_struct的地址了。
            匯編實(shí)現(xiàn)過(guò)程為
            movl  %-8192 ,%eax
            andl   %esp ,%eax
            寄存器esp存放進(jìn)程棧的當(dāng)前地址,eax最后存放的就是進(jìn)程棧的起始地址。current使用current_thread_info來(lái)實(shí)現(xiàn)這個(gè)過(guò)程。
            kernel源碼(對(duì)于x86類(lèi)型的CPU來(lái)說(shuō)文件位于arch/x86/include/asm //include/asm/thread_info.h)
            1. /* how to get the current stack pointer from C */
            2. register unsigned long current_stack_pointer asm("esp") __used;

            3. /* how to get the thread information struct from C */
            4. static inline struct thread_info *current_thread_info(void)
            5. {
            6.         return (struct thread_info *)
            7.                 (current_stack_pointer & ~(THREAD_SIZE - 1));
            8. };
            其中current_stack_pointer為進(jìn)程棧的當(dāng)前地址,THREAD_SIZE為進(jìn)程棧的大小。
            所以current_thread_info()->task即為task_struct()的地址。 
            久久久久一级精品亚洲国产成人综合AV区| 精品久久久久久久久久中文字幕| 久久精品国产久精国产果冻传媒| 香蕉99久久国产综合精品宅男自 | 久久亚洲国产成人影院网站| 日日狠狠久久偷偷色综合0| 国产精品99久久久精品无码| 亚洲午夜久久久久久久久电影网| 一本久久久久久久| 久久无码中文字幕东京热| 久久综合久久综合九色| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 婷婷国产天堂久久综合五月| 久久久无码人妻精品无码| 久久精品国产99久久久香蕉| 久久精品国产亚洲av麻豆色欲 | 国内精品久久久久影院免费| 久久久久久精品免费看SSS| 国产精品伊人久久伊人电影| 国产美女久久精品香蕉69| 欧美一区二区久久精品| 久久精品国产亚洲7777| 一本大道久久a久久精品综合 | 国产欧美久久久精品影院| 久久播电影网| 精品久久久久久无码中文字幕 | 久久精品国产亚洲麻豆| 无码国内精品久久人妻蜜桃| 久久亚洲国产精品成人AV秋霞| 久久精品不卡| 久久影院久久香蕉国产线看观看| 青青草原综合久久| 国产精品久久久久9999| 久久国产高潮流白浆免费观看| 三级三级久久三级久久 | 久久99精品久久久久久秒播| 免费精品99久久国产综合精品| 国产成人精品久久一区二区三区| 久久99精品久久久久婷婷| 99精品久久久久中文字幕| 久久久综合九色合综国产|