linux进程描述符存储在哪里,什么可以访问它?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux进程描述符存储在哪里,什么可以访问它?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1932字,纯文字阅读大概需要3分钟。
内容图文
![linux进程描述符存储在哪里,什么可以访问它?](/upload/InfoBanner/zyjiaocheng/949/6f59b8e9d4694909a1644f75b182284b.jpg)
我读到Linux(在x86上)的进程描述符存储在内核数据段中,但存储在PAGE_OFFSET以下的地址(即在用户地址空间中).由于内核数据段和用户数据段都覆盖整个4GB地址空间,因此,如果用户代码知道其地址,则大概可以通过用户数据段访问过程描述符.这是正确的吗?如果是这样,那不是安全漏洞吗?
一个相关的问题:有人断言过程描述符的线性地址可以用作唯一的过程ID.但是,由于线性地址是使用页表转换的,并且页表对于PAGE_OFFSET以下的地址的每个进程都是不同的,那么两个进程不能将其进程描述符存储在同一线性地址吗?
解决方法:
在linux中,“进程描述符”是struct task_struct [和其他一些].它们存储在内核地址空间中[PAGE_OFFSET之上],而不是用户空间中.
这与PAGE_OFFSET设置为0xc0000000的32位内核更相关.
在32位内核中,用户进程虚拟地址空间限制为PAGE_OFFSET
64位内核有所不同,并且限制并不重要. PAGE_OFFSET为0xffff880000000000
而且,内核具有自己的单个地址空间映射.
每个进程/线程都有其自己的虚拟地址空间,因此,禁止.so库的共享内存和线程的共享内存是唯一的.它不会映射到内核地址空间中的任何内容.
即使使用[如果有]公共地址空间映射,内核页面也受到用户进程的读/写保护.
A related question:
这真的是两个问题
there was an assertion that the linear address of the process descriptor can serve as a unique process ID.
不能.由于某些原因,无法完成此操作.
仅内核有权访问(即“知道”)task_struct地址.
其次,如果进程终止,则它是僵尸,直到父进程通过等待“收割”它.内核必须记住哪些进程是僵尸(即它们的pid不会被新进程重用),直到父进程获得它们.
但是task_struct很大.因此,当进程进入僵尸状态时,内核会捕获task_struct数据的一小部分(例如pid和status),并将其保存在“僵尸”结构中.然后,内核几乎可以立即重用task_struct [使用其他pid].
例如,虽然具有pid 37的进程在运行时可能在地址(例如)0x1000上有一个任务结构,但在终止之后但在收割之前,pid 37没有任务结构地址,并且在0x1000处的任务结构可能已经被分配pid 23727
However, as linear addresses get translated using the page table, and the page table is different for every process for addresses below PAGE_OFFSET, then couldn’t two processes store their process descriptors at the same linear address?
再一次,不.
内容总结
以上是互联网集市为您收集整理的linux进程描述符存储在哪里,什么可以访问它?全部内容,希望文章能够帮你解决linux进程描述符存储在哪里,什么可以访问它?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。