2023年7月6日发(作者:)
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 mempool_create
get_free_
24. IRQ 和 FIQ 有什么区分,在CPU 里面是是怎么做的?
25. 中断的上半局部和下半局部的问题:讲下分成上半局部和下半局部的缘由,为何要分?
讲下如何实现?
上半局部执行与硬件相关的处理要求快, 而有些驱动在中断处理程序中又需要完成大量工
作,这构成冲突,所以Linux 有所谓的bottom half 机制,中断处理程序中全部不要求马上完
成的,在开中断的环境下,由底半程序随后完成.
Linux 的底半处理实际上是建立在内核的软中断机制上的.
queue 以及 softirq ( 2.4 内核则有BH , Task
Linux 的底半 机制主要有Tasklet 和 work
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;
printf(“Current allocation %d MBn“,
++count);
}
2
while(1) {
if (!p) break;
memset(p, 1, MEMSIZE);
printf(“Current allocation %d MBn“, ++count);
}
第一道程序安排内存但没有填充,编译器可能会把内存安排优化掉,程序死循环;其次道,
程序安排内存并进展填充,系统会始终安排内存,直到内存缺乏,退出循环。
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))
{
printf(“a >= bn“);
}
else
{
printf(“a < bn“);
}
}
40、LINUX 下的 Socket 套接字和 Windows 下的 WinSock 有什么共同点?请从 C/C++语言开发的角度描述,至少说出两点共同点。
参考答案:
第 1 题,答中一个得 5 分,答出其它正确答案的,也得 5 分。
a)
都基于TCP/IP 协议,都供给了面对连接的TCP SOCK 和无连接的UDP
都是一个sock 构造体。
b)
都是使用sock 文件句柄进展访问。
c)
d)都具有缓冲机制。
SOCK。
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
export LD_LIBRARY_PATH=“/lib“
#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
echo “test running times is
$count“ #Is test running too many
times?
if [ “$count“ -gt 100 ]; then
echo “Will reboot because of test running too many
times“ reboot
fi
#wait for
sleep 3
done
#########################################
42.
你寻常是怎么用 C 写嵌入式系统的死循环的? 43.
写一条命令,实现在 dir 以及其子名目下找出全部包含“hello world”字符串的文件
44.
下面的两段程序中,循环能否执行?为什么?
A: unsigned short i; unsigned short index = 0; for(i = 0; i i++){ i++){ printf(“an”); } printf(“bn”); } B: unsigned short i; unsigned long index = 0; for(i = 0; i 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} r13!, {r0-r11} r12, r14 loop stmia cmp bl 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 访问的时候才需要物理上连续 比 kmalloc 要慢 [*]vmalloc 58、module_init 的级别 59、添加驱动 静态加载和动态加载: 静态加载是系统启动的时候由内核自动加载的,这个要事先将驱动编译进内核才行; 动态加载,也就是模块加载方式,这种方式下驱动以模块的形式存放在文件系统中,需要时动态载入内核,这种主要用在调试的时候,比较便利灵敏。insmod 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。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1688594385a153209.html
评论列表(0条)