首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用于x86上的linux的thread_info结构的成员

thread_info结构是Linux内核中用于管理线程信息的数据结构。它位于每个线程的内核栈顶部,包含了线程的状态、调度信息以及与线程相关的其他元数据。

thread_info结构的成员包括:

  1. task:指向线程所属的进程控制块(task_struct)。
  2. flags:用于存储线程的状态标志,如是否在运行、是否被挂起等。
  3. preempt_count:用于实现内核抢占机制的计数器,记录了当前线程被抢占的次数。
  4. addr_limit:线程的地址空间限制,用于隔离不同线程的内存访问。
  5. stack:指向线程的内核栈顶部。
  6. cpu:记录了线程所在的CPU编号。
  7. task_list:用于将线程链接到进程的线程链表中。
  8. exec_domain:指向线程所在的执行域(execution domain),用于支持多个执行域的系统。

thread_info结构在Linux内核中扮演着重要的角色,它提供了线程的关键信息,帮助内核进行线程调度和管理。在x86架构上,thread_info结构的成员在内核源代码中定义,并通过宏定义进行访问。

对于x86上的Linux,腾讯云提供了多种云计算产品和服务,如云服务器、容器服务、云原生应用平台等,可以满足用户在云计算领域的需求。具体产品和服务的介绍和链接地址可参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux进程描述符task_struct结构体详解--Linux进程管理与调度(一)【转】

谈到task_struct结构体,可以说她是linux内核源码中最复杂一个结构体了,成员之多,占用内存之大。 进程状态 /* * Task state bitmask. NOTE!...需要注意是,内核态堆栈仅用于内核例程,Linux内核另外为中断提供了单独硬中断栈和软中断栈 下图中显示了在物理内存中存放两种数据结构方式。...但是较新内核代码中,进程描述符task_struct结构中没有直接指向thread_info结构指针,而是用一个void指针类型成员表示,然后通过类型转换来访问thread_info结构。...(long)]; }; 获取当前在CPU正在运行进程thread_info 下面来说说如何通过esp栈指针来获取当前在CPU正在运行进程thread_info结构。...实际,上面提到,thread_info结构和内核态堆栈是紧密结合在一起,占据两个页框物理内存空间。而且,这两个页框起始起始地址是213对齐

2.3K20

Linux进程管理(一)进程数据结构

Linux内核中使用 task_struct 结构来表示一个进程,这个结构体保存了进程所有信息,所以它非常庞大,在讲解Linux内核进程管理,我们有必要先分析这个 task_struct 中各项成员...,就是 fs_struct 每个进程还要维护它所打开文件,这些信息在 files_struct 中 进程内核栈: 1、栈结构: 上面讲解了 task_struct 大部分成员,下面来讲解进程内核栈...在内核栈最高端,存放着一个 pt_regs 结构,这个结构包含了相关寄存器定义,用户态寄存器值就保存在这里,对于X86 32 位其定义如下: struct pt_regs { unsigned...12位置零就可以得到内核栈基址 而 thread_info 存在于内核栈栈底处,所以也就获取到了该进程对应 thread_info 结构thread_info 结构中有一个 task_struct...* 成员,指向该进程 task_struct,所以也就可以获得该进程 task_struct 结构 不禁感叹,Linux内核实现真是巧妙啊!

1.2K10
  • 全新系列-Linux进程管理初探

    结构定义在include/linux/sched.h文件中,而且这个结构体有非常多属性,在《Linux内核设计与实现》一书中提到,在当时task_struct结构体就有1.7KB大小,现在内核只增不减...值得注意是,笔者在arch/x86/include/asm/thread_info.h中未找到类似的结构体,只有: //arch/x86/include/asm/thread_info.h L56 struct...thread_info和current_thread_info都是基于特定体系结构,所以会有各种不同实现。...所谓不忘初心方得始终,我们在task_struct中看到了有关perf结构成员: // include/linux/sched.h L1239 #ifdef CONFIG_PERF_EVENTS...,而是修改一个副本,只有当所有的读者都完成读以后,才将数据写入,这种机制适用于多读和少写情况。

    27210

    《coredump问题原理探究》Linux x86版6.3节有成员变量类coredump例子

    由于从符号表可以看到xuzhina_dump_c06_s2_ex::print是类xuzhina_dump_c06_s2_ex成员函数,那么由调用类成员函数时,this指针作为第一个参数传递规则,知道...也就是说,这一段汇编结构如下 if ( flag == 0 ) { … } else if ( flag == 1 ) { …. } else { … } 现在尝试着找出ebp-0xc这个局部变量是处于什么作用...=> 0x0804863c : movzbl (%eax),%eax //该成员变量是char数组 可以看出eax+14h即this指针偏移20个字节成员变量是char指针,命名为...由于第一个成员变量flag占两个字节,那么查看起始地址应该是0xbfe096b6....那么,类xuzhina_dump_c06_s2_ex成员变量ptr,num应该是在构造函数里初始化

    1.6K10

    《coredump问题原理探究》Linux x86版6.2节C++风格数据结构内存布局之有成员变量

    由上面代码可得知,test在构造完成后,它三个成员值分别是5, ‘d’,-1(0xffffffff), 且由一节得知,在调用类成员函数时,this指针作为第一个参数放入栈里。...由此可知,类成员变量排列和结构体没什么区别,只是在调用成员函数时,this指针会作为成员函数第一个参数放入栈中。...即定位coredump问题,可以看看在调用类成员函数时看一下它第一个参数,找到this指针,然后根据this指针查看类每个成员变量值。...从而可以看到,类成员函数和普通区别确实在于会把this指针作为成员函数第一个参数。这应该也是为什么类成员函数指针声明要指定类名原因。...可见,类成员函数指针使用和类成员函数一样,都会把this指针作为成员函数第一个参数。这也是为什么调用类成员函数时要指定对象或对象指针。如这个例子 (test.*clsFuncPtr)();

    84210

    Linux内核0-使用QEMU和GDB调试Linux内核

    Linux把跟一个进程相关thread_info和内核栈stack放在了同一内存区域,内核通过esp寄存器获得当前CPU运行进程内核栈栈底地址,该地址正好是thread_info地址,由于进程描述符指针...task字段在thread_info结构体中偏移量为0,进而获得task。...而且进程thread_info也不再位于进程内核栈底了,而是放在了进程描述符task_struct结构体中,见提交sched/core: Allow putting thread_info into...task_struct和x86: Move thread_info into task_struct,这样也无法通过esp寄存器获取thread_info地址了。...(gdb) p $lx_current().thread_info $5 = {flags = 2147483648} thread_info这个变量好像没有了,打印结果显示没有这个成员 这样做是从安全角度考虑

    2.4K10

    《coredump问题原理探究》Linux x86版4.2节函数逆向之顺序结构

    区区十来行代码,就变成了非常多汇编语句,非常令人害怕。实际,不需要那么害怕。 先看一下call指令地方,由于call指令是调用函数,所以,用它可以大致定一下这样范围。...但上面由于有一些指令是编译器生成,有一些是函数调用时把参数入栈指令,所以,要筛选出这些指令,仅以第一段汇编为例(即第一个scanf调用前汇编): 0x08048570 : push...,所以,这是由编译器自动生成。...也是编译器自动生成。...小结: 由于顺序结构逆向非常考验汇编基础,但如果是有函数调用的话,先找call指令,根据call指令来划分范围,筛选出编译器自动生成指令。

    34320

    结构成员在内存中对齐方式

    以下我会举两个结构例子,分别画图方式表达对齐原则。 结构体对齐公式 记住以下这些规则,把结构体往里面套就可以了。...结构体对齐原则就是牺牲空间方式来减少时间消耗,空间用完还可以复用,而时间过去了就再也不会回来了。...以 #pragma pack(x) 中 x 大小和结构中占用空间最大成员做比较,取小值为 n(外对齐依据) 以 n 值和结构体每个成员比较,得出结果列表为 m[x] 根据每个成员大小依次向内存中填充数据...,要求填充 成员起始地址 减去 构体起始地址 差都可以整除 m[x] ,如不能整除则向后移动,直到可以整除再填充成员到内存(内对齐依据) 当全部成员填充完毕后所占用字节若不能整除 n,则扩充内存到可以整除...案例一 我们来看一个简单案例,#pragma pack(4) 为 4,结构体中有 char、short、int 3个成员,其对齐方式如下图表示: #include #pragma

    18330

    TiDB 在 Raft 成员变更

    成员变更过程中, 例如上面需要将DC-1中 a 节点迁移到 d 节点, 中间状态 DC-1 有 ad 2个节点....而在节点数是 偶数 时候, majority 没有能力描述系统最大 quorum 集合. majority 是 Raft 设计第一个不足....但是, 你品, 你细品… 品完后笔者一拍大腿: 这个修正实际就是将单步变更升级成了joint consensus, 本质都变成了: 一条变更在旧配置中必须通过quorum互斥, 只能有1个变更被认为是...由此导致结果就是, 为了保证正确性, 单步变更必须使用跟joint consensus 几乎同样复杂逻辑, 实现2步变更逻辑, 而执行效率, 没有任何优势....东旭也表示 TiDB 下一步就会将单步变更升级为joint consensus, 彻底解决单步变更带来可用性问题以及工程实现麻烦.

    42730

    《coredump问题原理探究》Linux x86版4.4节函数逆向之循环结构

    https://blog.csdn.net/xuzhina/article/details/8588991 在x86里,循环指令有: LOOP:ECX不为零时循环 LOOPE/LOOPZ:ECX...不为零且标志Z=1时循环 LOOPNE/LOOPNZ:ECX不为零且标志Z=0时循环 但实质,由于上面指令适用范围太窄,只能用于循环体非常简单。...由于loop_for,loop_while代码逻辑一样,连生成汇编都是一样。loop_do和两者不大一样,所以,汇编不一样。...由指令地址0x080485fd这一条指令可知,执行流程会回到0x080485e8,这个地址是比跳转指令地址更小,直到满足eax值和ebp+8内容相等才会停止。...从这里可以看出,如果在分析函数汇编时,遇到跳转指令,如果它并不是跳到比当前指令地址更大地址执行,那么它有可能是一个循环,否则就是一个普通条件跳转结构

    32320

    《coredump问题原理探究》Linux x86版4.3节函数逆向之条件结构

    https://blog.csdn.net/xuzhina/article/details/8576178 在x86里,条件跳转指令有: JMP:无条件跳转 JAE/JNB:大于或等于跳转,用于无符号整数运算...JA/JNBE:不小于或不等于跳转,用于无符号整数运算 JB/JNAE:小于跳转,用于无符号整数运算 JBE/JNA:小于或等于跳转,用于无符号整数运算 JG/JNLE:大于跳转,用于有符号整数运算...JGE/JNL:大于或等于跳转,用于有符号整数运算 JL/JNGE :小于跳转,用于有符号整数运算 JLE/JNG:小于或等于跳转,用于有符号整数运算 JE/JZ:等于跳转 JNE/JNZ:不等于跳转...而这些指令之前,往往会有一些设置这些标志位指令。最常见是cmp, test指令。那么,就可以根据上面指令快速构建条件结构骨架。...也可以看到,if…else if…else和switch实际在汇编里是没什么区别。

    40320

    Windows x64x86重定向

    x86机器,我们程序调用regedit路径是C:\windows\regedit.exe;而在x86_64,程序调用regedit路径是C:\windows\SysWOW64\regedit.exe...其中SysWOW64(System Windows on Windows64)是windows一个兼容层,用来在x86_64机器运行x86程序。...正巧程序读取注册表键值在64bit版regedit可以读取,而在32bit版本regedit无法读取,这就造成了开头问题。...0x02 解决方法 解决方法有两种: 将程序编译成64bit 使用关闭重定向函数Wow64DisableWow64FsRedirection 第一种方法当然简单粗暴,但是在x86系统却无法运行,...0x03 x86 Redirect in x86_64 wow64其实相当于64bit系统一个子系统,用来兼容32bit程序。

    2K80

    猫:if选择结构

    一.基本if结构:  1.定义:if选择结构是根据条件判断之后再做处理一种语法结构!  ...:非-----条件为真时,结果为假;条件为假时,结果为真  注:当运算符比较多,无法确定运算符执行顺序时,可以使用小括号控制 三.多重:  1.多重if选择结构"不是"多个基本if选择结构简单地排列在一起...  >如果条件之间存在连续关系,则else if块顺序不是随意排列,要么从大到小,要么从小到大.总之要有顺序排列 四.嵌套:  1.只有当满足外层if选择结构条件时,才会判断内层if条件  2....else总是与它前面最近那个缺少elseif配对  3.if结构书写规范:   >为了使if结构更加清晰,应该把每个if或else包含代码块用大括号括起来   >相匹配一对if和else应该左对齐...  >内层if结构相对于外层if结构要有一定缩进

    1K120

    Linux体系结构

    Linux体系结构 ?...环境配置 Linux系统,体验指令 Windows系统下载 cigwin 常用 查看系统调用 适用与简单操作 查看系统调用 man 2 syscalls 系统调用说明 man 2 acct...返回调用结果 可编程,脚本 默认是当前主流bash ? 当前shell版本 ? 本地shell版本 ? 切换任意路径版本 ?...字符串:向上查询“字符串”功能 n:重复前一个查询 N:反向重复前一个查询 q:离开 more 和 less 区别: less 不必读整个文件,所以加载速度会比 more 更快 less 可以按键盘上下方向键显示上下内容...,而 more 不能通过上下方向键控制显示 less 退出后 shell 不会留下刚显示内容,而 more 退出后会在 shell 留下刚显示内容 编辑vi、vim vim更流行

    94720

    Linux各种栈:进程栈 线程栈 内核栈 中断栈

    有专门栈指针寄存器,以及特定硬件指令来完成 入栈/出栈 操作。例如在 ARM 架构,R13 (SP) 指针是堆栈指针寄存器,而 PUSH 是用于压栈汇编指令,POP 则是出栈汇编指令。...因此内核将进程内核栈头部一段空间,用于存放 thread_info 结构体,而此结构体中则记录了对应进程描述符,两者关系如下图(对应内核函数为 dup_task_struct()): 有了上述关联结构后...这里有一个小技巧,直接将 esp 地址与 ~(THREAD_SIZE - 1) 后即可直接获得 thread_info 地址。...成功获取到 thread_info 后,直接取出它 task 成员就成功得到了 task_struct。...X86 中断栈就是独立于内核栈;独立中断栈所在内存空间分配发生在 arch/x86/kernel/irq_32.c irq_ctx_init() 函数中 (如果是多处理器系统,那么每个处理器都会有一个独立中断栈

    2.8K50

    一文搞懂 | Linux各种栈(进程栈 线程栈 内核栈 中断栈)

    有专门栈指针寄存器,以及特定硬件指令来完成 入栈/出栈 操作。例如在 ARM 架构,R13 (SP) 指针是堆栈指针寄存器,而 PUSH 是用于压栈汇编指令,POP 则是出栈汇编指令。...因此内核将进程内核栈头部一段空间,用于存放 thread_info 结构体,而此结构体中则记录了对应进程描述符,两者关系如下图(对应内核函数为 dup_task_struct()): 有了上述关联结构后...这里有一个小技巧,直接将 esp 地址与 ~(THREAD_SIZE - 1) 后即可直接获得 thread_info 地址。...成功获取到 thread_info 后,直接取出它 task 成员就成功得到了 task_struct。...X86 中断栈就是独立于内核栈;独立中断栈所在内存空间分配发生在 arch/x86/kernel/irq_32.c irq_ctx_init() 函数中 (如果是多处理器系统,那么每个处理器都会有一个独立中断栈

    6.3K33

    Linux内核Crash分析

    对每一个进程来说,Linux内核都会把两个不同数据结构紧凑存放在一个单独为进程分配存储空间中:一个是内核态进程堆栈,另一个是紧挨进程描述符数据结构thread_info,叫线程描述符。...在Linux-2.6.32内核中thread_info.h文件中有对内核堆栈定义: #define THREAD_SIZE 8192 在Linux内核中使用下面的联合结构体表示一个进程线程描述符和内核栈...]; }; 该结构是一个联合体,我们在C语言书上看到过关于union解释,在在C Programming Language 一书中对于联合体是这么描述: 1) 联合体是一个结构; 2) 它所有成员相对于基地址偏移量都为...0; 3) 此结构空间要大到足够容纳最"宽"成员; 4) 其对齐方式要适合其中所有的成员; 通过上面的描述可知,thread_union结构大小为8192个字节。...task_struct结构成员stack是栈底,也是对应thread_info结构地址。堆栈数据是从栈底+8K地方开始向下存。SP指向是当前栈顶。

    4.5K20
    领券