查看MIPS Linux 存储管理分析札记的源代码
←
MIPS Linux 存储管理分析札记
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== MIPS TLB == MIPS TLB 的每项的主要数据有: | G | ASID | VPN | PFN | 其中 VPN 为 virtual page number, PFN 为 physical frame number。 项与项之间没有次序,CPU 转换时是直接匹配的。不能称为 Page Table 。 而 Page Table 当年设计成 数组结构,以数组的下标作为虚页号是经过考虑的,即使今天看来,我们依然能够体会它的巧妙。 <br><br> ;;4. 内核在从汇编语言跳到C语言中时,其栈的栈顶是在哪里设置的? 内核在进入 start_kernel 前,将 esp 指向了 init_thread_union + THREAD_SIZE, init_thread_union 位于 .data.init_task 节,是个 union 结构,其大小为 THREAD_SIZE,定义的比较巧妙: <source lang=c> union thread_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)]; }; </source> <br><br> ;;5. 内核态线程、内核线程以及进程的内核栈问题 linux 下线程库的实现,以常用的 Linuxthread 或者 NPTL 为例,这些库创建线程是使用这些标志 CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND 调用 clone() 来实现的,就是一个轻量级进程。 在使用 fork, vfork, clone 这些函数创建进程或者轻量级进程时,内核都会调用 alloc_task_struct() 为其分配一个 task_struct; 调用 alloc_thread_info() ,表面上看好像是分配 thread_info 结构,实际上: <source lang=c> #define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) </source> 分 配了 THREAD_SIZE 的空间,底端为 thread_info ,指向它的指针保存于 task_struct->thread_info 中。可以看到,task_struct->thread_info + THREAD_SIZE 即为进程或者轻量级进程的内核栈栈底。 无论是使用 clone 生成轻量级进程,还是使用 kernel_thread 创建内核线程,他们都会进入 do_fork,进而调用 alloc_thread_info(),因此他们都有内核栈,大小为 THREAD_SIZE,底端为 thread_info 。 因此linux 下,每个线程都会有一个内核栈,这个当线程数目很大时是个问题 <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br>
返回到
MIPS Linux 存储管理分析札记
。
个人工具
3.147.80.36
该IP地址的讨论
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面