免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-26 22:03 |只看该作者 |倒序浏览
本人在看ULK第三版(中文),问题如下:

1、ULK里提到的进程描述符是否指操作系统里经常提到的“进程表“?

2、第89页,第2段中的“Linux把不同的PID与系统中每个进程或轻量级进程相关联......“;第3段中的“另一方面,Unix程序员希望同一组中的线程有共同的PID.....“。请问,轻量级进程与线程有区别吗?(个人认为线程就是轻量级进程......)

3、同样是第89页,最后一段里提到的8KB存储区域,它说这个8KB的存储区域里包含1个内核栈和一个线程描述符(threat_info)。但在第90页的图3-2里,该栈并未在内核区域里(即虚拟地址3GB以上),是否例子有错?如果例子没错,那该内核栈是否是TSS里 esp0 所指向的地方(即进程由 ring3 进入 ring0 后,esp所指向的堆栈地址)?

另,threat_info有什么用的?为何不存在内核区域内,反而动态的放在用户区域里?

论坛徽章:
0
2 [报告]
发表于 2011-05-26 22:05 |只看该作者
回复 1# tomkedy


    顶

论坛徽章:
0
3 [报告]
发表于 2011-05-26 23:56 |只看该作者
3. 在内核里的。图我没看,也许是因为旁边注释时用的是物理地址。。。

可以看看这个贴子:http://bbs.chinaunix.net/thread-1945967-1-1.html

论坛徽章:
0
4 [报告]
发表于 2011-05-27 09:23 |只看该作者
回复 1# tomkedy


     thread_info存放更低层次的进程信息,比如能否睡眠等等的flag.thread_info就是放在内核栈底层的。。。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
5 [报告]
发表于 2011-05-27 09:29 |只看该作者
1,进程表是全局维护的一个链表或数组,里面每一项应该就是一个进程描述符。
2,Linux中线程是通过轻量级进程实现的。
3,我没有看图,不能确定上下文的意思,不过如果所说的不在3G,也不一定说就不对,有可能人家说的是物理地址。
另:进程包括两个栈,一个在用户空间中,一个在内核空间中,thread_info是在内核栈的低地址上的数据结构。

论坛徽章:
0
6 [报告]
发表于 2011-05-27 09:52 |只看该作者
回复 1# tomkedy


    1. In chinese, I don't know the literal difference of two words.But Process descriptor is a structure which descrip info about process for kernel management.
    2. Thread does't equal to lightweight process, and it has many impletements, LWP is just one of many impletements.
    3. Per-process kernel stack is located in kernel space undoubtedly. As for the address 0x015fa000, it just a example , maybe just a phisycal address IMO.

论坛徽章:
0
7 [报告]
发表于 2011-05-27 21:19 |只看该作者
回复 6# alexbuaa


刚重新再看一遍,发现似乎内核栈(包含于8KB里的存储区域)确是在“用户区“中,而不在“内核区域“中(图应该没错)。但看各位的回答似乎是每个进程的内核栈都应该在内核区域中......这个我就有点乱了......

论坛徽章:
0
8 [报告]
发表于 2011-05-27 21:20 |只看该作者
回复 6# alexbuaa


    刚重新再看一遍,发现似乎内核栈(包含于8KB里的存储区域)确是在“用户区“中,而不在“内核区域“中(图应该没错)。但看各位的回答似乎是每个进程的内核栈都应该在内核区域中......这个我就有点乱了......

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
9 [报告]
发表于 2011-05-27 21:56 |只看该作者
那是因为你对用户区域和内核区域的理解本来就是混乱的。

某些硬件会可以让内核拥有独立的地址空间,在这种情况下思考这个问题就比较简单。由于地址要通过MMU转换,只要保证某块物理内存不被任何进程的虚拟地址映射于其上,那么任何进程是无论如何也访问也到这块物理内存的,此时,这块内存并不在进程的地址空间之内。而切换到内核态时,一般让内核的页表覆盖整个物理内存,于是内核就可以访问到任何一块物理内存。

现在的OS一般让内核与进程共用地址空间,把顶1G的虚拟地址空间划为内核空间,用户态无权访问。尽量让这1G的虚拟地址从物理内存底端开始映射(就像内核有独立地址空间时让其覆盖整个物理内存一样)。而底3G虚拟地址则依进程的不同而做不同映射。严格来说,这时底1G(其实不到1G)的物理地址也是在进程的地址空间里,但由于MMU的保护机制,在用户态是无权通过顶上1G虚拟地址访问底端1G物理内存。所以此时,可以认为底3G虚拟地址映射到的物理内存才算在进程的地址空间里。但是内核栈并不在这个范围之内,也就是说,进程是不可能通过底3G的虚拟地址访问到内核栈的。换句话说,内核栈不在进程的地址空间里,或者严格来说,不在进程有权访问的地址空间里。

论坛徽章:
0
10 [报告]
发表于 2011-05-27 23:05 |只看该作者
本帖最后由 tomkedy 于 2011-05-27 23:11 编辑
那是因为你对用户区域和内核区域的理解本来就是混乱的。

某些硬件会可以让内核拥有独立的地址空间,在这 ...
tempname2 发表于 2011-05-27 21:56


楼上,谢谢你的回复,但就你的回复我有些疑问,如下:

8KB的存储区域(包含内核栈)是所有用户进程共享的吗?如果是的话,那我相信会是可以放在内核区域里(因为位置是固定的,可以预先指定,反正每个用户进程使用的都是同一个8KB)。但ULK上说了,每个进程对应一个8KB的存储区域,即每个进程各自拥有自己的内核栈,且该内核栈对每个进程来说是动态分配的。那疑问就来了,当新建一个进程时,处于用户态的用户进程如何指挥操作系统动态的为该用户进程创建一个“内核态“的堆栈?

另,这里提到的内核栈是指“内核态堆栈“,而我所理解的“内核态堆栈”(包含在8KB里的)是指对于每个用户进程来说,当它由ring3进入ring0后,所使用到的堆栈。如果linux使用TSS的话(我目前还不太清楚linux里有没有使用到TSS),就应该是 esp0 的指向。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP