网上流传的内核开发面试题答案--欢迎指正
1) Linux中主要有哪几种内核锁? 由于内核的几种机制导致必须要加锁。SMP多处理器机制 内核抢占机制 中断处理机制 schedule() spinlock锁(轻量级锁,持有时间为ns级) 特征是临界区只能进一人,无法获得锁的人忙等,持有锁的人不能睡眠,内核四中机制中只有schedule()机制用spinlock无法保护
1) Linux中主要有哪几种内核锁?
由于内核的几种机制导致必须要加锁。SMP多处理器机制 内核抢占机制 中断处理机制 schedule()
spinlock锁(轻量级锁,持有时间为ns级)
特征是临界区只能进一人,无法获得锁的人忙等,持有锁的人不能睡眠,内核四中机制中只有schedule()机制用spinlock无法保护
mutex锁(重量级锁,持有时间为ms级)
特征是临界区只可进一人,无法获得锁的人会睡眠,直到锁被释放,持有锁时也可以睡眠,内核四种机制中只有中断处理机制用mutex无法保护
2) Linux中的用户模式和内核模式是什么含意?
MS-DOS等操作系统在单一的CPU模式下运行,但是一些类Unix的操作系统则使用了双模式,可以有效地实现时间共享。在Linux机器上,CPU要么处于受信任的内核模式
,要么处于受限制的用户模式。除了内核本身处于内核模式以外,所有的用户进程都运行在用户模式之中。
内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和I/O空间。如果用户模式的进程要享有此特权,它必须通过系统调用向设备驱动程序或其他内核模
式的代码发出请求。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许。
在2.4和更早的内核中,仅仅用户模式的进程可以被上下文切换出局,由其他进程抢占。除非发生以下两种情况,否则内核模式代码可以一直独占CPU:
(1) 它自愿放弃CPU;
(2) 发生中断或异常。
2.6内核引入了内核抢占,大多数内核模式的代码也可以被抢占。
3) 怎样申请大块内核内存?
在Linux内核环境下,申请大块内存的成功率随着系统运行时间的增加而减少,虽然可以通过vmalloc系列调用申请物理不连续但虚拟地址连续的内存,但毕竟其使用
效率不高且在32位系统上vmalloc的内存地址空间有限。所以,一般的建议是在系统启动阶段申请大块内存,但是其成功的概率也只是比较高而已,而不是100%。如果程序真的
比较在意这个申请的成功与否,只能退用“启动内存”(Boot Memory)
4) 用户进程间通信主要哪几种方式?
(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统
中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
(3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持
Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用
sigaction函数重新实现了signal函数)。
(4)消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可
以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
(5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合
使用,来达到进程间的同步及互斥。
(6)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
(7)套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类
Unix系统上:Linux和System V的变种都支持套接字。
5) 通过伙伴系统申请内核内存的函数有哪些?
在物理页面管理上实现了基于区的伙伴系统(zone based buddy system)。对不同区的内存使用单独的伙伴系统(buddy system)管理,而且独立地监控空闲页。相应
接口alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。
6) 通过slab分配器申请内核内存的函数有?
7) Linux的内核空间和用户空间是如何划分的(以32位系统为例)?
高1G为内核空间,低3G为用户空间(0~0xBFFFFFFF用户空间空间) (0xC0000000到0xFFFFFFF内核空间空间)
8) vmalloc()申请的内存有什么特点?
9) 用户程序使用malloc()申请到的内存空间在什么范围?
0~0xBFFFFFFF
10) 在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式?
虚拟地址模式
11) ARM处理器是通过几级页表进行存储空间映射的?
两级页表。一级页表中包含以段为单位的地址变换条目或者指向二级页表的指针,一级页表实现的地址映射粒度较大。二级页表中包含以大页、小页和极小页为单位
的地址变换条目
12) Linux是通过什么组件来实现支持多种文件系通的?
VFS
13) Linux虚拟文件系统的关键数据结构有哪些?(至少写出四个)
super_block inode file dentry
14) 对文件或设备的操作函数保存在那个数据结构中?
file_operations
15) Linux中的文件包括哪些?
普通文件 : 通常是流式文件
目录文件 : 用于表示和管理系统中的全部文件
连接文件 : 用于不同目录下文件的共享
设备文件 : 包括块设备文件和字符设备文件,块设备文件表示磁盘文件、光盘等,字符设备文件按照字符操作终端、键盘等设备。
管道(FIFO)文件 : 提供进程建通信的一种方式
套接字(socket) 文件: 该文件类型与网络通信有关
16) 创建进程的系统调用有那些?
system exec一族函数 fork
17) 调用schedule()进行进程切换的方式有几种?
直接调用 延迟调用
18) Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的?
动态优先级----完全公平调度器CFS
19) 进程调度的核心数据结构是哪个?
task_struct
20) 如何加载、卸载一个模块?
insmod rmmod
21) 模块和应用程序分别运行在什么空间?
模块运行在内核空间、应用程序运行在用户空间
22) Linux中的浮点运算由应用程序实现还是内核实现?
由内核实现
23) 模块程序能否使用可链接的库函数?
不能
24) TLB中缓存的是什么内容?
25) Linux中有哪几种设备?
字符设备 快设备 网络设备
26) 字符设备驱动程序的关键数据结构是哪个?
file_operations
27) 设备驱动程序包括哪些功能函数?
register prob release remove
28) 如何唯一标识一个设备?
主设备号和从设备号
29) Linux通过什么方式实现系统调用?
SWI(软终端)
30) Linux软中断和工作队列的作用是什么?
软中断可以让用户程序使用系统提供的软件资源
工作队列(work queue)是Linux kernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。
更多推荐
所有评论(0)