linux内核

linux内核 

http://blog.chinaunix.net/uid-26611383-id-3422889.html

from: http://www.cnmaizi.com/tech/kernel/30-embedded-linux-kernel-develop-self-testing-topic/
如果你能正确回答以下问题并深刻理解相关知识点原理,那么你可以算得上合格的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软中断和工作队列的作用是什么?

 

答案:

第一题:

Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡;
伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效,也越来越复杂。
Linux的内核锁主要是自旋锁和信号量。
自旋锁【忙等待锁,"测试并置位"操作必须以原子方式进行,一般适用于多cpu之间,只能有 2 个值:"上锁"和"解锁".自旋锁可用在不能睡眠的代码中, 例如中断处理. 当正确地使用了, 通常自旋锁提供了比旗标更高的性能. 如果一个非抢占的单处理器系统进入一个锁上的自旋, 它将永远自旋; 没有其他的线程再能够获得 CPU 来释放这个锁. 因此, 自旋锁在没有打开抢占的单处理器系统上的操作被优化为什么不作】最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。


Linux
中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。


信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。

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

补充:
内核抢占(可抢占式内核):
即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。

抢占式内核的意义:
首先,这是将Linux应用于实时系统所必需的。实时系统对响应时间有严格的限定,当一个实时进程被实时设备的硬件中断唤醒后,它应在限定的时间内被调度 执行。而Linux不能满足这一要求,因为Linux的内核是不可抢占的,不能确定系统在内核中的停留时间。事实上当内核执行长的系统调用时,实时进程要 等到内核中运行的进程退出内核才能被调度,由此产生的响应延迟,在如今的硬件条件下,会长达100ms级。这对于那些要求高实时响应的系统是不能接受的。 而可抢占的内核不仅对Linux的实时应用至关重要,而且能解决Linux对多媒体(video, audio)等要求低延迟的应用支持不够好的缺陷。



第二题:
一、内核空间和用户空间
   Linux 简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~ 4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内 核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间“)。因为每个进程可以通过系 统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

二、内核态和用户态
   当 一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执 行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户 态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核 态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。

 

三、进程上下文和中断上下文
   处理器总处于以下状态中的一种:

1、内核态,运行于进程上下文,内核代表进程运行于内核空间;

2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

3、用户态,运行于用户空间。



内核的一些特点:

无内存保护
 
当用户空间的应用程序尝试一个非法的内存访问时,内核可以捕捉到错误,发送SIGSEGV信号,杀掉进程,如果内核尝试一个非法的内存访问时,结果就不受控制了,因为谁也无法去控制内核,这也是内核最主要的失误。
 
此外,内核内存也是不可分页的,因此你消耗的每个内存字节都比物理内存的一个字节要少。
 
不能(容易)使用浮点数
 
当用户空间进程使用浮点指令时,内核要负责处理从整型到浮点模式的转换。
 
与用户空间不一样,内核不能无缝支持浮点数,因为它自己不能轻易地捕捉到自己,在内核中使用浮点数需要手动保存和恢复浮点数寄存器,因此除非却有必要,否则尽量不要在内核中做浮点运算。
 
小型,固定大小的堆栈
 
用户空间可以静态分配许多不同的堆栈,包括巨型结构和千元数组,这个行为是合法的,因为用户空间有很大的堆栈,并可以动态增长。
 
内核堆栈不大也不是动态的,相反,它很小且是固定的,内核堆栈的精确大小根据架构有所不同,在x86上,堆栈大小是在编译时确定的,一般是4KB或 8KB,历史上,内核堆栈有2页,通常表示它处于32位架构上,大小是8KB,如果是16KB就表示是64位架构,总之大小是固定的,每个进程接收它自己 的堆栈。






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

如果是从事内核开发的话,所有引用的头文件均是来自内核本身,绝不可能使用用户空间的头文件,比如"glibc"(Linux标准C库),“lib

stdc++"(Linux标准C++库)等头文件的引用是不可能出现在内核程序中的。
《独辟蹊径品内核:Linux内核源代码导读》,李云华编著,电子工业出版社,2009年
 
 
 
 
 
1)LINUX KERNEL DEVELOPMENT, 2ND EDITION (LKD)(注:非常好的入门书籍)
2) LINUX DEVICE DRIVERS, 3RD EDITION  (LDD)(注:很好的实战书籍,对KERNEL HACKER一样有帮助)
3) UNDERSTANDING LINUX KERNEL. 3RD EDITION (ULK) (注:从硬件讲到上层,内容丰富,大观念清楚)

posted on 2015-05-02 08:39  小西红柿  阅读(236)  评论(0)    收藏  举报

导航