我目前处于需要重新定位TCB(线程控制块)的情况 . 根据我的理解,调用VDSO时进程执行中有以下方案(根据this article)
-
全部由指令 *call %gs:0x10 触发
-
%gs是使用全局描述符表的段寄存器 . GDT是存储在与进程相关联的内核堆栈中的关联表,并保持段寄存器值与进程的地址空间中的地址之间的对应关系 . 它是随机初始化并由加载器选择(glibc库的一部分)
-
一旦 Build 了对应关系,处理器就会在*(GDT [%gs] 0x10)处读取地址并进行VDSO中的呼叫 .
-
执行系统调用并从内核返回到用户进程使用内核AS中的返回地址存储 .
我的问题是我需要用其他东西覆盖我的一些进程内存,并且大多数时候,它会擦除地址部分(GDT [%gs] 0x10) .
我想要做的是将TCB的内容(从GDT [%gs]重新定位到GDT [%gs] 0x ..)在我的进程'AS中的空闲位置,但这意味着改变GDT内容,我认为我不能从用户模式做什么 . 换句话说,我想在我的GDT中更改%GS的关联 .
提前感谢任何答案,/ iansus
1 回答
好的,我找到了解决方案: