Linux内核30题

1)      Linux中主要有哪几种内核锁?
Linux的内核锁主要是自旋锁和信号量。
自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。
Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。


2)      Linux中的用户模式和内核模式是什么含意?
MS-DOS等操作系统在单一的CPU模式下运行,但是一些类Unix的操作系统则使用了双模式,可以有效地实现时间共享。在Linux机器上,CPU要么处于受信任的内核模式,要么处于受限制的用户模式。除了内核本身处于内核模式以外,所有的用户进程都运行在用户模式之中。
  内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和I/O空间。如果用户模式的进程要享有此特权,它必须通过系统调用向设备驱动程序或其他内核模式的代码发出请求。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许。
  在2.4和更早的内核中,仅仅用户模式的进程可以被上下文切换出局,由其他进程抢占。除非发生以下两种情况,否则内核模式代码可以一直独占CPU:
  (1) 它自愿放弃CPU;
  (2) 发生中断或异常。
  2.6内核引入了内核抢占,大多数内核模式的代码也可以被抢占。

3)      怎样申请大块内核内存?
       通过vmalloc系列调用申请物理不连续但虚拟地址连续的内存

4)      用户进程间通信主要哪几种方式?
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。


5)      通过伙伴系统申请内核内存的函数有哪些?
         物理页框分配__get_free_pages()和物理页框回收free_pages()
6)      通过slab分配器申请内核内存的函数有?
          kmalloc和kfree
7)      Linux的内核空间和用户空间是如何划分的(以32位系统为例)?

8)      vmalloc()申请的内存有什么特点?
Kmalloc 是连续的物理内存。
Vmalloc 是非连续的。
vmalloc是一页一页地去获取内存,然后把获取到的这些页映射成连续的虚拟地址;
kmalloc是一次性获取所需要的所有页,并且不需要再做映射;
vmlloc 是否效率远不如 kmalloc

9)      用户程序使用malloc()申请到的内存空间在什么范围?

10)   在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式?

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

12)   Linux是通过什么组件来实现支持多种文件系通的?
Linux虚拟文件系统的关键数据结构有哪些?(至少写出四个)
VFS超级块:struct super_block
VFS的i节点:struct inode
i节点的操作函数:struct inode_operations
VFS的dentry结构:struct dentry

14)   对文件或设备的操作函数保存在那个数据结构中?
file_operations

15)   Linux中的文件包括哪些?
FAT16 文件分配表系统
VFAT  扩展文件分配表系统
FAT32  应用于windows98系统,特点是一个簇比FAT16小很多,节省磁盘空间
HPFS 高性能文件系统
NIFS EXT2等等

16)   创建进程的系统调用有那些?
fork();创建子进程,其实是复制了父进程,但是父进程的程序代码和全局变量没有被复制。父进程调用fork会返回子进程的ID号,调用失败返回-1,子进程调用返回0。
 execve();子进程调用execve(),是为了运行另一个属于自己的程序。
exit();进程调用exit()就会立即退出,系统的跟进程会接替被中止进程的地位。
wait();进程调用,阻塞自己,等到自己的某个子进程退出再继续运行。
vfork();也是创建一个子进程,但它并不把父进程的映像全部复制到子进程中,而是只是用复制指针的方法使子进程与父进程的资源共享。它与父进程共享一个内存空间。

17)   调用schedule()进行进程切换的方式有几种?
切换用户空间
切换内存堆栈
18)   Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的?
动态优先级,实时进程优于普通进程,每次进行进程调度时,会计算出每一个进程占用处理器权利的权重参数weight,优先运行weight值大的进程。

19)   进程调度的核心数据结构是哪个?
进程控制块  task_struct
包含有:进程的当前状态,调度信息,进程标识,与其他进程的关系,计时器等。

20)   如何加载、卸载一个模块?
使用insmod 命令加载模块,使用rmmod命令卸载模块。

21)   模块和应用程序分别运行在什么空间?
模块运行在内核空间,应用程序运行在用户空间

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

23)   模块程序能否使用可链接的库函数?
模块是内核函数,不能使用C库函数

24)   TLB中缓存的是什么内容?

25)   Linux中有哪几种设备?
外部设备
设备驱动
设备文件

26)   字符设备驱动程序的关键数据结构是哪个?
char_device_struct
包含:主设备号,字符设备名称,设备文件操作函数

27)   设备驱动程序包括哪些功能函数?
模块的注册与注销
设备的打开、关闭、读、写及其他操作函数
设备的中断服务程序

28)   如何唯一标识一个设备?

29)   Linux通过什么方式实现系统调用?
提供内核服务的内核函数,通过内核函数实现系统调用

30)   Linux软中断和工作队列的作用是什么?
       软中断(softirq):Linux系统把中断分为两部分,前半部分是中断立即执行的,后半部分可以在稍后的某个时候执行。由于后半部分的紧急程度不那么“硬”,也由于后半部分的执行是由软件来启动的,所以后半部分的中断机制也叫做“软中断”。
       工作队列:Linux总是在已经进入就绪状态的进程中来选择一个合适的进程来运行的。为了加快寻找速度,Linux就把所有已就绪的进程集中起来形成一个就绪进程队列。这个队列就叫工作队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值