免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: tomkedy
打印 上一主题 下一主题

有关进程的问题 [复制链接]

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
11 [报告]
发表于 2011-05-27 23:13 |只看该作者
本帖最后由 tempname2 于 2011-05-28 11:39 编辑

回复 10# tomkedy

内核栈是否所有进程共享,这个要看设计,我做过一个教学所用操作系统,它的内核栈就是所有进程共用的。但是一般操作系统的内核栈都是每个进程独立的,比如Linux。新建一个进程是在内核态做的,此时会为新进程分配一个进程描述符,也会为它分配一个内核栈。

TSS这个东西比较尴尬,Intel最初的设计应该是想给OS切换进程提供便利,但Linux大概是为了可移植性不吃这一套。但其中切换到ring0时必需从TSS段里取得内核栈指针。所以Linux所有进程都共用一个TSS段,每次切换进程时就把新进程的内核栈地址写进TSS的相关字段。这个应该是绕不过去了才这样的,类似Linux对x86分段机制的使用。

论坛徽章:
0
12 [报告]
发表于 2011-05-28 10:16 |只看该作者
回复 11# tempname2


    非常赞同楼上所言。
    Linux内核栈是每个进程都有一份,英文叫Per-Process kernel stack,而且我都说了在内核空间,在进程进入内核态时,位于kernel data segment中。
    假设每个进程共享内核栈,不仅效率差(每次进程切换都要保护现场),而且多次系统调用后站容易溢出!

论坛徽章:
0
13 [报告]
发表于 2011-05-29 10:20 |只看该作者
回复 10# tomkedy


    兄弟,进程是要切换的。

论坛徽章:
0
14 [报告]
发表于 2011-05-30 12:54 |只看该作者
回复  tomkedy


    兄弟,进程是要切换的。
flyfrogs 发表于 2011-05-29 10:20



楼上,不太明白你的意思........

论坛徽章:
0
15 [报告]
发表于 2011-05-30 13:05 |只看该作者
[quote][/quote]处于用户态的用户进程如何指挥操作系统动态的为该用户进程创建一个“内核态“的堆栈?

呵呵,通过fork系统调用去指挥了

论坛徽章:
0
16 [报告]
发表于 2011-06-01 15:49 |只看该作者
核心进程堆栈是和 thread_info 共享的,8k肯定在内核空间,
在include/linux/sched.h
union thread_union {
        struct thread_info thread_info;
        unsigned long stack[THREAD_SIZE/sizeof(long)];
};

#define init_thread_info        (init_thread_union.thread_info)
#define init_stack                (init_thread_union.stack)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP