嵌入式面试高频(实战场景5)
此部分不只包含面经内容,均是实战类型不必全文背诵,有思路即可
后续收录于专栏:嵌入式/C++面试八股文
实战场景5
1 linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些⭐⭐⭐⭐
区别
- 权限不同:内核空间具最高权限,可直接访问硬件;用户空间权限受限,操作受内核管控。
- 功能不同:内核空间负责系统核心管理;用户空间运行普通应用程序。
- 内存不同:两者内存相互隔离,保证系统稳定。
通信方式
- 系统调用:用户程序请求内核服务的标准途径。
- 信号:内核通知用户进程事件。
- proc/sysfs 文件系统:用户可读写对应文件与内核交互。
- netlink 套接字:常用于网络相关通信。
2 linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化,高端内存概念⭐⭐⭐⭐
内存划分与使用
- Linux 将内存划分为内核空间和用户空间。内核空间供内核使用,处理系统关键任务,如进程调度、硬件管理等;用户空间运行普通应用程序。用户程序通过系统调用请求内核分配内存,内核使用伙伴系统和 slab 分配器管理内存。
虚拟地址与物理地址
- 概念:虚拟地址是程序使用的地址,为每个进程提供独立的地址空间,增强程序的可移植性和安全性;物理地址是内存芯片的实际地址。
- 转化:通过内存管理单元(MMU)和页表实现。MMU 根据页表将虚拟地址映射为物理地址。
高端内存
- 物理内存较大时,内核无法直接映射全部内存,超出部分为高端内存。内核需动态映射高端内存,使用临时映射或永久映射机制,映射后才能访问其中数据。
3 Linux中中断的实现机制,tasklet与workaueue的区别及底层实现区别?为什么要区分上半部和下半部⭐⭐⭐
Linux 中断实现机制
- 硬件产生中断信号,通过中断控制器传递给 CPU。CPU 收到信号后,暂停当前程序,根据中断向量表找到对应的中断服务程序(ISR)入口,执行 ISR。ISR 完成后,CPU 恢复原程序执行。
tasklet 与 workqueue 区别及底层实现
- 区别:tasklet 运行于软中断上下文,执行快且不允许睡眠;workqueue 运行于内核线程上下文,可睡眠,适合处理耗时任务。
- 底层实现:tasklet 基于软中断机制,有自己的调度队列,在软中断处理时被调度执行;workqueue 由内核线程实现,将工作项放入队列,内核线程从队列取出执行。
区分上半部和下半部原因
- 中断发生时,上半部快速响应,完成紧急操作,如应答中断、保存现场。下半部处理耗时任务,避免影响其他中断响应,提高系统实时性和处理效率。
4 Iinux中断的响应执行流程⭐⭐⭐⭐
Linux 中断的响应执行流程如下:
中断发生
- 硬件设备产生中断信号,如网卡接收到数据,将中断信号发送给中断控制器。中断控制器对信号进行管理和优先级排序,再将处理后的信号传递给 CPU。
中断响应
- CPU 检测到中断信号后,暂停当前正在执行的程序,保存现场,包括程序计数器、寄存器等信息,以便后续恢复执行。根据中断向量表找到对应中断服务程序(ISR)的入口地址。
执行上半部
- 进入 ISR 的上半部,此部分代码执行速度快,完成紧急操作,如应答中断控制器,防止重复触发中断;保存关键数据等。
调度下半部
- 上半部完成后,若有需要后续处理的任务,会调度下半部执行。下半部可通过 tasklet、工作队列等机制实现,在合适时机处理耗时任务。
恢复现场
- 中断处理完成后,恢复之前保存的现场,CPU 继续执行被中断的程序。
5 linux中的同步机制?spinlock与信号量的区别⭐⭐⭐
Linux 中的同步机制
- Linux 中有多种同步机制,用于解决并发访问共享资源时的数据不一致问题。常见的有自旋锁、信号量、互斥体、读写锁等。这些机制能保证在多进程或多线程环境下,对共享资源的访问是有序的。
spinlock 与信号量的区别
- 等待方式:spinlock 是忙等待,获取不到锁时,进程会一直循环检查锁的状态,占用 CPU 资源;而信号量获取不到时,进程会进入睡眠状态,让出 CPU。
- 使用场景:spinlock 适用于锁持有时间短的场景,避免进程频繁睡眠和唤醒的开销;信号量适合锁持有时间长的情况,可让 CPU 处理其他任务。
- 中断上下文使用:spinlock 可在中断上下文中使用,因为它不会引起睡眠;信号量不能在中断上下文中使用,因为中断处理程序不能睡眠。
6 Linux中RCU原理⭐⭐⭐⭐
RCU(Read-Copy-Update)是 Linux 内核的一种同步机制。其原理是允许多个读操作并发执行,且读操作无需加锁,不影响性能。当有写操作时,先复制一份数据副本进行修改,待所有读操作完成旧数据使用后,再用新副本更新数据并释放旧数据。它通过维护读端临界区和回调机制实现数据同步,适合读多写少场景。
7 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类⭐⭐⭐
Linux 设备中字符设备与块设备主要有以下区别,并列举一些实际设备说明:
数据传输方式
- 字符设备:以字符为单位按顺序进行数据传输,数据的读取和写入是连续的流,就像从文件中逐字符读取或写入一样。
- 块设备:以块为单位进行数据传输,块的大小通常是固定的,如 512 字节或 4096 字节等,数据的读写可以随机访问不同的块。
访问特点
- 字符设备:通常用于面向流的设备,数据的访问是顺序的,不支持随机访问,应用程序一般需要按照顺序依次读取或写入数据。
- 块设备:支持随机访问,应用程序可以直接访问设备上的任意块,而不必按照顺序依次访问。
典型设备
- 字符设备:如键盘、鼠标、串口设备、打印机等。以键盘为例,用户按下按键时,字符会逐个输入到系统中,系统按顺序接收和处理这些字符。
- 块设备:常见的有硬盘、固态硬盘、U 盘、光盘等。以硬盘为例,操作系统可以根据需要随机读取或写入硬盘上的任意一个数据块,而不必像字符设备那样顺序访问。
8 设备请简述主设备号和次设备号的用途⭐⭐⭐⭐
主设备号
- 标识设备类型:用于区分不同种类的设备驱动程序,同一类设备具有相同的主设备号。例如,所有的硬盘设备可能共享一个特定的主设备号,而所有的串口设备有另一个主设备号,系统通过主设备号能快速定位到对应的设备驱动程序。
- 建立驱动关联:内核利用主设备号来查找和调用相应的设备驱动程序,当设备进行读写等操作时,内核依据主设备号找到对应的驱动入口点,从而实现对设备的控制和操作。
次设备号
- 区分同类设备:在同一类设备中,用于区分不同的具体设备实例。比如系统中有多个硬盘,每个硬盘通过不同的次设备号来标识,以便系统对它们进行单独的管理和操作,如分别对不同硬盘进行分区、格式化等。
- 实现设备定制:可以用于指定设备的特定属性或功能变体。例如,某些设备可能有不同的工作模式或配置选项,次设备号可以用来区分这些不同的情况,使驱动程序能够根据次设备号执行不同的操作或提供不同的功能。
9 请简述中断于DMA的区别⭐⭐⭐⭐
中断和 DMA(直接内存访问)是计算机系统中用于数据传输和处理的两种不同机制,它们的区别如下:
- 数据传输方式:中断方式下,CPU 需不断查询或响应设备中断来传输数据,是由 CPU 控制的;DMA 方式则是由 DMA 控制器直接控制数据在内存和设备间传输,无需 CPU 干预。
- 应用场景:中断适用于处理少量、随机的数据交互,如键盘输入;DMA 适合大量数据的快速传输,像硬盘与内存间的数据读写。
- 对 CPU 的影响:中断会频繁打断 CPU 当前工作,影响 CPU 效率;DMA 传输时 CPU 可处理其他任务,大大提高了 CPU 的利用率。
10 中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动⭐⭐⭐⭐
中断和轮询的效率高低及采用哪种方式实现驱动需根据具体情况判断,以下是相关分析:
效率比较
- 一般情况下,中断的效率更高。中断是由设备主动发送信号给 CPU,CPU 在接收到中断信号后才会去处理设备相关事务,无需 CPU 不断查询,不会浪费 CPU 时间在无意义
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
该专栏面向嵌入式开发工程师、C++开发工程师,包括C语言、C++,操作系统,ARM架构、RTOS、Linux基础、Linux驱动、Linux系统移植、计算机网络、数据结构与算法、数电基础、模电基础、5篇面试题目、HR面试常见问题汇总和嵌入式面试简历模板等文章。超全的嵌入式软件工程师面试题目和高频知识点总结! 另外,专栏分为两个部分,大家可以各取所好,为了有更好的阅读体验,后面会持续更新!!!