您的位置 首页 开关

嵌入式Linux内核开发有必要了解的三十道题

嵌入式Linux内核开发必须了解的三十道题-嵌入式系统Linux内核开发工程师必须掌握的三十道题 linux内核工程师需要知道的30个问题,看看你能回答出多少个。

Linux的同步机制从2.0到2.6以来不断开展完善。从开始的原子操作,到后来的信号量,从大内核锁到今日的自旋锁。这些同步机制的开展随同Linux从单处理器到对称多处理器的过渡。

随同着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有用,也越来越杂乱。

1)Linux的内核锁首要是自旋锁和信号量。

自旋锁最多只能被一个可履行线程持有,假如一个履行线程企图恳求一个已被争用(现已被持有)的自旋锁,那么这个线程就会一向进行忙循环——旋转——等候锁从头可用。要是锁未被争用,恳求它的履行线程便能马上得到它并且继续进行。自旋锁能够在任何时刻避免多于一个的履行线程一起进入临界区。

Linux中的信号量是一种睡觉锁。假如有一个使命企图取得一个已被持有的信号量时,信号量会将其推入等候行列,然后让其睡觉。这时处理器取得自在去履行其它代码。当持有信号量的进程将信号量开释后,在等候行列中的一个使命将被唤醒,然后便能够取得这个信号量。

信号量的睡觉特性,使得信号量适用于锁会被长期持有的状况;只能在进程上下文中运用,由于中止上下文中是不能被调度的;别的当代码持有信号量时,不能够再持有自旋锁。

Linux 内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的API,别的一些同步机制,包含大内核锁、读写锁、大读者锁、RCU (Read-Copy Update,望文生义便是读-复制修正),和次序锁。

嵌入式Linux内核开发有必要了解的三十道题

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 x\n”, 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)同享内存:使得多个进程能够拜访同一块内存空间,是最快的可用IPC方法。是针对其他通讯机制运转功率较低而规划的。往往与其它通讯机制,如信号量结合运用,来到达进程间的同步及互斥。

(6)信号量(semaphore):首要作为进程间以及同一进程不同线程之间的同步手法。

(7)套接字(Socket):更为一般的进程间通讯机制,可用于不同机器之间的进程间通讯。起初是由Unix体系的BSD分支开宣布来的,但现在一般能够移植到其它类Unix体系上:Linux和System V的变种都支撑套接字。

5) 经过同伴体系请求内核内存的函数有哪些?

在物理页面办理上完成了依据区的同伴体系(zone based buddy system)。对不同区的内存运用独自的同伴体系(buddy system)办理,并且独登时监控闲暇页。相应接口alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。

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软中止和作业行列的效果是什么?

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/102739.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部