首先,它是

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中定义了此联合类型的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成员中,覆盖它。假设,as我在括号中注意到,宏被调整为指向联合的开始。如果未调整宏,则初始线程信息将保留在内存中,未使用,直到重新启动或关闭。)

因此,总而言之,union更合适,因为内核开发人员专门为初始线程信息和初始堆栈(用于启动内核的线程)使用union类型,并且明确希望它们占用相同的记忆区域。尽管使用结构可以实现完全相同的实际效果,但它会使init_thread_info和init_stack宏不必要地复杂化,浪费其他/未来开发人员尝试破译原始意图的时间。

最后,请记住,内核开发人员对实际结果比对理论或标准更感兴趣。例如,C编译器编写者可以指出,根据C标准,访问联合的不同成员而不是最后一次赋值给union,会产生未定义的结果。这没关系:内核依赖于实际的,现实世界的行为,而不是任何标准的文本。这也意味着阅读LKML或与内核相关的其他邮件列表上的代码,注释和讨论,总是比依赖一般的C知识更具指导性和可靠性。

Linux中写入union作用,Linux进程描述符中union的用法相关推荐

  1. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)

    转自:http://blog.csdn.net/gatieme/article/details/51383272 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...

  2. Linux进程描述符task struct结构体详解--Linux进程的管理与调度(一)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 日期 内 ...

  3. Linux内核进程管理:进程的“内核栈”、current宏、进程描述符

    目录 linux 进程内核栈 概念 thread_info 有什么用? thread_info .内核栈.task_struct 关联 current 宏 1.arm 2.ARM64 3.x86 SY ...

  4. 深入理解Linux进程描述符task_struct结构体

    进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称.注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源. ...

  5. 进程—Linux进程描述符初印象

    进程内核栈结构:union task_union 在../include/linux/sched.h中定义了如下一个联合结构用来创建内核栈空间. //../include/linux/sched.hu ...

  6. Linux进程描述符task_struct结构体简析

    进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个 ...

  7. 抽象思想解读Linux进程描述符

    来源 | 嵌入式客栈 责编 | Carol 头图 | CSDN 下载自视觉中国 内核是怎么工作的? 首先要理解进程管理,进程调度,本文开始阅读进程管理部分,首先从进程的抽象描述开始.抽象是软件工程的灵 ...

  8. linux 快组描述符,Linux 进程描述符 task struct

    大家都知道进程,可是知道linux是怎么管理其进程的吗?每一个进程都有一个进程描述符,具体是task_struct结构体存储相关的信息,在linux/sched.h文件里定义,那么我们先看看linux ...

  9. 【Linux Centos6/7连接Oracle11g数据库,提示:ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务】

    Linux Centos6/7连接Oracle11g数据库,提示:ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 1.登录oracle用户权限并查看监听状况 2.修改配置文件(* ...

最新文章

  1. mysql 分组排序_Python、PowerBI、Excel、MySQL,都能做?搞清楚数据聚合与分箱
  2. P3651-展翅翱翔之时【贪心,环套树】
  3. 二十三、中断(控制计算机硬件,避免使用0000:0000-0000:03FF内存地址)
  4. Postman系列之安装及简介
  5. 深度学习之浅谈全连接层
  6. 剑指offer面试题[49]-把字符串转化为整型
  7. Linux操作系统资源 大合集【鸿蒙OS Suse 红帽 BSD CentOS Arch Ubuntu】 | 寻找C站宝藏
  8. ISO IEC 27001 企业信息安全管理要求
  9. 淘宝开放接口api分享
  10. 停车场管理(C语言版)
  11. SHN-PEG2000-Pyrene,Pyrene-PEG2000-NHS
  12. 想想搭建个域控文件打印机服务器
  13. chrome浏览器在https网站中打开http图片,打不开的解决方案
  14. 如何判断一棵树是否是满二叉树
  15. Android常用UI
  16. gitlab 的备份与恢复
  17. 二、三级等保建议安全设备及其主要依据(毫无保留版)
  18. Portraiture 3 for Mac使用教程
  19. 【传智播客郑州校区分享】HTTP/2技术整理
  20. Android WebView 安全漏洞

热门文章

  1. iOS开发-仿大众点评iPad侧边导航栏
  2. Fantageek翻译系列之《使用Autolayout显示变化高度的UITableViewCell》
  3. php发送email
  4. Kickfire Enters into MySQL Enterprise Agreement with Sun
  5. javabean反射改字段内容_JSP第三篇「JavaBean的介绍、JSP的行为--JavaBean」(修订版)...
  6. linux mysql定时删除数据_让linux每天定时备份MySQL数据库并删除五天前的备份文件...
  7. 总结:Linux磁盘分区管理
  8. JavaScript权威指南笔记
  9. maven jetty
  10. 【ANDROID游戏开发之六】在SURFACEVIEW中添加系统控件,并且相互交互数据!