免费预览已结束,剩余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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人工智能促进数字经济创新研究
- 2026 年 1 例糖尿病合并妊娠高危护理个案研讨
- 2026 年智能化工具辅助护理临床带教实践
- 学历类《自考》自考专业(营销)《消费心理学》考试试题及答案解析
- 小学二年级下册数学常考应用题含答案
- 水文地质学基础习题库及答案
- 煤矿职业病试题及答案
- 高级维修电工考试试题及答案
- 2026二次反射塔式太阳能光热发电站集热系统技术规范
- 2026年铁路车站值班员(高级)考试题库及答案
- 钢结构水电安装施工合同(3篇)
- 十五运会闭幕式串词
- 无水三氯化铝中试项目环境影响报告书
- 2025算电协同技术白皮书
- GJB3206B-2022技术状态管理
- 2024年下半年中国铁路南宁局集团有限公司校招笔试题带答案
- 《陆上风电场工程设计概算编制规定及费用标准》(NB-T31011-2024)
- 2025内蒙古能源集团有限公司招聘55人笔试参考题库附带答案详解
- 2024年汽车驾驶员(技师)考试题及答案
- 商业银行风险偏好和限额管理管理办法
- 古代汉语文选无标点(第一册,第二册)教案资料
评论
0/150
提交评论