linux驱动工程师面试题整理

1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用

程序打开使用的文件?

答: mknod 命令结合设备的主设备号和次设备号,可创建一个设备文件。

评:这只是其中一种方式,也叫手动创建设备文件。还有 UDEV/MDEV 自动创建设备文件的方式,UDEV/MDEV 是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。那末在系统启动期间还有 devfs 创建了设备文件。一共有三种方式可以创建设备文件。

2、写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?答:中断处理例程应该尽量短,把能放在后半段(tasklet,等待队列等)的任务尽量放在后半段。

评:写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬件信息,然后推出中断,要做其它事情可以使用工作队列或者 tasklet 方式。也就是中断上半部和下半部。

第二:中断服务程序中不能有阻塞操作。为什么?大家可以讨论。

第三:中断服务程序注意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的OK,FAIL 之类的。

3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么?

答:使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。

4、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源惟独一个使用者行不行?

答:原子操作指的是无法被打断的操作。我没懂第二句是什么意思,自己定义一个变量怎么可能标记资源的使用情况?其他进程又看不见这个变量

评:第二句话的意思是:

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

if(flag == 0)

{

flag = 1;

操作临界区;

flag = 0;

}这样可否?

5、insmod 一个驱动模块,会执行模块中的哪个函数? rmmod 呢?这两个函数在设计上要注意哪些?遇到过卸载驱动浮现异常没?是什么问题引起的?

答: insmod 调用 init 函数, rmmod 调用 exit 函数。这两个函数在设计时要注意什么?卸载模块时曾经浮现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁的问题。

评:要注意在 init 函数中申请的资源在 exit 函数中要释放,包括存储, ioremap,定时器,工作队列等等。也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一切不留下一点痕迹。

6、在驱动调试过程中遇到过 oops 没?你是怎么处理的?

7、ioctl 和 unlock_ioctl 有什么区别?

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

答:因为内核没有办法直接访问物理内存地址,必须先通过 ioremap 获得对应的虚拟地址。

9、设备驱动模型三个重要成员是? platfoem 总线的匹配规则是?在具体应用上要不要先注册驱动再注册设备?有先后顺序没?

10、linux 中内核空间及用户空间的区别?用户空间与内核通信方式有哪些?

11、linux 中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化,高端内存概念?

12、linux 中中断的实现机制,tasklet 与 workqueue 的区别及底层实现区别?为什么要区分上半部和下半部?

13、linux 中断的响应执行流程?中断的申请及何时执行(何时执行中断处理函数)?

14、linux 中的同步机制?spinlock 与信号量的区别?

15、linux 中 RCU 原理?

16、linux 中软中断的实现原理?

17、linux 系统实现原子操作有哪些方法?

18、MIPS Cpu 中空间地址是怎么划分的?如在 uboot 中如何操作设备的特定的寄存器?

19、linux 中系统调用过程?如:应用程序中 read()在 linux 中执行过程即从用户空间到内核空间?

20、linux 内核的启动过程(源代码级)?

21、linux 调度原理?

22、linux 网络子系统的认识?

23、linux 内核里面,内存申请有哪几个函数,各自的区别?

Kmalloc() __get_free_page() mempool_create()

24. IRQ 和 FIQ 有什么区别,在 CPU 里面是是怎么做的?

25. 中断的上半部份和下半部份的问题:讲下分成上半部份和下半部份的原因,为何要分?

讲下如何实现?

上半部份执行与硬件相关的处理要求快, 而有些驱动在中断处理程序中又需要完成大量工作,这构成矛盾,所以 Linux 有所谓的 bottom half 机制,中断处理程序中所有不要求即将完成的,在开中断的环境下,由底半程序随后完成.

Linux 的底半处理实际上是建立在内核的软中断机制上的.

Linux 的底半机制主要有 Tasklet 和 work queue 以及 softirq ( 2.4 内核则有 BH , Task queue , softirq , tasklet 没有 work queue),其实底半可以理解成一种工作的延迟。所以实际使用时跟 timer 机制基本上一个意思。

26. 内核函数 mmap 的实现原理,机制?

mmap 函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用 read/write 也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,固然,也可以把文件的内容映射到内存来恢复某些服务。此外,mmap 实现共享内存也是其主要应用之一,mmap 系统调用使得进程之间通过映射同一个普通文件

实现共享内存。

27. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?

28. spinlock 自旋锁是如何实现的?

自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻惟独一个线程允许存在于临界区中。这点可以应用在多处理机器、或者运行在单处理器上的抢占式内核中需要的锁定服务。

这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。 linux 中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

29. 任务调度的机制?

30. 嵌入式 linux 和 wince 操作系统的特点和特性?

31. 嵌入式 linux 中 tty 设备驱动的体系结构?

32. 嵌入式设备,为加快启动速度,可以做哪些方面的优化?

33. USB 设备的枚举过程?

(1) Get Device Descriptor。主机的第一个命令要求得到设备描述符,此 SETUP 包为 8 个字节数据( 80,06,00,01,00,00,40,00 ) ,发向地址 0,端口 0。“40”表示返回数据长度最大为 40H 个字节。实际上,只返回一个包,即数组 DEV_DESC[ ]中的前 8 个字节,用于说明

设备的描述符的真实长度和设备的类型。

(2) Set Address。接着是设置设备地址处理事件,主机发送一个含有指定地址的数据包( 00, 05,02,00,00,00,00,00 ) ,在主机惟独一个 USB 设备的时候,这个地址普通会是 2,最大地址 127,USB 协议中可以连接 127 个设备。设置地址事件处理结束后,设备进入地址状态,主机以后会在新的指定地址处访问设备。

(3) Get Device Descriptor。主机再次发送请求得到设备描述符的数据包( 80,06,00, 01,00,00,12,00 ) ,与上次不同的是,要求的数据的长度是实际的数据长度,同时是发送到 Set Address 命令所设置的地址。

(4) 读取全部 Configuration Descriptor。接着主机要求得到设备全部的配置描述符、接口描述符和节点描述符( 80,06,00,02,00,00,40,00 ) ,由于主机不知道设备描述符的真实长度,因此它要求得到 64 个字节。

(5) Set Interface,主机发送数据包( 01,0B,00,00,00,00,00,00 ) ,设置接口值为0。

(6) Set Conifguration,确定 USB 设备工作在哪一个配置下。对于 U 盘设备来说,普通只有 1 个配置值,其值为 01。主机发送数据包( 00,09,01,00,00,00,00,00 ) 。

(7) 如果以上步骤都正确,主机将找到新设备,并且配置成功,该设备可以正常使用,可以进行后续的 U 盘枚举过程了。

(8) 用 busHound 观察计算机对于 U 盘的枚举过程,发现上述步骤后还有一个 GetMaxLun 的操作,但是实际上对于 U 盘来说忽略该步骤也没有问题。

34. PSRAM、SDRAM、DDR、DDR2 的时序特性?

35.什么是 GPIO?

general purpose input/output

GPIO 是相对于芯片本身而言的,如某个管脚是芯片的GPIO 脚,则该脚可作为输入或者输出高或者低电平使用,固然某个脚具有复用的功能,即可做 GPIO 也可做其他用途。

也就是说你可以把这些引脚拿来用作任何普通用途的输入输出,例如用一根引脚连到 led 的一极来控制它的亮灭,也可以用一根 (一些) 引脚连到一个传感器上以获得该传感器的状态,这给 cpu 提供了一个方便的控制周边设备的途经。如果没有足够多的 gpio 管脚,在控制一些外围设备时就会力有不逮,这时可采取的方案是使用 CPLD 来匡助管理。

36.触摸屏的硬件原理?

触摸屏的主要三大种类是:电阻技术触摸屏、表面声波技术触摸屏、电容技术触摸屏。电

阻触摸屏的主要部份是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或者硬塑料平板作为基层,表面图有一层透明氧化金属 ( ITO 氧化铟,透明的导电电阻) 导电层,上面在盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层 ITO 涂层、在他们之间有许多细小的 (小于 1/1000 英寸 ) 的透明隔离点把两层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,控制器侦测到这一接触并计算出( X,Y )的位置,再根据摹拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。

表面声波技术是利用声波在物体的表面进行传输,当有物体触摸到表面时,妨碍声波的传输,换能器侦测到这个变化,反映给计算机,进而进行鼠标的摹拟。

电容技术触摸屏利用人体的电流感应进行工作。用户触摸屏幕时,由于人体电场,用户和触摸屏表面形成以一个耦合电容,对于高频电流来说,电容是直接导体,于是手指从接触点吸走一个很小的电流

37.在 Linux C 中,ls 这个命令是怎么被执行的?

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

38.在一个惟独 128M 内存并且没有交换分区的机器上,说说下面两个程序的运行结果

1

#define MEMSIZE 1024*1024

int count = 0;

void *p = NULL;

while(1) {

p = (void *)malloc(MEMSIZE);

if (!p) break;

}

2

while(1) {

p = (void *)malloc(MEMSIZE);

if (!p) break;

memset(p, 1, MEMSIZE);

}

第一道程序分配内存但没有填充,编译器可能会把内存分配优化掉,程序死循环;第二道,程序分配内存并进行填充,系统会向来分配内存,直到内存不足,退出循环。

39.请定义一个宏,比较两个数 a、b 的大小,不能使用大于、小于、 if 语句

搞的比较复杂。主要思想就是 a-b 的值的最高位是否为 0;但是又得考虑整数溢出的问题,所以很复杂。不知道哪位大侠有更好的办法,指点指点。

#include

#define ZHENG(i)((i>> 31)== 0)

#define FU(i)((i>> 31)!= 0)

#define COMPARE(a,b)((ZHENG(a)&& FU(b)) | | (((ZHENG(a)&&

ZHENG(b)) | | (FU(a)&&FU(b)))&&((((a)- (b))>> 31)== 0)))

void main()

{

int a = 0x80000001;

int b = 0x6FFFFFFF;

if(COMPARE(a,b))

{

}

else

{

}

}

40、LINUX 下的 Socket 套接字和 Windows 下的 WinSock 有什么共同点?请从 C/C++语言开

发的角度描述,至少说出两点共同点。

参考答案:

第 1 题,答中一个得 5 分,答出其它正确答案的,也得 5 分。

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

b)都是一个 sock 结构体。

c)都是使用 sock 文件句柄进行访问。

d)都具有缓冲机制。

41、请编写一个标准 Shell 脚本 testd,实现如下功能:

A、在 Linux 操作系统启动的时候,自动加载/mnt/test/test 程序。

B、当 test 异常退出之后,自动重新启动。

C、当 test 程序重启次数超过 100 次,自动复位操作系统。

假设你所拥有的资源:

A、目标机器是一台具有标准 shell 的嵌入式计算机, CPU 为 ARM7 56MB,内存 16MB,软件环境基于 Linux2.6.11 和 BusyBox1.2 构建。

B、当前已有 11 个用户进程在运行,占用了大部份的 CPU 时间和内存,你可使用的内存惟独

2MB 摆布, CPU 时间由系统分派。

本题是考查 LINUX 和嵌入式编程功底的,写出程序来的不少,但是 95%以上的人竟无视我假设的资源,不知道在重启 test 程序的时候需要加之一个适当的掩饰时间,以便资源紧张的操作系统有时间回收资源。 85%的人不知道写完 testd 之后,要在 init 里边加载这个脚本,

才干实现启动时自动加载的功能。

参考答案:

########################################

#testd is a daemon script to start an watch the program test

########################################

#!/bin/sh

#load *.so that may need

if [ -r /sbin/ldconfig ]; then

ldconfig

fi

#add the libs PATH that may need

#count is the counter of test started times

count=0

#main loop

while [ 1 ] ;do

#add execute property for /mnt/test/test

chmod +x /mnt/test/test

#start test

/mnt/test/test

#the running times counter

let count=count+1

#Is test running too many times?

reboot

fi

#wait for test stoping...

sleep 3

done

#################################

########

42.你寻常是怎么用 C 写嵌入式系统的死循环的?

43.写一条命令,实现在 dir 以及其子目录下找出所有包含“hello world”字符串的文件

44.下面的两段程序中,循环能否执行?为什么?

A: unsigned short i; unsigned short index = 0; for(i = 0; i

i++){ printf( “a”); }

B: unsigned short i; unsigned long index = 0; for(i = 0; i

i++){ printf( “b ”); }

45.一个计划跑 LINUX 系统的 ARM 系统把 bootloader 烧录进去后,上电后串口上没有任何输出,硬件和软件各应该去检查什么?

提示: 1.跑 LINUX 的系统普通都需要外扩 DRAM,普通的系统也时常有 NOR 或者 NAND FLASH

476 列举至少 3 种你所知道的嵌入式的体系结构,并请说明什么是 ARM 体系结构。

47.请简述下面这段代码的功能

mov r12, #0x0

ldr r13, =0x30100000

mov r14, #4096

loop:

ldmia r12!, {r0-r11}

stmia r13!, {r0-r11}

cmp r12, r14

bl loop

48.嵌入式中常用的文件系统有哪些?说出它们的主要特点和应用场合?

49.某外设寄存器 rGpioBase 的地址是 0x56000000,寄存器的 0~15 位有效,请写出给外设寄存器高八位(8~`15 位)设置成 0xc3 的代码

50.如何编写一个 LINUX 驱动?

提示:主要说字符设备的编写过程

51.简述 LINUX 驱动中字符设备和块设备的区别?

52.试总结单片机底层开辟与 LINUX 驱动开辟有哪些异同?

53.请从网卡、 USB HOST、LCD 驱动器、 NAND FLASH、WIFI 、音频芯片中选择一个或者 2 个(可以以具体的芯片为例),对下面的问题做答:

1)如果是外部扩展芯片,请说出你用的芯片的型号 2)

画出上题中你选定相应硬件模块与 CPU 的主要引脚连线

3) 编写上题中你选定相应硬件模块相应 LINUX 驱动的流程?

54、linux 驱动分类

Linux 设备驱动的分类

( 1 )字符设备。

( 2 ) 块设备。

( 3 ) 网络设备。

字符设备指那些必须以串行顺序挨次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备和块设备并没有明显的界限,如对于Flash 设备,符合块设备的特点,但是我们仍然可以把它作为一个字符设备来访问。网络设备在 Linux 里做专门的处理。Linux 的网络系统主要是基于 BSD unix 的 socket 机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。

55、信号量与自旋锁

自旋锁

自旋锁是专为防止多处理器并发而引入的一种锁,它应用于中断处理等部份。对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁。

自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那末这个任务就会向来进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。

事实上,自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特殊浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长期锁定的话, 最好使用信号量。但是自旋锁节省了上下文切换的开消。

自旋锁的基本形式如下:

spin_lock(&mr_lock);

//临界区

spin_unlock(&mr_lock);

信号量和自旋锁区别

从严格意义上讲,信号量和自旋锁属于不同层次的互斥手段,前者的实现有赖于后者。注意以下原则:

如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。此外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。

自旋锁对信号量

需求

低开消加锁

短期锁定

长期加锁

中断上下文中加锁

持有锁是需要睡眠、调度建议的加锁方法优先使用自旋锁优先使用自旋锁优先使用信号量使用自旋锁

使用信号量

因为自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻惟独一个线程允许存在于临界区中。这点很好地满足了对称多处理机器需要的锁定服务。在单处理器上,自旋锁仅仅当做一个设置内核抢占的开关。如果内核抢占也不存在,那末自旋锁会在编译时被完全剔除出内核。

简单的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。此外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——因为睡眠有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁),它能够在中断上下文中使用。

死锁:假设有一个或者多个内核任务和一个或者多个资源,每一个内核都在等待其中的一个资源,但所有的资源都已经被占用了。这便会发生所有内核任务都在相互等待,但它们永远不会释放已经占有的资源,于是任何内核任务都无法获得所需要的资源,无法继续运行,这便意味着死锁发生了。自死琐是说自己占有了某个资源,然后自己又申请自己已占有的资源,显然不可能再获得该资源,因此就自缚手脚了。递归使用一个自旋锁就会浮现这种情况。

信号量

信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

信号量的睡眠特性,使得信号量合用于锁会被长期持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;此外当代码持有信号量时,不可以再持有自旋锁。

信号量基本使用形式为:

static DECLARE_MUTEX(mr_sem);//声明互斥信号量

if(down_interruptible(&mr_sem))

//可被中断的睡眠,当信号来到,睡眠的任务被唤醒

//临界区

up(&mr_sem);

56、platform 总线设备及总线设备如何编写

57、kmalloc 和 vmalloc 的区别

kmalloc()和 vmalloc()介绍

kmalloc()

用于申请较小的、连续的物理内存

1. 以字节为单位进行分配,在

2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上自然连续

3. gfp_mask 标志:什么时候使用哪种标志?如下:

———————————————————————————————-

情形相应标志

———————————————————————————————-

进程上下文,可以睡眠 GFP_KERNEL

进程上下文,不可以睡眠 GFP_ATOMIC

中断处理程序 GFP_ATOMIC

软中断 GFP_ATOMIC

Tasklet GFP_ATOMIC

用于 DMA 的内存,可以睡眠 GFP_DMA | GFP_KERNEL

用于 DMA 的内存,不可以睡眠 GFP_DMA | GFP_ATOMIC

———————————————————————————————-

4. void kfree(const void *ptr)

释放由 kmalloc()分配出来的内存块

vmalloc()

用于申请较大的内存空间,虚拟内存是连续的

1. 以字节为单位进行分配,在

2. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续,物理地址不连续

3. 普通情况下,惟独硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于 MMU 之外,根本不了解虚拟地址;但为了性能上的考虑,内核中普通使用 kmalloc(),而惟独在需要获得大块内存时才使用 vmalloc(),例如当模块被动态加载到内核之中时,就把模块装载到由 vmalloc()分配的内存上。

4.void vfree(void *addr),这个函数可以睡眠,因此不能从中断上下文调用。

malloc(), vmalloc()和 kmalloc()区别

[*]kmalloc 和 vmalloc 是分配的是内核的内存,malloc 分配的是用户的内存 [*]kmalloc

保证分配的内存在物理上是连续的,vmalloc 保证的是在虚拟地址空间上的连续,malloc 不

保证任何东西(这点是自己猜测的,不一定正确)

[*]kmalloc 能分配的大小有限,vmalloc 和 malloc 能分配的大小相对较大

[*]内存惟独在要被 DMA 访问的时候才需要物理上连续

[*]vmalloc 比 kmalloc 要慢

58、module_init 的级别

59、添加驱动

静态加载和动态加载:

静态加载是系统启动的时候由内核自动加载的,这个要事先将驱动编译进内核才行;

动态加载,也就是模块加载方式,这种方式下驱动以模块的形式存放在文件系统中,需要时动态载入内核,这种主要用在调试的时候,比较方便灵便。 insmod module.ko

60、IIC 原理,总线框架,设备编写方法, i2c_msg

61、kernel panic

62、USB 总线, USB 传输种类, urb 等

USB 总线:

USB 总线属于一种轮询式总线,主机控制端口初始化所有的数据传输。每一总线动作最多传送三个数据包,包括令牌(Token)、数据(Data)、联络(HandShake)。按照传输前制定好的原则,在每次传送开始时,主机送一个描述传输动作的种类、方向、 USB 设备地址和终端号的USB 数据包,这个数据包通常被称为令牌包 (TokenPacket)。USB 设备从解码后的数据包的适当位置取出属于自己的数据。数据传输方向不是从主机到设备就是从设备到主机。在传输开始时,由标志包来标志数据的传输方向,然后发送端开始发送包含信息的数据包或者表明没有数据传送。接收端也要相应发送一个握手的数据包表明是否传送成功。发送端和接收端之间的 USB 数据传输,在主机和设备的端口之间,可视为一个通道。USB 中有一个特殊的通道一缺省控制通道,它属于消息通道,设备一启动即存在,从而为设备的设置、状态查询和输入控制信息提供一个入口。

USB 总线的四种传输类型:

1、中断传输:由 OUT 事务和 IN 事务构成,用于键盘、鼠标等 HID 设备的数据传输中

2、批量传输:由OUT 事务和 IN 事务构成,用于大容量数据传输,没有固定的传输速率,也不占用带宽,当总线忙时, USB 会优先进行其他类型的数据传输,而暂时住手批量转输。

3、同步传输:由 OUT 事务和 IN 事务构成,有两个特殊地方,第一,在同步传输的 IN 和OUT 事务中是没有返回包阶段的;第二,在数据包阶段任何的数据包都为 DATA0

4、控制传输:最重要的也是最复杂的传输,控制传输由三个阶段构成 (初始配置阶段、可选数据阶段、状态信息步骤) ,每一个阶段能够看成一个的传输,也就是说控制传输其实是由三个传输构成的,用来于USB 设备初次加接到主机之后,主机通过控制传输来交换信息,设备地址和读取设备的描述符,使得主机识别设备,并安装相应的驱动程式,这是每一个 USB 研发者都要关心的问题。URB:

USB 请求块 ( USB request block,urb ) 是 USB 设备驱动中用来描述与 USB 设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的 sk_buff 结构体,是 USB 主机与设备通信的“电波”。

63、同步和互斥

同步和互斥

相交进程之间的关系主要有两种,同步与互斥。所谓互斥,是指散步在不同进程之间的

若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一

程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同

进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后

次序依赖于要完成的特定的任务。

显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个线

程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才干运行,

而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!

总结:

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有惟一性和排它性。但互

斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上 (大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特殊是所有写入资源的情况必然是互斥的。少

数情况是指可以允许多个访问者同时访问资源

64、 Linux 设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出

它们是属于哪一类设备。

答:字符设备:字符设备是个能够像字节流 (类似文件)一样被访问的设备,由字符设备

驱动程序来实现这种特性。字符设备驱动程序通常至少实现 open,close,read 和write 系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。

块设备:和字符设备类似,块设备也是通过/dev 目录下的文件系统节点来访问。块设备上

能够容纳文件系统,如:u 盘,SD 卡,磁盘等。

字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序

之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱

动程序具有彻底不同的接口

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

答:1) 查看驱动模块中打印信息的命令:dmesg

2) 查看字符设备信息可以用 lsmod 和 modprobe,lsmod 可以查看模块的依赖关系,modprobe 在加载模块时会加载其他依赖的模块。

3)显示当前使用的中断号 cat /proc/interrupt

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

答:首先,模块是预先注册自己以便服务于将来的某个请求,然后他的初始化函数就即将结束。换句话说,模块初始化函数的任务就是为以后调用函数预先作准备。

好处:

1) 应用程序在退出时,可以不管资源的释放或者其他的清除工作,但是模块的退出函数却

必须子细此撤销初始化函数所作的一切。

2) 该机制有助于缩短模块的开辟周期。即:注册和卸载都很灵便方便。

67、copy_to_user()和 copy_from_user()主要用于实现什么功能?普通用于

file_operations 结构的哪些函数里面?

答:由于内核空间和用户空间是不能互相访问的,如果需要访问就必须借助内核函数进行数据读写。 copy_to_user():完成内核空间到用户空间的复制, copy_from_user():是完成用户空间到内核空间的复制。普通用于 file_operations 结构里的 read,write,ioctl 等内存数据交换作用的函数。固然,如果 ioctl 没实用到内存数据复制,那末就不会用到这两个函数。

68、请简述主设备号和次设备号的用途。如果执行 mknod chartest c 4 64,创建 chartest 设备。请分析 chartest 使用的是那一类设备驱动程序。

答:

1 )主设备号:主设备号标识设备对应的驱动程序。虽然现代的 linux 内核允许多个驱动程序共享主设备号,但我们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织。

次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依赖于驱动程序的编写方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作设备本地数组的索引。

2 ) chartest 由驱动程序 4 管理,该文件所指的设备是 64 号设备。 (感觉类似于串口终端或者字符设备终端)。

69、设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。

答:注册一个字符设备驱动有两种方法:

1 ) void cdev_init(struct cdev *cdev, struct file_operations *fops)

该注册函数可以将 cdev 结构嵌入到自己的设备特定的结构中。cdev 是一个指向结构体 cdev 的指针,而 fops 是指向一个类似于 file_operations 结构(可以是 file_operations 结构,但不限于该结构)的指针.

2 ) int register_chrdev(unsigned int major, const char *namem , struct

file)operations *fopen);

该注册函数是早期的注册函数, major 是设备的主设备号, name 是驱动程序的名称,而 fops 是默认的 file_operations 结构 (这是只限于 file_operations 结构)。对于 register_chrdev 的调用将为给定的主设备号注册 0- 255 作为次设备号,并为每一个设备建立一个对应的默认 cdev 结构。

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

答: 1 ) DMA:是一种无须 CPU 的参预就可以让外设与系统内存之间进行双向数据传输的硬件机制,使用DMA 可以使系统CPU 从实际的 I/O 数据传输过程中摆脱出来,从而大大提高系统的吞吐率。

中断:是指CPU在执行程序的过程中,浮现了某些突发事件时CPU 必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU 又返回源程序被中断的位置并继续执行。所以中断和 MDA 的区别就是 MDA 不需CPU 参预而中断是需要 CPU 参预的。 2 ) 中断注册函数和中断注销函数注册中断:

int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id);

参数意义挨次是:中断号,中断处理函数,中断管理有关的掩码,中断请求设备名,中断信

号线。

过程是:dev_name 设备请求中断->cpu 分配中断号->设置中断管理的掩码->分配中断信号线 ->处理中断函数->完成之后再根据设置情况返回原处理程序处继续处理程序。

注销中断;

Void free_irq(unsigned int irq, void *dev_id);

释放中断和中断信号线

71、中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?

答:中断是 CPU 处于被中状态下来接受设备的信号,而轮询是 CPU 主动去查询该设备是否有

请求。凡事都是两面性,所以,看效率不能简单的说那个效率高。如果是请求设备是一个频

繁请求 cpu 的设备,或者有大量数据请求的网络设备,那末轮询的效率是比中断高。如果是普通设备,并且该设备请求 cpu 的频率比较底,则用中断效率要高一些。

72、简单描述在 cs8900 的驱动设计中, 发送数据 frame 和接收数据 frame 的过程。答:

1 ) 发送流程如下:

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

( 2 ) 对于以太网,如果有效数据的长度小于以太网冲突检测所要求的数据桢的最小长度,则给暂时缓冲区的末尾填充 0

( 3 ) 设置硬件寄存器,驱使网络设备进行数据发送操作。

2 ) 接收流程

网络设备接收数据主要是由中断引起设备的中断处理函数,中断处理函数判断中断类型,如果为接收中断,则读取接受到的数据,分配 sk_buff 数据结构和数据缓冲区,将接收到的数据复制到数据缓冲区,并调用netif_rx()函数将 sk_buff 传递给上层协议。

73、cs8900.c 的驱动中,发送数据 frame 的过程为什么需要关中断?接收数据 frame 的过程为什么不需要关中断?

答:在发送过程中是不能被打断的,在发送的过程中,不关中断,这时候如果有一个中断到来,那末 cpu 有可能会去相应该中断,如果该中断需要改写的数据是发送数据的缓冲区,那

么缓冲区将被改写,这样即使 cpu 相应完毕该中断,再发送数据,接收方也不认识该数据不

能接收。

在接收数据的时候,需要打开中断,是因为要及时的相应接收到的数据。如果关闭该中断,那末接收方有可能因为相应优先级高的中断而接收不到该数据。

74、简单描述 skbuff 这个数据结构在网络结构中所起到的作用,为什么需要一个 skbuff, 它

的分配和释放主要都在什么部位

答: sk_buff 结构非常重要,它的含义为“套接字缓冲区”,用于在 linux 网络子系统中的各层之间传递数据。

当发送数据包时,linux 内核的网络处理模块必须建立一个包含要传输的数据包的 sk_buff,然后将 sk_buff 递交给下层,各层在 sk_buff 中添加不同的协议头直至交给网络设备发送。同样的,当网络设备从网络媒介上接受到数据包后,它必须将接受到的数据转换为 sk_buff 数据结构并传递给上层,盖层不抛去相应的协议头直至交给用户。分配 sk_buff 在接收一开始就应该分配,在发送完毕数据之后可以释放 sk_buff。

linux 驱动面试题

linux 驱动面试题 Linux驱动面试题 Linux驱动是许多技术岗位面试过程中经常出现的一个重要考点。在这篇文章中,我将通过一系列Linux驱动面试题,帮助您更好地理解和掌握Linux驱动的相关知识。本文将涵盖从基础知识到深入理解的面试问题,旨在帮助您应对Linux驱动岗位的挑战。 1. 什么是Linux驱动? Linux驱动是用于设备与操作系统之间通信以实现设备功能的软件程序。它充当着设备硬件和操作系统之间的接口,使得操作系统能够与设备进行交互。Linux支持各种类型的驱动,包括字符设备驱动、块设备驱动和网络设备驱动等。 2. Linux驱动的加载和卸载过程是怎样的? 在Linux系统中,驱动的加载和卸载通过模块实现。首先,驱动程序将被编译为模块,然后使用insmod命令将模块加载到内核中。加载模块时,内核会执行模块的初始化函数。相反,使用rmmod命令可以将模块从内核中卸载,卸载模块时,内核会执行模块的清理函数。 3. Linux驱动的主要组成部分是什么? Linux驱动主要由两个组成部分组成:设备驱动程序和设备文件。设备驱动程序由设备主要功能的实现组成,包括硬件的初始化、读写

操作的处理以及与操作系统的交互等。设备文件是与设备驱动程序进行交互的接口,通过设备文件可以对设备进行访问和控制。 4. 请解释一下Linux中的字符设备和块设备。 字符设备是指按字节顺序进行访问的设备,其输入输出是连续、无结构的流。例如,键盘和鼠标就是字符设备。对字符设备的访问是以字节为单位进行的,一次只能读取或写入一个字符。 块设备是指以固定大小的块进行访问的设备,其输入输出是按块进行的,块的大小通常为512字节或4KB。例如,硬盘就是块设备。对块设备的访问可以一次读取或写入一个或多个块。 5. Linux驱动中的缓冲区是什么?它的作用是什么? 缓冲区是用于在内存中暂存数据的一块区域。在Linux驱动中,缓冲区用来存储从设备读取的数据或要写入设备的数据。它允许驱动程序以更高效的方式进行数据传输,提高系统的性能。 6. 请解释一下Linux驱动程序中的中断和轮询。 中断是指当设备发生某个事件时,通过向处理器发送中断信号来通知操作系统。在Linux驱动中,中断用于处理设备的异步事件,如设备输入或输出的完成。 轮询是指驱动程序通过不断地查询设备状态来检测设备的输入或输出是否已完成。在Linux驱动中,轮询用于处理一些无法使用中断的设备或对设备实时性要求不高的场景。

linux驱动面试题

linux驱动面试题 Linux驱动是指在Linux操作系统中,用于控制与硬件之间的交互 和通信的软件模块。在Linux的工作环境中,驱动程序起着至关重要的作用。如果你准备参加Linux驱动的面试,以下是一些常见的Linux驱 动面试题,希望可以对你有所帮助。 一、简述Linux驱动的作用和功能。 Linux驱动是一种软件模块,用来控制硬件设备与操作系统之间的 通信和交互。它负责将输入/输出请求传递给硬件设备,并处理来自硬 件设备的中断和事件。Linux驱动的功能包括设备初始化和配置、数据 传输和处理以及错误处理等。 二、请简要介绍Linux驱动程序的加载过程。 当系统启动时,Linux内核首先会加载核心模块和驱动程序模块。 驱动程序模块是以目标硬件设备为基础的,它们包含了与设备通信所 需的函数和数据结构。一般情况下,系统会根据硬件设备信息自动加 载对应的驱动程序模块。加载驱动程序模块需要通过insmod或modprobe命令进行,这些命令可以在启动时自动执行。 三、请简述Linux驱动程序的实现方式。 Linux驱动程序的实现方式包括内核空间驱动和用户空间驱动。内 核空间驱动是指驱动程序运行在内核空间,直接与硬件设备进行交互。用户空间驱动是指驱动程序运行在用户空间,通过系统调用和内核模 块实现与硬件设备的通信。内核空间驱动的优势是性能更好,但需要

对内核进行编译和加载,而用户空间驱动的优势是开发更加容易,但性能会稍差。 四、请介绍Linux驱动程序中常用的数据结构和函数。 在Linux驱动程序中,常用的数据结构有file结构体、inode结构体和cdev结构体等。file结构体用于表示一个打开的设备文件,可以通过它传递与设备相关的信息。inode结构体用于表示一个文件的元数据信息,包括文件的权限、大小和创建时间等。cdev结构体用于表示一个字符设备,包含了设备文件的操作函数和设备号等信息。 常用的函数包括register_chrdev、unregister_chrdev、request_irq和release_irq等。register_chrdev函数用于注册字符设备驱动,unregister_chrdev函数用于注销字符设备驱动。request_irq函数用于请求硬件设备的中断,release_irq函数用于释放硬件设备的中断。 五、请简述Linux驱动程序中的中断处理流程。 中断是指当硬件设备有特定事件发生时,通过触发中断信号来通知CPU进行处理。在Linux驱动程序中,中断处理是非常重要的环节。中断处理流程一般包括以下几个步骤: 1. 中断的触发:当硬件设备有特定事件发生时,会触发中断信号,通知CPU进行处理。 2. 中断处理程序的执行:中断处理程序是在中断上下文中运行的,它是一种特殊的函数,用于处理特定的中断事件。

linux驱动面试题

linux驱动面试题2 1.什么是GPIO? general purpose input/output GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,当然某个脚具有复用的功能,即可做GPIO也可做其他用途。 也就是说你可以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚连到led的一极来控制它的亮灭,也可以用一根(一些)引脚连到一个传感器上以获得该传感器的状态,这给cpu提供了一个方便的控制周边设备的途经。如果没有足够多的gpio管脚,在控制一些外围设备时就会力有不逮,这时可采取的方案是使用CPLD来帮助管理。 2.触摸屏的硬件原理? https://www.360docs.net/doc/f519241212.html,/Article/Maintain/Technology/175945932.htm https://www.360docs.net/doc/f519241212.html,/u2/78837/showart_1186312.html 触摸屏的主要三大种类是:电阻技术触摸屏、表面声波技术触摸屏、电容技术触摸屏。 电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面图有一层透明氧化金属(ITO氧化铟,透明的导电电阻)导电层,上面在盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层ITO涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,控制器侦测到这一接触并计算出(X,Y )的位置,再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。 表面声波技术是利用声波在物体的表面进行传输,当有物体触摸到表面时,阻碍声波的传输,换能器侦测到这个变化,反映给计算机,进而进行鼠标的模拟。 电容技术触摸屏利用人体的电流感应进行工作。用户触摸屏幕时,由于人体电场,用户和触摸屏表面形成以一个耦合电容,对于高频电流来说,电容是直接导体,于是手指从接触点吸走一个很小的电流 3.在Linux C中,ls这个命令是怎么被执行的? 使用fork创建一个进程或exec函数族覆盖原进程。 4.在一个只有128M内存并且没有交换分区的机器上,说说下面两个程序的运行结果 1, #define MEMSIZE 1024*1024 int count = 0; void *p = NULL; while(1) { p = (void *)malloc(MEMSIZE);

linux驱动工程师面试题整理

1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。 评:这只是其中一种方式,也叫手动创建设备文件。还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV 是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。那么在系统启动期间还有devfs创建了设备文件。一共有三种方式可以创建设备文件。 2、写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的? 答:中断处理例程应该尽量短,把能放在后半段(tasklet,等待队列等)的任务尽量放在后半段。 评:写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬件信息,然后推出中断,要做其它事情可以使用工作队列或者tasklet方式。也就是中断上半部和下半部。 第二:中断服务程序中不能有阻塞操作。为什么?大家可以讨论。 第三:中断服务程序注意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的OK,FAIL之类的。 3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么? 答:使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。 页脚内容1

4、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行? 答:原子操作指的是无法被打断的操作。我没懂第二句是什么意思,自己定义一个变量怎么可能标记资源的使用情况?其他进程又看不见这个变量 评:第二句话的意思是: 定义一个变量,比如int flag =0; if(flag == 0) { flag = 1; 操作临界区; flag = 0; }这样可否? 5、insmod 一个驱动模块,会执行模块中的哪个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的? 答:insmod调用init函数,rmmod调用exit函数。这两个函数在设计时要注意什么?卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁的问题。 页脚内容2

linux驱动面试题及答案

linux驱动面试题及答案 一、概述 在Linux开发领域,驱动程序是至关重要的组成部分。为了帮助读者更好地准备Linux驱动开发面试,本文将介绍一些常见的Linux驱动面试题及其答案。 二、Linux驱动基础知识 1. 什么是Linux驱动? 答:Linux驱动是一段软件程序,用于与特定硬件设备进行通信,实现对硬件设备的控制和数据传输。 2. Linux驱动由哪些组成部分构成? 答:Linux驱动由多个组成部分构成,包括设备和驱动模块。设备代表硬件设备,而驱动模块负责驱动设备并与内核进行交互。 3. 内核态和用户态之间的区别是什么? 答:内核态是操作系统的核心部分,具有最高的权限。用户态是应用程序运行的环境,权限较低。在内核态中,驱动可以直接访问硬件设备。 4. 请解释Linux设备树(Device Tree)是什么? 答:Linux设备树是一种描述硬件设备及其连接方式的数据结构,用于在启动时为设备提供必要的参数和配置信息。

5. 使用哪个命令来加载和卸载Linux驱动? 答:insmod命令用于加载驱动模块,rmmod命令用于卸载驱动模块。 三、Linux驱动开发相关问题 6. 在Linux驱动中,什么是Platform驱动? 答:Platform驱动是一种Linux内核驱动,用于支持与硬件设备直 接连接的平台设备。其驱动模块通过设备树(Device Tree)来识别和 初始化设备。 7. 请解释字符设备驱动是什么? 答:字符设备驱动是一种Linux驱动,用于支持以字符为单位进行 I/O操作的设备,如串口、终端等。 8. 什么是中断处理程序?如何在Linux驱动中实现中断处理程序? 答:中断处理程序是在CPU接收到硬件设备发出的中断信号时执 行的函数。在Linux驱动中,可以通过注册中断处理程序的方式来实现,通常使用request_irq函数来注册中断处理函数。 9. 在Linux驱动中,如何进行内存管理? 答:在Linux驱动中,可以使用kmalloc和kfree函数来进行动态内 存的分配和释放。另外,还可以通过ioremap和iounmap函数来映射和 解映射物理内存。 10. 什么是字符设备文件?如何在Linux中创建字符设备文件?

linux面试题及答案100

linux面试题及答案100 随着Linux操作系统在企业中的广泛应用,越来越多的企业开始重视招聘Linux相关岗位的人才。而在面试过程中,面试官通常会提出各种与Linux相关的问题,以考察应聘者的专业能力。本篇文章将为你列举了100道常见的Linux面试题及其答案,希望能够帮助你在Linux面试中取得好成绩。 1. 什么是Linux? Linux是一种开源的操作系统内核,是基于Unix的一种操作系统。它的主要特点是具有良好的稳定性、安全性、可配置性和自由性。 2. Linux的优点是什么? Linux具有以下优点: - 开源免费:可以自由获得、使用和修改Linux的源代码。 - 良好的稳定性和安全性:Linux系统在工作中不易崩溃,且相对于其他操作系统更少受到病毒的攻击。 - 强大的网络功能:Linux操作系统具备强大的网络功能,可在网络环境中高效稳定地工作。 - 高度可配置性:用户可以根据自己的需要对Linux系统进行各种配置。 - 强大的多用户和多任务支持:Linux支持多用户同时登录,并能够同时运行多个任务。

3. Linux的发行版有哪些主流的? 主流的Linux发行版包括Ubuntu、Red Hat、CentOS、Fedora、Debian等。 4. 如何使用命令行在Linux系统中安装软件? 在Linux系统中,可以使用以下命令来安装软件: - Debian系列:apt-get install 软件包名 - Red Hat系列:yum install 软件包名 - SUSE系列:zypper install 软件包名 5. 如何查看Linux系统的版本信息? 可以使用以下命令来查看Linux系统的版本信息: - lsb_release -a:显示系统的版本信息 - uname -a:显示内核的版本信息 6. 如何在Linux系统中查看文件的内容? 可以使用以下命令来查看文件的内容: - cat 文件名:显示整个文件的内容 - more 文件名:逐页显示文件的内容 - less 文件名:提供更加可定制和强大的文件内容查看方式 7. 在Linux系统中,如何查看当前的进程?

linux驱动面试题及答案

linux驱动面试题及答案 1. 请解释什么是Linux驱动? Linux驱动是一种软件,它允许操作系统与硬件设备进行交互。驱动程序是一种特殊的内核模块,它为硬件设备提供了一种接口,使得应用程序可以与硬件设备进行通信。驱动程序的主要任务是控制和管理硬件设备,以便它们能够正常工作。 2. 请解释设备驱动程序的主要功能是什么? 设备驱动程序的主要功能包括: - 为硬件设备提供接口:驱动程序为应用程序提供了一个标准接口,使得应用程序可以与硬件设备进行通信。 - 控制和管理硬件设备:驱动程序负责控制和管理硬件设备,包括设备的初始化、配置、关闭等操作。 - 缓冲区管理:驱动程序负责管理硬件设备和内存之间的数据交换,通常使用缓冲区来实现。 - 错误处理:驱动程序需要处理硬件设备可能出现的错误,以确保系

统的稳定运行。 - 资源管理:驱动程序需要管理硬件设备所使用的系统资源,如中断、DMA通道等。 3. 请解释Linux驱动的基本架构? Linux驱动的基本架构包括以下几个部分: - 设备模型:设备模型是Linux内核中用于表示硬件设备的数据结构。它包含了设备的各种属性和操作方法。 - 设备驱动程序:设备驱动程序是实现设备模型的具体代码,它负责控制和管理硬件设备。 - 设备文件:设备文件是一个特殊的文件,它代表了硬件设备的一个实例。应用程序可以通过读写设备文件来与硬件设备进行通信。 - 设备类:设备类是一组具有相同属性和行为的设备的集合。一个驱动程序可以为一个或多个设备类提供支持。 - 总线和控制器:总线和控制器是连接硬件设备的物理组件。驱动程序需要了解总线和控制器的工作原理,以便正确地控制和管理硬件设备。

linux工程师面试题及答案

linux工程师面试题及答案 1. 请描述一下Linux操作系统的基本架构和组件。 答:Linux操作系统的基本架构包括内核、系统调用接口、shell和应用程序。内核是操作系统的核心,负责管理系统的硬件资源,如CPU、内存、磁盘等。系统调用接口是内核提供给应用程序的一组接口,应用程序通过这些接口来请求内核提供服务。shell是用户与操作系统交互的工具,它接收用户的命令并传递给内核执行。应用程序是运行在操作系统上的程序,如文本编辑器、浏览器等。 2. 请解释一下什么是Linux文件系统? 答:Linux文件系统是一种用于组织和管理文件的数据结构。它将文件存储在磁盘上,并为每个文件分配一个唯二的路径。Linux文件系统采用树形结构,根目录为/,其他目录从根目录开始分层排列。Linux支持多种文件系统,如Ext4、XFS、Btrfs等。 3. 请简述Linux系统中的用户和组的概念。 答:Linux系统中的用户和组是用来管理用户权限的一种机制。每个用户都有一个唯二的用户名和密码,用户可以分为不同的用户组。用户组可以包含一个或多个用户,用户组之间可以有继承关系。用户和组的权限分为读、写、执行三种,分别用r、w、x表示。用户对文件的访问权限由用户所属的用户组和其他附加权限共同决定。 4. 请解释一下Linux系统中的文件权限。

答:Linux系统中的文件权限用来控制用户对文件的访问和操作。每个文件都有三组权限,分别针对文件所有者、文件所属组和其他用户。每组权限包括读(r)、写(w)和执行(x)三种权限。权限可以用数字表示,如755表示文件所有者具有读、写、执行权限(7),文件所属组和其他用户具有读、执行权限(5)。 5. 请简述Linux系统中的进程管理。 答:Linux系统中的进程是指正在运行的程序的实例。进程管理主要包括进程的创建、终止、暂停、恢复等操作。Linux使用fork()系统调用来创建新的进程,新进程是父进程的一个副本,它们共享相同的代码和数据空间。当父进程终止时,所有子进程也会被终止。可以使用kill()系统调用来终止进程,也可以使用信号来通知进程终止。此外,还可以使用信号来暂停和恢复进程的执行。 6. 请解释一下Linux系统中的信号机制。 答:Linux系统中的信号是一种软件中断,用于通知进程某个事件发生。信号可以分为同步信号和异步信号。同步信号是由程序员主动发送的,如kill()函数发送的信号;异步信号是由内核或其他进程发送的,如SIGSEGV表示段错误信号。信号可以用来通知进程终止、暂停、恢复等操作。进程可以通过注册信号处理函数来响应信号,也可以忽略信号或者采取默认操作。 7. 请简述Linux系统中的线程管理。 答:Linux系统中的线程是进程中的一个执行单元,它共享进程的资源,

30题中科创达Linux 开发工程师岗位常见面试问题含HR问题考察点及参考回答

中科创达 Linux 开发工程师岗位面试真题及解析 含专业类面试问题和高频面试问题,共计30道 一、请简要介绍一下您的工作经历和技术背景。 面试问题:请简要介绍一下您的工作经历和技术背景。 考察点: 1. 自我表达能力:面试者需要用简练、清晰的语言陈述自己的工作经历和技术背景,展示自己的沟通和表达能力。 2. 技术深度和广度:通过面试者的工作经历和技术背景,了解其在相关领域的技术深度和广度,评估其是否符合岗位需求。 3. 技能匹配度:面试官会根据岗位要求,了解面试者的技能是否与岗位匹配,例如:项目经验、技术专长、熟练掌握的工具和技能等。 面试参考回答话术: 尊敬的面试官,您好!我非常荣幸能参加这次面试。我毕业于 XX 大学计算机科学与技术专业,获得硕士学位。在校期间,我积极参与了各类项目实践,对 Linux 系统、嵌入式开发等领域产生了浓厚兴趣。毕业后,我加入了一家从事物联网行业的公司,担任 Linux 开发工程师,至今已有 3 年的工作经验。 在这 3 年的工作中,我主要参与了两个项目的开发。唯二个项目是一款智能家居系统,我负责 Linux 内核的定制和优化,以及设备驱动程序的开发。在这个项目中,我深入了解了 Linux 内核的工作原理,学会了如何根据硬件平台定制合适的内核版本,并针对特定需求进行内核优化。此外,我还掌握了设备驱动程序的开发流程,熟悉了主流设备驱动程序框架。 第二个项目是一款工业控制主板,我负责整个 Linux 系统的设计和开发,包括系统配置、内核定制、设备驱动程序、文件系统以及应用程序。在这个项目中,我进一步巩固了 Linux 系统开发的技能,学会了如何根据不同场景选择合适的Linux 发行版,并熟练掌握了各种系统配置和优化方法。此外,我还积累了丰富的硬件兼容性测试经验,确保主板在各种硬件环境下都能稳定运行。

linux驱动面试题

linux驱动面试题 1. 概述 在Linux系统中,驱动程序的作用是使硬件设备与操作系统能够有 效地通信和合作。在Linux驱动面试中,考察的内容主要包括对Linux 驱动的基本原理和相关技术的理解、驱动开发经验以及解决实际问题 的能力等方面。 2. 驱动开发基础 2.1 驱动与内核 Linux驱动是在内核中运行的模块,通过向内核注册相应的设备驱 动接口,实现设备与操作系统的交互。驱动开发需要对内核的基本原 理和架构有一定的了解。 2.2 设备模型 Linux采用了设备树(Device Tree)来描述硬件设备,驱动开发者 需要理解设备树的基本概念和使用方法。此外,掌握相关的API接口,如设备注册和资源管理等也是重要的。 2.3 驱动开发工具 驱动开发通常需要使用一些工具来辅助开发和调试,如GCC编译器、Makefile、Kconfig等。熟悉这些工具的使用可以提高开发效率。 3. 驱动开发技巧

3.1 驱动加载与卸载 了解驱动的加载和卸载过程是驱动开发的基础,掌握相关的函数和接口,如module_init()、module_exit()等。 3.2 设备操作 对于设备操作,驱动开发者需要实现相应的接口函数,如open()、read()、write()和release()等。同时,需要注意多个进程对设备的并发访问问题。 3.3 中断处理 了解中断的基本原理,驱动开发者需要实现中断处理函数,通过适当地使能和屏蔽中断,确保设备的稳定工作。 3.4 内存管理 驱动开发过程中需要对内存进行分配和释放,应注意内存的合理管理,避免内存泄漏和越界访问问题。 4. 驱动性能与调试 4.1 性能优化 优化驱动程序可以提高系统的效率和响应速度。常见的性能优化方法包括减少不必要的资源竞争、提高中断处理效率等。 4.2 调试技巧

linux工程师面试题及答案

linux工程师面试题及答案 Linux是一种开源操作系统,广泛应用于各种计算机领域。作为一名Linux工程师,熟悉Linux系统的原理、管理和维护至关重要。在面试过程中,常常会涉及一些与Linux系统相关的问题,下面是一些常见的Linux工程师面试题及其答案。 一、Linux系统相关面试题 1. 请说明什么是Linux系统? Linux系统是一种基于Unix的操作系统,最初由Linus Torvalds在1991年开发而成。它的特点是开放源代码、多用户、多任务、多线程和稳定可靠。 2. 请解释什么是Linux内核? Linux内核是操作系统的核心部分,负责管理硬件、文件系统和其他系统资源。它控制着计算机的所有核心功能,并提供了对外部应用程序的接口。 3. 怎样查看Linux系统的版本信息? 在终端命令行输入以下命令: ``` uname -a ```

即可查看Linux系统的版本、内核版本以及其他详细信息。 4. 请简述Linux系统的目录结构? Linux系统的目录结构采用层级式的树状结构,以根目录“/”为起点,分为许多子目录,如/bin、/etc、/home、/usr等。每个子目录都有其特 定的用途,例如/bin存放可执行文件,/etc存放系统配置文件。 5. 如何查看当前工作目录? 在终端命令行输入以下命令: ``` pwd ``` 即可查看当前所在的工作目录。 二、Linux系统管理面试题 1. 怎样查看Linux系统的CPU使用情况? 在终端命令行输入以下命令: ``` top ``` 即可实时查看CPU的使用情况,包括每个进程的CPU占用率。

嵌入式linuxandroid驱动工程师面试题总汇

嵌入式linuxandroid驱动工程师面试题总汇 嵌入式linux android驱动工程师面试题总汇 1. 嵌入式系统中断服务子程序(ISR) 收藏中断是嵌入式系统中重要的组成 部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt 关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 __interrupt double compute_area (double radius) { double area = PI * radius * radius; printf(" Area = %f", area); return area; } 1). ISR 不能返回一个值。2). ISR 不能传递参数。3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。4). 与第三点一脉相承,printf()经常有重入和性能上的问题。 2.C语言中对位的操作,比如对a的第三位清0,第四位置1.本来应该会的,一犯晕写反了,以后注意! #define BIT3 (1<<3) #define BIT4 (1<<4) a &= ~BIT3; a |= BIT4; 3.考到volatile含义并举例:理解出错,举了很具体的例子,连程序都搬上去了,有些理解不深的没举出来…… volatile表示这个变量会被意想不到的改变,每次用他的时候都会小心的重新读取一遍,不适用寄存器保存的副本。 volatile表示直接存取原始地址 例: 并行设备的硬件寄存器(状态寄存器) 在多线程运行的时候共享变量也要时时更新 一个中断服务子程序中访问到的的非自动变量(不太清楚,正在

Linux运维工程师面试题库及答案

Linux运维工程师面试题库及答案 为帮助大家顺利通过Linux面试,为大家分享的是Linux面试各部分知识题库,希望对大家复习有所帮助! 1.常见的Linux发行版本都有什么?你最擅长哪一个?它的网站网站是什么?说明你擅长哪一块? 2.Linux开机启动流程详细步骤是什么?系统安装完,忘记密码如何破解? 3.企业中Linux效劳器系统分区标准是什么?(硬盘为300G,内存16G) 4.某一天突然发现Linux系统文件只读,该怎么办呢?完整操作步骤。 5.安装一台系统使用DVD光盘安装,如何安装50台Linux系统如何安装呢?思考一下。 6.用虚拟机安装了一台Linux系统,突然想克隆一台效劳器,克隆后发现无法上网,如何解决? 7.Linux网卡配置文件路径是什么?要使效劳器上外网,必须满足的条件有哪些?需要配置什么? 8.一般可以使用什么软件远程linux效劳器?通过什么上传文件和下载文件? 9./mnt目录主要用于什么?/root目录跟root用户有什么关系?/根目录与/boot目录有什么联系? 10.某一天误操作,执行了rm -rf * ,会有哪些情况发生?请举例。 1.在/tmp/目录下创立test.txt文件,内容为: Hello,World! ,用一个命令写出来。

2.给test.txt文件除所有者之外增加执行权限,最终以数字写出文件的权限。 3.用vi命令test.txt,如何跳转到末行,首行,行首、行末,如何在光标行下一行插入,如何复制5行,删除10行,查找jingfeng的字符、把jingfeng替换为jfedu. 4.查找linux系统下以txt结尾,30天没有修改的文件大小大于20K同时具有执行权限的文件并备份到/data/backup/目录下。 5.当前test.txt所属的用户为root,组为abc,请将 test.txt使拥有者为abc,组为root,写出命令。 6.如何修改Linux启动级别为字符模式并永久生效,如何临时、永久关闭selinux及防火墙,请分别写出操作方法。 7.每次开机在/tmp目录下创立一个当天的日期文件夹(提示:当前日期表示的方法为:`date +%Y%m%d`) 8.如何查看文件内容,命令有哪些?查看文件第1行到3行,查看文件最后一行。 9.查看linux效劳器IP的命令,同时只显示包含ip所在的行打印出来。 10.将普通用户test参加root组的命令是? 1.如何添加一块新的50G硬盘到linux效劳器系统作为单独的分区,并正在使用?需要哪些操作步骤? 2.有个金士顿U盘,需要往效劳器/var//html/目录下上传一个index.html文件,如何操作并完成。 3.有一块移动硬盘,上面有300G数据,如何快速cp到linux 效劳器? 4.光盘里面有一个d-2.2.1 5.xx.rpm包,如何挂载并安装呢?

linux研发工程师面试题

linux研发工程师面试题 1. 请描述一下你对Linux操作系统的理解。 2. Linux系统中,你非常熟悉的发行版是哪个?为什么? 3. 请解释一下Linux的文件系统结构。 4. 你能解释一下什么是shell脚本吗?你在哪些项目中使用过shell 脚本? 5. 你能解释一下什么是C语言中的指针吗? 6. 你能解释一下什么是内存管理吗?在Linux中,内存是如何分配的? 7. 你能解释一下什么是进程和线程吗?他们在Linux中是如何工作的?

8. 你能解释一下什么是I/O多路复用吗?它在Linux中的应用是什么? 9. 你能解释一下什么是死锁吗?在Linux中,如何避免死锁? 10. 你能解释一下什么是Linux的内核吗?它的主要功能是什么? 11. 你能解释一下什么是Linux的设备驱动吗?你有哪些设备驱动的开发经验? 12. 你能解释一下什么是虚拟化技术吗?在Linux中,你如何使用虚拟化技术? 13. 你能解释一下什么是容器技术吗?在Linux中,你如何使用容器技术? 14. 你能解释一下什么是网络编程吗?你在Linux中进行过哪些网络编程的项目?

15. 你能解释一下什么是数据库编程吗?你在Linux中进行过哪些数据库编程的项目? 16. 你能解释一下什么是多线程编程吗?你在Linux中进行过哪些多线程编程的项目? 17. 你能解释一下什么是同步和异步编程吗?你在Linux中如何应用这两种编程途径? 18. 你能解释一下什么是嵌入式系统吗?你在Linux中有哪些嵌入式系统开发的经验? 19. 你能解释一下什么是开源软件吗?你对开源软件有什么看法? 20. 你能解释一下什么是版本控制系统吗?你在Linux中使用过哪些版本控制系统? 21. 你能解释一下什么是Git吗?你在Linux中使用过Git进行项目管理吗?

驱动笔试面试题

驱动笔试面试题 就业模拟测试题-LINUX驱动、系统底层工程师职位 1.你平常是怎么用C写嵌入式系统的死循环的?[3分] 2.写一条命令,实现在dir以及其子目录下找出所有包含“hello world”字符串的文件[2分] 3.下面的两段程序中,循环能否执行?为什么? A: unsigned short i; unsigned short index = 0; for(i = 0; i <="" p=""> printf(“a\”); } B: unsigned short i; unsigned long index = 0; for(i = 0; i <="" p=""> printf(“b\”); } [每空2分] 4.一个计划跑LINUX系统的ARM系统把bootloader烧录进去后,上电后串口上没有任何输出,硬件和软件各应该去检查什么? 提示:1.跑LINUX的系统一般都需要外扩DRAM,一般的系统也经常有NOR或NAND FLASH 2.bootloader一般是由汇编和C编写的裸奔程序[5分] 5.列举最少3种你所知道的嵌入式的体系结构,并请说明什么是ARM体系结构。[7分] 6.请简述下面这段代码的功能 mov r12, #0x0

ldr r13, =0x30100000 mov r14, #4096 loop: ldmia r12!, {r0-r11} stmia r13!, {r0-r11} cmp r12, r14 blo loop [2分] 7.嵌入式中常用的文件系统有哪些?说出它们的主要特点和应用场合?[5分] 8.某外设寄存器rGpioBase的地址是0x56000000,寄存器的0~15位有效,请写出给外设寄存器高八位(8~`15位)设置成0xc3的代码[7分] 9.根据时序图和说明编写程序: GPIO已经设置好,只需要调用函数gpio_seet_level(int gpio, int level)即课使某个GPIO 输出高电平或者低电平。图中用于产生时序的gpio已经分别定义为 SSP_XCS,SSP_SCLK,SSP_DIN,level的定义分别为GPIO_LO和GPIO_HI,需要编写函数的原型为:void ssp_io_write_word(u32 command),该函数用来输出一个字(如上图中的A0到C0一组9位),这9个位是在参数command中的低9位. [5分] 10.简述LINUX系统从上电开始到系统起来的主要流程? 提示: 1.可以uboot、内核和文件系统的主要功能去总结 2.这个题主要是在笔试之后的面试,需要在3~5分钟之内表述清楚[8分] 11.如何编写一个LINUX驱动? 提示:主要说字符设备的编写过程[7分] 12.简述LINUX驱动中字符设备和块设备的区别?[5分] 13.试总结单片机底层开发与LINUX驱动开发有哪些异同?[4分] 14.请从网卡、USB HOST、LCD驱动器、NAND FLASH、WIFI 、

25题Linux开发工程师岗位常见面试问题含HR问题考察点及参考回答

Linux开发工程师岗位面试真题及解析 含专业类面试问题和高频面试问题,共计25道 一、描述一下你之前使用的非常有效的Linux命令?它对性能有哪些提升? 考察点及参考回答: 一、考察点: 1. Linux命令的使用和熟悉程度:面试者是否能熟练地使用Linux命令,是否能根据实际需求选择合适的命令,这是考察的重点。 2. 解决问题的能力:面试者是否能通过Linux命令解决实际问题,例如优化系统性能、处理系统故障等,这也是考察的重点。 3. 技能应用能力:面试者是否能将所学的Linux技能应用到实际工作中,这也是考察的重点。 二、参考回答: 我曾经使用过的非常有效的Linux命令是`top`和`htop`。这两个命令可以实时查看系统资源使用情况,包括CPU、内存、交换空间等。`top`命令每2秒钟刷新一次,对于需要频繁查看系统资源使用情况的场景非常有用。而`htop`则比`top`更加人性化,界面更友好,操作更方便。 使用这两个命令,我发现它们对系统性能的提升主要表现在以下几个方面: 首先,通过实时查看系统资源使用情况,我们可以及时发现系统瓶颈,从而采取相应的优化措施。例如,如果发现CPU使用率较高,我们可以使用`top`或`htop`查看是哪个进程占用了大部分CPU资源,然后针对该进程进行优化。 其次,通过实时查看系统资源使用情况,我们可以更好地了解系统的负载情况,从而更好地规划系统的扩容和升级。例如,如果发现内存使用率较高,我们可以考虑增加内存容量或者优化系统负载均衡策略。 最后,使用`htop`命令还可以方便地进行进程管理,例如可以方便地查看进程的详细信息、杀死进程等。这些功能对于系统管理员来说是非常实用的。

Linux系统工程师面试题大全

Linux面试题大全 一.填空题: 1. 在Linux系统中,以文件方式访问设备。 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统。 3. Linux文件系统中每个文件用 i节点来标识。 4. 全部磁盘块由四个部分组成,分别为引导块、专用块、 i节点表块和数据存储块。 5. 链接分为:硬链接和符号链接。 6. 超级块包含了i节点表和空闲块表等重要的文件系统信息。 7. 某文件的权限为:drw-r--r--,用数值形式表示该权限,则该八进制数为:644,该文件属性是目录。 8. 前台起动的进程使用Ctrl+c终止。 9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置。 10. 网络管理的重要任务是:控制和监控。 11. 安装Linux系统对硬盘分区时,必须有两种分区类型:文件系统分区和交换分区。 13. 编写的Shell程序运行前必须赋予该脚本文件执行权限。 14. 系统管理的任务之一是能够在分布式环境中实现对程序和数据的安全保护、备份、恢复和更新。 15. 系统交换分区是作为系统虚拟存储器的一块区域。 16. 内核分为进程管理系统、内存管理系统、 I/O管理系统和文件管理系统等四个子系统。 17. 内核配置是系统管理员在改变系统配置硬件时要进行的重要操作。 18. 在安装Linux系统中,使用netconfig程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、IP地址、网关地址和子网掩码等必要信息。 19. 唯一标识每一个用户的是用户ID和用户名。 20 . RIP协议是最为普遍的一种内部协议,一般称为动态路由选择协议。 21. 在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统。 22. DHCP可以实现动态 IP 地址分配。 23. 系统网络管理员的管理对象是服务器、用户和服务器的进程以及系统的各种资源。 24. 网络管理通常由监测、传输和管理三部分组成,其中管理部分是整个网络管理的中心。 25. 当想删除本系统用不上的设备驱动程序时必须编译内核,当内核不支持系统上的设备驱动程序时,必须对内核升级。 26 Ping命令可以测试网络中本机系统是否能到达一台远程主机,所以常常用

相关主题
相关文档
最新文档