问一个关于寄存器和应用程序的关系

Jekhn 2010-12-21 02:18:10
最近有一个困惑,就是CPU只有一组寄存器,但是在debug的时候CPU各寄存器是不变的,那其它应用程序也要用到寄存器吧,CPU还是在工作吧,怎么不会相互影响吗?内存空间独立可以理解,不过各程序之间的寄存器怎么保持相对独立呢?求解答。
...全文
118 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
一个傻冒 2010-12-21
  • 打赏
  • 举报
回复
可以这么理解。
Jekhn 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ydfivy 的回复:]

以上的话,希望对你有帮助。
[/Quote]
谢谢!
那么就是说在线程获取CPU时间片的时候就要先从CONTEXT结构体里面获取相关信息,CPU切换时间片的时候又要把寄存器等相关信息保存起来,是这样的反复过程吗?
一个傻冒 2010-12-21
  • 打赏
  • 举报
回复
以上的话,希望对你有帮助。
一个傻冒 2010-12-21
  • 打赏
  • 举报
回复
每个线程内核对象都维护着一个CONTEXT结构,里面保存了线程运行的状态,使得CPU可以记得上次运行该线程运行到哪里了,该从哪里开始运行,该线程内部数据如何如何。

  在Platform SDK文档中记录着CONTEXT结构的信息。该结构是与CPU有关的,特定的CPU对应着特定的CONTEXT结构。

  x86类型CPU对应的CONTEXT结构文档如下:



typedef struct _CONTEXT {

//
// The flag values within this flag control the contents of
// a CONTEXT record.
//
// If the context record is used as an input parameter, then
// for each portion of the context record controlled by a flag
// whose value is set, it is assumed that that portion of the
// context record contains valid context. If the context record
// is being used to modify a thread's context, only that
// portion of the thread's context will be modified.
//
// If the context record is used as an IN OUT parameter to capture
// the context of a thread, only those portions of the thread's
// context corresponding to set flags will be returned.
//
// The context record is never used as an OUT only parameter.
//

DWORD ContextFlags;

//
// This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
// set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
// included in CONTEXT_FULL.
//

DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;

//
// This section is specified/returned if the
// ContextFlags word contains the flag CONTEXT_FLOATING_POINT.
//

FLOATING_SAVE_AREA FloatSave;

//
// This section is specified/returned if the
// ContextFlags word contains the flag CONTEXT_SEGMENTS.
//

DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;

//
// This section is specified/returned if the
// ContextFlags word contains the flag CONTEXT_INTEGER.
//

DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;

//
// This section is specified/returned if the
// ContextFlags word contains the flag CONTEXT_CONTROL.
//

DWORD Ebp;
DWORD Eip;
DWORD SegCs; // MUST BE SANITIZED
DWORD EFlags; // MUST BE SANITIZED
DWORD Esp;
DWORD SegSs;

//
// This section is specified/returned if the ContextFlags word
// contains the flag CONTEXT_EXTENDED_REGISTERS.
// The format and contexts are processor specific
//

BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];

} CONTEXT;



  可见,该CONTEXT结构中,保存着直接和CPU有关的信息:

1、ContextFlags,在查询的时候需要设置该字段,表示查询哪些其他的CONTEXT结构字段。

2、调试寄存器组

3、FLOATING_SAVE_AREA FloatSave —— 浮点寄存器

4、段寄存器

5、通用数据寄存器(整型寄存器)组

6、控制寄存器组——比如CS、BP、SP之类的保存基址指针和堆栈指针、程序计数器。

7、BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION] —— 展寄存器组

Jekhn 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ydfivy 的回复:]

每个线程都有一个结构来保存自己占用CPU时所使用的寄存器。
[/Quote]
能不能解释详细一点啊?
znxllyuan 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ydfivy 的回复:]
每个线程都有一个结构来保存自己占用CPU时所使用的寄存器。
[/Quote]

WINDOWS么
一个傻冒 2010-12-21
  • 打赏
  • 举报
回复
每个线程都有一个结构来保存自己占用CPU时所使用的寄存器。
znxllyuan 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 va_zaixuexi 的回复:]
一个CMD模拟一个DOS下只有一个任务运行.
[/Quote]

。。。。。。。。。。。。。。
va_zaixuexi 2010-12-21
  • 打赏
  • 举报
回复
一个CMD模拟一个DOS下只有一个任务运行.
znxllyuan 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 jekhn 的回复:]
最近有一个困惑,就是CPU只有一组寄存器,但是在debug的时候CPU各寄存器是不变的,那其它应用程序也要用到寄存器吧,CPU还是在工作吧,怎么不会相互影响吗?内存空间独立可以理解,不过各程序之间的寄存器怎么保持相对独立呢?求解答。
[/Quote]
可能是应用程序也要 PUSH 寄存器
POP 寄存器吧

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧