Linux 驱动面试问题总结

1、 Linux 设备中字符设备和块设备的主要区别是什么?请分别列举一些实际设备,并说明它们属于哪种设备。

字符设备:字符设备是可以像字节流一样访问的设备(类似于文件)。通过/dev目录下的设备文件节点访问。这个特性是由字符设备驱动程序实现的。字符设备驱动程序通常至少实现 open、close、read 和 write 系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡、显卡都是典型的字符设备。

块设备:与字符设备类似,块设备也是通过/dev目录下的设备文件节点访问的。块设备可以容纳文件系统,例如 U 盘、SD 卡和磁盘。

字符设备和块设备的区别仅在于内核管理数据的方式,即内核和驱动程序之间的软件接口,这些区别对用户是透明的。在内核中,块驱动与字符驱动相比,有着完全不同的接口。

2、 应该用什么命令查看驱动模块中的打印信息?如何查看内核中现有字符设备的信息?如何查看正在使用的中断号?

1. 可以通过dmesg查看驱动模块的加载信息;或者在/proc/sys//中增加内核的打印级别。

2.可以通过/sys/class/中设备对应的文件夹中的信息查看设备号、驱动名称等信息;或者通过/proc/文件中的信息查看设备号;或者查看字符设备信息,可以使用lsmod和lsmod查看模块的依赖关系,模块加载时会加载其他依赖模块。

3.当前使用的中断号可以通过查看/proc/文件中的信息获得。

3、在Linux中引入模块机制有什么好处?

首先,模块提前注册自己以服务未来的请求,然后它的初始化函数立即结束。也就是说,模块初始化函数的任务就是为以后调用该函数提前做好准备。

优点:

1) 应用退出时,可以忽略资源的释放或其他清理任务,但模块的退出函数必须小心的撤销初始化函数所做的一切。

2) 这种机制有助于缩短模块的开发周期,即:注册和卸载既灵活又方便。

4、 () 和 () 的主要作用是什么?结构中一般使用哪些函数?

因为内核空间和用户空间是不能互相访问的,如果需要访问,就必须使用内核函数来读写数据。 () 完成从内核空间到用户空间的拷贝; () 完成从用户空间到内核空间的拷贝。一般用于结构体中的读、写、ioctl等内存数据交换功能。当然,如果ioctl不使用内存数据拷贝,那么这两个函数就不用了。

5、 请简述主设备号和次设备号的用途。如果执行 mknod c 4 64,则创建一个设备。请分析您使用的是哪种类型的设备驱动程序。

1) 主设备号:主设备号标识了该设备对应的驱动,即某种类型的设备。虽然现代linux内核允许多个驱动共享主设备号,但我们看到的大部分设备还是按照“一个主设备对应一种驱动”的原则组织的。

次设备号:次设备号是内核用来正确判断设备文件所指向的设备鼠标宏和驱动有什么区别,即某个设备。根据驱动程序的编写方式,我们可以通过次设备号获取内核设备的直接指针,也可以将此设备号作为设备本地数组的索引。

2)mknod c 4 64 表示创建设备节点,c表示字符设备,主设备号为4(即第4类驱动),从设备号为64(即第 4 类驱动程序)第 64 号设备)。由驱动程序4管理,这个文件指向的设备是第64个设备。 (感觉类似于串口终端或者字符设备终端)

6、如何在设备驱动中注册字符设备?分别说明其几个参数的含义。

注册字符设备驱动有两种方式:

1) void (cdev *cdev, *fops)

添加int (cdev *p, dev_t dev, count)的组合。

该函数可以将 cdev 结构嵌入到它自己的特定于设备的结构中。 cdev是结构体cdev的指针,fops是类似结构体的指针(可以是结构体,但不限于这种结构体)。作用是给系统添加一个cdev,完成字符设备的注册

2) int (int Major, const char *name, *fops);

注册函数是早期注册函数,major是设备的主设备号,name是驱动的名字,fops是默认结构体(这里只限于结构体)。对于调用,为给定的主设备号注册0-255作为次设备号,并为每个设备建立相应的默认cdev结构。

7、 请简述中断和DMA的区别。 Linux设备驱动中,哪个函数用于注册和注销中断处理程序?

1)DMA:它是一种硬件机制,允许在外围设备和系统内存之间进行双向数据传输,而无需 CPU 的参与。使用 DMA 允许系统 CPU 从实际 I/O 传输数据。摆脱它,从而大大提高系统的吞吐率。

中断:指CPU在执行程序的过程中,当发生某些紧急情况时,CPU必须暂停当前程序的执行,然后再转移处理突发事件。处理完成后,CPU 返回到源程序被中断的位置。并继续执行。

所以中断和DMA的区别在于DMA不需要CPU参与,而中断需要CPU参与。

2)中断注册函数和中断取消函数

注册中断:

int (int irq, (*)(int, void *, *), long flags, const char *, void *);

参数含义为:中断号、中断处理函数、中断管理相关掩码、中断请求设备名称、中断信号线。

流程为:设备请求中断->CPU分配中断号->设置中断管理掩码->分配中断信号线->处理中断函数->完成后返回原加工程序继续加工程序到设置。

退出中断

void (int irq, void *);

释放中断和中断信号线

8、中断和轮询哪个更有效率?如何决定使用中断方式还是轮询方式来实现驱动?

中断是CPU处于被动状态接收设备的信号,而轮询是CPU主动询问设备是否有请求。任何事情都有两个方面,所以当你看效率时,你不能简单地说效率高。如果请求设备是频繁请求cpu的设备或请求大量数据的网络设备鼠标宏和驱动有什么区别,那么轮询效率高于中断。如果是通用设备,并且请求cpu的设备频率比较低,中断效率就比较高。主要取决于请求的频率。

9、 简述驱动设计中发送和接收数据帧的过程。

1)发送过程如下:

(1)网络设备驱动从上层协议传递过来的参数中获取数据包的有效数据和长度,并将有效数据放入临时缓冲区。

(2)对于以太网,如果有效数据的长度小于以太网冲突检测所需的数据帧的最小长度,则在临时缓冲区的末尾填充0

(3)设置硬件寄存器驱动网络设备发送数据。

2)接收过程

网络设备接收到的数据主要是由设备的中断处理功能引起的。中断处理函数决定了中断的类型。如果是接收中断,则读取接收到的数据,分配数据结构和数据缓冲区,然后接收数据。将数据拷贝到数据缓冲区,调用()函数传递给上层协议。

1 在0、.c的驱动中,为什么发送数据帧的过程需要关闭中断?为什么接收数据帧的过程需要关闭中断?

发送过程中不可中断。在发送过程中,中断没有关闭。这时候,如果有中断来了,那么cpu可能会响应中断。如果中断需要重写,数据是发送数据缓冲区,然后缓冲区会被重写,这样即使cpu响应中断然后发送数据,接收方也不会识别到数据无法接收.

接收数据时需要开启中断,因为接收到的数据必须及时响应。如果中断关闭,接收方可能因为相应的高优先级中断而收不到数据。

11、 简述这个数据结构在网络结构中的作用,为什么需要一个,主要是在哪里分配和释放?

结构很重要。意思是“套接字缓冲区”,用于在Linux网络子系统的覆盖层之间传输数据。

Linux内核的网络处理模块在发送数据包时,必须创建一个要传输的数据包,然后提交给下层,每层添加不同的协议头,直到发送到网络设备同样,当网络设备接收到来自网络介质的数据包时,必须将接收到的数据转换成数据结构传递给上层。覆盖层不会丢弃相应的协议头,直到它交给用户。分配应在验收开始时分配,发送数据后即可释放。

12、如何为字符驱动设备创建设备文件

手动创建: mknod /dev/led c 250 0 其中 dev/led 是设备节点 c 代表字符设备 250 代表主设备号 0 代表次设备号

还有自动创建设备文件的udev/medv:udev/medv是一个运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件。在用户模式下运行意味着系统正在运行。在/etc/init.d/rcS脚本文件中,会执行mdev -s自动创建设备节点。

13、 编写中断服务需要注意什么?产生中断后还有很多事情要做怎么办?

中断处理例程越短越好,能放在后半部分的任务(等待队列等)尽量放在后半部分。

编写中断服务程序时,注意快进快出。在中断服务程序中尽快收集信息,包括硬件信息,然后退出中断。您可以使用工作队列或方法来做其他事情。那就是打断上下两半。

第二:中断服务程序中不能有阻塞操作。应该是中断时CPU完全被占用(即没有内核调度),中断被阻塞,其他进程将无法运行;

第三:中断服务程序关注返回值,使用操作系统定义的宏作为返回值,而不是自定义的OK、FAIL等。

14、 互斥使用自旋锁和信号量需要注意什么?中断服务例程中的互斥锁使用的是自旋锁还是信号量?还是两者都可以用?为什么?

使用自旋锁的进程不能休眠,使用信号量的进程可以休眠。

中断服务程序中的互斥使用了自旋锁。原因是在中断处理程序中关闭了硬中断;但是,需要注意的是,这会丢失可能的传入中断。

15、如何理解原子操作?为了实现互斥,能不能把一个变量定义为一个标记为一个资源,并且只有一个用户?

原子操作是指不能被中断的操作。

第二句的意思:

定义一个变量,如int flag =0;

if(flag == 0)

{

标志 = 1;

操作临界区;

标志 = 0;

}

16、 一个驱动模块,会执行模块中的哪些功能? rmmod 呢?这两个功能的设计要注意什么?卸载驱动时遇到过异常吗?导致问题的原因是什么?

调用init函数,rmmod调用exit函数。这两个功能在设计时应该注意什么?卸载模块时,卸载失败,因为进程正在使用该模块。查了一下代码,发现出现了死锁问题。

注意init函数中请求的资源要在exit函数中释放,包括、、work queue等。即一个模块注册到内核中,退出内核时要清除它带来的影响,带走一切,不留痕迹。

17、为什么要在驱动中先操作物理绝对地址?

因为内核无法直接访问物理内存地址,所以必须先获取对应的虚拟地址。

18、 设备驱动模型的三个重要成员是什么?公交车的匹配规则是什么?我是否需要先注册驱动程序,然后在特定应用程序中注册设备?有订单吗?

设备驱动模型的三个重要成员是:总线、设备和驱动

总线的匹配规则是:要匹配的设备和驱动必须注册;

19、在linux内核中,内存申请的功能和区别是什么?

()、()、()

20、 IRQ 和 FIQ 有什么区别,在 CPU 中是怎么做的?

22、 中断的上下部分问题:为什么要分下部分的原因,为什么要分上部分和下部分?告诉我如何实现它?

上半部分进行硬件相关的处理,要求速度快。而有些驱动程序需要在中断处理程序中完成大量工作,这就构成了矛盾。因此,Linux 有所谓的 half 机制。所有不需要立即完成的中断处理程序都由程序的下半部分在启用中断的环境中完成。 .

Linux 处理的后半部分实际上是基于内核的软中断机制。如何实现这个机制?

两种方式:

[工作队列]

1.定义和初始化

tlet;

(&tlet,, (long) 数据);

参数

第一个:定义的变量

第二个:函数

第三:Data 传递给回调函数的数据

2. 定义函数

void(长参数)

{

//中断的下半部分 当这个函数执行的时候,已经发生了中断

(“in =%ldn”,);

}

3. 需要调度的地方调用以下函数

(&tlet);

一般在中断函数中调度,不迟于下一个时钟滴答执行。

[普通设备的区别]

1. 执行时间

定时器的执行:时间确定

:不确定

2. 执行耗时操作

23、核函数mmap的实现原理和机制?

mmap 函数实现了一个文件被映射到一个内存区域,这样我们就可以像读写内存一样读写文件,这比单纯调用read/write要快很多。在某些时候,我们可以将内存中的内容复制到文件中以实现内存备份。当然,您也可以将文件内容映射到内存来恢复某些服务。此外,mmap 实现共享内存也是其主要应用之一。 mmap 系统调用使进程能够通过映射相同的公共文件来实现共享内存。

24、 为什么驱动中有并发互斥控制?如何实现?举个例子?

25、自旋锁是如何实现的?

自旋锁一次最多只能被一个内核任务持有,所以一次只能有一个线程存在于临界区。这可以应用于多处理机器或在单个处理器上运行的抢占式内核所需的锁定服务。

26、信号量介绍

这里也介绍了信号量的概念,因为它的用法类似于自旋锁。

Linux 中的信号量是睡眠锁。如果有任务试图获取一个已被持有的信号量,信号量会将其推入等待队列,然后将其置于睡眠状态。处理器现在可以自由执行其他代码。当持有信号量的进程释放信号量时,等待队列中的任务会被唤醒,从而获取信号量。

27、 任务调度的机制?

28、什么是GPIO?

输入/

GPIO 是相对于芯片本身而言的。如果某个管脚是芯片的GPIO 管脚,则该管脚可以作为输入或输出高低电平。当然,一个管脚具有复用功能,即可以作为GPIO或者其他用途。换句话说,您可以将这些引脚用于任何通用输入和输出,例如,使用引脚连接到 LED 的一个极来控制其通断,或者您可以使用(某些)引脚连接 Go到传感器获取传感器的状态,这为cpu控制外围设备提供了一种便捷的方式。如果gpio管脚不够,将无法控制一些外围设备。这时候可以采取的解决办法就是使用CPLD来帮助管理。

29、在Linux C中,ls命令是如何执行的?

使用fork创建进程或exec函数族覆盖原进程。

30、LINUX下的和LINUX下的有什么共同点?请从C/C++语言开始

a) 基于 TCP/IP 协议,均提供面向连接的 TCP SOCK 和无连接的 UDP SOCK。

b) 是袜子结构。

c) 全部使用 sock 文件句柄进行访问。

d) 都有缓冲机制。

31、 一个打算运行LINUX系统的ARM系统烧录进去后,上电后串口没有输出。硬件和软件应该检查​​什么?

提醒:1.运行LINUX的系统一般需要外扩DRAM,一般系统常有NOR或NAND FLASH

一般是用汇编和C编写的裸奔程序[5分]

文章来源:https://blog.csdn.net/lpwsw/article/details/122248883

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享