16**,linux中软中断的实现原理?**
**答:**中断服务程序往往都是在CPU关中断的条件下执行的,以避免中断嵌套而使控制复杂化。但是CPU关中断的时间不能太长,否则容易丢失中断信号。为此, Linux将中断服务程序一分为二,各称作“Top Half”和“Bottom Half”。前者通常对时间要求较为严格,必须在中断请求发生后立即或至少在一定的时间限制内完成。因此为了保证这种处理能原子地完成,Top Half通常是在CPU关中断的条件下执行的。具体地说,Top Half的范围包括:从在IDT中登记的中断入口函数一直到驱动程序注册在中断服务队列中的ISR。而Bottom Half则是Top Half根据需要来调度执行的,这些操作允许延迟到稍后执行,它的时间要求并不严格,因此它通常是在CPU开中断的条件下执行的。
但是, Linux的这种Bottom Half(以下简称BH)机制有两个缺点,也即:(1)在任意一时刻,系统只能有一个CPU可以执行Bottom Half代码,以防止两个或多个CPU同时来执行Bottom Half函数而相互干扰。因此BH代码的执行是严格“串行化”的。(2)BH函数不允许嵌套。
这两个缺点在单CPU系统中是无关紧要的,但在SMP系统中却是非常致命的。因为BH机制的严格串行化执行显然没有充分利用SMP系统的多CPU特点。为此,Linux2.4内核在BH机制的基础上进行了扩展,这就是所谓的“软中断请求”(softirq)机制。
Linux 的softirq机制是与SMP紧密不可分的。为此,整个softirq机制的设计与实现中自始自终都贯彻了一个思想:“谁触发,谁执行”(Who marks,Who runs),也即触发软中断的那个CPU负责执行它所触发的软中断,而且每个CPU都由它自己的软中断触发与控制机制。这个设计思想也使得softirq 机制充分利用了SMP系统的性能和特点。
参考:https://blog.csdn.net/liangjingbo/article/details/2817939
17**,linux系统实现原子操作有哪些方法?**
**答:**有3种吧!
从理论上来说,最简单的方法就是加锁:在任何时间点上,只有一个处理器被允许执行一个原子操作。这个处理器在做原子操作之前,必须先获得锁,并且在操作完成后释放它。这就是x86的LOCK前缀的作用(大致如此;这里我略去了细节)。这里,获得锁的操作意味着向总线发送一条消息,说“好吧,我要占用总线一会儿,大家都退后”(根据我们的目的,这就意味着“请不要再做内存操作了”)。然后发出请求的处理器要先等其他处理器完成它们正在进行的内存操作,之后才会得到确认。只有等到其他所有处理器都确认了以后,请求锁的处理器才能开始处理内存操作。最后,一旦锁被释放,它还需要发送一条信息给总线上的其他处理器“我的工作完成,你们可以继续向总线发送请求了”。
18**,MIPS Cpu中空间地址是怎么划分的?如在uboot中如何操作设备的特定的寄存器?**
答:首先需要明确的是CPU物理地址空间不仅仅包括RAM物理内存的空间,还包括CPU内部的一些总线、寄存器的编址。
一个MIPS CPU可以运行在两种优先级别上, 用户态和核心态。MIPS CPU从核心态到用户态的变化并不是CPU工作不一样,而是对于有些操作认为是非法的。在用户态,任何一个程序地址的首位是1的话,这个地址是非法的,对 其存取将会导致异常处理。另外,在用户态下,一些特殊的指令将会导致CPU进入异常状态。
参考1:http://blog.chinaunix.net/uid-20564848-id-74684.html
参考2:http://www.360doc.com/content/12/0816/10/7775902_230452499.shtml
19,linux****中系统调用过程?如:应用程序中read()在linux中执行过程即从用户空间到内核空间?
linux的系统调用过程:
层次例如以下:
用户程序------>C库(即API):INT 0x80 ----->system_call------->系统调用服务例程-------->内核程序
先说明一下,我们常说的用户API事实上就是系统提供的C库。
系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中。
(软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的。)
INT 0x80 这条指令的运行会让系统跳转到一个预设的内核空间地址,它指向系统调用处理程序。即system_call函数。
参考:https://www.cnblogs.com/yfceshi/p/6885322.html
20,linux****内核的启动过程(源代码级)?
**答:**1,head_armv.S启动;
2,start_kernel()函数;
2.1,lock_kernel()进入内核态;
2.2,setup_arch()初始化函数;
2.2.1,setup_architecture,结构;
2.2.2,内存设置代码;
2.2.3,内核内存空间管理;
2,2,4,内存结构初始化;
2,2,5,paging_init,创建内核页表。
参考:https://www.linuxidc.com/Linux/2014-10/108034.htm
21,linux****调度原理?
**答:**进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级。前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。任何时候,实时进程的优先级都高于普通进程,实时进程只会被更高级的实时进程抢占,同级实时进程之间是按照FIFO(一次机会做完)或者RR(多次轮转)规则调度的。
参考:https://yq.aliyun.com/articles/363020
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
!!**](https://bbs.csdn.net/topics/618654289)
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!