linux中断机制主要思想?
Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部。上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。也就是我们常说的硬中断,特点是快速执行。下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。也就是我们常说的软中断,特点是延迟执行。
Linux中有硬件中断和软件中断。但是对于硬件中断的处理有两个原则:不能嵌套,越快越好。(早起Linux版本是支持中断嵌套)
当ARM处理器收到中断的时候,它进入中断模式,同时ARM处理器的CPSR寄存器的IRQ位会被硬件设置为屏蔽IRQ。
将要被CPU执行的指令从内存或cache取出后保存在哪里?
程序执行的过程:
1、写好一个程序,经过编译、链接后会生成一个可执行文件,在linux平台下是ELF(Executable Linkable Format)格式的,windows平台下是PE(Portable Executable)格式的。
2、然后你执行这个可执行文件,这个可执行文件里面的代码段、数据段和BSS段会被加载到PC或者某设备的内存中。代码段里放的就是指令,所以内存里的指令是通过执行某可执行文件加载到内存里的。
3、CPU会从代码段的起始地址,调用第一条指令,开始执行。如果没有遇到跳转指令就顺序执行:假设代码段起始地址是0x100,那么就是先执行0x100这个地址里的指令,然后再执行0x104、0x108地址里的指令。如果遇到跳转指令,就跳转到相应地址,取指令,继续执行。如此往复,完成了整个程序的运行。
4、有些指令,比如add rD,rA,rB。需要去rA和rB寄存器里取值。rA和rB寄存器里的值来自哪里?来自内存里的数据段、BSS段或者栈里或者堆里。说白了,程序就是靠执行一条条执行运行起来的,而指令执行所需的数据放在数据段、BSS段、栈或者堆里。
5、数据加载到数据寄存器的过程:CPU先去数据cache里找这个数据,如果找到了就直接从数据cache加载到数据寄存器里,如果找不到的话就只能再去内存里找。然后就是cache把刚才找到的这个数据缓存起来。
6、另外,CPU读数据的时候,cache的工作很简单,就是缓存。如果是写数据的话,cache就分为write though和wirte back两种不同的工作方式了。此外,CPU发出的地址都是逻辑地址,必须经过MMU模块把逻辑地址转换为物理地址才能正确访问内存。
7、注意,CPU执行指令的时候,也是从指令寄存器里取指令的,并不是直接跑到内存里去取指令,因为这样太慢了。指令加载到指令寄存器的过程和加载数据是类似的。
嵌入式linux系统的启动流程是什么样的?
1) 初始化 RAM因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 Bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备。初始化 RAM 的任务包括设置 CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等。
2) 初始化串口端口在 Linux 的启动过程中有着非常重要的作用,它是 Linux内核和用户交互的方式之一。Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解 Linux 的启动过程。虽然它并不是 Bootloader 必须要完成的工作,但是通过串口输出信息是调试 Bootloader 和Linux 内核的强有力的工具,所以一般的 Bootloader 都会在执行过程中初始化一个串口作为调试端口。
3) 检测处理器类型Bootloader在调用 Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给 Linux 内核。Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序。
4) 设置 Linux启动参数Bootloader在执行过程中必须设置和初始化 Linux 的内核启动参数。
5) 调用 Linux内核映像Bootloader完成的最后一项工作便是调用 Linux内核。如果 Linux 内核存放在 Flash 中,并且可直接在上面运行(这里的 Flash 指 Nor Flash),那么可直接跳转到内核中去执行。但由于在 Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将 Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行。
linux内核态和用户态的区别?
主要区别:是代码执行的层级;性能损失来源于缓冲区的复制。
首先内核态和用户态的堆和栈是不一样的,所以必然会发生寄存器状态的切换,其实单纯切换寄存器影响倒不是特别大,大概就是会影响 CPU 方面的一些比如指令流水,分支预测等
最大的问题是用户态程序发生系统调用相当于把控制权交给内核,内核甚至会剥夺当前进程的执行,去执行另一个进程,那这个时候要发生 TLB flush,这个对性能影响非常大不说,整个进程的执行都会停止