linux内核源码分析与探索01-预备知识
1.内核简介
传统的操作系统,内核应具备多方便的功能或者成分,既包含用于管理属于应用层的 进程 的成分,也包含为这些进程提供的各种服务的成分,如进程间通信 设备驱动 文件系统等,内核中提佛那个各种服务的成分,与使用这些服务的进程之间形成了典型的 client-server 的关系,其实这些服务的提供者不一定都得留在内核中,他们本身也可以被设计并实现耨些服务进程,其中必须留在内核中的成分只有进程间通信,如果把服务提供者从内核转移到进程的层次上,那么内核本身的结构就可以大大减小,而各个服务进程,既然从内核中游离出来,就可以单独设计 实现 调试,更重要的是,可以按需配置和启动。基于这种想法,微内核应运而生。特别是对一些专用的系统。比如实时系统和嵌入式系统。但是微内核也优缺点,把服务都放在进程层次上,再通过进程间通信-经常是报文传递-提供服务,会增加系统的运行开销,降低效率。
与微内核对应,传统内核结构都是宏内核,或者成为一体化内核,通用的系统需要的服务面广,一体化内核就更为合适。
传统内核unix是封闭式的,如果在内核中增加一个设备--增加一种服务,做法是编写这个设备的驱动程序,并变动内核源程序中的某些设局结构--设备表,再重新编译整个内核,再重新引导整个系统。这样做系统安全,但是太僵化。linux比unix进步,允许把设备驱动程序在编译时,静态地连接在内核中,或者也可以在运行时安装,或者运行时需要的话由系统自动安装。这样的模块依然运行在内核中,而不是像在微内核一样作为单独的进程运行。模块:就是设备驱动程序。
linux最初是在intel 80386系列cpu架构上实现的,但是已经被移植到各种主要的cpu系列上,包括,alpha,m68k,mips,sparc,power pc等。pentium 奔腾II均属于i386系列。可以说linux内核是覆盖面最广的一体化内核。同时在同一个系列的cpu上,linux还支持不同的系统结构,单cpu和多cpu都支持。接下来以单cpu讲解为主,最后会有一节专门讨论多cpu.
1991年发布了linux 的0.02版,各其他公司,发行linux,如red hat,ubuntu等,只是在内核上集成了大量应用软件:在安装程序,安装界面,软件包多少,软件包的安装和管理,等方面不一致,其实来源只有一种,那就是linux主持开发和维护的内核版本。不要把发行商的linux版本,和linux的内核版本混为一谈,原则上全世界只有一个linux.
linux内核的源代码位于/usr/src/linux,内核源码结构:
Linux 内核源代码包含如下目录。
● arch :包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、
arm64、powerpc、mips 等。Linux 内核目前已经支持30 种左右的体系结构。在arch
目录下,存放的是各个平台以及各个平台的芯片对Linux 内核进程调度、内存管理、
中断等的支持,以及每个具体的SoC 和电路板的板级支持代码。
● block:块设备驱动程序I/O 调度。
● crypto:常用加密和散列算法(如AES、SHA 等),还有一些压缩和CRC 校验算法。
● documentation:内核各部分的通用解释和注释。
● drivers :设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、
mtd、i2c 等。
● fs:所支持的各种文件系统,如EXT、FAT、NTFS、JFFS2 等。
● include:头文件,与系统相关的头文件放置在include/linux 子目录下。
● init:内核初始化代码。著名的start_kernel() 就位于init/main.c 文件中。
● ipc:进程间通信的代码。
● kernel :内核最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码
放在arch/*/kernel 目录下。
● lib:库文件代码。
● mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm 目录下。
● net:网络相关代码,实现各种常见的网络协议。
● scripts:用于配置内核的脚本文件。
● security:主要是一个SELinux 的模块。
● sound:ALSA、OSS 音频设备的驱动核心代码和常用设备驱动。
● usr:实现用于打包和压缩的cpio 等。
● include:内核API 级别头文件。
2.X86系列寻址方式