Linux进程描述符中union的用法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux进程描述符中union的用法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2528字,纯文字阅读大概需要4分钟。
内容图文
![Linux进程描述符中union的用法](/upload/InfoBanner/zyjiaocheng/954/657862b51bb8486fb4fdb15bd63521ce.jpg)
在阅读“理解Linux内核”时,我发现union正被用于Process Descriptor数据结构.
union thread_union {
struct thread_info thread_info;
unsigned long stack[2048]; /* 1024 for 4KB stacks */
};
当这两个数据结构都被使用时,为什么在这里使用union union for union union thread_union?
解决方法:
首先,它是
union thread_union {
struct thread_info thread_info;
unsigned long stack[THREAD_SIZE/sizeof(long)];
};
如内核include/linux/sched.h中所定义.这很重要,因为宏THREAD_SIZE在很多地方使用(在内核源中总共有几百次),并且在架构之间有所不同.
OP想知道为什么不使用结构:
struct thread_struct {
struct thread_info thread_info;
unsigned long stack[(THREAD_SIZE - sizeof (struct thread_info))/sizeof (long)];
};
(我假设相关的宏,init_thread_info和init_stack,相应地调整,即两者都引用init_thread_union的开始,以便实际的内存布局不会改变.)
简单的原因是联合的两个成员意图驻留在同一个内存区域,因此联合更合适.
完整的推理更复杂.重点是所有体系结构在init/init_task.c中定义了此union类型的init_thread_union变量,用于启动时的初始内核线程,以及预处理器宏
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
在特定于体系结构的头文件中(例如,在x86上的arch/x86/include/asm/thread_info.h中).这些宏分别引用初始线程(引导内核的线程)及其堆栈.
据我所知,union thread_union类型除了初始堆栈和线程信息之外不用于任何其他目的.此外,init_thread_info部分仅在启动期间需要,而不是在以后启动.
这意味着如果使用结构而不是联合,则只要内核正在运行,struct thread_info部分就会在内存中保持未使用状态.当然,它不是很多字节..但是,使用一个联合 – 记住在Linux中,堆栈增长 – 初始线程信息位于初始堆栈区域的末尾,如果在某些时候有一个深度内核代码中的足够的调用链需要每一位可用的内核堆栈,初始的thread_info将被堆栈数据覆盖.哪个好,因为不再需要了.
(如果你非常敏锐,你会发现使用这个结构会产生同样的实际效果:init_stack的运行会溢出到init_thread_info成员中,覆盖它.假设,正如我在括号中所说的那样,调整了宏指向联合的开始.如果未调整宏,则初始线程信息将保留在内存中,未使用,直到重新启动或关闭.)
总而言之,union更合适,因为内核开发人员专门为初始线程信息和初始堆栈(用于启动内核的线程)使用union类型,并且明显希望它们占用相同的内存区域.尽管使用结构可以实现完全相同的实际效果,但它会使init_thread_info和init_stack宏不必要地复杂化,浪费其他/未来开发人员尝试破译原始意图的时间.
最后,请记住,内核开发人员对实际结果比对理论或标准更感兴趣.例如,C编译器编写者可以指出,根据C标准,访问联合的不同成员而不是最后一次赋值给union,会产生未定义的结果.这没关系:内核依赖于实际的,现实世界的行为,而不是任何标准的文本.这也意味着阅读LKML中的代码,注释和讨论或与内核相关的其他邮件列表,总是比依赖一般的C知识更具指导性和可靠性.
内容总结
以上是互联网集市为您收集整理的Linux进程描述符中union的用法全部内容,希望文章能够帮你解决Linux进程描述符中union的用法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。