• <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精品久久久久久噜噜| 免费无码国产欧美久久18| 狠色狠色狠狠色综合久久| 人人狠狠综合久久亚洲高清| 97久久久精品综合88久久| 午夜精品久久影院蜜桃| 久久国产精品久久| 久久婷婷五月综合97色一本一本 | 久久久久18| 午夜精品久久久久久久久| 久久免费大片| 91精品婷婷国产综合久久| 久久狠狠高潮亚洲精品| 久久天天躁夜夜躁狠狠| 久久久91人妻无码精品蜜桃HD| 久久99精品国产自在现线小黄鸭| 国产精品一区二区久久精品涩爱 | 99久久人妻无码精品系列| 亚洲欧美国产日韩综合久久| 国产免费久久精品99久久| 久久99毛片免费观看不卡 | 国产一区二区久久久| 久久综合成人网| 综合久久给合久久狠狠狠97色 | AV狠狠色丁香婷婷综合久久| 久久精品成人欧美大片| 久久久久久久精品成人热色戒| 久久乐国产精品亚洲综合| 久久精品无码一区二区三区日韩 | 亚州日韩精品专区久久久| 久久高潮一级毛片免费| 国内精品伊人久久久久影院对白| 国产精品久久久天天影视香蕉| 久久久九九有精品国产| 欧美精品一区二区精品久久| 日本久久久精品中文字幕|