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中调用频率较高较重要的部分。然后结合应用程序的系统调用来分析内核部分。
- linux内核的总结
- linux内核的数据类型总结
- Linux内核的总结认识
- linux内核编译的总结
- linux内核的一点总结
- 总结编译linux内核的步骤
- Linux内核等待队列的使用方法总结
- 关于linux内核中断的个人总结
- Linux内核调试方法的总结
- Linux内核设计的艺术-前三章总结
- Linux内核调试方法的总结
- Linux内核调试方法的总结
- Linux内核调试方法的总结
- linux内核编译遇到的问题总结
- Linux内核的编译步骤总结
- Linux内核的学习总结(一)
- Linux系统内核的执行流程总结
- 有关Linux内核分析课程的总结
- 小小猿课堂开课啦
- 【Unity3D游戏开发】NGUI之多分辨率下完美分布式协同开发 (五)
- poj3616 dp
- springmvc restful 支持
- [转]SplayTree学习资料
- linux内核的总结
- Rabbit and Grass HDOJ(尼姆博弈)
- CSS基础-29CSS动画-过渡
- C语言:链队列
- Spark:大数据的“电光石火”
- CSS基础-30CSS动画-动画
- UVA11882 Biggest Number 强剪枝
- Photoshop 画笔工具下的模式选择的使用
- 播布客小布老师视频