乐趣区

关于linux:让面试者头大如斗的linux内核30道题

前言

前些天的面试血流成河,因为面试官问了 linux 内核,很多同学平时并不重视这个,所以天然也就没方法答得进去,一起来看看是哪些题难住了大家,答案也帮大家整顿好了,不过只写了了几个,因为不晓得有没有人看,我犯懒,剩下的答案感兴趣的敌人能够进群获取

1. Linux 中次要有哪几种内核锁?

=============================

Linux 的同步机制从 2.0 到 2.6 以来一直倒退欠缺。从最后的原子操作,到起初 的信号量,从大内核锁到明天的自旋锁。这些同步机制的倒退随同 Linux 从单处 理器到对称多处理器的过渡;随同着从非抢占内核到抢占内核的适度。Linux 的锁机制越来越无效,也越

来越简单。自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图申请一个已被争用曾经被持有)的自旋锁,那么这个线程就会始终进行忙循环——旋转——期待 锁从新可用。要是锁未被争用,申请它的执行线程便能立即失去它并且持续进行。自旋锁可 

以在任何时刻避免多于一个的执行线程同时进入临界区。信号量的睡眠个性,使得信号量实用于锁会被长时间持有的状况;只能在过程上 下文中应用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不 能够再持有自旋锁。Linux 内核中的同步机

制:原子操作、信号量、读写信号量和自旋锁的 API,另 外一些同步机制,包含大内核锁、读写锁、大读者锁、RCU (Read-Copy Update,顾名思义就是读 - 拷贝批改),和程序锁。

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)。上面就

是申请并导出启动内存的一段示例代码:

void* x_bootmem = NULL;
EXPORT_SYMBOL(x_bootmem);
unsigned long x_bootmem_size = 0;
EXPORT_SYMBOL(x_bootmem_size);
static int __init x_bootmem_setup(char *str)
{x_bootmem_size = memparse(str, &str);
x_bootmem = alloc_bootmem(x_bootmem_size);
printk("Reserved %lu bytes from %p for xn", x_bootmem_size, x_bootmem);
return 1;
}
__setup("x-bootmem=", x_bootmem_setup);

可见其利用还是比较简单的,不过利弊总是共生的,它不可避免也有其本身的限

制:

内存申请代码只能连贯进内核,不能在模块中应用。被申请的内存不会被页调配 器和 slab 分配器所应用和统计,也就是说它处于零碎的可见内存之外,即便在 未来的某个中央你开释了它。个别用户只会申请一大块内存,如果须要在其上实

现简单的内存治理则须要本人实现。在不容许内存调配失败的场合,通过启动内 存预留内存空间将是咱们惟一的抉择。

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. 信号量 semaphore):次要作为过程间以及同一过程不同线程之间的同步伎俩。
  6. 套接字 Socket):更为个别的过程间通信机制,可用于不同机器之间的过程间 通信。起初是由 Unix 零碎的 BSD 分支开发进去的,但当初个别能够移植到其它 类 Unix 零碎上:Linux 和 System V 的变种都反对套接字。

5、调用 schedule()进行过程切换的形式有几种?

=============================================

1. 零碎调用 do_fork();

2. 定时中断 do_timer();

3. 唤醒过程 wake_up_process

4. 扭转过程的调度策略 setscheduler();

5. 零碎调用礼让 sys_sched_yield();


6、通过搭档零碎申请内核内存的函数有哪些?

7、通过 slab 分配器申请内核内存的函数有?

8、Linux 的内核空间和用户空间是如何划分的(以 32 位零碎为例)?

9、vmalloc()申请的内存有什么特点?

10、用户程序应用 malloc()申请到的内存空间在什么范畴?

11、在反对并使能 MMU 的零碎中,Linux 内核和用户程序别离运行在物理地址模式还是虚拟地址模式?

12、ARM 处理器是通过几级也表进行存储空间映射的?

13、Linux 是通过什么组件来实现反对多种文件系通的?

14、Linux 虚构文件系统的要害数据结构有哪些?(至多写出 四个)

15、对文件或设施的操作函数保留在那个数据结构中?

16、创立过程的零碎调用有那些?

17、Linux 调度程序是依据过程的动静优先级还是动态优先级来调度过程的?

18、过程调度的外围数据结构是哪个?

19、如何加载、卸载一个模块?

20、Linux 中的浮点运算由应用程序实现还是内核实现?

21、模块程序是否应用可链接的库函数?

22、TLB 中缓存的是什么内容?

23、Linux 中有哪几种设施?

24、字符设施驱动程序的要害数据结构是哪个?

25、设施驱动程序包含哪些性能函数?

26、如何惟一标识一个设施?

27、Linux 通过什么形式实现零碎调用?

28、Linux 软中断和工作队列的作用是什么?


好了,文章就到这里吧,你问我前面的答案怎么没有了?因为我懒得打字了,如果本人做不进去或者想印证一下做的对不对的敌人,能够进群 973961276 跟大家一起交换,如果有人看的话我再给大家贴一个解说 linux 内核的视频,散会!

退出移动版