1.GNU
GNU计划和自由软件基金会(FSF)是由Richard M.Stallman于1984年创办的,GNU是“GNU’s Not UNIX”的缩写。到20世纪90年代初,GNU项目已经开发出许多高质量的免费软件,其中包括emacs编辑系统、bash shell程序、gcc系列编译程序、GDB调试程序等。没有GNU软件环境,Linux将寸步难行。因此,严格来说,“Linux”应该称为“GNU/Linux”系统。
2.POSIX标准
POSIX(Portable Operating System Interface,可移植的操作系统接口)是由IEEE和ISO/IEC开发的一组标准。该标准基于现有的UNIX实践和经验完成,描述了操作系统的调用服务接口,用于保证编写的应用程序可以在源代码级上在多种操作系统中移植。该标准在推动Linux操作系统朝着正规化发展,是Linux前进的灯塔。
3.内核源目录结构
目录 | 说明 |
---|---|
arch | 包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、arm64、powerpc、mips等。Linux内核目前已经支持30种左右的体系结构。在arch目录下,存放的是各个平台以及各个平台的芯片对Linux内核进程调度、内存管理、中断等的支持,以及每个具体的SoC和电路板的板级支持代码。 |
block | 块设备驱动程序I/O调度。 |
crypto | 常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。 |
drivers | 设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c等。 |
fs | 所支持的各种文件系统,如EXT、FAT、NTFS、JFFS2等。 |
init | 内核初始化代码。著名的start_kernel()就位于init/main.c文件中。 |
ipc | 进程间通信的代码。 |
kernel | 内核最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码放在arch/*/kernel目录下。 |
mm | 内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。 |
4.内核组成
Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)5个子系统组成。
4.1进程调度
进程调度控制系统中的多个进程对CPU的访问,使得多个进程能在CPU中“微观串行,宏观并行”地执行。
Linux的进程在几个状态间进行切换。在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,并使本进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪状态。睡眠分成可中断的睡眠和不可中断的睡眠,两者的区别在于可中断的睡眠在收到信号的时候会醒。
4.2内存管理
内存管理的主要作用是控制多个进程安全地共享主内存区域。当CPU提供内存管理单元(MMU)时,Linux内存管理对于每个进程完成从虚拟内存到物理内存的转换。
Linux内核的内存管理总体比较庞大,包含底层的Buddy算法,它用于管理每个页的占用情况,内核空间的slab以及用户空间的C库的二次管理。另外,内核也提供了页缓存的支持,用内存来缓存磁盘,per-BDI flusher线程用于刷回脏的页缓存到磁盘。Kswapd(交换进程)则是Linux中用于页面回收(包括file-backed的页和匿名页)的内核线程,它采用最近最少使用(LRU)算法进行内存回收。
4.3虚拟文件系统
Linux虚拟文件系统隐藏了各种硬件的具体细节,为所有设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象。它为上层的应用程序提供了统一的vfs_read()、vfs_write()等接口,并调用具体底层文件系统或者设备驱动中实现的file_operations结构体的成员函数。
4.4网络
Linux内核支持的协议栈种类较多,如Internet、UNIX、CAN、NFC、Bluetooth、WiMAX、IrDA等,上层的应用程序统一使用套接字接口。
5.参与讨论
==================================
新的文章内容和分享已更新在:
|工|·-·|重|·-·|号|:协议森林
==================================