LINUX内核经典面试题

1) Linux中主要有哪几种内核锁?
2) Linux中的用户模式和内核模式是什么含意?
3) 怎样申请大块内核内存?
4) 用户进程间通信主要哪几种方式?
5) 通过伙伴系统申请内核内存的函数有哪些?
6) 通过slab分配器申请内核内存的函数有?
7) Linux的内核空间和用户空间是如何划分的(以32位系统为例)?
8) vmalloc()申请的内存有什么特点?
9) 用户程序使用malloc()申请到的内存空间在什么范围?
10) 在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式?
11) ARM处理器是通过几级也表进行存储空间映射的?
12) Linux是通过什么组件来实现支持多种文件系通的?
13) Linux虚拟文件系统的关键数据结构有哪些?(至少写出四个)
14) 对文件或设备的操作函数保存在那个数据结构中?
15) Linux中的文件包括哪些?
16) 创建进程的系统调用有那些?
17) 调用schedule()进行进程切换的方式有几种?
18) Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的?
19) 进程调度的核心数据结构是哪个?
20) 如何加载、卸载一个模块?
21) 模块和应用程序分别运行在什么空间?
22) Linux中的浮点运算由应用程序实现还是内核实现?
23) 模块程序能否使用可链接的库函数?
24) TLB中缓存的是什么内容?
25) Linux中有哪几种设备?
26) 字符设备驱动程序的关键数据结构是哪个?
27) 设备驱动程序包括哪些功能函数?
28) 如何唯一标识一个设备?
29) Linux通过什么方式实现系统调用?
30) Linux软中断和工作队列的作用是什么?

转载于 http://blog.chinaunix.net/u3/118354/showart_2311237.html

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

Linux的同步机制从2.02.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡;
伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效,也越来越复杂。
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_b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值