好文档 - 专业文书写作范文服务资料分享网站

(VR虚拟现实技术)L进程调度切换和虚拟空间管理深入分析最全版

天下 分享 时间: 加入收藏 我要投稿 点赞

(VR虚拟现实)L进程调度切换和虚拟空间管理深

入分析

一、Linux进程切换深入分析

#define CLONE_KERNEL (CLONE_FS | CLONE_FILES | CLONE_SIGHAND) 创建内核线程时使用的CLONE标志。

1.#define unlikely(x) __builtin_expect(!!(x), 0)

编译器优化,实际返回值x是整型表达式,0表示并不预期该事件发生,也就是说x为0的可能性很小,这是为了让编译器对下面得语句进行优化。

2.进程内核态堆栈结构:

进程是动态实体,进程描述符是存放在动态内存中的。在一块进程内存区上,Linux存放了两个数据结构:指向task_struct得thread_info和内核态的进程栈。大小一般2页8K,这要求页面帧对齐2的13次幂,在X86上编译时可以配置大小为4K。thread_info在内存区开始处,内核栈从内存尾向下增长。在C语言中可以用union结构表示:

图1. 8K内核栈和进程描述符task_struct及thread_info的相互关系

union thread_union {

struct thread_info thread_info;

unsigned long stack[2048]; /* 1024 for 4KB stacks */ };

CPU的esp寄存器用于执行堆栈的顶部指针,当从用户态转向内核态时,进程内核栈总是空的,所以esp就会执行堆栈底部。

使用alloc_thread_info 和free_thread_info用于分配和释放一个存放thread_info结构和内核堆栈的内存区。

内核通过当前esp指针可以很方便的得到thread_info结构的地址。current_thread_info(void)的原理即如下:

movl $0xffff2000,ìx /* or 0xfffff000 for 4KB stacks */ andl %esp,ìx movl ìx,p

thread_info中task指针是第一个,所以current宏相当于current_thread_info( )->task,从而也就得到task指针。

每个进程有自己独立得进程空间,所有进程共享CPU寄存器。进程继续执行时必须装入寄存器恢复得数据集称为硬件上下文环境。在Linux中部分硬件上下文存放在进程描述符中,部分存放到内核态堆栈里。

3. 进程切换堆栈原理:

每个进程有自己独立得进程空间,所有进程共享CPU寄存器。进程继续执行时必须装入寄存器恢复得数据集称为硬件上下文环境。在Linux中部分硬件上下文存放在进程描述符中,部分存放到内核态堆栈里。

80x86体系支持在进程TSS段跳转时自动执行进程硬件上下文切换。Linux使用软件方法实现。软件方式效率差不多,当更灵活,可以控制流程,留下优化空间。 80x86用TSS段保存硬件上下文内容,每个CPU有一个TSS段。从用户态到内核态切换时,从TSS中取出内核栈地址。用户态进程访问I/O端口时,TSS中的I/O访问位图可以验证权限。tss_struct描述了TSS格式,init_tss存放初始TSS内容,每次进程切换,内核更新TSS中的某些字段,以反映当前运行进程的权限等级。每个进程有个反映任务CPU状态的thread_struct结构变量thread,除eax、ecx等通用寄存器内容保存在内核态堆栈中,其他大部分寄存器都保存在次结构中。该结构一部分对应于tss_struct中的内容,进程切换时把thread中某些内容更新到tss_struct中就可以反映当前任务的运行CPU环境。

struct tss_struct {

unsigned short back_link,__blh; unsigned long esp0; unsigned short ss0,__ss0h; unsigned long esp1;

unsigned short ss1,__ss1h; /* ss1 is used to cache MSR_IA32_SYSENTER_CS */ unsigned long esp2; unsigned short ss2,__ss2h; unsigned long __cr3; unsigned long eip; unsigned long eflags;

unsigned long eax,ecx,edx,ebx; unsigned long esp; unsigned long ebp; unsigned long esi; unsigned long edi; unsigned short es, __esh; unsigned short cs, __csh; unsigned short ss, __ssh; unsigned short ds, __dsh; unsigned short fs, __fsh;

unsigned short gs, __gsh; unsigned short ldt, __ldth;

unsigned short trace, io_bitmap_base; /*

* The extra 1 is there because the CPU will access an * additional byte beyond the end of the IO permission * bitmap. The extra byte must be all 1 bits, and must * be within the limit. */

unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; /*

* Cache the current maximum and the last task that used the bitmap: */

unsigned long io_bitmap_max; struct thread_struct *io_bitmap_owner; /*

* pads the TSS to be cacheline-aligned (size is 0x100) */

unsigned long __cacheline_filler[35]; /*

* .. and then another 0x100 bytes for emergency kernel stack

(VR虚拟现实技术)L进程调度切换和虚拟空间管理深入分析最全版

(VR虚拟现实)L进程调度切换和虚拟空间管理深入分析一、Linux进程切换深入分析#defineCLONE_KERNEL(CLONE_FS|CLONE_FILES|CLONE_SIGHAND)创建内核线程时使用的CLONE标志。1.#defineunlikely(x)
推荐度:
点击下载文档文档为doc格式
5doo44si4f9epjx24qwd4i6jo0x1m7012b9
领取福利

微信扫码领取福利

微信扫码分享