• <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精品久久久久中文字幕| 亚洲国产精品无码久久| 香蕉久久永久视频| 久久久久久噜噜精品免费直播| 久久精品国产亚洲av水果派| 久久免费看黄a级毛片| 久久成人国产精品一区二区| 一本一道久久a久久精品综合| 国内精品久久久久影院亚洲| 99久久夜色精品国产网站| 亚洲欧美成人综合久久久| 色噜噜狠狠先锋影音久久| 少妇熟女久久综合网色欲| 国产精品99精品久久免费| 久久午夜福利电影| 久久精品国产只有精品2020| 无码任你躁久久久久久老妇 | 久久中文娱乐网| 性欧美大战久久久久久久久| 欧美国产成人久久精品| 亚洲中文字幕久久精品无码喷水| 久久久久人妻一区二区三区| 青草影院天堂男人久久| 好属妞这里只有精品久久| 奇米影视7777久久精品人人爽| 无码AV中文字幕久久专区| 久久久久久国产精品无码下载| AAA级久久久精品无码片| 国产精品无码久久综合网| 久久久久久狠狠丁香| 久久久亚洲裙底偷窥综合| 久久伊人五月丁香狠狠色| 狠狠综合久久AV一区二区三区| 一本一道久久a久久精品综合| 久久91这里精品国产2020| 国产一级持黄大片99久久| 精品久久久久久无码中文字幕一区 | 亚洲国产另类久久久精品黑人 | 亚洲国产成人久久精品99 | 精品国产青草久久久久福利|