前些天的面试尸横遍野,由于面试官问了linux内核,不少同窗平时并不注重这个,因此天然也就没办法答得出来,一块儿来看看是哪些题难住了你们,答案也帮你们整理好了,不过只写了了几个,由于不知道有没有人看,我犯懒,剩下的答案感兴趣的朋友能够进群获取linux
=============================面试
Linux 的同步机制从 2.0 到 2.6 以来不断发展完善。从最初的原子操做,到后来 的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux 从单处 理器到对称多处理器的过渡;伴随着从非抢占内核到抢占内核的过分。Linux 的锁机制愈来愈有效,也越缓存
来越复杂。 自旋锁最多只能被一个可执行线程持有,若是一个执行线程试图请求一个已被争用已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待 锁从新可用。要是锁未被争用,请求它的执行线程便能马上获得它而且继续进行。 自旋锁可 数据结构
以在任什么时候刻防止多于一个的执行线程同时进入临界区。 信号量的睡眠特性,使得信号量适用于锁会被长时间持有的状况;只能在进程上 下文中使用,由于中断上下文中是不能被调度的;另外当代码持有信号量时,不 能够再持有自旋锁。 Linux 内核中的同步机ide
制:原子操做、信号量、读写信号量和自旋锁的 API,另 外一些同步机制,包括大内核锁、读写锁、大读者锁、RCU (Read-Copy Update, 顾名思义就是读-拷贝修改),和顺序锁。函数
=====================================操作系统
MS-DOS 等操做系统在单一的 CPU 模式下运行,可是一些类 Unix 的操做系统则使 用了双模式,能够有效地实现时间共享。在 Linux 机器上,CPU 要么处于受信任 的内核模式,要么处于受限制的用户模式。除了内核自己处于内核模式之外,所 有的用户进程都运线程
行在用户模式之中。 内核模式的代码能够无限制地访问全部处理器指令集以及所有内存和 I/O 空间。 若是用户模式的进程要享有此特权,它必须经过系统调用向设备驱动程序或其余 内核模式的代码发出请求。另外,用户模式的代码容许发生缺页,而内核模式的code
代码则不容许。 在 2.4 和更早的内核中,仅仅用户模式的进程能够被上下文切换出局,由其余进 程抢占。除非发生如下两种状况,不然内核模式代码能够一直独占 CPU:视频
(1) 它自愿放弃 CPU;
(2) 发生中断或异常。
2.6 内核引入了内核抢占,大多数内核模式的代码也能够被抢占。
========================
在 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 分配器所使用和统计,也就是说它处于系统的可见内存以外,即便在 未来的某个地方你释放了它。通常用户只会申请一大块内存,若是须要在其上实
现复杂的内存管理则须要本身实现。在不容许内存分配失败的场合,经过启动内 存预留内存空间将是咱们惟一的选择。
===========================
=============================================
1.系统调用 do_fork();
2.定时中断 do_timer();
3.唤醒进程 wake_up_process
4.改变进程的调度策略 setscheduler();
5.系统调用礼让 sys_sched_yield();
六、经过伙伴系统申请内核内存的函数有哪些?
七、经过slab分配器申请内核内存的函数有?
八、Linux的内核空间和用户空间是如何划分的(以32位系统为例)?
九、vmalloc()申请的内存有什么特色?
十、用户程序使用malloc()申请到的内存空间在什么范围?
十一、在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式仍是虚拟地址模式?
十二、ARM处理器是经过几级也表进行存储空间映射的?
1三、Linux是经过什么组件来实现支持多种文件系通的?
1四、Linux虚拟文件系统的关键数据结构有哪些?(至少写出 四个)
1五、对文件或设备的操做函数保存在那个数据结构中?
1六、建立进程的系统调用有那些?
1七、Linux调度程序是根据进程的动态优先级仍是静态优先级来调度进程的?
1八、进程调度的核心数据结构是哪一个?
1九、如何加载、卸载一个模块?
20、Linux中的浮点运算由应用程序实现仍是内核实现?
2一、模块程序可否使用可连接的库函数?
2二、TLB中缓存的是什么内容?
2三、Linux中有哪几种设备?
2四、字符设备驱动程序的关键数据结构是哪一个?
2五、设备驱动程序包括哪些功能函数?
2六、如何惟一标识一个设备?
2七、Linux 经过什么方式实现系统调用?
2八、Linux 软中断和工做队列的做用是什么?
视频>>linux内核30道面试题好了,文章就到这里吧,你问我后面的答案怎么没有了?由于我懒得打字了,若是本身作不出来或者想印证一下作的对不对的朋友,能够进群973961276跟你们一块儿交流,若是有人看的话我再给你们贴一个讲解linux内核的视频,散会!