免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2073 | 回复: 6
打印 上一主题 下一主题

[进程管理] 内核线程的地址空间 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-07 15:40 |只看该作者 |倒序浏览

关于进程的地址空间,如下图:0-3G

1)我们一般说的改图一般指的用户态的进程地址空间,那么内核线程呢?
   当内核线程访问用户空间时,使用的是前一个进程的mm_struct,是这样的吗?

2)图中的代码段处于低端,但不是从0开始就是存放的代码段。这个可以查看/proc/xx/maps知道
那么0地址存放的是什么呢?

谢谢了

论坛徽章:
0
2 [报告]
发表于 2013-09-07 19:26 来自手机 |只看该作者
第一个问题:你的结论是对的,当从用户进程切换到内核线程,进去lazy tlb模式,因为内核线程永远不会访问用户态的地址空间,而所有的进程内核的地址空间一致,这样内核线程就借用上个进程的地址空间,避免不必要的tlb的flush操作

论坛徽章:
0
3 [报告]
发表于 2013-09-07 19:43 |只看该作者
进程地址空间中第一个页面不能随便使用,比如你不能使用mmap(2)映射到第一个页面。0是一个特殊值,Linux用0表示空指针,可以这样验证
#include <stdio.h>

int main()
{
        char *ptr = NULL;
        printf("%x\n", (int)ptr);
        return 0;
}
结果就是0。

论坛徽章:
0
4 [报告]
发表于 2013-09-07 21:45 |只看该作者
回复 3# ycnian

是的。
这个是linux本身的约定?在kernel代码中有所体现吗?或者哪里可以查到呢
我知道kernel的代码段是不可写的(0xc0000000~0xc*******),RX属性(读+执行)。

论坛徽章:
0
5 [报告]
发表于 2013-09-07 23:05 |只看该作者
回复 4# bluempire
这是C99标准的约定,Linux只是遵守C99标准而已。Linux内核中定义在include/linux/stddef.c中  #define NULL ((void *)0)。另外,除了定义空指针之外,进程地址空间中第一个页面是否还有其他用途我就不清楚了,目前只能确认这一点。


   

论坛徽章:
0
6 [报告]
发表于 2013-09-08 22:43 |只看该作者
回复 5# ycnian

谢谢。
关于 除了定义空指针之外,进程地址空间中第一个页面是否还有其他用途我就不清楚了,目前只能确认这一点。

哪位同学指导一下?


   

论坛徽章:
0
7 [报告]
发表于 2013-09-08 22:44 |只看该作者
回复 2# longddr

谢谢~

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP