linux内核堆栈.doc_第1页
linux内核堆栈.doc_第2页
linux内核堆栈.doc_第3页
linux内核堆栈.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在内核2.4中堆栈是这么定义的:union task_union struct task_struct task;unsigned long stackINIT_TASK_SIZE/sizeof(long); ;而INIT_TASK_SIZE只能是8K。内核为每个进程分配一个task_struct结构时,实际上分配两个连续的物理页面(8192字节),如图所示。底部用作task_struct结构(大小约为1K字节),结构的上面用作内核堆栈(大小约为7K字节)。访问进程自身的task_struct结构,使用宏操作current, 在2.4中定义如下:#define current get_current()static inline struct task_struct * get_current(void) struct task_struct *current; _asm_(andl %esp,%0; :=r (current) : (8191UL); return current;8191UL表示最低13位为0, 其余位全为1。 %esp指向内核堆栈中,当屏蔽掉%esp的最低13后,就得到这个”两个连续的物理页面”的开头,而这个开头正好是task_struct的开始,从而得到了指向task_struct的指针。在内核2.6中堆栈这么定义:union thread_union struct thread_info thread_info; unsigned long stackTHREAD_SIZE/sizeof(long);根据内核的配置,THREAD_SIZE既可以是4K字节(1个页面)也可以是8K字节(2个页面)。thread_info是52个字节长。下图是当设为8KB时候的内核堆栈:Thread_info在这个内存区的开始处,内核堆栈从末端向下增长。进程描述符不是在这个内存区中,而分别通过task与thread_info指针使thread_info与进程描述符互联。所以获得当前进程描述符的current定义如下:#define current get_current()static inline struct task_struct * get_current(void) return current_thread_info()-task;static inline struct thread_info *current_thread_info(void) struct thread_info *ti; _asm_(andl %esp,%0; :=r (ti) : (THREAD_SIZE - 1); return ti; 根据THREAD_SIZE大小,分别屏蔽掉内核栈的12-bit LSB(4K)或13-bit LSB(8K),从而获得内核栈的起始位置。struct thread_info struct task_struct *task; /* main task structure */ struct exec_domain *exec_domain; /* execution domain */ unsigned long flags; /* low level flags */ unsigned long status; /* thread-synchronous flags */ . .fork系统调用中调用dup_task_struct,其执行:1, 执行alloc_task_struct宏,为新进程获取进程描述符,并将描述符放在局部变量tsk中。2, 执行alloc_thread_info宏以获取一块空闲的内存区,用以存放新进程的thread_info结构和内核栈,并将这块内存区字段的地址放在局部变量ti中(8K 或 4K, 可配置)。3, 将current进程描述符的内容复制到tsk所指向的task_struct结构中,然后把tsk-thread_info置为ti。4, 把current进程的thread_info描述符的内容复制到ti中,然后把ti-task置为tsk。5, 返回新进程的描述符指针tsk。static struct task_struct *dup_task_struct(struct task_struct *orig)struct task_struct *tsk;struct thread_info *ti;prepare_to_copy(orig);tsk = alloc_task_struct();if (!tsk)return NULL;ti = alloc_thread_info(tsk);if (!ti) free_task_struct(tsk);return NULL;*tsk = *orig;tsk-thread_info = ti;setup_thread_stack(tsk, orig);.# define alloc_task_struct()kmem_cache_alloc(task_struct_cachep, GFP_KERNEL)#define alloc_thread_info(tsk) (struct thread_info *) _get_free_pages

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论