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.mfbz.cn/a/717960.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

天锐绿盾加密软件,它的适用范围是什么?

天锐绿盾数据防泄密软件的适用范围广泛,主要可以归纳为以下几点: 行业适用性: 适用于各个行业,包括但不限于制造业、设计行业、软件开发、金融服务等,特别是对数据安全性要求较高的行业。企业规模与类型: 适…

C# Winform图形绘制

WinForms 应用程序中的控件是基于窗体的,当控件需要重绘时,它会向父窗体发送一个消息请求重绘。但是,控件本身并不直接处理绘制命令,所以你不能直接在控件上绘制图形。 解决方法: 重写控件的OnPaint方法使用CreateGr…

网站改成HTTPS方法

网站改成HTTPS只要网站没有特殊性的要求,绝大部分网站很轻松的就可以完成,尤其是CMS类似的网站系统或者自助搭建的网站(比如:这种网站可以在网站后台一次性安装并且生效)。 基本要求 将网站改成HTTPS有2个前提&#…

MMpose安装实例

摘要: 这个大数据训练发展较快,各种版本问题,不太好匹配,仅是安装就会大费周章。本文图文并茂的描述了一种成功的安装方式。仅供参考。 使用的win版本是win11,英伟达显卡是GeForce GTX 1660 SUPER。 1.cuda版本选择 通…

FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析

一、av_malloc函数分析 (一)av_malloc函数的声明 av_malloc函数的声明放在在FFmpeg源码(本文演示用的FFmpeg源码版本为5.0.3,该ffmpeg在CentOS 7.5上通过10.2.1版本的gcc编译)的头文件libavutil/mem.h中:…

cve_2014_3120-Elasticsearch-rce-vulfocus靶场

1.背景 来源:ElasticSearch(CVE-2014-3120)命令执行漏洞复现_mvel 漏洞-CSDN博客 参考:https://www.cnblogs.com/huangxiaosan/p/14398307.html 老版本ElasticSearch支持传入动态脚本(MVEL)来执行一些复…

万字长文详述 - 带你了解Jvm虚拟机运行时数据区

JVM虚拟机,对大部分Java程序员而言,是既熟悉又陌生的存在,Java程序在虚拟机的自动内存管理机制帮助下,减少了绝大部分的内存管理工作。但也正是因为如此,虚拟机如果出现了内存溢出或者泄露的情况,问题排查、…

基于YOLOv8m的船舶检测(附数据集和Coovally操作步骤)

本文主要内容:详细介绍了船舶检测整个过程,从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式,请先看检测效果 现状 船舶检测和识别是一项重要的任务,它涉及到航运安全、港口管理、海洋保护等方面&#xff0c…

YOLOv10涨点改进轻量化双卷积DualConv,完成涨点且计算量和参数量显著下降

本文独家改进:双卷积由组卷积和异构卷积组成,执行3x3 和 1x1 卷积运算Q代替其他卷积核仅执行 1x1 卷积。 DualIConv 显着降低了深度神经网络的计算成本和参数数量,同时在某些情况下令人惊讶地实现了比原始模型略高的精度。 我们使用 DualConv 将轻量级 MobileNetV2 的参数数量…

JavaEE、SSM基础框架、JavaWeb、MVC(认识)

目录 一、引言 (0)简要介绍 (1)主要涉及的学习内容 (2)学习的必要性 (3)适用学习的人群(最好有这个部分的知识基础) (4)这个基础…

代码随想录——电话号码的字母组合(Leetcode17)

题目链接 回溯 class Solution {List<String> res new ArrayList<String>();StringBuilder str new StringBuilder();HashMap<String, String> Sites new HashMap<String, String>();public List<String> letterCombinations(String digit…

经验分享,xps格式转成pdf格式

XPS 是一种电子文档格式、后台打印文件格式和页面描述语言。有时候微软默认打印机保存的是xps格式&#xff0c;我们如何转换为pdf格式呢&#xff0c;这里分享一个免费好用的网站&#xff0c;可以实现。 网站&#xff1a;https://xpstopdf.com/zh/ 截图&#xff1a;

CAS Apereo 5.3.16 实现单点登录

1.CAS部署 服务端下载地址:cas5.3 1.下载好打开后,复制target/cas/WEB-INF/classes/META-INF/spring.factories target/cas/WEB-INF/classes/services下的Apereo-10000002.json和HTTPSandIMAPS-10000001.json target/cas/WEB-INF/classes下的application.properties和log4j…

访问jlesage/firefox镜像创建的容器中文乱码问题

目录 介绍总结 介绍 最近在使用jlesage/firefox镜像创建容器的时候&#xff0c;发现远程管理家里网络的时候中文会出现乱码&#xff0c;导致整个体验非常的不好&#xff0c;网上查找资料说只要设置环境变量ENABLE_CJK_FONT1 就可以解决问题&#xff0c;抱着试一试的态度还真的成…

苏州辰安塑业携塑料托盘、塑料物流箱解决方案亮相2024杭州快递物流展

苏州辰安塑业携塑料托盘、吹塑托盘、塑料卡板箱、塑料周转箱、塑料物流箱、塑料垃圾桶解决方案盛装亮相2024杭州快递物流展&#xff01; 展位号&#xff1a;3C馆A51 苏州辰安塑业有限公司&#xff0c;是一家专业从事塑料托盘、吹塑托盘、塑料卡板箱、塑料周转箱、塑料物流箱、…

北京十大金牌律师事务所(2024年权威高胜诉率推荐)

律师职业本身&#xff0c;是一个看起来很美、说起来很烦、听起来很阔、做起来很难的职业。所谓术业有专攻&#xff0c;律师的专业就是解决法律纠纷&#xff0c;负责为个人和组织提供法律咨询和代理法律服务。律师在执行其职责时需要遵守道德准则和法律规定&#xff0c;并以客户…

Compose 可组合项 - DatePicker、DatePickerDialog

一、概念 一般是以对话框的形式呼出&#xff0c;DatePickerDialog 就是对 DatePicker 的一个简单对话框封装。 Composable fun DatePicker( state: DatePickerState, modifier: Modifier Modifier, dateFormatter: DatePickerFormatter remember { DatePickerFor…

JSR303校验

校验的需求 前端请求后端接口传输参数&#xff0c;需要校验参数。 在controller中需要校验参数的合法性&#xff0c;包括&#xff1a;必填项校验、数据格式校验等在service中需要校验业务规则&#xff0c;比如&#xff1a;课程已经审核过了&#xff0c;所以提交失败。 servi…

面料识别技术:AI如何提升服装行业的效率与创新

面料识别技术&#xff1a;AI如何提升服装行业的效率与创新 随着人工智能技术的飞速发展&#xff0c;AI大模型在各个领域都展现出了其强大的应用潜力。特别是在服装行业&#xff0c;AI大模型的图片识别技术正在成为面料识别和设计创新的重要工具。本文将探讨AI大模型在服装行业…

vivado PIN

描述 引脚是基元或层次单元上的逻辑连接点。引脚允许 要抽象掉单元格的内容&#xff0c;并简化逻辑以便于使用。引脚可以 是标量的&#xff0c;包含单个连接&#xff0c;或者可以定义为对多个进行分组的总线引脚 信号在一起。 相关对象 引脚连接到一个单元&#xff0c;并且可以…