嵌软秋招两万字八股文汇总(二)

61、 linux操作系统具体是怎么读取文件的?

用户请求 -> VFS inode(文件大小、权限、inode_operations 结构体(readpage/writepage))-> 文件系统 -> 页缓存 -> 磁盘 I/O -> 用户空间

页缓存 (Page Cache) 的查找:在读取磁盘数据之前,内核会先检查页缓存中是否已经存在所需的数据。如果数据不在页缓存中(缓存未命中,Cache Miss),内核会发起磁盘 I/O 操作。从磁盘读取的数据被存储到页缓存中。

内核使用 copy_to_user() 函数将页缓存中的数据复制到用户进程指定的缓冲区中。

62、 epoll的底层机制?

63、 tcp如何判断数据包的正确性?怎么判断发送失败及处理?多次发送失败会怎么样?

校验和、序列号和确认应答等机制来保证数据包的正确性和可靠性;

超时重传:发送数据包后穷的那个定时器,超时之前没有收到对应的ACK,认为包丢失进行重传;

快速重传:如果接收方收到了一个序列号大于期望序列号的数据包,说明有数据包丢失。接收方会立即发送一个重复的 ACK (Duplicate ACK) 给发送方,告知发送方期望收到的序列号。如果发送方连续收到三个重复的 ACK,则认为该数据包已经丢失,会立即重新发送该数据包,而不需要等待 RTO 超时。

指数退避:每次重传失败后,RTO 的值会呈指数增长,避免网络拥塞进一步加剧,给网络留出恢复的时间。

放弃连接:TCP 会认为网络连接已经中断,会放弃连接,并向应用程序报告连接错误。放弃连接通常会发送 RST (Reset) 报文,通知对方连接已重置。

64、 为什么连接中断了还能发RST报文?

65、 linux哪个命令对文件的内容进行去重?

sort -u

66、 linux如何查看进程是否存活?

67、 如何切换用户态和内核态?

系统调用、异常、中断和上下文切换

68、 驱动如何匹配?除了compatible匹配还有什么匹配规则,匹配优先级是什么?

五条匹配规则。driver_override、compatible(of_match_table)、ACPI、table_id、name;

先判断platform_device.driver_override有没有赋值,如果被赋值了无论有没有被匹配上,后面的程序都不会再进行了;

ACPI主要用于x86架构的传统PC平台,特别是在桌面和笔记本电脑上。它较为复杂,包含了丰富的系统管理和电源管理功能。开发人员无法修改,只能由主板供应商修改BIOS固件。

这里可以看到匹配的优先级如下:

1. 设备里的driver_override被设置,优先级最高。

2. 驱动里的of_match_table,和平台设备的compatible比较。

3. 高级配置和电源管理之类的匹配。

4. platform_driver里的id_table里的所有名字和设备名字匹配。

5. 最后再是设备名字和驱动名字比较。

69、 如果中断过程中不关中断会发生什么?(中断嵌套)

70、 了解中断线程化吗?

my_irq=request_threaded_irq(irq, thread_irq);

wake_up_process(my_thread);

71、 什么是伙伴系统,伙伴系统申请内存不够会怎么办?

基本思想:

将整个可用内存区域划分为一组2的幂次方大小的块(例如,2^0页、2^1页、2^2页...2^n页)。

每个块都有一个"伙伴",大小相同,物理地址相邻。

当需要分配内存时,系统会查找一个大小合适的空闲块。 如果没有找到完全匹配的块,它会找到一个更大的块,并将其递归地分割成两个大小相等的伙伴,直到找到合适的块为止。

当释放内存时,系统会检查释放的块是否有伙伴也是空闲的。 如果是,则将这两个伙伴合并成一个更大的块,并继续检查合并后的块是否有伙伴也是空闲的,直到无法合并为止。

内存回收:

• 直接内存回收(Direct Memory Reclaim): 内核会尝试直接回收一些不常用的内存页,例如:

o 回收文件系统缓存(page cache和inode cache)。

o 回收slab缓存(用于内核数据结构的缓存)。

o 交换出不常用的进程页面到磁盘(swap)。

如果直接内存回收成功释放了足够的内存,则分配请求可以得到满足。

• 紧急内存回收(Emergency Memory Reclaim): 如果直接内存回收仍然无法满足分配请求,内核会进入紧急内存回收状态。 此时,内核会更加激进地回收内存,甚至可能会阻塞当前的分配请求,直到有足够的内存可用。 紧急内存回收可能会导致系统性能下降,因为它会强制内核执行大量的I/O操作。

• OOM Killer(Out-of-Memory Killer): 如果紧急内存回收仍然失败,内核会调用OOM Killer。 OOM Killer会选择一个或多个进程杀死,以释放内存。 选择哪个进程被杀死是由OOM Killer的启发式算法决定的,算法会考虑进程的内存使用量、优先级等因素。

• 返回错误: 如果OOM Killer也无法释放足够的内存,则内存分配函数(例如,alloc_pages())会返回错误(通常是NULL),表示内存分配失败。

72、 如果中断printk输出一万个字符会怎么样?

性能: 如上所述, printk 操作相对缓慢,并且会增加中断处理时间。

可靠性: printk 的缓冲区是有限的,可能会导致消息丢失或数据损坏。

73、 单核操作系统在中断中处理共享变量要不要加锁?

特殊情况:

**中断嵌套:**虽然在单核上只有一个内核上下文在运行,但仍然可能存在中断嵌套的情况。这意味着一个中断处理程序可能会被另一个中断打断。 如果不同的中断处理程序需要访问同一个共享变量,就需要考虑加锁或者禁用中断来避免竞争条件。不过,中断嵌套的情况相对较少,通常只发生在复杂的系统设计中。

用户态和中断共享: 如果用户态代码和中断处理程序访问同一个共享变量,即使在单核上,也需要考虑同步问题。 因为中断随时可能发生,打断用户态代码对共享变量的访问。

74、 极端情况下从中断机制的角度来说怎么提高上半部的响应时间?

75、 读取文件的步骤?

76、 讲一下零拷贝。

77、 cpu使用率突然飙升怎么排查?

78、 介绍一下ddpg、sac、ppo,他们有什么区别?

79、 大模型训练流程?

预训练:给文本进行无监督训练,学习知识;(tokniezer,预训练,数据清洗)

指令微调阶段:监督学习,问答的形式进行训练,人工标注数据或者gpt指令生成数据

奖励模型:对不同的答案进行好坏判断排序,直接为每一个样本直接打分,而是标注这些样本的好坏顺序

强化学习:状态空间:问题输入,动作空间:问题输出,奖励

80、 cmake和makefile区别?

81、 Git版本控制使用?

82、 进程线程通讯方法

83、 Void *类型指针作用是什么?对比char*、int*有什么有什么优势?

84、 大端模式小端模式,内存对齐,char,int,long在32位中多少字节,64位呢

85、 Spi四种模式?

86、 Linux的schedule函数原理和调用时机

87、 C语言字节对齐规则,为什么要直接对齐

88、 为什么分用户空间和内核空间

89、 结构体字节对齐?

90、 如何用栈来模拟队列

91、 动态分配调用什么函数

92、 I/O事件处理了解过吗

93、 NULL指针存在的意义

94、 如何使用位运算实现取余计算

95、 Memcpy和strcpy的区别

96、 常见的内存分配算法

#嵌入式软件八股#
全部评论
两个字牛逼
点赞 回复 分享
发布于 12-14 16:18 陕西

相关推荐

项目相关问题:多级菜单界面框架搭建:1、请详细描述你设计的基于树状多分支链表的菜单结构,包括节点的数据结构和链表的组织方式。你是如何选择这种数据结构的?有什么优点和缺点?答:Page结构体介绍2、你是如何将系统功能和参数配置与菜单节点关联起来的?详细描述菜单节点的处理函数,以及处理函数是如何响应用户操作的。答:判断下一结点是否为空,为空执行结构体里对应的函数3、详细解释你如何配置和使用外部中断来驱动按键扫描。中断服务程序(ISR)中做了哪些工作?答:使能GPIO时钟: 配置GPIO为输入模式,使能外部中断,中断模式、引脚映射,配置中断控制器设置中断优先级。中断服务程序 (ISR) 清除中断标志读取按键状态消抖,执行按键处理逻辑:4、你如何保证按键事件的可靠性,避免抖动和误触发?答:开始使用延时的方式消抖,后使用状态机方式提升效率。IDLE (空闲): 按键未按下状态。PRESSING (按下检测): 检测到按键按下,进入此状态,开始计数。PRESSED (按下): 确认按键已经按下。RELEASING (释放检测): 检测到按键释放,进入此状态,开始计数。RELEASED (释放): 确认按键已经释放。5、你是如何测量界面响应速度的?“响应速度提升了20%”这个数据是如何得出的?请描述你的测试方法和评估指标。软件计时,使用时间戳计算。6、如果系统负载较高,导致中断响应延迟,你如何处理?答:优化中断优先级(避免优先级反转): 缩短中断服务程序 (ISR) 的执行时间(避免中断使用阻塞函数;使用DMA;避免使用浮点运算):优化任务调度(多级反馈轮转调度算法):7、怎么提高屏幕刷新率?提高时钟频率、双缓冲、DMA数据采集与参数管理:1、为什么选择DMA方式进行数据传输?相比于中断方式,DMA的优势在哪里?多个传感器、数据量较大。中断要cpu介入,频繁中断会加大cpu开销。DMA无需cpu,只需要完成传输的时候给cpu完成信号。减轻cpu负担、提高数据传输效率2、描述一下你是如何配置定时器,使其能够精确触发ADC进行数据采集的?adc用定时器触发和自己周期触发有什么区别?周期性触发模式、配准分频和计数周期,使其大于adc转化时间,连接定时器输出比较通道到 ADC 触发输入。采样频率不稳定: 容易受到系统负载和中断的影响,实际采样频率可能不均匀,导致采样数据不准确。 因为其他任务会抢占ADC的执行时间,导致采样周期不固定CPU占用率较高: 通常需要轮询 ADC 的转换完成标志位来读取数据,CPU 必须不断查询 ADC 的状态,占用 CPU 资源。 也可以用中断,但是频繁中断会导致CPU的负担3、你是如何配置ADC以实现多通道扫描的?ADC怎么转化为数据?开启扫描模式,关闭连续转化模式使用外部触发。读取电压、量化、转化、根据手册再进一步进行转换。4、数据采集效率提升35%这个数据是如何得到的?你是如何进行测试和验证的?十秒内采集到的数据个数5、DMA在进行多通道数据采集时,你是如何组织和存储数据的?有没有考虑过数据对齐的问题?交错存储,双缓冲区;数组数据类型和存入数据的类型一样6、描述一下I2C协议的工作原理?I2C总线上有哪些关键信号?7、如何确保I2C通信的可靠性?有没有进行错误处理?ACK/NACK 检查、超时机制、超时重发、软件复位8、EEPROM中存储了哪些类型的参数?为什么选择EEPROM而不是Flash来存储参数?擦写寿命高、单位是字节、存储容量小9、如果EEPROM的存储空间不足,你会如何解决?换容量更大的或者别的存储介质如flash,数据覆盖远程控制与状态监控1、常用的 AT 指令有哪些? 比如建立连接,数据发送接收,断开连接的指令你是如何使用的?举例说明。AT+一个指令,收到数据会返回CONNECT OK,判断返回数据确认是否发送成功2、如何保证 AT 指令通信的可靠性? 你采取了哪些措施来处理可能的错误?返回数据判断、超时处理3、TCP 和 UDP 的区别是什么? 在这个项目中,为什么选择 TCP 而不是 UDP?4、描述一下 TCP 三次握手和四次挥手的过程? 为什么要进行三次握手和四次挥手?5、你是如何将设备运行状态从 STM32 传递到微信小程序?6、波特率是什么意思? 如何设置 UART 的波特率? 波特率设置错误会导致什么问题?每秒传输的bit数,配置uart结构体,数据损坏乱码7、请解释一下 UART 的工作原理? UART 包括哪些主要的信号线有时候有请求发送和清除发送数据线,用于硬件流控制,以防止数据溢出。FreeRTOS任务调度与优化1、请你详细解释一下 FreeRTOS 的任务调度机制,包括优先级和时间片的概念。在实际项目中,你是如何确定任务优先级的?2、假设你需要在 FreeRTOS 中创建一个周期性执行的任务,你会如何实现?你会考虑哪些因素来选择合适的实现方法(例如使用 vTaskDelayUntil() vs vTaskDelay())?3、请描述一下你使用队列解决过哪些具体问题?为什么选择队列而不是其他 IPC (Inter-Process Communication) 机制?4G模块数据接受和参数设置任务的数据传输;队列异步,缓冲,适用于数据传输;4、FreeRTOS 的任务通知机制(Event Groups)与信号量(Semaphores)在任务同步方面有什么区别?在什么情况下你会选择使用事件通知而不是信号量?请举例说明。事件组主要用于任务需要等待多个事件组合的场景。任务通知适用于一对一的任务同步或需要传递少量数据的情况,效率更高,并且可以避免优先级反转问题。信号量适用于需要控制对共享资源的访问或需要按照特定顺序执行任务的情况,或者需要多个任务同步的情况。5、互斥锁在 FreeRTOS 中用于保护共享资源。请描述一下死锁(Deadlock)的概念,以及在使用互斥锁时如何避免死锁?你是否有遇到过死锁的情况?你是如何解决的?锁排序、超时机制、优先级反转避免、FreeRTOS+Trace、vTaskList()6、在使用队列时,如何避免队列满或队列空的情况?设置超时时间,满空是会阻塞,taskdelay,减小速度,调整长度7、你是如何调试 FreeRTOS 程序的?ST-Link、FreeRTOS+Trace、串口调试、GDB、vTaskList();检测堆栈溢出用钩子函数:改config配置文件启用检测
面试问题记录
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务