CN117707931A - 跨内核态和用户态的操作系统源代码调试方法及装置 - Google Patents

跨内核态和用户态的操作系统源代码调试方法及装置 Download PDF

Info

Publication number
CN117707931A
CN117707931A CN202311594262.0A CN202311594262A CN117707931A CN 117707931 A CN117707931 A CN 117707931A CN 202311594262 A CN202311594262 A CN 202311594262A CN 117707931 A CN117707931 A CN 117707931A
Authority
CN
China
Prior art keywords
breakpoint
user
privilege level
operating system
state
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202311594262.0A
Other languages
English (en)
Inventor
吴竞邦
张露元
陈志扬
向勇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Technology and Business University
Original Assignee
Beijing Technology and Business University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Technology and Business University filed Critical Beijing Technology and Business University
Priority to CN202311594262.0A priority Critical patent/CN117707931A/zh
Publication of CN117707931A publication Critical patent/CN117707931A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明提供一种跨内核态和用户态的操作系统源代码调试方法及装置,通过将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括并将新设置断点存储在对应特权级状态的断点组内;判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;当被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点;检测到边界检测点被触发时,被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点。本发明解决了跨特权级的源代码断点设置冲突的问题。

Description

跨内核态和用户态的操作系统源代码调试方法及装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种跨内核态和用户态的操作系统源代码调试方法及装置。
背景技术
操作系统运行状态一般分为用户态和内核态,属于两个不同的特权级,拥有不同的执行权限。在操作系统运行的过程中,会频繁地进行特权级的切换,导致调试信息的丢失;用户态中的多个用户进程分别对应不同的符号表,在CPU对用户进程进行调度切换运行状态时同样存在上述的调试信息失效的问题,调试信息包括用户在当前特权级下设置的源代码断点,调试信息失效会引起跨特权级的源代码断点设置冲突的问题。
而目前现有的调试器都无法进行跨特权级的断点调试。
因此,因操作系统中多符号表切换导致的调试信息失效,进而引起跨特权级的源代码断点设置冲突是当前亟待解决的问题。
发明内容
本发明提供一种跨内核态和用户态的操作系统源代码调试方法及装置,用以解决现有技术中因操作系统中多符号表切换导致的调试信息失效,进而引起跨特权级的源代码断点设置冲突的问题。
本发明提供一种跨内核态和用户态的操作系统源代码调试方法,包括:
获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;
判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;
当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;
检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
根据本发明提供的跨内核态和用户态的操作系统源代码调试方法,所述边界检测点设置后,被立即激活,然后进入待触发状态。
根据本发明提供的跨内核态和用户态的操作系统源代码调试方法,不同的特权级状态对应不同的断点组及符号表。
根据本发明提供的跨内核态和用户态的操作系统源代码调试方法,用户态内设置有多个用户进程,不同用户进程对应不同的断点组和符号表,所述多个用户进程为所述被操作系统在用户态创建,用于执行不同用户任务的多个进程。
根据本发明提供的跨内核态和用户态的操作系统源代码调试方法,所述被调试操作系统由原特权级状态向当前特权级状态切换,包括由用户态切换到内核态、由内核态切换到用户态;若用户态运行在当前用户进程时,所述由用户态切换到内核态,包括由当前用户进程切换到内核态,具体包括:
在当前用户进程中,通过预先设置的调试选项,由当前用户进程切换为内核态,并触发预先设定的边界检测点;
所述被调试操作系统的运行暂停在所述边界检测点位置;
若用户态下一个需执行的用户进程时,所述由内核态切换到用户态,包括由内核态切换到用户态下一个需执行的用户进程,具体包括:
通过内核态获取用户态下一个需执行的用户进程的进程标识符,所述进程标识符设置于用户进程内,所述进程标识符用于区分用户态中不同的用户进程;
基于所述进程标识符,通过调试器将内核态对应的断点组与符号表切换为所述待执行的用户进程对应的断点组与符号表。
根据本发明提供的跨内核态和用户态的操作系统源代码调试方法,所述通过内核态获取用户态下一个需执行的用户进程的进程标识符之前,还包括:
将用户进程的进程标识符通过进程标识符变量保存在所述被调试操作系统的调试器中;
将用户态内各用户进程组成的列表保存在所述待调试操作系统的内核态中,所述列表中提供各用户进程对应进程标识符变量的取值;
在被调试操作系统的进程调度函数中加入检测点。
根据本发明提供的跨内核态和用户态的操作系统源代码调试方法,所述基于所述进程标识符,通过调试器将内核态对应的断点组与符号表切换为所述待执行的用户进程对应的断点组与符号表,包括:
基于内核态获取的用户进程标识符,确定调试器中所述用户进程标识符对应的进程标识符变量的取值;
基于所述进程标识符变量的取值,获取调试器中待执行的用户进程的断点组与符号表;
由所述内核态对应的断点组与符号表切换为待执行的用户进程对应的断点组与符号表;
由所述内核态对应的断点组与符号表切换为待执行的用户进程对应的断点组与符号表。
根据本发明提供的跨内核态和用户态的操作系统源代码调试方法,所述判断所述断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在所述断点组内,包括:
将被调试操作系统运行在当前特权级状态下的断点组设置为当前有效断点组;
判断断点所在断点组是否为当前有效断点组;
若断点所在断点组为当前有效断点组,则激活该断点;
若断点所在断点组不是当前有效断点组,则将该断点缓存到其他特权级状态下的断点组中。
根据本发明提供的跨内核态和用户态的操作系统源代码调试方法,所述判断断点所在断点组是否属于当前有效断点组,包括:
获取断点所在断点组的内存地址空间;
将所述断点所在断点组的内存地址空间与当前有效断点组的内存地址空间进行对比;
若断点所在断点组的内存地址空间与当前有效断点组的内存地址空间相同,则断点所在断点组是当前有效断点组。
本发明还提供跨内核态和用户态的操作系统源代码调试装置,包括:
断点设置模块,用于获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;
确定模块,用于判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;
状态切换模块,用于当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;
状态切换模块,还用于检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述跨内核态和用户态的操作系统源代码调试方法的步骤。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述跨内核态和用户态的操作系统源代码调试方法的步骤。
本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述跨内核态和用户态的操作系统源代码调试方法的步骤。
本发明提供的跨内核态和用户态的操作系统源代码调试方法及装置,通过在不同特权级内设置不同的断点组,缓存用户设置的不在当前进程地址空间的断点,并在被调试操作系统运行到对应的地址空间时激活所述断点,实现断点组的切换,解决了跨特权级的源代码断点设置冲突的问题;本发明通过设置边界检测点,使调试器能够识别被调试操作系统当前运行的特权级,并根据特权级切换不同的符号表,从而能够进行跨特权级的调试。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的跨内核态和用户态的操作系统源代码调试方法的流程示意图;
图2是本发明实施例提供的特权级切换示意图的示意图;
图3是本发明实施例提供的多个用户进程的符号表切换示意图的示意图;
图4是本发明另一实施例提供的调试器配置及使用的流程示意图;
图5是本发明提供的跨内核态和用户态的操作系统源代码调试装置的结构示意图;
图6是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明实施例一部分实施例,而不是全部的实施例。基于本发明实施例中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明实施例保护的范围。
操作系统(OS)是驱动硬件运行的核心系统,其在硬件和用户之间起到了桥梁的作用。在自主中央处理器(CPU)与自主操作系统的开发中,包括基于C语言以及基于RUST语言的操作系统内核代码调试一直是开发人员面临的技术难点。不同于通用应用程序代码调试,操作系统源代码运行状态多、工作逻辑复杂,使得传统的调试方法难以适应其开发调试工作。尤其是针对相对复杂的内核代码以及用户态、内核态的系统调用交互工作,方便的源代码级调试工具,对监测程序运行状态和理解程序的逻辑十分重要。
操作系统运行状态一般分为用户态和内核态,属于两个不同的特权级,拥有不同的执行权限。当应用程序需要执行一些特权操作或与操作系统交互时,需要通过系统调用的方式从用户态切换到内核态。特权级的应用提供了应用程序与核心系统之间的隔离,可以有效防止应用程序对系统造成损害,并优化系统的资源利用。然而,特权级的切换会清除调试状态信息,使得传统程序调试方法失效。除此以外,操作系统需要一个运行在一个指定的硬件环境中,所以调试方式和普通应用程序的调试有所不同。QEMU(Quick Emulator)是一个完全由软件实现的开源虚拟机,它可以提供操作系统运行所需的硬件条件,操作系统运行在QEMU模拟器中,操作系统调试器运行在宿主机中,使用这种方法可以让操作系统的开发与调试变得更加便捷。
调试器的主要功能是能够让使用者控制被调试软件的运行,并提供一系列工具实时查看被调试软件运行过程中的中间状态,为使用者定位程序问题以及修改代码提供帮助,是相关软件开发中不可缺少的一种工具。GDB是一个开源的调试软件,能够支持对被调试程序进行断点执行的调试方法,调试器通过GDB执行调试指令,控制被调试操作系统的执行情况,并获取调试信息;获取到的信息通过设定的接口传递返回。在GDB的基础上,有许多继承调试环境如VSCode、Visual Studio、Eclipse、XCode等,提供应用程序的代码开发和调试功能。
但上述这些调试器对操作系统源代码的调试支持不够完善,其中一个主要问题在于操作系统不同运行状态下程序符号表的切换导致断点等调试信息丢失,从而使得调试器失效。
为解决上述问题,本发明提供一种跨内核态和用户态的操作系统源代码调试方法,如图1所示,包括:
步骤101、获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;
步骤102、判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;
步骤103、当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;
步骤104、检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
下面结合具体的实施例对上述步骤进行详细说明。
步骤101、获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;
在本步骤中,所述对应特权级状态的断点组包括用户态断点组和内核态断点组,所述用户态断点组和内核态断点组分别用于保存用户态和内核态对应内存地址空间内的断点。通过断点组对断点的缓存机制,用户可以在被调试操作系统任意特权级下的任意代码中设置断点,这些断点都会被保存,只有操作系统运行到某个进程的时候,相应的地址空间中的断点组的断点才会被激活,最终被触发,从而解决了跨特权级源代码断点设置的问题。
具体地,用于保存因为特权级切换失效的断点调试信息:使用一个词典缓存了用户要求设置的所有断点(包括内核态和用户态)。词典中的每个元素都是一个键值对,其中键是程序运行所占内存地址空间的代号,值是该代号对应的断点组,包括用户态断点组和内核态断点组,分别保存了用户态和内核态对应内存地址空间内的所有断点。
步骤102、判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;
在本步骤中,为了满足调试需求,本发明设置了一个当前有效断点组变量,即被调试操作系统当前执行的进程地址空间对应的断点组,只有当前有效断点组中的断点才会被激活,随后会被触发,不是当前有效断点组的断点只会被缓存到其他地址空间的断点组中,不会被触发。
具体地,当用户在调试器中设置新断点时,调试器的断点组管理模块会先将这个断点的信息存储在对应的断点组中,然后判断这个断点所在的断点组是否为当前有效断点组。如果是,就立即激活这个断点。如果不是,那么这个断点暂时不会被激活,将会被保存到断点组中。在这种缓存机制下,用户态断点和内核态断点不会同时被激活,从而避免了内核态和用户态断点的冲突。
步骤103、当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;具体地,操作系统中包括用户态代码和内核态代码,对应不同的特权级,不同的特权级又对应不同的符号表。调试器检测到被调试操作系统的特权级切换,通过分析找到被调试操作系统的用户态和内核态切换的边界代码位置,并设置检测点。边界监测点不属于任何断点组,如果设置了边界监测点,就会立即被激活然后等待被触发。
通过设置边界检测点,在进行特权级切换时,用户首先找到边界监测点的位置,并进行配置,然后再启动调试。
步骤104、检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。在本步骤中,具体来说,特权级的切换主要涉及符号表的切换,符号表包含了编译后的代码中各种变量、函数、数据结构等的名称和地址信息,这些是调试代码所必需的内容,同时符号表也是编译后的代码与源代码之间的桥梁,使调试器能够将二进制代码中的地址映射回源代码的符号名,所以无论调试任何进程,调试器都需要先加载进程的符号表。而在操作系统中内核态程序和用户态程序的符号表是分开的,如果程序运行中进行了用户态和内核态的转换,符号表也要随之切换,符号表切换以后,用户设置的程序断点也会随之消失,比如在内核态设置用户态的断点以后,再进入用户态,用户态的断点将不会被触发,因此同时设置内核态、用户态的断点会产生冲突,无法跨越特权设置断点。
针对这一问题,本发明具体实施例中设置了断点组管理模块。断点组管理模块会先缓存设置的异常断点,例如当前操作系统处在内核态代码的运行中,操作人员在用户态代码中设置了断点,该断点即为异常断点,待特权级切换到对应的状态时,再将缓存的断点信息进行激活,即在用户态运行时,缓存用户设置的内核态断点,等到程序运行到内核态时,再激活缓存的内核态断点;在内核态运行时,缓存用户设置的用户态断点,等运行到用户态时,再激活用户态断点。通过这种方法,操作人员可以在任意状态下对被调试操作系统的任意代码行设置断点,从而实现跨特权级的源代码调试。
由于不同的特权级对应不同的断点组和符号表,在进行特权级切换时,需要同时切换特权级对应的断点组和符号表,如由用户态向内核态切换时,当操作系统运行到边界检测点时,说明即将进行特权级的切换,此时调试器自动中断操作系统的运行,操作系统调试暂停在内核态第一个断点位置,并进行对应符号表的切换以及断点组的切换,即将用户态的断点组和符号表切换为内核态的断点组和符号表及其他调试信息也进行了切换,最后恢复操作系统的运行。
示例地,图2是本发明实施例提供的特权级切换示意图的示意图,如图2所示,当用户进程A想要通过系统调用进入内核态时,会触发边界检测点,这时调试器就会检测到被调试操作系统发生了特权级切换,接下来就会进行符号表切换、断点组切换,在切换过程中,调试器会删除原进程对应的地址空间中设置的断点,设置新进程地址空间中断点组的断点,从内核态回到用户态也是一样的流程。边界监测点不属于任何断点组,如果设置了边界监测点,就会立即被激活然后等待被触发。
进一步地,用户态内包括多个用户进程,每一个用户进程对应一个符号表和一个断点组。所述特权级状态切换工作,包括由用户态切换到内核态、由内核态切换到用户态,即由用户态的当前用户进程切换到内核态和由内核态切换到下一个用户态的用户进程。
具体来说,操作系统通常允许在用户态创建多个进程对应不同的工作,即用户进程,多个用户进程会抢占有限的中央处理器运行资源,即调度执行或用户进程切换。类似于用户态与内核态,每个用户进程都有自己的符号表,每次进行用户进程切换的时候都需要通过系统调用进入内核态,更新内存地址空间,然后返回用户态执行新的进程。本发明设计了通过进程标识的获取对应不同的符号表,并在调试器检测到用户程序切换时对符号表进行切换,以此实现多用户进程的调试。
也就是说,调试器是根据进程标识符,来进行符号表切换的,我们在调试器中使用一个变量来保存被调试进程的标识符。在操作系统中,切换用户进程都需要经过系统调用进入内核态,在内核态中可以获取到下一个运行的进程标识符。操作者需要在被调试操作系统的内核态源代码中,含有进程标识符变量的代码行设置断点,如sys_exec函数中,通过给GDB发送获取变量信息的命令,并解析返回信息,来获取进程标识符。
示例地,图3是本发明实施例提供的多个用户进程的符号表切换示意图的示意图,如图3所示,多个用户进程切换符号表:在被调试操作系统刚刚运行起来的时候都是先从内核态开始运行的,然后会指定一个第一个要运行的用户态进程,如用户进程A,在调试器触发边界检测点的时候,调试器就会根据用户进程A的进程标识符进行符号表的切换,切换到指定的用户进程A的符号表,切换断点组,激活在用户进程A中设置的断点。接下来要进行进程切换的话,就需要从当前进程A进入内核态,当边界检测点被触发时,切换到内核的符号表,切换断点组,在内核态运行的时候,获取到下一个要执行的用户进程标识符,如用户进程C。在获取到用户进程C的标识符以后,赋值给保存进程标识符的变量,这样调试器就能够知道下一个要运行的进程是用户进程C。接下来从内核态进入用户态,在边界检测点进行符号表切换,此时要切换的符号表就是用户进程C的符号表,断点组切换,激活用户进程C中设置的断点,最终实现了多个用户进程的符号表切换。
也就是说,调试器通过内核态给GDB发送指定命令,获取到下一个要运行的进程标识符,获取到进程标识符以后,调试器根据该标识符切换到正确的用户进程中,并对新进程进行调试。
另一个示例中,如图4所示,图4是本发明另一实施例提供的调试器配置及使用的流程示意图,操作者需要先找到边界监测点的位置,并进行配置,随后就可以启动调试。在调试过程中,被调试操作系统启动以后会先进入内核态,接着被调试操作系统继续运行,会暂停到边界监测点的位置,这时用户就可以在源代码的任意位置设置断点,但是只有内核态中的断点会被激活,随后被触发,最后会暂停到内核出口检测点的位置,调试器进行符号表和断点组的切换。接下来就会进入指定的用户进程,该用户进程中的所有断点都被激活,并暂停到用户进程中设置的第一个断点,在用户进程中,用户可以通过设置好的调试选项,在任意时刻进入内核态,在这个过程中,用户可以在任意时刻、任意代码行设置断点,观测各种变量信息,最终完成整个操作系统的调试。
本发明实施例中,通过在不同特权级内设置不同的断点组,缓存用户设置的不在当前进程地址空间的断点,并在被调试操作系统运行到对应的地址空间时激活所述断点,实现断点组的切换,解决了跨特权级的源代码断点设置冲突的问题;本发明通过设置边界检测点,使调试器能够识别被调试操作系统当前运行的特权级,并根据特权级切换不同的符号表,从而能够进行跨特权级的调试;本发明为了支持多个用户进程的调试,通过内核代码获取待运行用户进程的进程标识符,并通过进程标识符变量传送给调试器,调试器根据进程标识符来确定待切换的符号表,获取到新用户进程的调试信息,对新用户进程进行调试,从而实现多个用户进程的符号表切换,完成对多个用户进程的调试。
下面对本发明实施例提供的跨内核态和用户态的操作系统源代码调试装置进行描述,下文描述的跨内核态和用户态的操作系统源代码调试装置与上文描述的跨内核态和用户态的操作系统源代码调试方法可相互对应参照。
本发明还提供一种跨内核态和用户态的操作系统源代码调试装置,如图5所示,包括:
断点设置模块51,用于获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;
确定模块52,用于判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;
状态切换模块53,用于当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;
状态切换模块54,还用于检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
根据本发明提供的一种跨内核态和用户态的操作系统源代码调试装置,所述断点设置模块51,具体用于设置对应特权级状态的断点组,对应特权级状态的断点组包括用户态断点组和内核态断点组,所述用户态断点组和内核态断点组分别用于保存用户态和内核态对应内存地址空间内的断点。
根据本发明提供的一种跨内核态和用户态的操作系统源代码调试装置,所述确定模块52,具体用于:
将被调试操作系统运行在当前特权级状态下的断点组设置为当前有效断点组;判断断点所在断点组是否为当前有效断点组;
若断点所在断点组为当前有效断点组,则激活该断点;
若断点所在断点组不是当前有效断点组,则将该断点缓存到其他特权级状态下的断点组中。
根据本发明提供的一种跨内核态和用户态的操作系统源代码调试装置,所述确定模块52,具体还用于:
获取断点所在断点组的内存地址空间;
将所述断点所在断点组的内存地址空间与当前有效断点组的内存地址空间进行对比;
若断点所在断点组的内存地址空间与当前有效断点组的内存地址空间相同,则断点所在断点组是当前有效断点组。
根据本发明提供的一种跨内核态和用户态的操作系统源代码调试装置,状态切换模块53,具体用于:
由用户态切换到内核态、由内核态切换到用户态;若用户态运行在当前用户进程时,所述由用户态切换到内核态,包括由当前用户进程切换到内核态,具体包括:
在当前用户进程中,通过预先设置的调试选项,由当前用户进程切换为内核态,并触发预先设定的边界检测点;
所述被调试操作系统的运行暂停在所述边界检测点位置;
若用户态下一个需执行的用户进程时,所述由内核态切换到用户态,包括由内核态切换到用户态下一个需执行的用户进程,具体包括:
通过内核态获取用户态下一个需执行的用户进程的进程标识符,所述进程标识符设置于用户进程内,所述进程标识符用于区分用户态中不同的用户进程;
基于所述进程标识符,通过调试器将内核态对应的断点组与符号表切换为所述待执行的用户进程对应的断点组与符号表。
根据本发明提供的一种跨内核态和用户态的操作系统源代码调试装置,状态切换模块53,具体还用于:
在所述通过内核态获取用户态下一个需执行的用户进程的进程标识符之前,将用户进程的进程标识符通过进程标识符变量保存在所述被调试操作系统的调试器中;将用户态内各用户进程组成的列表保存在所述待调试操作系统的内核态中,所述列表中提供各用户进程对应进程标识符变量的取值;在被调试操作系统的进程调度函数中加入检测点。
根据本发明提供的一种跨内核态和用户态的操作系统源代码调试装置,状态切换模块53,具体还用于
基于内核态获取的用户进程标识符,确定调试器中所述用户进程标识符对应的进程标识符变量的取值;
基于所述进程标识符变量的取值,获取调试器中待执行的用户进程的断点组与符号表;
由所述内核态对应的断点组与符号表切换为待执行的用户进程对应的断点组与符号表;
由所述内核态对应的断点组与符号表切换为待执行的用户进程对应的断点组与符号表。
本发明实施例中提供的跨内核态和用户态的操作系统源代码调试装置,通过断点设置模块及确定模块,缓存用户设置的不在当前进程地址空间的断点,并在被调试操作系统运行到对应的地址空间的时候再激活断点,实现断点组的切换,解决了跨特权级的源代码断点设置冲突的问题;在状态切换模块中设置了边界检测点,使调试器能够识别被调试操作系统当前在哪个特权级中运行,并根据特权级切换不同的符号表,从而能够让使用者进行跨特权级的调试;最后为了支持多个用户进程的调试,通过状态切换模块在内核代码中获取下一个要运行进程的标识符,并告知调试器,调试器根据进程标识符来确定下一个要切换的符号表,获取到新进程的调试信息,对新进程进行调试,能够支持多个用户进程的符号表切换,从而实现了对多个用户进程的调试。
图6是本发明提供的电子设备的结构示意图,如图6所示,该电子设备可以包括:处理器(processor)610、通信接口(Communications Interface)620、存储器(memory)630和通信总线640,其中,处理器610,通信接口620,存储器630通过通信总线640完成相互间的通信。处理器610可以调用存储器630中的逻辑指令,以执行跨内核态和用户态的操作系统源代码调试方法,该方法包括:获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
此外,上述的存储器630中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的跨内核态和用户态的操作系统源代码调试方法,该方法包括:获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的跨内核态和用户态的操作系统源代码调试方法,该方法包括:获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种跨内核态和用户态的操作系统源代码调试方法,其特征在于,包括:
获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;
判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;
当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;
检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
2.根据权利要求1所述的跨内核态和用户态的操作系统源代码调试方法,其特征在于,用户态内设置有多个用户进程,不同用户进程对应不同的断点组和符号表,所述多个用户进程为所述被操作系统在用户态创建,用于执行不同用户任务的多个进程。
3.根据权利要求2所述的跨内核态和用户态的操作系统源代码调试方法,其特征在于,所述被调试操作系统由原特权级状态向当前特权级状态切换,包括由用户态切换到内核态、由内核态切换到用户态;若用户态运行在当前用户进程时,所述由用户态切换到内核态,包括由当前用户进程切换到内核态,具体包括:
在当前用户进程中,通过预先设置的调试选项,由当前用户进程切换为内核态,并触发预先设定的边界检测点;
所述被调试操作系统的运行暂停在所述边界检测点位置;
若用户态下一个需执行的用户进程时,所述由内核态切换到用户态,包括由内核态切换到用户态下一个需执行的用户进程,具体包括:
通过内核态获取用户态下一个需执行的用户进程的进程标识符,所述进程标识符设置于用户进程内,所述进程标识符用于区分用户态中不同的用户进程;
基于所述进程标识符,通过调试器将内核态对应的断点组与符号表切换为所述待执行的用户进程对应的断点组与符号表。
4.根据权利要求3所述的跨内核态和用户态的操作系统源代码调试方法,其特征在于,所述通过内核态获取用户态下一个需执行的用户进程的进程标识符之前,还包括:
将用户进程的进程标识符通过进程标识符变量保存在所述被调试操作系统的调试器中;
将用户态内各用户进程组成的列表保存在所述待调试操作系统的内核态中,所述列表中提供各用户进程对应进程标识符变量的取值;
在被调试操作系统的进程调度函数中加入检测点。
5.根据权利要求4所述的跨内核态和用户态的操作系统源代码调试方法,其特征在于,所述基于所述进程标识符,通过调试器将内核态对应的断点组与符号表切换为所述待执行的用户进程对应的断点组与符号表,包括:
基于内核态获取的用户进程标识符,确定调试器中所述用户进程标识符对应的进程标识符变量的取值;
基于所述进程标识符变量的取值,获取调试器中待执行的用户进程的断点组与符号表;
由所述内核态对应的断点组与符号表切换为待执行的用户进程对应的断点组与符号表;
由所述内核态对应的断点组与符号表切换为待执行的用户进程对应的断点组与符号表。
6.根据权利要求1所述的跨内核态和用户态的操作系统源代码调试方法,其特征在于,所述判断所述断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在所述断点组内,包括:
将被调试操作系统运行在当前特权级状态下的断点组设置为当前有效断点组;
判断断点所在断点组是否为当前有效断点组;
若断点所在断点组为当前有效断点组,则激活该断点;
若断点所在断点组不是当前有效断点组,则将该断点缓存到其他特权级状态下的断点组中。
7.根据权利要求6所述的跨内核态和用户态的操作系统源代码调试方法,其特征在于,所述判断断点所在断点组是否属于当前有效断点组,包括:
获取断点所在断点组的内存地址空间;
将所述断点所在断点组的内存地址空间与当前有效断点组的内存地址空间进行对比;
若断点所在断点组的内存地址空间与当前有效断点组的内存地址空间相同,则断点所在断点组是当前有效断点组。
8.一种跨内核态和用户态的操作系统源代码调试装置,其特征在于,包括:
断点设置模块,用于获取被调试操作系统待设置断点位置,设置断点,并将新设置断点存储在对应特权级状态的断点组内,所述特权级状态包括内核态和用户态,所述断点组用于存储用户设置的断点,不同的特权级状态对应不同的断点组;
确定模块,用于判断新设置断点所在断点组是否为当前特权级状态下的断点组,若是,则激活新设置断点,若否,则继续将新设置断点存储在对应特权级状态的断点组内;
状态切换模块,用于当所述被调试操作系统由原特权级状态向当前特权级状态切换时,触发预先设置的边界检测点,所述边界检测点设置于被调试操作系统边界代码位置,用于确定所述被调试操作系统的特权级状态;
状态切换模块,还用于检测到所述边界检测点被触发时,所述被调试操作系统对应的调试器将原特权级状态下的断点组及符号表切换到当前特权级状态下的断点组及符号表,激活当前特权级状态下断点组内的断点,所述符号表用于存放源程序中出现的有关标识符的属性信息。
9.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至8任一项所述跨内核态和用户态的操作系统源代码调试方法的步骤。
10.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1至8任一项所述跨内核态和用户态的操作系统源代码调试方法的步骤。
CN202311594262.0A 2023-11-27 2023-11-27 跨内核态和用户态的操作系统源代码调试方法及装置 Pending CN117707931A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311594262.0A CN117707931A (zh) 2023-11-27 2023-11-27 跨内核态和用户态的操作系统源代码调试方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311594262.0A CN117707931A (zh) 2023-11-27 2023-11-27 跨内核态和用户态的操作系统源代码调试方法及装置

Publications (1)

Publication Number Publication Date
CN117707931A true CN117707931A (zh) 2024-03-15

Family

ID=90145217

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311594262.0A Pending CN117707931A (zh) 2023-11-27 2023-11-27 跨内核态和用户态的操作系统源代码调试方法及装置

Country Status (1)

Country Link
CN (1) CN117707931A (zh)

Similar Documents

Publication Publication Date Title
US5630049A (en) Method and apparatus for testing software on a computer network
US4819234A (en) Operating system debugger
US5511217A (en) Computer system of virtual machines sharing a vector processor
US5437033A (en) System for recovery from a virtual machine monitor failure with a continuous guest dispatched to a nonguest mode
US5553291A (en) Virtual machine control method and virtual machine system
US5533192A (en) Computer program debugging system and method
KR101519845B1 (ko) 안티디버깅 방법
KR102003663B1 (ko) 디버그 예외 생성 제어
US11645068B2 (en) Method for implementing function jump, apparatus, and computer storage medium
KR20130050156A (ko) 가상 주소 공간 전환 장치
US20050268195A1 (en) Apparatus and method for improving emulation speed of high-level languages in on-chip emulation systems
KR102025078B1 (ko) 단일 스텝 실행을 이용한 코드 진단
CN105550575B (zh) 一种未导出的函数地址和数据结构偏移的获取方法及装置
CN117707931A (zh) 跨内核态和用户态的操作系统源代码调试方法及装置
JPH09259002A (ja) デバッグ支援装置
CN112579460B (zh) 一种基于多核嵌入式系统的多级调试方法
US10019343B2 (en) Kernel tracing in a protected kernel environment
JPH0922369A (ja) マルチタスキング方式のカーネルにおける不正動作検出方法
JPH0552535B2 (zh)
KR100214125B1 (ko) 전전자 교환기에서 함수 파라미터 추적 방법
CN114327648B (zh) 一种驱动调试方法、装置、电子设备及存储介质
JP2000181748A (ja) マルチメモリ空間プログラムのデバッグシステムおよびそのデバッグ方法
JP2658982B2 (ja) 特定命令実行検出方式
KR100208268B1 (ko) 전전자 교환기에 있어서 오류 정보 출력 방법
CN114385982A (zh) 安卓应用程序反调试的方法、系统、电子设备和存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination