高通面试题答案-GPT版
1、gdb 中step,next与finish的区别
在gdb中,step、next和finish都是用于逐步执行程序的命令。
step 命令执行当前行并进入函数(如果当前行是函数调用)。如果当前行有多个函数调用,则进入第一个函数调用。next 命令执行当前行并跳到下一行,不会进入当前行的函数调用,而是将其作为单个指令处理。finish 命令执行当前函数剩余的所有代码,并停止在函数返回之后的第一条指令处。三个命令的区别主要在于它们如何处理当前代码中的函数调用:
对于step来说,当它遇到一个函数调用时,它会在函数内部暂停。这意味着你可以检查函数的内部状态,然后单步执行函数里面的代码。对于next来说,当它遇到一个函数调用时,它会一直运行,直到函数返回,然后停止在下一行指令。而对于finish来说,它会执行函数的所有代码,直到函数返回,然后停止在下一行指令。因此,选择使用哪种命令取决于你想要达到的目标以及你正在调试的代码。
2、gdb调试时运行在用户态还是内核态
当使用gdb调试时,程序运行在用户态而不是内核态。gdb通过附加到正在运行的进程来实现调试。这意味着,当你启动一个程序并用gdb附加到它时,你的程序仍然运行在用户空间,并且可以访问所有与用户空间数据相关的系统资源。
当你在gdb中执行命令时,gdb会向被调试的程序发送信号来控制它的行为。例如,当你使用step或next命令时,gdb会发送单步执行的信号给正在运行的程序。被调试的程序将收到这个信号并暂停执行,等待下一步指令。一旦被调试的程序暂停,gdb就可以读取和修改程序的内存、寄存器和状态信息,从而进行调试。
尽管gdb只是在用户空间中运行,但它可以访问和控制内核的许多部分,包括进程、线程、信号和虚拟内存。因此,gdb可以帮助你调试许多不同类型的问题,包括内存泄漏、死锁、崩溃和性能瓶颈等。
3、arm v8的异常等级
Arm v8架构中,共有四个异常等级(Exception Level),从 EL0 到 EL3。
EL0:最低的异常等级,用于运行应用程序。在EL0模式下,处理器提供了用户态和内核态之间的切换机制,并提供了一组受限的CPU功能。EL1:也称为操作系统模式,用于运行操作系统内核。在EL1模式下,处理器能够访问所有的CPU功能,包括MMU、异常向量表等。EL2:也称为虚拟化模式,用于运行第二层虚拟化管理器(Hypervisor)。在EL2模式下,处理器提供了更高级别的虚拟化特性,以支持多个虚拟机的管理和隔离。EL3:也称为安全状态模式,用于运行安全监控器(Secure Monitor)。在EL3模式下,处理器提供了对某些安全功能的独占访问权限,例如加密和解密支持、安全计算和信任管理等。这些异常等级可以根据需要进行切换。例如,在操作系统启动时,处理器将会一直处于EL3模式,在运行操作系统内核时,处理器将会切换到EL1模式。同时,如果使用虚拟化技术来运行多个虚拟机,则处理器可能会在不同的异常等级之间切换。
4、linux内核启动流程
Linux内核启动流程如下:
加载BIOS和bootloader,将控制权交给内核;内核进行一些初始化,例如设置分页等,并移动到内核地址空间;启动第一个进程init,它是所有用户空间进程的父进程;init进程读取 /etc/rc.sysinit 文件,并运行其中的脚本来初始化系统资源和设备驱动程序;init进程在 /etc/inittab 中查找默认的运行级别(runlevel)并执行对应的脚本;在指定的运行级别中,init会运行所有相关的配置脚本,以启动必需的服务和进程;如果有getty进程,则getty将向终端发送登录提示符,等待用户输入用户名和密码;用户登录后,getty交给shell处理,用户可以执行命令来与系统交互。在整个启动过程中,内核负责管理硬件资源和内存,提供文件系统、网络和其他基本服务。init进程则负责启动和管理用户空间的进程和服务,在系统启动完成后,用户就可以通过终端或其他方式与系统交互了。
5、arm v8的软中断
在Arm v8架构中,软中断(Software Interrupt)又称为SVC(Supervisor Call)指令,用于在用户空间和内核空间之间进行系统调用。软中断是一条特殊的指令,它可以触发处理器从用户态切换到内核态,并将控制权交给操作系统内核。
软中断是通过SVC指令来触发的,该指令由用户空间应用程序发起。当SVC指令被执行时,处理器会暂停当前进程的执行,并跳转到一个预定义的内核地址空间,执行内核中相应的中断服务例程。这个中断服务例程会根据请求类型,执行所需的操作,并返回数据或状态信息。然后,处理器会将控制权返回给原始进程,继续执行用户空间代码。
在内核空间中,有一个专门的中断向量表(Interrupt Vector Table),记录了所有可能的中断服务例程的入口地址。当SVC指令触发时,处理器会根据指令中提供的中断号,在中断向量表中查找对应的中断服务例程,并跳转到该例程的入口地址开始执行。完成中断服务例程后,处理器再次回到用户空间,继续执行中断之前的进程。
软中断机制在操作系统中广泛应用,允许应用程序向操作系统请求服务或资源,例如文件系统、网络、内存分配等。在Arm v8架构中,软中断机制具有高效性和灵活性,可用于支持各种操作系统和应用程序。
6、arm v8的几种工作模式
ARM v8架构,是ARM公司的第八代处理器架构,主要用于高性能计算设备。ARMv8架构引入了64位计算能力,同时保持对32位应用的兼容。在这一架构中,处理器可以工作在以下几种模式:
用户模式(User mode):这是最常见的模式,用于运行普通的应用程序。在这个模式下,代码的执行受到一定的限制,以避免对系统其他部分造成干扰。
系统模式(System mode):这是一种特权模式,用于运行操作系统的核心部分。在系统模式下代码可以执行一些特殊的指令,比如访问控制硬件的指令。
超级用户模式(Supervisor mode):这也是一种特权模式,通常用于处理软件中断(SWI)和操作系统的启动。
当处理器接收到硬件中断请求时,会进入这个模式。在中断模式下,可中断模式(IRQ mode)”以执行处理中断的代码。
快速中断模式(FIQ mode):这是一种专门设计用于快速处理中断的模式。它有更多的寄存器以减少保存和恢复上下文的时间,从而提高处理速度。
监控模式(Monitor mode):这是一种安全相关的模式,用于实现一个安全的执行环境,例如行信任的引导序列。
异常级别(Exceptionlevels):在ARMv8中,引入了异常级别的概念,用于支持虚拟化和提供不同级别的操作系统隔离。这些级别从EL0到EL3,EL0为用户模式,EL1为操作系统内核模式,EL2为虚拟机监视器模式,EL3为安全监视器模式。
每个模式都有其特定的用途和权限级别,这样设计是为了提高系统的安全性和稳定性。在实际使用中,操作系统和应用程序代码会根据需要在这些模式之间切换。
7、ARM v8的异常向量表(GPT应该不太对)
CPT说:ARM v8处理器的异常向量表包含了处理器上可能出现的所有异常类型和中断类型所对应的向量地址。这些向量地址用于跳转到相应的异常处理程序,以便在系统遇到异常时能够恰当地响应。
下面是ARM v8的异常向量表:
异常类型 向量地址重置
0x000非屏蔽中断(FIQ)
0x008数据同步异常(Data abort)
0x010未定义指令异常(Undefined instruction abort)
0x018系统调用异常(SVC)
0x020中断请求(IRQ)
0x028虚拟化异常(Hypervisor trap)
0x030监视异常(Monitor trap)
0x038管道错误异常(Pipeline error)
0x040返回栈异常(Stack overflow)
0x048指令同步异常(Instruction abort)
0x050调试异常(Debug trap)
0x058算术运算溢出异常(Arithmetic overflow trap)
0x060以上就是ARM v8处理器的异常向量表,每个异常类型都有其对应的向量地址,用于跳转到相应的异常处理程序。
百度总结:异常向量表(vector tables)是一组存放于普通内存(normal memory)空间的,用于处理不同类型异常的指令(exception handler)。当异常发生时,处理器需要跳转到对应的异常处理器(exception handler)来处理异常。异常处理器充当调度代码,识别异常的原因,然后调用相关的处理程序代码(异常处理子程序)来处理异常。
exception vector:在内存中存储异常处理器(exception handler)的位置称为异常向量。
exception vector tables :异常向量统一存放的区域称为异常向量表。
每个异常级别都有它自己的向量表,其基地址由它自己的向量基地址寄存器(Vector Base Address Register) VBAR_EL<x>定义,其中<x>为1、2或3。需要注意的是,没有针对EL0的向量表,因为异常永远不会在EL0中被处理。VBAR的值需要由软件进行初始化,它们在reset后的值是未定义的。
所有的向量表都使用相同的格式,对不同的异常类型和异常来源,有着不同的异常处理器(异常向量) ,并且,针对每种异常类型,在距离向量基地址的固定偏移量处(0x80)都有一个异常向量。
异常向量的区分和选择取决于如下因素:
异常的类型,比如有(SError, FIQ, IRQ以及同步异常)。
当前异常等级以及目标异常等级(The Exception levels the exception is being taken from and to)。
当前支持的执行状态(AArch32或者AArch64)
所使用的栈指针寄存器(SP_EL0还是SP_ELx)
下表为AArch64的异常向量表格式:
8、ARM v8处理器的异常向量表的位置
在ARMv8体系结构中,异常向量表(Exceptio
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
7年嵌入式软、硬件开发经验,分享嵌入式软件开发相关资料,简历、工作、技术支持!!!