linux驱动工程师面试题整理.pdf

上传人:白大夫 文档编号:5402777 上传时间:2020-05-01 格式:PDF 页数:16 大小:171.14KB
返回 下载 相关 举报
linux驱动工程师面试题整理.pdf_第1页
第1页 / 共16页
linux驱动工程师面试题整理.pdf_第2页
第2页 / 共16页
linux驱动工程师面试题整理.pdf_第3页
第3页 / 共16页
linux驱动工程师面试题整理.pdf_第4页
第4页 / 共16页
linux驱动工程师面试题整理.pdf_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《linux驱动工程师面试题整理.pdf》由会员分享,可在线阅读,更多相关《linux驱动工程师面试题整理.pdf(16页珍藏版)》请在三一文库上搜索。

1、. . 1、字符型驱动设备你是怎么创建设备文件的,就是/dev/ 下面的设备文件,供上层应用程 序打开使用的文件? 答: mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。 评:这只是其中一种方式,也叫手动创建设备文件。还有 UDEV/MDEV 自动创建设备文件的方 式,UDEV/MDEV 是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件, 运行在用户态意味着系统要运行之后。那么在系统启动期间还有devfs创建了设备文件。 一 共有三种方式可以创建设备文件。 2、写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的? 答:中断处理例程应该尽量

2、短,把能放在后半段(tasklet,等待队列等) 的任务尽量放在后 半段。 评:写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬 件信息, 然后推出中断, 要做其它事情可以使用工作队列或者tasklet方式。 也就是中断上 半部和下半部。 第二:中断服务程序中不能有阻塞操作。为什么?大家可以讨论。 第三:中断服务程序注意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的 OK , FAIL 之类的。 3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁 还是信号量?还是两者都能用?为什么? 答:使用自旋锁的进程不能睡眠,使用信号量的

3、进程可以睡眠。中断服务例程中的互斥使用 的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。 4、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源 只有一个使用者行不行? 答:原子操作指的是无法被打断的操作。我没懂第二句是什么意思,自己定义一个变量怎么 可能标记资源的使用情况?其他进程又看不见这个变量 评:第二句话的意思是: 定义一个变量 , 比如 int flag =0; if(flag = 0) flag = 1; 操作临界区; flag = 0; 这样可否? . . 5、insmod 一个驱动模块, 会执行模块中的哪个函数?rmmod

4、呢?这两个函数在设计上要注 意哪些?遇到过卸载驱动出现异常没?是什么问题引起的? 答:insmod 调用 init函数, rmmod调用 exit函数。 这两个函数在设计时要注意什么?卸载 模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁 的问题。 评:要注意在init函数中申请的资源在exit函数中要释放,包括存储,ioremap ,定时器, 工作队列等等。 也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一切不 留下一点痕迹。 6、在驱动调试过程中遇到过oops 没?你是怎么处理的? 7、ioctl和 unlock_ioctl有什么区别? 8、驱

5、动中操作物理绝对地址为什么要先ioremap? 答:因为内核没有办法直接访问物理内存地址,必须先通过ioremap 获得对应的虚拟地址。 9、 设备驱动模型三个重要成员是?platfoem总线的匹配规则是?在具体应用上要不要先注 册驱动再注册设备?有先后顺序没? 10、 linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 11、linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化,高端内 存概念? 12、linux中中断的实现机制,tasklet与 workqueue 的区别及底层实现区别?为什么要区 分上半部和下半部? 13、 linux中断的响应执行流

6、程?中断的申请及何时执行( 何时执行中断处理函数) ? 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、 l

7、inux内核里面,内存申请有哪几个函数,各自的区别? Kmalloc() _get_free_page() mempool_create() 24. IRQ和 FIQ 有什么区别,在CPU里面是是怎么做的? 25. 中断的上半部分和下半部分的问题:讲下分成上半部分和下半部分的原因,为何要分? 讲下如何实现? 上半部分执行与硬件相关的处理要求快, 而有些驱动在中断处理程序中又需要完成大量工 作, 这构成矛盾 , 所以 Linux 有所谓的bottom half机制,中断处理程序中所有不要求立即完 成的 , 在开中断的环境下, 由底半程序随后完成. Linux 的底半处理实际上是建立在内核的软中断

8、机制上的. Linux 的底半机制主要有Tasklet 和 work queue 以及 softirq ( 2.4 内核则有BH , Task queue , softirq , tasklet 没有 work queue) ,其实底半可以理解成一种工作的延迟。所 以实际使用时跟timer机制基本上一个意思。 26. 内核函数mmap 的实现原理,机制? mmap 函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件, 他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文 件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务

9、。另外,mmap 实现共享内存也是其主要应用之一,mmap 系统调用使得进程之间通过映射同一个普通文件 . . 实现共享内存。 27. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子? 28. spinlock自旋锁是如何实现的? 自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临 界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。 这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。linux中的信号量 是一种睡眠锁。 如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待 队列, 然后让其睡眠。 这时

10、处理器获得自由去执行其它代码。当持有信号量的进程将信号量 释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。 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”表示返回数 据长度

11、最大为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

12、,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盘设

13、备来说,一般只 有 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是相对于芯片本身而言的,如某个管脚是芯片的

14、GPIO脚,则该脚可作为输入或输出高 或低电平使用,当然某个脚具有复用的功能,即可做GPIO也可做其他用途。 也就是说你可以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚连到led 的一极来控制它的亮灭,也可以用一根 (一些) 引脚连到一个传感器上以获得该传感器的状 态,这给cpu 提供了一个方便的控制周边设备的途经。如果没有足够多的gpio 管脚,在控 制一些外围设备时就会力有不逮,这时可采取的方案是使用CPLD来帮助管理。 36. 触摸屏的硬件原理? 触摸屏的主要三大种类是:电阻技术触摸屏、表面声波技术触摸屏、电容技术触摸屏。 电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻

15、薄膜屏,这是一种多层的复合 薄膜,它以一层玻璃或硬塑料平板作为基层,表面图有一层透明氧化金属(ITO 氧化铟, 透明的导电电阻)导电层,上面在盖有一层外表面硬化处理、光滑防擦的塑料层、它的内 表面也涂有一层ITO 涂层、在他们之间有许多细小的(小于 1/1000 英寸) 的透明隔离点把 两层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,控制器 侦测到这一接触并计算出(X,Y )的位置,再根据模拟鼠标的方式运作。这就是电阻技术 触摸屏的最基本的原理。 表面声波技术是利用声波在物体的表面进行传输,当有物体触摸到表面时,阻碍声波的传输, 换能器侦测到这个变化,反映给计算机,进而

16、进行鼠标的模拟。 电容技术触摸屏利用人体的电流感应进行工作。用户触摸屏幕时,由于人体电场, 用户和 触摸屏表面形成以一个耦合电容,对于高频电流来说,电容是直接导体,于是手指从接触 点吸走一个很小的电流 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)

17、; if (!p) break; printf(“Current allocation %d MBn“, +count); 2 while(1) p = (void *)malloc(MEMSIZE); . . if (!p) break; memset(p, 1, MEMSIZE); printf(“Current allocation %d MBn“, +count); 第一道程序分配内存但没有填充,编译器可能会把内存分配优化掉,程序死循环;第二道, 程序分配内存并进行填充,系统会一直分配内存,直到内存不足,退出循环。 39. 请定义一个宏,比较两个数a、b 的大小,不能使用大于、小于、i

18、f语句 搞的比较复杂。主要思想就是a-b 的值的最高位是否为0;但是又得考虑整数溢出的问题, 所以很复杂。不知道哪位大侠有更好的办法,指点指点。 #include #define ZHENG(i)(i 31)= 0) #define FU(i)(i 31)!= 0) #define COMPARE(a,b)(ZHENG(a) int b = 0x6FFFFFFF; if(COMPARE(a,b) printf(“a = bn“); else printf(“a 中 2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上自 然连续

19、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.

20、 以字节为单位进行分配,在中 2. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续,物理地址不连续 3. 一般情况下,只有硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于MMU 之外, 根本不了解虚拟地址;但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在 需要获得大块内存时才使用vmalloc(),例如当模块被动态加载到内核当中时,就把模块装 载到由 vmalloc()分配的内存上。 4.void vfree(void *addr),这个函数可以睡眠,因此不能从中断上下文调用。 malloc(), vmalloc()和 km

21、alloc()区别 *kmalloc和 vmalloc是分配的是内核的内存,malloc分配的是用户的内存 *kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连 续,malloc不保证任何东西( 这点是自己猜测的, 不一定正确 ) *kmalloc能分配的大小有限,vmalloc和 malloc 能分配的大小相对较大 * 内存只有在要被DMA 访问的时候才需要物理上连续 *vmalloc比 kmalloc要慢 58、 module_init的级别 . . 59、添加驱动 静态加载和动态加载: 静态加载是系统启动的时候由内核自动加载的,这个要事先将驱动编译进

22、内核才行; 动态加载, 也就是模块加载方式,这种方式下驱动以模块的形式存放在文件系统中,需要时 动态载入内核,这种主要用在调试的时候,比较方便灵活。insmod module.ko 60、 IIC 原理,总线框架,设备编写方法,i2c_msg 61、 kernel panic 62、 USB总线, USB传输种类, urb 等 USB总线: USB总线属于一种轮询式总线,主机控制端口初始化所有的数据传输。每一总线动作最多传 送三个数据包, 包括令牌 (Token) 、数据 (Data) 、联络 (HandShake) 。按照传输前制定好的原 则,在每次传送开始时,主机送一个描述传输动作的种类、

23、方向、USB设备地址和终端号的 USB数据包, 这个数据包通常被称为令牌包(TokenPacket) 。USB设备从解码后的数据包的适 当位置取出属于自己的数据。数据传输方向不是从主机到设备就是从设备到主机。在传输开 始时,由标志包来标志数据的传输方向,然后发送端开始发送包含信息的数据包或表明没有 数据传送。 接收端也要相应发送一个握手的数据包表明是否传送成功。发送端和接收端之间 的 USB数据传输,在主机和设备的端口之间,可视为一个通道。USB中有一个特殊的通道一 缺省控制通道, 它属于消息通道,设备一启动即存在,从而为设备的设置、状态查询和输入 控制信息提供一个入口。 USB总线的四种传输

24、类型: 1、中断传输:由OUT事务和 IN 事务构成,用于键盘、鼠标等HID 设备的数据传输中 2 、批 量传输:由OUT事务和 IN 事务构成,用于大容量数据传输,没有固定的传输速率,也不占 用带宽,当总线忙时,USB会优先进行其他类型的数据传输,而暂时停止批量转输。 3 、同 步传输:由OUT事务和 IN 事务构成, 有两个特别地方,第一,在同步传输的IN 和 OUT事务 中是没有返回包阶段的;第二,在数据包阶段任何的数据包都为DATA0 4、控制传输:最重 要的也是最复杂的传输,控制传输由三个阶段构成(初始配置阶段、可选数据阶段、状态信 息步骤),每一个阶段能够看成一个的传输,也就是说控

25、制传输其实是由三个传输构成的, 用来于 USB设备初次加接到主机之后,主机通过控制传输来交换信息,设备地址和读取设备 的描述符, 使得主机识别设备,并安装相应的驱动程式,这是每一个USB研发者都要关心的 问题。 URB: USB请求块( USB request block, urb)是 USB设备驱动中用来描述与USB设备通信所用的 基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体, 是 USB主机与设 备通信的“电波”。 63、同步和互斥 同步和互斥 . . 相交进程之间的关系主要有两种,同步与互斥。 所谓互斥, 是指散步在不同进程之间的 若干程序片断, 当某个进程运行

26、其中一个程序片段时,其它进程就不能运行它们之中的任一 程序片段, 只能等到该进程运行完这个程序片段后才可以运行。所谓同步, 是指散步在不同 进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后 次序依赖于要完成的特定的任务。 显然, 同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个线 程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行, 而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥) ! 总结 : 互斥: 是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互 斥无法限

27、制访问者对资源的访问顺序,即访问是无序的。 同步: 是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访 问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少 数情况是指可以允许多个访问者同时访问资源 64、 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出 它们是属于哪一类设备。 答:字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备 驱动程序来实现这种特性。字符设备驱动程序通常至少实现open,close,read和 write系统 调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是

28、典型的字符设备。 块设备:和字符设备类似,块设备也是通过/dev 目录下的文件系统节点来访问。块设备上 能够容纳文件系统,如:u 盘, SD卡,磁盘等。 字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序 之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱 动程序具有完全不同的接口 65、查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信 息?如何查看正在使用的有哪些中断号? 答: 1) 查看驱动模块中打印信息的命令:dmesg 2) 查看字符设备信息可以用lsmod 和 modprobe, lsmod 可以查看模块的

29、依赖关系, modprobe 在加载模块时会加载其他依赖的模块。 3)显示当前使用的中断号cat /proc/interrupt 66、 Linux 中引入模块机制有什么好处? 答:首先, 模块是预先注册自己以便服务于将来的某个请求,然后他的初始化函数就立即结 束。换句话说,模块初始化函数的任务就是为以后调用函数预先作准备。 好处: 1) 应用程序在退出时,可以不管资源的释放或者其他的清除工作,但是模块的退出函数却 必须仔细此撤销初始化函数所作的一切。 2) 该机制有助于缩短模块的开发周期。即:注册和卸载都很灵活方便。 67、 copy_to_user()和 copy_from_user()主

30、要用于实现什么功能?一般用于 file_operations结构的哪些函数里面? . . 答:由于内核空间和用户空间是不能互相访问的,如果需要访问就必须借助内核函数进行数 据读写。 copy_to_user():完成内核空间到用户空间的复制,copy_from_user():是完成用 户空间到内核空间的复制。一般用于file_operations结构里的read,write,ioctl等内存 数据交换作用的函数。当然, 如果 ioctl没有用到内存数据复制,那么就不会用到这两个函 数。 68、请简述主设备号和次设备号的用途。如果执行mknod chartest c 4 64,创建 charte

31、st 设备。请分析chartest使用的是那一类设备驱动程序。 答: 1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核允许多个驱动程 序共享主设备号,但我们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原 则组织。 次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依赖于驱动程序的 编写方式, 我们可以通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作 设备本地数组的索引。 2)chartest 由驱动程序4 管理,该文件所指的设备是64 号设备。(感觉类似于串口终端 或者字符设备终端)。 69、设备驱动程序中如何注册一个字符设备?分别解

32、释一下它的几个参数的含义。 答:注册一个字符设备驱动有两种方法: 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)oper

33、ations *fopen); 该注册函数是早期的注册函数,major 是设备的主设备号,name是驱动程序的名称,而 fops 是默认的file_operations结构(这是只限于file_operations结构)。对于 register_chrdev的调用将为给定的主设备号注册0255 作为次设备号,并为每个设备建 立一个对应的默认cdev 结构。 70、请简述中断与DMA 的区别。 Linux 设备驱动程序中,使用哪个函数注册和注销中断处理 程序? 答:1)DMA :是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件 机制,使用DMA 可以使系统CPU从实际的I

34、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_nam

35、e, void *dev_id); 参数意义依次是:中断号,中断处理函数,中断管理有关的掩码,中断请求设备名,中断信 . . 号线。 过程是:dev_name设备请求中断-cpu 分配中断号 - 设置中断管理的掩码-分配中断信号线 -处理中断函数- 完成之后再根据设置情况返回原处理程序处继续处理程序。 注销中断; Void free_irq(unsigned int irq, void *dev_id); 释放中断和中断信号线 71、中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动? 答:中断是 CPU处于被中状态下来接受设备的信号,而轮询是CPU主动去查询该设备是否有

36、请求。 凡事都是两面性,所以, 看效率不能简单的说那个效率高。如果是请求设备是一个频 繁请求 cpu 的设备, 或者有大量数据请求的网络设备,那么轮询的效率是比中断高。如果是 一般设备,并且该设备请求cpu 的频率比较底,则用中断效率要高一些。 72、简单描述在cs8900 的驱动设计中, 发送数据frame 和接收数据frame 的过程。 答: 1)发送流程如下: (1) 网络设备驱动程序从上层协议传递过来的sk_buff参数获得数据包的有效数据和长 度,将有效数据放入临时缓冲区。 (2) 对于以太网,如果有效数据的长度小于以太网冲突检测所要求的数据桢的最小长度, 则给临时缓冲区的末尾填充0

37、 (3) 设置硬件寄存器,驱使网络设备进行数据发送操作。 2)接收流程 网络设备接收数据主要是由中断引发设备的中断处理函数,中断处理函数判断中断类 型,如果为接收中断,则读取接受到的数据,分配 sk_buff数据结构和数据缓冲区,将接收 到的数据复制到数据缓冲区,并调用netif_rx()函数将 sk_buff传递给上层协议。 73、cs8900.c的驱动中, 发送数据frame 的过程为什么需要关中断?接收数据frame 的过程 为什么不需要关中断? 答:在发送过程中是不能被打断的,在发送的过程中,不关中断,这时候如果有一个中断到 来,那么 cpu 有可能会去相应该中断,如果该中断需要改写的

38、数据是发送数据的缓冲区,那 么缓冲区将被改写,这样即使cpu 相应完毕该中断,再发送数据, 接收方也不认识该数据不 能接收。 在接收数据的时候,需要打开中断,是因为要及时的相应接收到的数据。如果关闭该中断, 那么接收方有可能因为相应优先级高的中断而接收不到该数据。 74、简单描述skbuff这个数据结构在网络结构中所起到的作用, 为什么需要一个skbuff, 它的分配和释放主要都在什么部位 答: sk_buff结构非常重要,它的含义为“套接字缓冲区”,用于在linux网络子系统中的 各层之间传递数据。 当发送数据包时, linux内核的网络处理模块必须建立一个包含要传输的数据包的sk_buff , 然后将 sk_buff递交给下层,各层在sk_buff中添加不同的协议头直至交给网络设备发送。 同样的,当网络设备从网络媒介上接受到数据包后,它必须将接受到的数据转换为sk_buff 数据结构并传递给上层,盖层不抛去相应的协议头直至交给用户。分配 sk_buff在接收一开 始就应该分配,在发送完毕数据之后可以释放sk_buff 。 . .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1