Linux 内核及内核编程(1)

成于坚持,败于止步

Linux 2.6 内核的特点

Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面。

1.新的调度器

2.6 版本的 Linux 内核使用了新的进程调度算法,它在高负载的情况下执行得极其出色,并且当有很多处理器时也可以很好地扩展。

2.内核抢占

在 2.6 版本的 Linux 内核中,内核任务可以被抢占,从而提高系统的实时性。这样做最主要的优势在于可以极大地增强系统的用户交互性。

3.改进的线程模型

2.6 版本的 Linux 内核中线程操作速度得以提高,可以处理任意数目的线程,PID最大可以到 2000000000。

4.虚拟内存的变化

从虚拟内存的角度来看,新内核融合了 r-map(反向映射)技术,显著改善虚拟内存在一定程度负载下的性能。

5.文件系统

2.6 版本的 Linux 内核增加了对日志文件系统功能的支持,解决了 2.4 版本的 Linux内核在这方面的不足。2.6 版本的 Linux 内核在文件系统上的关键变化还包括对扩展属性及 POSIX 标准访问控制的支持。Ext2/Ext3 作为大多数 Linux 系统缺省安装的文件系统,在 2.6 版本的 Linux 内核中增加了对扩展属性的支持,可以给指定的文件在文件系统中嵌入元数据。

6.音频

新的 Linux 音频体系结构 ALSA(Advanced Linux Sound Architecture)取代了缺陷很多的旧的 OSS(Open Sound System)。新的声音体系结构支持 USB 音频和 MIDI 设备,并支持全双工重放等功能。

7.总线

SCSI/IDE 子系统经过大幅度的重写,解决和改善了以前的一些问题。比如 2.6 版本的 Linux 内核可以直接通过 IDE 驱动程序来支持 IDE CD/RW 设备,而不必像以前那样使用一个特别的 SCSI 模拟驱动程序。

8.电源管理

支持 ACPI(高级电源配置管理界面,Advanced Configuration and Power Interface),用于调整 CPU 在不同的负载下工作于不同的时钟频率以降低功耗。

9.联网和 IPSec

2.6 版本的 Linux 内核中加入了对 IPSec 的支持,删除了原来内核内置的 HTTP 服务器 kttpd,加入了对新的 NFSv4(网络文件系统)客户机/服务器的支持,并改进了对 IPv6 的支持。

10.用户界面层

2.6 版本的 Linux 内核重写了帧缓冲/控制台层,人机界面层还加入了对大多数接口设备的支持(从触摸屏到盲人用的设备和各种各样的鼠标)。 在设备驱动程序的方面,Linux 2.6 相对于 Linux 2.4 也有较大的改动,这主要表现在内核 API 中增加了不少新功能(例如内存池)、sysfs 文件系统、内核模块从.o 变为.ko、驱动模块编译方式、模块使用计数、模块加载和卸载函数的定义等方面。

Linux 内核的组成部分 

如图 3.1 所示,Linux 内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)等 5 个子系统组成。
Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)-LMLPHP

1.进程调度

精度调度控制系统中的多个进程对 CPU 的访问使得多个进程能在 CPU 中微观串行,宏观并行地执行。进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。 如图 3.2 所示,Linux 的进程在几个状态间进行切换。在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,并使驱动对应的进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪状态。睡眠分为可被打断的睡眠和不可被打断的睡眠,两者的区别在于可被打断的睡眠在收到信号的时候会醒来。

Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)-LMLPHP

在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,其对应的进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪状态。 设备驱动中,如果需要几个并发执行的任务,可以启动内核线程,启动内核线程
的函数为:
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);

2.内存管理

内存管理的主要作用是控制多个进程安全地共享主内存区域。当 CPU 提供内存管理单元(MMU)时,Linux 内存管理完成为每个进程进行虚拟内存到物理内存的转换。Linux 2.6 引入了对无 MMU CPU 的支持。

如图 3.3 所示,一般而言,Linux 的每个进程享有 4GB 的内存空间,0~3GB 属于用户空间,3~4GB 属于内核空间,内核空间对常规内存、I/O 设备内存以及高端内存存在不同的处理方式。

Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)-LMLPHP

3.虚拟文件系统

如图 3.4 所示,Linux 虚拟文件系统(VFS)隐藏各种了硬件的具体细节,为所有的设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象,它使用超级块 super block 存放文件系统相关信息,使用索引节点 inode
存放文件的物理信息,使用目录项 dentry 存放文件的逻辑信息。

Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)-LMLPHP

4.网络接口

网络接口提供了对各种网络的标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序,网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱
动程序。

Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)-LMLPHP

5.进程通信

Linux 支持进程间的多种通信机制,包含信号量、共享内存、管道等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。 Linux 内核的 5 个组成部分之间的依赖关系如下。

进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,必须为程序创建进程,而创建进程的第一件事情就是将程序和数据装入内存。

进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。

虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持 RAMDISK 设备。

内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的惟一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。

除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的例程,如分配和释放内存空间的函数、打印警告或错误信息的函数及系统提供的调试例程等。

就到这里了,O(∩_∩)O~

我的专栏地址:http://blog.csdn.net/column/details/linux-driver-note.html

待续。。。。

04-14 14:13