Libhybris之Glibc和Bionic共存时的TLS问题(四),安卓面试题10道

本文详细探讨了在Libhybris中Glibc和Bionic如何处理TLS(线程局部存储),分析了线程切换时的机制,以及glibc和bionic对TLS的不同实现方式。同时,文章提到了Android面试中可能涉及的10个问题。
摘要由CSDN通过智能技术生成
  1. set_tls_desc(p, idx, &info, 1);

  2. return 0;

  3. }

glibc或者bionic都会调用set_thread_area来设置线程的数据的,bionic是通过__set_tls来调用的。

其实线程有很大一部分是在glibc/bionic中实现的,不全是在内核中的。

上述代码中idx和entry_number表示gs指向gdt中的第几个描述符,如果上层调用者没有指定idx和entry_number的话,由内核自己动态分配。

x86可能的值为6,7,8,x86_64可能的值为12,13,14。但是一般来说,x86上的gs的值是0x33,对应的idx为6,使用gdt中的第6个描述符。

线程切换时,修改的是gdt[6]中的东西,不会去修改gs的,gdt[6]指向了什么东西呢?glibc时gdt[6]中的是线程的tcbhead_t的指针,bionic时gdt[6]是一个指向TLS数组的指针。

线程通过gs,找到gdt中的描述符,然后找到tcbhead_t *或者TLS数组,然后在glibc和bionic中使用不同的实现,可以获得线程的tid,errno,TLS,等等信息。

二、glibc中的TLS

==========================================================================

设置gs的值,以及gdt[6]中的地址,是在如下代码中进行设置的:

  1. /* Code to initially initialize the thread pointer. This might need

  2. special attention since 'errno' is not yet available and if the

  3. operation can cause a failure 'errno' must not be touched. */

  4. # define TLS_INIT_TP(thrdescr) \

  5. ({ void *_thrdescr = (thrdescr); \

  6. tcbhead_t *_head = _thrdescr; \

  7. union user_desc_init _segdescr; \

  8. int _result; \

  9. \

  10. _head->tcb = _thrdescr; \

  11. /* For now the thread descriptor is at the same address. */ \

  12. _head->self = _thrdescr; \

  13. /* New syscall handling support. */ \

  14. INIT_SYSINFO; \

  15. \

  16. /* Let the kernel pick a value for the 'entry_number' field. */ \

  17. tls_fill_user_desc (&_segdescr, -1, _thrdescr); \

  18. \

  19. /* Install the TLS. */ \

  20. INTERNAL_SYSCALL_DECL (err); \

  21. _result = INTERNAL_SYSCALL (set_thread_area, err, 1, &_segdescr.desc); \

  22. /*........*/

tls_fill_user_desc第二个参数为-1,表示动态申请gdt中的位置,一般为6,所以gs=0x33。

在_segdescr中保存了tcbhead_t的地址,后续在set_thread_area系统调用里将tc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值