Linux驱动面试题

1.导出符号表的原理?

image-20240321094442214

2.字符设备驱动的框架流程

image-20240325113102684

open  read  wirte  close  是系统调用(从用户空间进入内核空间的唯一的方法)会产生swi软中断《也会存在软中断号》(从User模式切换到SVC(管理模式)下因为在内核空间操作硬件SVC才有管理权限),在这个过程中他会去arch/arm/include/generated/calls-eabi.S文件中去找到对应的系统调用号,这是用户层和内核层的接口

通过sys_open找到对应的设备文件,然后通过文件找到inode号(文件系统识别文件的唯一编号)

(只要一个文件在文件系统上存在内核中,那么就有一个对应inode结构体与之对应)。

通过inode结构体中的dev_t和cdev就可确定唯一的cdev结构体(字符设备驱动)然后来操作下层的硬件。

3.linux内核中并发和竞态的解决方法?

当多个进程同时访问驱动的临界资源的时候竞态就会产生了。

image-20240325145754529

(1)中断屏蔽(了解)

中断屏蔽:中断屏蔽只对单核处理器有效,中断屏蔽就是将中断临时关闭掉。

中断屏蔽的临界区要尽可能的短,如果中断屏蔽的时间很长就可能会造成用户

数据的丢失或者内核的崩溃。(在中断屏蔽期间不需要有延时,耗时,甚至休眠的操作)。

(2)自旋锁(重点)

什么是自旋锁?

当一个进程获取到自旋锁之后,如果此时有另外一个进程也想获取这把锁,

此时后一个进程处于自旋状态(原地打转的状态)。自旋锁又叫做忙等锁。

自旋锁的特点

1.  自旋状态是需要消耗cpu资源的

2.  自旋锁保护的临界区要尽可能的短,只有这样它的效率才会高。

    在自旋锁保护的临界区中不能有延时,耗时,休眠的操作。

3.  在自旋锁保护的临界区内不能够调用copy\_to\_user/copy\_from\_user等函数

4.  自旋锁可能会导致死锁(在同一个进程内多次获取同一把未解锁的锁)

5.  自旋锁可以在中断上下文使用

6.  自旋锁在上锁前会关闭抢占

(3)信号量(重点)

什么是信号量?

当一个进程获取到信号量之后,如果此时有另外一个进程也想获取这个信号量,

此时后一个进程处于休眠状态。休眠状态是不需要消耗CPU资源。

信号量的特点

1.  信号量获取不到资源的时候不消耗CPU
2.  信号量保护的临界区可以很大,里面可以有延时,耗时,甚至休眠的操作
3.  信号量工作进程上下文
4.  信号量不会产生死锁现象
5.  信号量上上锁前也是不会关闭抢占的

(4)互斥体(会用)

什么是互斥锁?

当一个进程获取到互斥体之后,如果此时有另外一个进程也想获取这个互斥体,

此时后一个进程处于休眠状态。互斥体又叫做排它锁。

互斥体的特点

1.  互斥体获取不到资源的时候不消耗CPU
2.  互斥体保护的临界区可以很大,里面可以有延时,耗时,甚至休眠的操作
3.  互斥体工作进程上下文
4.  互斥体不会产生死锁现象
5.  互斥体上锁前也是不会关闭抢占的
6.  互斥体在获取不到资源的时候,会适当的等一会儿再决定是否进入休眠状态,如果 临界区比较大它会进入休眠状态,临界区比较小的时候在等待期间,获取资源就可以直接运行而不休眠了。

(5)原子操作(会用)

什么是原子操作?

原子操作名字就是根据它的特性得到的,在使用原子操作的时候如果执行了原子操作

中间的过程是不允许被打断的,认为原子是可以最小的不可被分割的整体。原子操作

并没有像自旋锁或者信号量那么多特性,它本身就是通过一个原子变量实现的。原子操作

的内部实现:1.保证只有一个核能操作这个变量,2在一个核上对变量的值的修改过程通

过内联汇编完成。

4.IO模型

IO模型的种类:非阻塞,阻塞,IO多路复用,异步通知(信号驱动IO)

5.select/poll/epoll的区别?

select:(位图(表))

1.  select监听的文件描述符是1024个
2.  select有清空表的过程,需要反复构造表,拷贝表,效率比较低
3.  select对应的进程从休眠态被唤醒之后,需要再次bianli文件描述符,效率比较低

poll:(链表)

1.  poll监听的文件描述符没有个数限制
2.  poll不会清空表,效率高于select
3.  poll对应的进程从休眠态被唤醒之后,需要再次遍历文件描述符,效率比较低

epoll:(红黑树+双链表)

1.  epoll监听的文件描述符没有个数限制
2.  epoll不会清空表,效率高于select
3.  epoll对应的进程从休眠态被唤醒之后,它能直接拿到就绪的文件描述符,不需要再次变量效率高

6.ARM工作模式及异常源

工作模式

1.  用户模式           User
2.  系统模式           Sys
3.  SVC模式           管理模式
4.  IRQ模式            普通中断模式
5.  FIQ模式             快速中断模式
6.  终止模式            ABT
7.  未定义模式         UND

异常模式及异常源

异常模式有5种:

1.  SVC异常模式
2.  IRQ异常模式
3.  FIQ异常模式
4.  终止异常模式
5.  未定义异常模式

异常源有7种:

1.  reset异常

2.  swi异常

3.  IRQ异常

4.  FIQ异常

5.  预取终止异常

6.  数据访问终止异常

7.  未定义异常

8.  **Reset异常**:当处理器接收到复位信号时触发的异常,它将处理器状态重置到某种初始状态。

9.  **SWI异常**:SWI(Software Interrupt)指令用于在程序中请求操作系统服务。当这个指令被执行时,处理器会触发SWI异常,然后将控制权转移到操作系统的相应服务例程。

10. **IRQ异常**:IRQ(Interrupt Request)异常是由外部设备发出的中断请求引起的异常。处理器响应这种异常来处理外部设备的事件。

11. **FIQ异常**:FIQ(Fast Interrupt Request)异常是一种高优先级的中断请求,通常用于处理时间敏感性较高的任务。

12. **预取终止异常**:这种异常发生在处理器试图执行指令预取时遇到问题时。可能是由于无效的指令地址或者存储器访问权限不足等原因引起的。

13. **数据访问终止异常**:当处理器试图访问无效的内存地址或者访问权限不足时触发的异常。

14. **未定义异常**:当处理器尝试执行未定义的指令或者遇到无法识别的操作码时触发的异常。

7.中断底半部机制

为什么需要中断底半部?

在中断顶半部中不能够做延时,耗时,或者休眠的操作,也就是说在中断顶半部

只能做紧急的,不耗时的任务。但是有的时候又希望在中断到来的时候做尽可能多

的操作,所以两者就产生了矛盾。linux内核为了解决这一矛盾专门设计了中断底半部

机制。也就是说在中断底半部中可以做不紧急的,耗时的的任务。中断底半部机制

分别是 软中断(个数限制32,留给内核使用),tasklet,工作队列。

例子:软中断

在网卡中断到了的时候需要从网络上接受数据,接收数据的过程就是耗时操作,

如果把它放在中断顶半部中是不可以的。所以linux内核开发者将接收网络数据的过程

放在了软中断这个底半部机制中完成。

(1)tasklet底半部机制

tasklet底半部机制的特点

tasklet是基于软中断实现的,tasklet没有个数限制,因为它是通过链表实现的。

tasklet工作在中断上下文,不能够脱离中断顶半部单独执行,tasklet底半部是在

中断顶半部执行即将结束的时候开启。tasklet底半部中可以做短延时或者耗时操作

但是不能够做长延时或者休眠操作。

(2)工作队列底半部机制

工作队列底半部机制特点

在linux内核启动的时候会创建一个events线程,这个线程默认处于休眠状态,在

这个线程中维护一个队列,如果需要让events线程执行你的任务,只需要向队列

中添加队列项,然后唤醒休眠的线程,工作队列底半部处理函数就会被调用执行。

工作队列工作在进程上下文,它可以脱离中断单独执行。它也是没有个数限制的。

在工作队列的底半部处理函数中可以做耗时,延时,甚至休眠的操作。

8.platform总线驱动

在Linux内核中所有总线驱动都遵从设备驱动的模型,总线驱动的模型如下图:

设备模型

内核在设计这些总线驱动模型的时候将一个驱动分为了三个

部分device、bus、driver。device是用来描述硬件设备的

bus是总线 **用来链接device和driver,**driver是用来描述驱动的

对象。在内核中所有的device放在内核的klist_devices的链表

中管理,而内核中所有的driver放在klist_driver中管理。内核中

的device和driver通过bus完成关联。当device和driver匹配成

功之后执行驱动的probe函数,在probe函数中就可以完成操

作硬件了。当卸载任何一方驱动的时候都会执行驱动中的

remove函数。

主要思想就是将设备信息和设备驱动进行分离

platform总线驱动遵从设备模型,platform是Linux内核抽象

出来的软件代码,并没有真实的总线协议与之对应。platform

总线驱动的思想就是要将设备信息和设备驱动进行分离。

platform_device和platform_driver通过总线匹配成功之后会执

行驱动中probe函数,在probe函数中驱动就能够拿到设备信息。

image-20220518102931467

它有三种匹配信息的方式(1)名字匹配   (2)idtable   (3)设备树匹配方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你还不会选ProfiNET和EtherCAT网线?

在现代工业自动化领域,ProfiNET和EtherCAT是两种非常流行的通信协议。选择合适的网线对于确保通信的稳定性和效率至关重要。 ProfiNET是什么? ProfiNET是一种基于以太网的通信协议,由德国西门子公司开发。它支持实时通信,广泛应用…

商超智能守护:AI监控技术在零售安全中的应用

结合思通数科大模型的图像处理、图像识别、目标检测和知识图谱技术,以下是详细的商超合规监测应用场景描述: 1. 员工仪容仪表监测: 利用图像识别技术,系统可以自动检测员工是否按照规范整理妆容、穿着工作服,以及是否…

大学课设项目,Windows端基于UDP的网络聊天程序的服务端和客户端

文章目录 前言项目需求介绍一、服务端1.对Udp套接字进行一个封装2. UdpServer的编写3. Task.h4.protocol.h的编写5.线程池的编写6.main.cc 二、客户端1. Socket.h2.protocol.h3.UdpClient4.menu.h5.main.cpp 三、运行图 前言 本次项目可以作为之前内容的一个扩展,学…

003 gitee怎样将默认的私有仓库变成公开仓库

先点击“管理”, 再点击“基本信息” 在“是否开源”里, 选择:开源

python文件操作、文件操作、读写文件、写模式

with读取文件数据内容 with open(filepath,mode,encoding) as file:#具体操作,例如:print(file.read())#查看文件所有的内容。 with:Python中的一个上下文管理器,用于简化资源的管理和释放。它可以用于任意需要进行资源分配和释放的情境…

使用 Azure AI Document Intelligence 创建智能文档处理

简介 借助 Azure AI 文档智能中的预生成模型,无需自行训练模型,即可从常见表单和文档中提取数据。 公司中,表单种类繁多,如发票、收据、调查表等。你可能想知道,从这些文档中提取姓名、地址、金额等信息需要多少工作…

APaaS:智能制造助手

资金不足、IT基础架构薄弱...... 车间业务需求不断地在增加...... 都在说数字化,都在说转型...... 随着企业竞争的日益激烈和市场环境的快速变化,企业需要一个灵活、高效、快速响应市场变化的新平台。在这样的背景下,APaaS应运而生&#x…

RocketMQ快速入门:集成java客户端实现各类消息发送|异步、同步、顺序、单向、延迟、事务(五)附带源码

0. 引言 前面的章节中,我们已经针对rocketmq的基本概念和消息发送、消费流程进行了讲解,但实际在开发中如何实现rocketmq的接入、实现消息发送、消费还没有落实,那么今天,我们继续来学习如何基于java client集成rocketMQ 1. 集成…

火车头采集中英文翻译教程

火车头采集怎么实现数据中文翻译成英文,或英文翻译成中文? 火车头采集没有自带的翻译功能,但可以使用插件功能来实现:导入翻译插件(例如谷歌翻译插件,百度翻译插件等),然后在火车头…

视频媒介VS文字媒介

看到一篇蛮有思考意义的文章就摘录下来了,也引起了反思 目录 一、视频的定义 二、”视频媒介“与”文字媒介”作对比 1.形象 VS 抽象 2.被动 VS 主动 三、视频的缺点-【更少】的思考 1.看视频为啥会导致【更少的思考】 2.内容的【浅薄化】 3.内容的【娱乐化…

【尚庭公寓SpringBoot + Vue 项目实战】用户管理(十五)

【尚庭公寓SpringBoot Vue 项目实战】用户管理(十五) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】用户管理(十五)1、业务介绍2、接口实现2.1、根据条件分页查询用户列表2.2、根据ID更新用户状态 1、业务介绍 用户管理共包含两…

关于生成式人工智能的发展

近年来,人工智能的发展引起了广泛关注,尤其是在深度学习领域,以深度神经网络为代表的人工智能技术已经取得了重大突破。然而,深度神经网络也有其局限性。深度学习技术在处理一些复杂问题时表现良好,但在解决更广泛的任…

PS系统教学20

油漆桶工具 作用:上色工具的一种 上一些纯色、图案 纯色 新建图层填充区域的源设置为前景色设置前景色为想要的颜色左键单机填充(altdelete)如果要添加背景色(Ctrldelete)也可以与选区工具结合使用 可以与快速选择…

【React】如何使用npm run start命令运行两个服务

我们开发前端项目时,有时候需要本地 mock 数据,这样就需要启动两个服务,一个是接口服务,一个是前端项目。可以安装一个插件来帮助我们通过一个命令启动两个服务。 方法一 添加& npm run server 注意:Windows系统…

牛客热题:最长回文子串

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:最长回文子串题目链接方法一&am…

Linux之网络编程

Linux之网络编程 TCP协议 TCP(Transmission ControlProtocol) : 传输控制协议,是一个 面向连接的、可靠的、基于字节流的传输层的协议。TCP 协议建立的是一种点到点的,一对一的可靠连接协议 特点: 数据无丢失数据无失序数据无错误数据无重…

振动分析-3-基于Python的FFT幅值修正与能量修正

幅值修正与能量修正过程(更正) 参考什么是泄漏? 参考什么是窗函数? 参考使用python实现快速傅里叶变换(FFT) 参考频谱泄露和窗函数以及加窗后幅度修正和python代码实现 1 快速傅里叶变换(FFT) 离散傅里叶变换(discr…

84. 柱状图中最大的矩形(hard)

单调栈&#xff1a; 就是说&#xff1a;固定高度&#xff0c;寻找最长宽度&#xff0c;如何找最长宽度&#xff0c;需要从heights[i] 这一个元素开始向左向右两边寻找heights[j] <heights[i]的j元素&#xff0c;也就是找两边第一小于heights[i]的元素。此过程中就是利用到单…

java面试(企业场景)

设计模式 工厂方法模式 简单工厂模式 简单工厂包括以下角色&#xff1a; 抽象产品&#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能具体产品&#xff1a;实现或者继承抽象产品的子类具体工厂&#xff1a;提供了创建产品的机会&#xff0c;调用者通过该…

【C++进阶学习】第二弹——继承(下)——挖掘继承深处的奥秘

继承&#xff08;上&#xff09;&#xff1a;【C进阶学习】第一弹——继承&#xff08;上&#xff09;——探索代码复用的乐趣-CSDN博客 前言&#xff1a; 在前面我们已经讲了继承的基础知识&#xff0c;让大家了解了一下继承是什么&#xff0c;但那些都不是重点&#xff0c;今…