switch_to函数为什么要保存esi/edi/ebx/ebp?

摘要:
而慧慧编写的开关_ to函数由c语言_版本_调用句柄函数编写。所以在switch_中,这些寄存器应该保存在中。

线程切换过程:

  interrupt_handler.S(interrupt_handle_entry)  ->  interrupt.c(c_version_handle)  ->  switch_to.S

结论:

  在switch_to函数中必须保存esi/edi/edx/ebp这四个寄存器

原因:

  GCC在对C、汇编代码进行混合编译时,遵从cdecl调用约定,且cdecl规定EBX, EBP, ESP, EDI, ESI, CS, DS这些寄存器不应该受到函数调用影响。而汇编写的switch_to函数是受到c语言写的c_version_handle函数的调用。所以在switch_to中应该保存这些寄存器。在实际场景中CS、DS、ESP不会变化,所以就不用保存这些寄存器。

疑问:

  问:在switch_to汇编代码中没有修改这四个寄存器的代码为什么还要保存这四个寄存器?

  答:

  switch_to函数为什么要保存esi/edi/ebx/ebp?第1张

  switch_to函数负责切换线程,A线程进入c_version_handle并使用了这四个寄存器,然后switch_to到B线程去执行,如果B线程修改了这四个寄存器,当A线程又调度上来以后,A线程的这四个寄存器值就丢失了。

  问:在c_version_handle函数执行了switch_to以后就结束了,最后也没有用这四个寄存器,为什么还要保存这四个寄存器?

  switch_to函数为什么要保存esi/edi/ebx/ebp?第2张

  从c代码上看,执行完switch_to以后没有其他的代码,把该文件编译成汇编再看下:

  switch_to函数为什么要保存esi/edi/ebx/ebp?第3张

  在调用完switch_to以后会执行一个leave汇编命令,leave命令在32位汇编下相当于: 

  mov esp,ebp;
  pop ebp

  所以这里会使用到ebp寄存器,所以必须要保存这个寄存器。

免责声明:文章转载自《switch_to函数为什么要保存esi/edi/ebx/ebp?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇git操作命令hive-命令操作记录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

操作系统知识总结

操作系统 面向进程和线程学习操作系统。 目录 Chapter 1 Chapter 2 Chapter 3 Chapter 4 Chapter 5 进程线程模型 进程间通信 同步互斥机制 存储管理 网络I/O模型 内容 进程线程模型 线程和进程的概念已经在操作系统书中被翻来覆去讲了很多遍。很多概念虽然都是套话,但没能理解透其中深意会导致很多内容...

Kafka:生产者

Kafka java客户端数据生产流程解析 ProducerRecord ProducerRecord 含义: 发送给Kafka Broker的key/value 值对 //ProducerRecord的成员变量 public class ProducerRecord<K, V> { private final String top...

解决关闭窗口,C#报错"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

情况:在C#开发的过程中多线程委托是经常用的,今天在测试以前写的软件的时候发现有个问题,报 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。 这样的错误。 解决方法:加上 if (this.IsHandleCreated) 1、首先分析问题,句柄:是对象的引用名,存于栈区(可以理解为对象的指针),对象是存于堆区,通过操控栈区...

Java多线程-线程的调度(休眠)

Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。...

windows api线程

一、1、定义入口函数static void threadFunc(void);//在TestDlg.h里面声明 void CTestDlg::threadFunc(void)     //在TestDlg.cpp里定义 {   Sleep(1000);   AfxMessageBox(_T("OK!"));} 2、定义线程句柄:HANDLE hthread...

MySQL-锁

1. 公平锁与非公平锁   公平锁:严格按照线程启动的顺序执行,不允许其他线程插队执行;非公平锁允许插队;   当使用非公平锁时,会立刻尝试配置状态,成功则:插队执行,失败则:与公平锁一样调用acquire()方法,以排他方式获取锁,成功后立刻返回,否则将线程加入队列,直到成功调用为止。 2. 悲观锁与乐观锁   两种常见的资源并发锁设计。   悲观锁:先...