linux内核的总结

来源:互联网 发布:机器人仿真软件dami 编辑:程序博客网 时间:2024/06/05 17:37

linux内核是什么:

1. 编译后的一大推函数集合,很多很多,相信看过systerm.map的都知道

2. uboot启动后要被调用的函数,进行好多的初始化,相信看过start_kernel的都知道

3. 它与大部分的程序一样是一个死循环,由内核挑选要运行的进程来运行。

4. linux内核有几大部分组成,内存管理、进程调度、中断和异常、同步机制、进程间通信、文件系统、驱动、网络协议栈等。

5. linux内存管理的场景

5.1 当我们在shell执行一个bin文件时,需要把bin文件读取到RAM中,其中涉及到文件系统读写和页高速缓存。一个bin文件一般有代码段和数据段,以及链接的动态库,一般需要内核使用mmap映射到进程的用户空间,通过/proc/pid/mmap可以看到进程的用户空间虚拟地址区域。

5.2 虚拟地址和物理地址之间的映射是有内核来管理的,比如我们读取一个文件或者在heap中malloc一段内存,会触发缺页异常来真正的分配物理内存,并且添加相应的映射。

5.3 物理内存的管理也是非常的复杂,首先是物理内存的模型,接着面临内存碎片的问题(伙伴算法),然后是小块内存的管理,特别是内核中的管理数据结构,如inode、dentry等(slab/slub)。

5.4 内存紧缺时的页面回收,其中还涉及到换出RAM中的页到swap的问题。

6. linux进程管理场景

6.1 内核中最重要的数据结构task _struct,包括好多成员。进程的状态、进程间的关系、进程打开的文件、进程地址空间、进程的信号、进程的用户信息等。

6.2 内核中进程的始祖是一个内核静态定义的结构init_task,即idle进程,后续的进程都是通过fork加exec来创建并且运行的。

6.3 内核中的那么多进程是怎么调度的,一定要保证公平性,否则一个进程一直运行,另一个进程得不到运行。进程有主动放弃和被动放弃cpu的。主动放弃,如资源不可用把自己设置为TASK_INTERRUPTIBLE,并且设置自己的flag为可调度,主动调用schedule。被动放弃,如进程已经运行了一段时间,需要其它进程也需要运行一段时间。

6.4 内核中进程的调度策略是什么呢,现在一般是CFS,完全公平调度。

6.5 如果有多个cpu设计到smp该怎么处理呢,cpu之间的load balance如何处理呢,还有内核中心加入的cgroup又是什么东东呢。

7. linux中断和异常

7.1 中断和异常是非常重要的,没有时钟中断,内核就没有了脉搏,就无法更新进程运行了多长时间,是否需要调度,也就好比人没有了心脏的跳动一样了。有了中断,外围的设备才可以通知cpu有数据要接收和发送。前面其实已经有了一个异常,缺页异常。平常我们经常用但是没有注意的一个是gdb的单步调试,其实也是利用了断点异常。

7.2 说到中断,就不得不提软中断softirq。一个使用softirq的例子是tasklet,在驱动代码里面可以说是到处可见。还有一个使用softirq的例子是TIMER_SOFTIRQ,在用户空间调用sleep函数,在内核其实是利用了这个软中断。

8. linux的同步机制

8.1 内核中有好多的全局变量,又有多个cpu同时运行的情况。不能一个cpu在读一个链表数据,而另一个cpu却把我这个链表数据删了。内核中也提供了好多种同步方式。

9. linux的进程间通信

9.1 信号signal其实也算是一种进程间通信的方式。在应用程序中,我们可以重新定义信号处理函数。

9.2 linux内核提供了管道和命名管道、信号量、消息、共享内存区、套接字等。

9.3 在android中也提供了一种进程间通信机制binder。

10. linux的文件系统

10.1 linux秉承了一切皆是文件的思想。提供了好多种文件系统,如ext2,ext3,ext4,squash,jffs2,proc,seq,sysfs等。

10.2 文件的读操作需要与内存管理模块交互,文件读取到RAM后是被缓存起来,方便下次读取不需要重新从存储设备读,加快速度。

这也就是为什么top命令看到的free部分比较少,其实真正可用的内存还要加上cached部分和buffer部分。

10.3 文件的写操作是一个异步的过程,文件写是有内核统一写回到存储设备的。

10.4 linux提供了几个系统调用来监控文件上的事件,如select,poll,epoll。这几个系统调用在网络编程中用的相当多。

11. linux的驱动

11.1 linux驱动是内核中最庞大的部分,提供了好多的驱动框架,使用了分层的思想。具体可以参考我的《linux驱动》类别的系列文章,

涵盖了主要的驱动框架。

12. linux协议栈

12.1 现在是互联网的时代,我们都体验到互联网给我们带来的便捷生活。其实背后全靠linux网络协议栈保驾护航,linux网络协议栈也是比较复杂的,

特别是tcp部分,内核提供了好多种方法来保证tcp的可靠数据连接。


总结,后续我会写linux内核的几个重要部分,分析linux中调用频率较高较重要的部分。然后结合应用程序的系统调用来分析内核部分。


0 0