一、 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。html
字符设备:字符设备是个可以像字节流(相似文件)同样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序一般至少实现open,close,read和write系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。linux
块设备:和字符设备相似,块设备也是经过/dev目录下的文件系统节点来访问。块设备上可以容纳文件系统,如:u盘,SD卡,磁盘等。面试
字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不一样对用户来说是透明的。在内核中,和字符驱动程序相比,块驱动程序具备彻底不一样的接口。算法
二、查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号?sql
1) 查看驱动模块中打印信息的命令:dmesg编程
2) 查看字符设备信息能够用lsmod 和modprobe,lsmod能够查看模块的依赖关系,modprobe在加载模块时会加载其余依赖的模块。设计模式
3) 显示当前使用的中断号cat /proc/interrupt
三、Linux中引入模块机制有什么好处?数组
首先,模块是预先注册本身以便服务于未来的某个请求,而后他的初始化函数就当即结束。换句话说,模块初始化函数的任务就是为之后调用函数预先做准备。安全
好处:服务器
1) 应用程序在退出时,能够无论资源的释放或者其余的清除工做,可是模块的退出函数却必须仔细此撤销初始化函数所做的一切。
2) 该机制有助于缩短模块的开发周期。即:注册和卸载都很灵活方便。
四、copy_to_user()和copy_from_user()主要用于实现什么功能?通常用于file_operations结构的哪些函数里面?
因为内核空间和用户空间是不能互相访问的,若是须要访问就必须借助内核函数进行数据读写。copy_to_user():完成内核空间到用户空间的复制,copy_from_user():是完成用户空间到内核空间的复制。通常用于file_operations结构里的read,write,ioctl等内存数据交换做用的函数。固然,若是ioctl没有用到内存数据复制,那么就不会用到这两个函数。
五、请简述主设备号和次设备号的用途。若是执行mknod chartest c 4 64,建立chartest设备。请分析chartest使用的是那一类设备驱动程序。
1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核容许多个驱动程序共享主设备号,但咱们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织。
次设备号:次设备号由内核使用,用于正确肯定设备文件所指的设备。依赖于驱动程序的编写方式,咱们能够经过次设备号得到一个指向内核设备的直接指针,也可将此设备号看成设备本地数组的索引。
2)chartest 由驱动程序4管理,该文件所指的设备是64号设备。(感受相似于串口终端或者字符设备终端)。
六、设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。
注册一个字符设备驱动有两种方法:
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结构。
七、请简述中断于DMA的区别。Linux设备驱动程序中,使用哪一个函数注册和注销中断处理程序?
1)DMA:是一种无须CPU的参与就可让外设与系统内存之间进行双向数据传输的硬件机制,使用DMA可使系统CPU从实际的I/O数据传输过程当中摆脱出来,从而大大提升系统的吞吐率.
中断:是指CPU在执行程序的过程当中,出现了某些突发事件时CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回源程序被中断的位置并继续执行。
因此中断和DMA的区别就是DMA不需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);
释放中断和中断信号线
八、中断和轮询哪一个效率高?怎样决定是采用中断方式仍是采用轮询方式去实现驱动?
中断是CPU处于被动状态下来接受设备的信号,而轮询是CPU主动去查询该设备是否有请求。凡事都是两面性,因此,看效率不能简单的说那个效率高。若是是请求设备是一个频繁请求cpu的设备,或者有大量数据请求的网络设备,那么轮询的效率是比中断高。若是是通常设备,而且该设备请求cpu的频率比较底,则用中断效率要高一些。主要是看请求频率。
九、简单描述在cs8900的驱动设计中, 发送数据frame和接收数据frame的过程。
1)发送流程以下:
(1) 网络设备驱动程序从上层协议传递过来的sk_buff参数得到数据包的有效数据和长度,将有效数据放入临时缓冲区。
(2) 对于以太网,若是有效数据的长度小于以太网冲突检测所要求的数据桢的最小长度,则给临时缓冲区的末尾填充0
(3) 设置硬件寄存器,驱使网络设备进行数据发送操做。
2)接收流程
网络设备接收数据主要是由中断引起设备的中断处理函数,中断处理函数判断中断类型,若是为接收中断,则读取接受到的数据,分配sk_buff数据结构和数据缓冲区,将接收到的数据复制到数据缓冲区,并调用netif_rx()函数将sk_buff传递给上层协议。
十、Cs8900.c的驱动中,发送数据frame的过程为何须要关中断?接收数据frame的过程为何不须要关中断?
在发送过程当中是不能被打断的,在发送的过程当中,不关中断,这时候若是有一个中断到来,那么cpu有可能会去相应该中断,若是该中断须要改写的数据是发送数据的缓冲区,那么缓冲区将被改写,这样即便cpu相应完毕该中断,再发送数据,接收方也不认识该数据不能接收。
在接收数据的时候,须要打开中断,是由于要及时的相应接收到的数据。若是关闭该中断,那么接收方有可能由于相应优先级高的中断而接收不到该数据。
十一、简单描述skbuff这个数据结构在网络结构中所起到的做用,为何须要一个skbuff,它的分配和释放主要都在什么部位
sk_buff结构很是重要,它的含义为“套接字缓冲区”,用于在linux网络子系统中的盖层之间传递数据。
当发送数据包时,linux内核的网络处理模块必须创建一个包含要传输的数据包的sk_buff,而后将sk_buff递交给下层,各层在sk_buff中添加不一样的协议头直至交给网络设备发送。一样的,当网络设备从网络媒介上接受到数据包后,它必须将接受到的数据转换为sk_buff数据结构并传递给上层,盖层不抛去相应的协议头直至交给用户。分配sk_buff在接受一开始就应该分配,在发送完毕数据以后能够释放sk_buff
十二、字符型驱动设备怎么建立设备文件
手动建立:mknod /dev/led c 250 0 其中dev/led 为设备节点 c 表明字符设备 250表明主设备号 0表明次设备号
还有UDEV/MDEV自动建立设备文件的方式,UDEV/MDEV是运行在用户态的程序,能够动态管理设备文件,包括建立和删除设备文件,运行在用户态意味着系统要运行以后。在 /etc/init.d/rcS 脚本文件中会执行mdev -s 自动建立设备节点。
1三、写一个中断服务须要注意哪些?若是中断产生以后要作比较多的事情你是怎么作的?
中断处理例程应该尽可能短,把能放在后半段(tasklet,等待队列等)的任务尽可能放在后半段。
写一个中断服务程序要注意快进快出,在中断服务程序里面尽可能快速采集信息,包括硬件信息,而后退出中断,要作其它事情可使用工做队列或者tasklet方式。也就是中断上半部和下半部。
第二:中断服务程序中不能有阻塞操做。应为中断期间是彻底占用CPU的(即不存在内核调度),中断被阻塞住,其余进程将没法操做;
第三:中断服务程序注意返回值,要用操做系统定义的宏作为返回值,而不是本身定义的OK,FAIL之类的。
1四、自旋锁和信号量在互斥使用时须要注意哪些?在中断服务程序里面的互斥是使用自旋锁仍是信号量?仍是二者都能用?为何?
使用自旋锁的进程不能睡眠,使用信号量的进程能够睡眠。
中断服务例程中的互斥使用的是自旋锁,缘由是在中断处理例程中,硬中断是关闭的;可是要注意这样会丢失可能到来的中断。
1五、原子操做你怎么理解?为了实现一个互斥,本身定义一个变量做为标记来做为一个资源只有一个使用者行不行?
原子操做指的是没法被打断的操做。
第二句话的意思是:
定义一个变量,好比 int flag =0;
if(flag == 0)
{
flag = 1;
操做临界区;
flag = 0;
}
1六、insmod 一个驱动模块,会执行模块中的哪一个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引发的?
insmod调用init函数,rmmod调用exit函数。这两个函数在设计时要注意什么?卸载模块时曾出现卸载失败的情形,缘由是存在进程正在使用模块,检查代码后发现产生了死锁的问题。
要注意在init函数中申请的资源在exit函数中要释放,包括存储,ioremap,定时器,工做队列等等。也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一切不留下一点痕迹。
1七、驱动中操做物理绝对地址为何要先ioremap?
由于内核没有办法直接访问物理内存地址,必须先经过ioremap得到对应的虚拟地址。
1八、设备驱动模型三个重要成员是?platfoem总线的匹配规则是?在具体应用上要不要先注册驱动再注册设备?有前后顺序没?
设备驱动模型三个重要成员是 总线、设备、驱动;
platfoem总线的匹配规则是:要匹配的设备和驱动都要注册;
1九、linux内核里面,内存申请有哪几个函数,各自的区别?
Kmalloc() __get_free_page() mempool_create()
20、 IRQ和FIQ有什么区别,在CPU里面是是怎么作的?
21
int *a;
char *b;
a 和 b自己是什么类型?
a、b里面自己存放的只是一个地址,难道是这两个地址有不一样么?
2二、 中断的上半部分和下半部分的问题:讲下分红上半部分和下半部分的缘由,为什么要分?讲下如何实现?
上半部分执行与硬件相关的处理要求快, 而有些驱动在中断处理程序中又须要完成大量工做,这构成矛盾,因此Linux有所谓的bottom half机制,中断处理程序中全部不要求当即完成的,在开中断的环境下,由底半程序随后完成.
Linux的底半处理其实是创建在内核的软中断机制上的.如何实现该机制?
两种方式
【tasklet 工做队列】
1.定义和初始化
struct tasklet_struct tlet;
tasklet_init(&tlet, jit_tasklet_fn, (unsigned long) data);
参数
第一个:定义的tasklet变量
第二个:函数
第三个:数据 传递给回调函数的数据
2. 定义函数
void jit_tasklet_fn(unsigned long arg)
{
//中断的底半部 执行该函数的时候,已经出中断了
printk("in jit_tasklet_fn jiffies=%ld\n",jiffies);
}
3. 在须要调度的地方调用如下函数
tasklet_schedule(&tlet);
通常在中断函数当中调度在不晚于下一个时钟滴答以前执行
【tasklet 和按期器的区别】
1. 执行时间
定时器的执行:时间是肯定的
tasklet :不肯定的
2.tasklet 执行耗时的操做的
2三、内核函数mmap的实现原理,机制?
mmap函数实现把一个文件映射到一个内存区域,从而咱们能够像读写内存同样读写文件,他比单纯调用read/write也要快上许多。在某些时候咱们能够把内存的内容拷贝到一个文件中实现内存备份,固然,也能够把文件的内容映射到内存来恢复某些服务。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间经过映射同一个普通文件实现共享内存。
2四、驱动里面为何要有并发、互斥的控制?如何实现?讲个例子?
2五、spinlock自旋锁是如何实现的?
自旋锁在同一时刻只能被最多一个内核任务持有,因此一个时刻只有一个线程容许存在于临界区中。这点能够应用在多处理机器、或运行在单处理器上的抢占式内核中须要的锁定服务。
2六、信号量简介
这里也介绍下信号量的概念,由于它的用法和自旋锁有类似的地方。
Linux中的信号量是一种睡眠锁。若是有一个任务试图得到一个已被持有的信号量时,信号量会将其推入等待队列,而后让其睡眠。这时处理器得到自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而即可以得到这个信号量。
2七、 任务调度的机制?
2八、什么是GPIO?
general purpose input/output
GPIO是相对于芯片自己而言的,如某个管脚是芯片的GPIO脚,则该脚可做为输入或输出高或低电平使用,固然某个脚具备复用的功能,便可作GPIO也可作其余用途。 也就是说你能够把这些引脚拿来用做任何通常用途的输入输出,例如用一根引脚连到led的一极来控制它的亮灭,也能够用一根(一些)引脚连到一个传感器上以得到该传感器的状态,这给cpu提供了一个方便的控制周边设备的途经。若是没有足够多的gpio管脚,在控制一些外围设备时就会力有不逮,这时可采起的方案是使用CPLD来帮助管理。
2九、在Linux C中,ls这个命令是怎么被执行的?
使用fork建立一个进程或exec函数族覆盖原进程。
30、LINUX下的Socket套接字和Windows下的WinSock有什么共同点?请从C/C++语言
a)都基于TCP/IP协议,都提供了面向链接的TCP SOCK和无链接的UDP SOCK。
b)都是一个sock结构体。
c)都是使用sock文件句柄进行访问。
d)都具备缓冲机制。
3一、一个计划跑LINUX系统的ARM系统把bootloader烧录进去后,上电后串口上没有任何输出,硬件和软件各应该去检查什么?
提示: 1.跑LINUX的系统通常都须要外扩DRAM,通常的系统也常常有NOR或NAND FLASH
bootloader通常是由汇编和C编写的裸奔程序[5分]
一、驱动中操做物理绝对地址为何要先ioremap?
由于在内核中操做的都是虚拟地址,内核访问不到物理地址,只能经过ioremap映射为虚拟地址 内核才能访问此内存空间
二、设备驱动模型三个重要成员是?platform总线的匹配规则是?在具体应用上要不要先注册驱动再注册设备?有前后顺序没?
设备驱动模型的三个重要成员是总线,驱动,设备。
platfoem总线的匹配规则是:要匹配的设备和驱动都要注册,驱动和设备的匹配规则以下
1.基于设备树风格的匹配
2.匹配ID表(即platform_device设备名是否出如今platform_driver的id表内)
3.匹配platform_device设备名和驱动的名字
4.基于ACPI风格的匹配
三、中断的上半部分和下半部分的问题:请说明分红上半部分和下半部分的缘由,为什么要分?该如何实现?
中断分红上半部分和下班部分的缘由主要是由于内核要保证内核中进程的正常调度和运行,中断程序因此须要短小精悍,可是有些驱动在中断处理程序须要完成大量的工做,因此就很耗时。为了解决这个问题就Linux 将中断
处理程序分解为两个半部:顶半部(top half)和底半部(bottom half)。顶半部完成尽量少的比较紧急的功能,底半部就由tasklet或者工做队列的方法实现 具体的实现效果以下
1.定义和初始化 struct tasklet_struct tlet; tasklet_init(&tlet, jit_tasklet_fn, (unsigned long) data); 参数 第一个:定义的tasklet变量 第二个:函数 第三个:数据 传递给回调函数的数据 2. 定义函数 void jit_tasklet_fn(unsigned long arg) { //中断的底半部 执行该函数的时候,已经出中断了 printk("in jit_tasklet_fn jiffies=%ld\n",jiffies); } 3. 在须要调度的地方调用如下函数 tasklet_schedule(&tlet); 通常在中断函数当中调度在不晚于下一个时钟滴答以前执行 【tasklet 和定时器的区别】 1. 执行时间 定时器的执行:时间是肯定的 tasklet:不肯定的 2.tasklet 执行耗时的操做的
四、自旋锁和信号量在互斥使用时须要注意哪些?在中断服务程序里面的互斥是使用自旋锁仍是信号量?仍是二者都能用?为何?
使用自旋锁的进程不能睡眠,使用信号量的进程能够睡眠。
中断服务例程中的互斥使用的是自旋锁,缘由是在中断处理例程中,硬中断是关闭的;可是要注意这样会丢失可能到来的中断。
五、原子操做你怎么理解?为了实现一个互斥,本身定义一个变量做为标记来做为一个资源只有一个使用者行不行?
原子操做指的是没法被打断的操做。
第二句话的意思是:
定义一个变量,好比 int flag =0;
if(flag == 0)
{
flag = 1;
操做临界区; flag = 0;
}
六、insmod 一个驱动模块,会执行模块中的哪一个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引发的?
insmod调用init函数,rmmod调用exit函数。这两个函数在设计时 要注意在init函数中申请的资源在exit函数中要释放,包括存储,ioremap,定时器,工做队列等等。也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一切不留下一点痕迹。
卸载模块时曾出现卸载失败的情形,缘由是存在进程正在使用模块,检查代码后发现产生了死锁的问题。
七、 copy_to_user()和copy_from_user()主要用于实现什么功能?通常用于file_operations结构的哪些函数里面?
因为内核空间和用户空间是不能互相访问的,若是须要访问就必须借助内核函数进行数据读写。copy_to_user():完成内核空间到用户空间的复制,copy_from_user():是完成用户空间到内核空间的复制。通常用于file_operations结构里的read,write,ioctl等内存数据交换做用的函数。固然,若是ioctl没有用到内存数据复制,那么就不会用到这两个函数。
八、请简述主设备号和次设备号的用途。若是执行mknod chartest c 4 64,建立chartest设备。请分析chartest使用的是那一类设备驱动程序。
1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核容许多个驱动程序共享主设备号,但咱们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织。
次设备号:次设备号由内核使用,用于正确肯定设备文件所指的设备。依赖于驱动程序的编写方式,咱们能够经过次设备号得到一个指向内核设备的直接指针,也可将此设备号看成设备本地数组的索引。
2)chartest 由驱动程序4管理,该文件所指的设备是64号设备。(感受相似于串口终端或者字符设备终端)。
九、设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。
注册一个字符设备驱动有两种方法:
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 *name , struct file_operations *fopen);
该注册函数是早期的注册函数,major是设备的主设备号,name是驱动程序的名称,而fops是默认的file_operations结构(这是只限于file_operations结构)。对于register_chrdev的调用将为给定的主设备号注册0-255做为次设备号,
并为每一个设备创建一个对应的默认cdev结构。
十、 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。
字符设备:字符设备是个可以像字节流(相似文件)同样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序一般至少实现open,close,read和write系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。
块设备:和字符设备相似,块设备也是经过/dev目录下的文件系统节点来访问。块设备上可以容纳文件系统,如:u盘,SD卡,磁盘等。
字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不一样对用户来说是透明的。在内核中,和字符驱动程序相比,块驱动程序具备彻底不一样的接口。
十一、查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号?、
1) 查看驱动模块中打印信息的命令:dmesg
2) 查看字符设备信息能够用lsmod 和modprobe,lsmod能够查看模块的依赖关系,modprobe在加载模块时会加载其余依赖的模块。
3) 显示当前使用的中断号cat /proc/interrupt
十二、linux中引入模块机制有什么好处?
首先,模块是预先注册本身以便服务于未来的某个请求,而后他的初始化函数就当即结束。换句话说,模块初始化函数的任务就是为之后调用函数预先做准备。
好处:
1) 应用程序在退出时,能够无论资源的释放或者其余的清除工做,可是模块的退出函数却必须仔细此撤销初始化函数所做的一切。
2) 该机制有助于缩短模块的开发周期。即:注册和卸载都很灵活方便。
我相信若是能搞懂以上问题,面试什么的便没有问题。
正常的HR面试:
平时喜欢干什么
高考状况,成绩,考研状况,成绩
特此列出部分我认为具备挑战性的问题:
中科创达HR面
1. 自我介绍下。被打断【她说很差意思注意回说谢谢,同时还要记得本身说到哪里】而后再次打断她没有让你继续自我介绍。到此自我介绍便结束。
2. 你家在哪,这些项目都是你作的吗?有没有让本身感到很挫败的事情?同窗周围的人对你是怎么评价的?你的缺点是什么?【老掉牙的问题】
3. 分配任务,你和另一我的合做,主要都是你作的,可是上级不知道,把功劳主要分给了另我的,你会怎么想。我首先讲了本身学习到的不少,并不会太在乎!而后她追问:若是一直出现这个问题,你会怎么样。【先软后硬】
4. 分配一个任务,由你和另一我的完成,你只能借助他完成,由于其能力比你强,若是他和你格格不入,你会怎么办?若是一直这样你会怎么办?【先自身后他人,结合团体公司利益阐述,最后可上升到公司层面】
5. 咱们公司有两种,一个是我的负责项目,成就感更好,一个是和同事一块儿作项目,你倾向于哪一种?我说:能够和能力高于个人一块儿合做,并无特定要求我的本身作。追问:若是有人能力不行怎么办?我说:没有关系,能够带。追问:不是托你后腿吗。我说:教同事,能提升本身,给予会带来回报,并且本身会的并不算真正会,把别人教会了才算。【注意这里的陷阱,必定要选择团队项目】
中兴HR面
1. 你是如何完成一个分配给你的任务的?
2. 在你作的这些项目中有没有很难忘的困难或者经历,那你有没有想过,若是如今回想这个困难如何更好地去解决?【考察你的即时总结和部分记忆力的能力+真实性考察】
3. 这些项目都比较闲散,和真正工做的时候不同,不能这块没有作好放一段时间,那你怎么办?【实战和训练的区别,可自由发挥】
博客写完,浙江大华和中兴的offer尚未消息,虽然手里有了9个offer,可是只有那几个是比较中意的。最后祝你们可以有博主的好运,愿都能找到本身的归处。Best wishes to you!!