- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一些内核代码并试图了解数据结构是如何链接在一起的。我知道调度程序如何工作的基本概念,以及 PID 是什么。但是我不知道在这种情况下命名空间是什么,也无法弄清楚所有这些是如何协同工作的。
我已经阅读了一些解释(包括 O'Reilly “Understanding the Linux Kernel”的部分内容)并理解可能是同一个 PID 进入了两个进程,因为一个进程已经终止并且 ID 被重新分配。但我无法弄清楚这一切是如何完成的。
所以:
task_struct
之间有什么关系?和 pid_namespace
? (我已经认为它与 pid_t
有关,但不知道如何)pid_namespace
的定义task_struct
的定义upid
的定义(另见 pid
正下方)最佳答案
也许这些链接可能会有所帮助:
Yes, that’s it, with this namespace it is possible to restart PID numbering and get your own “1″ process. This could be seen as a “chroot” in the process identifier tree. It’s extremely handy when you need to deal with pids in day to day work and are stuck with 4 digits numbers…
All the PIDs that a task may have are described in the
struct pid
. This structure contains the ID value, the list of tasks having this ID, the reference counter and the hashed list node to be stored in the hash table for a faster search. A few more words about the lists of tasks. Basically a task has three PIDs: the process ID (PID), the process group ID (PGID), and the session ID (SID). The PGID and the SID may be shared between the tasks, for example, when two or more tasks belong to the same group, so each group ID addresses more than one task. With the PID namespaces this structure becomes elastic. Now, each PID may have several values, with each one being valid in one namespace. That is, a task may have PID of 1024 in one namespace, and 256 in another. So, the formerstruct pid
changes. Here is how thestruct pid
looked like before introducing the PID namespaces:struct pid {
atomic_t count; /* reference counter */
int nr; /* the pid value */
struct hlist_node pid_chain; /* hash chain */
struct hlist_head tasks[PIDTYPE_MAX]; /* lists of tasks */
struct rcu_head rcu; /* RCU helper */
};And this is how it looks now:
struct upid {
int nr; /* moved from struct pid */
struct pid_namespace *ns; /* the namespace this value
* is visible in */
struct hlist_node pid_chain; /* moved from struct pid */
};
struct pid {
atomic_t count;
struct hlist_head tasks[PIDTYPE_MAX];
struct rcu_head rcu;
int level; /* the number of upids */
struct upid numbers[0];
};As you can see, the
struct upid
now represents the PID value -- it is stored in the hash and has the PID value. To convert thestruct pid
to the PID or vice versa one may use a set of helpers liketask_pid_nr()
,pid_nr_ns()
,find_task_by_vpid()
, etc.
struct nsproxy
.这个结构是所有事物命名空间相对于它所关联的进程的焦点。它包含一个指向
的指针。此进程的子进程将使用的 PID 命名空间 .当前进程的 PID 命名空间使用
task_active_pid_ns
找到。 .
struct task_struct
内,我们有一个命名空间代理指针,恰本地称为
nsproxy
,它指向这个进程的
struct nsproxy
结构体。如果您跟踪创建新流程所需的步骤,您可以找到
task_struct
之间的关系。 ,
struct nsproxy
和
struct pid
.
execve
替换它的镜像(或 exec 系列的类似功能)。因此,作为
do_fork
的一部分,
copy_process
被调用。
task_struct
首先使用 dup_task_struct
复制. copy_namespaces
复制父进程的命名空间.这也创建了一个新的 nsproxy
子结构,它的 nsproxy 指针指向这个新创建的结构 PID
使用 alloc_pid
分配结构它实际上为新的 fork
分配了一个新的 PID 结构。编辑过程。此函数的简短片段:nr = alloc_pidmap(tmp);
if(nr<0)
goto out_free;
pid->numbers[i].nr = nr;
pid->numbers[i].ns = tmp;
upid
通过给它一个新的 PID 以及它当前所属的命名空间来构建结构。
copy process
的一部分函数,这个新分配的 PID 然后链接到相应的
task_struct
通过函数
pid_nr
即它的全局 ID(从 INIT 命名空间中看起来是原始 PID nr)存储在字段
pid
中在
task_struct
.
copy_process
的最后阶段,
task_struct
之间建立链接还有这个新的
pid
结构通过
pid_link
task_struct
内的字段通过函数
attach_pid
.
关于linux-kernel - `task_struct` 和 `pid_namespace` 之间有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26779416/
我正在研究一种管理休眠进程的替代方法,为了我的实验,我需要制作一个修改过的 Linux 内核。对于我正在做的事情,我需要访问描述进程的 task_struct,即使它是当前正在运行的进程。我需要这样做
和这个问题有点关系: Direct access to structure task_struct from Usermode as root 编写了一个打印指向任务结构 (task_struct)
Task_struct 用于内核保存进程的必要信息。由于该结构,内核可以暂停一个进程,并在一段时间后继续执行它。但我的问题是:这个 task_struct 存储在内存中的什么地方(我读过内核堆栈,是在
内核 task_struct 如下所示。我对两个成员更感兴趣,即 children 和 sibling ,所以我从这个内核结构中删除了其他元素。 struct task_struct{
我有一个 task_struct *我通过调用 find_task_by_vpid(get_pid()) 得到的.我想弄清楚哪个用户拥有该进程,以便我可以在我正在编写的系统调用中进行一些权限检查,但要
我已经编写了在/proc 文件上读取和写入的模块,并且工作正常,但是当我创建下面所示的权限函数时,想要使用它的权限,它给了我错误(基本上我希望每个人都可以读取该文件,但是只有 root 可以写入)。
我正在尝试实现一个模块,该模块将 pid 作为输入并简单地打印该进程的一些属性。打印 sibling 的信息也是该模块的一部分。但是,当我进入第二或第三级叶进程时,它直接返回 pid=1 的父进程,即
我正在尝试编写一个内核模块来检测 fork 炸弹,为此,我想向 task_struct 添加一个字段 int descendantCount。到目前为止,这是我的代码: struct task_str
Linux中的task_struct中是否有成员可以统计进程中正在运行的线程总数? 我读到,在Linux中没有线程,但是如果我们检查任何进程目录(proc/[PID]/task)内的任务目录,就会发现
在一个模块中,我正在访问 task_struct 并返回 stime+utime。我想将它转换为毫秒。 stime 和 utime 将以什么格式出现在 task_struct 中。我也可以从/proc
我有一个家庭作业,我必须向 task_struct 添加一些条目并用它们做一些事情。此外,我必须在 task_struct 初始化时将一个条目初始化为特定的 int。 task_struct 第一次初
我想从 struct task_struct 中获取完整的进程名称。 comm 字段仅存储 16 个字符,而进程名称可以更长。有没有办法获得完整的进程名称? 这可以通过从task_struct获取st
我想获取有关任务的信息,例如任务的总执行时间(使用task_exec_time(task))、未运行的时间(task->sched_info.run_delay)以及调度程序调用任务的次数(任务->s
我读到线程使用 thread_info ,而 task_struct 是 thread_info 的成员,我怀疑进程也使用 thread_info 还是他们在为进程描述符条目分配内存时使用 task_
我正在尝试弄清楚流程是如何相互关联的。我知道 linux 内核使用循环链表 list_head 将不同的进程连接在一起,信息保存在一个名为 task_struct 的结构中。在 task_struct
我正在阅读 Linux 内核的 try_to_wake_up() 函数的源代码。这个函数做了很多事情,包括:return p->on_rq == TASK_ON_RQ_QUEUED。 那么,task_
在阅读 Linux 内核源代码时,我发现一件事让我感到困惑。 在task_struct中,是这样写的 struct task_struct { #ifdef CONFIG_THREAD_INFO_IN
我正在研究一些内核代码并试图了解数据结构是如何链接在一起的。我知道调度程序如何工作的基本概念,以及 PID 是什么。但是我不知道在这种情况下命名空间是什么,也无法弄清楚所有这些是如何协同工作的。 我已
sched.h 中 task_struct 中的 void *stack 声明是什么? ? 它是指向进程镜像(堆栈、堆、.bss、数据、文本)堆栈的指针吗?如果是这样,指向过程镜像其余部分的指针在哪里
我无法理解 Linux 中进程控制 block 和进程描述符之间的区别? 我看到这两种结构都被称为 task_struct,这些术语似乎可以互换使用 - 两者之间有什么区别? 非常感谢您的帮助! 最佳
我是一名优秀的程序员,十分优秀!