Windows核心编程_FS段寄存器

Windows核心编程_FS段寄存器

FS段寄存器Windows用来存储一些进程信息的,FS段的首地址是存储这些进程信息的首地址:在内核态FS指向GDT表的:0x30地址, 在用户态FS=0x3B

也就是说当切换到用户态时,操作系统会把进程下正在执行的线程的某些信息写入到0X3B为起始地址的空间里,内核态时候也一样,操作系统也会写入一些关于内核程序的相关信息到0x3B里!

由于进程的不同进程信息也不同,所以当控制权到不同的进程下时操作系统会向0x3B空间下写入不同的数据!

下面为FS寄存器下偏移的相关信息:

00  指向SEH链表指针

 

04  线程堆栈顶部(地址最小)

 

08  线程堆栈底部(地址最大)

 

0c  SubSystemTib

 

10  FiberData

 

14  ArbitraryUserPointer

 

18  FS 段寄存器在内存中的镜像

 

20  进程PID

 

24  线程ID

 

2c  指向线程局部存储的指针

 

30  PEB结构地址(进程结构/不是PCB进程控制块)

 

34  上一个错误(LastError)

 

这里来演示一下用_asm内联汇编来获取FS寄存器指向的地址空间里的内容

获取进程PID:

 

DWORD _PID;
	_asm{
		mov eax, dword ptr fs:[20h]
		mov [_PID],eax
	}
	printf("%d", _PID);
	getchar();

运行结果:

 

 

 

不信的话,我们使用WindowsAPI:

GetCurrentProcessId来获取自身进程PID试试:
DWORD _PID;
	_asm{
		mov eax, dword ptr fs:[20h]
		mov [_PID],eax
	}
	printf("%d,%d", _PID, GetCurrentProcessId());
	getchar();

运行结果

 

但是还有一个问题,多核CPU是一个CPU下有多个单核CPU,这些CPU通过内部总线来交互数据的,并且是并行的,当每个线程切换时,windows会将某个线程的信息写入到此寄存器下,但是并行的,每个CPU都会有一个自己的fs段寄存器!

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17岁boy想当攻城狮

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值