1.1 Gdb对于linux应用程序调试实现机制
jtag调试方式直接通过jtag扫描链控制had模块来实现非侵入式调试。Jtag调试方式可以通过had向cpu的流水线中灌指令的方式控制cpu执行某条指令,以此实现cpu的寄存器、memory的读写;并且通过had控制cpu的debug mode于trace mode实现断点和单步。上述的功能即实现了jtag方式的基本的调试功能。相比于jtag调试方式,linux应用程序的调试则是通过linux内核提供的一套ptrace调试系统调用来实现上述的寄存器、memory的读写以及断点、单步等操作。那么下面介绍一下实现机制。
Ptrace系统调用相关知识就不在此介绍。
整个gdb对于linux应用程序都是基于ptrace系统调用实现的。所以,我们先了解一下linux内核对于系统调用的流程。如下图所示。
系统调用完,内核态返回到用户态之前会进行两次判断,分别是是否需要重新调度和是否有信号要处理,这是接下来讨论的关键所在。
进程调度:
Linux-2.6之后支持可抢占式任务调度。当一个进程正在执行时,如果出现另外一个优先级高的进程,当前进程就会被抢占。那么,下面问题来了,抢占的时机在哪呢?是不是任何时候都可以进行抢占呢?
被抢占有两种方式,一种是通过调用check_p