从静态角度来看分为c盘分区+相关文件
内核调用
第一个方法:调用内核过分复杂,所以有些内核开发人员创建了库文件,通过调用库文件来调用内核程序。这么shell就是通过调用库的用户插口(用户程序)
第二个方法:程序开发人员很牛B,他为了追求效率,他自己编撰程序直接调用内核程序。
内核设计流派
1、单内核设计
把所有功能集成与同一程序。便捷使用,并且一个功能出了问题就影响整个程序。linux就是反例
2、微内核设计
每种功能使用一个单独的子系统实现。管理较为复杂,而且各功能之间互相影响较小。并且各类内核之间的兼容性就麻烦了。WindowsSolaris就是反例
Linux内核特性
1、支持模块化,.ko(kernelobject)
2、支持模块化运行时动态状态或卸载
Linux内核组成
核心文件
vmlinuz-3.10.0-693xxxx就是内核文件。
模块文件
这个就是对应内核的模块文件LINUX社区,假如管理员安装了多个内核版本,这么在这个目录下才会有多个模块文件
这个就是模块文件中的内容。
在kernel目录中又有一些系统必须的文件,例如说一些驱动文件
ramdisk文件(可选)
如今假定内核程序早已在显存当中了(怎样载入的先不讨论),这么内核的第一件事情就是装载根文件系统(加载init文件,开启各类进程),装载根文件系统须要挂在分区,挂载分区就须要硬碟驱动linux更改ip地址,硬碟的驱动在根文件系统内。这样就矛盾了,简单的来说挂载根文件系统须要驱动,而驱动又在根文件系统中。
如何办?将显存的一部份当成c盘来用,这个过程中有个伪根文件系统,用于将实际的根分区挂载linux内核启动流程图,并读取init文件。真正的根文件系统上线后,伪根文件系统就失效了。这个伪根文件系统是在第一次安装操作系统的时侯,系统按照实际c盘生成的。
伪文件系统在一定条件下是不须要的,假如在编译内核的时侯就晓得实际c盘的驱动,这么就可以将c盘的驱动直接编译到内核中。
这个就是ramdisk文件,在CentOS6之前该文件为initrd文件,到了CentOS6就转换成ramdisk文件了,由于c盘到显存必须有缓存,并且实际的数据就在显存中,不须要缓冲区。
内核实现的功能
1、进程管理
进程调度
进程的创建
进程销毁
2、内存管理
进程间通讯简称IPC、通信机制有1、消息队列2、semerphor3、shm(共享显存)
socket是两个主机进程间通讯的机制
3、网络合同栈
各类主机间进程的通讯都须要通过网路合同,这些公共的服务须要在内核中实现。
4、文件系统
运行中的系统环境分为两层:1、内核空间2、用户空间
用户空间中运行了各类应用程序
内核空间中运行了内核代码,这个代码通常都须要特权级操作。
这么假如用户的应用程序须要使用硬件资源时,用户空间的代码会调用内核空间的代码,由内核代为完成硬件资源操作。
5、驱动程序
6、安全功能
启动分区(/boot)
用于储存内核代码的储存空间。在内核程序启动之前是没有根文件系统的,只有内核启动以后才去辨识根文件系统。推荐boot分区使用普通分区
根文件系统(rootfs)
必须符合FHS结构(特定目录结构,例如包含/bin/sbin/proc)等目录。其中init文件是最重要的文件,由于init是启动其他进程的父进程,一切进程都来始于init
所以根文件系统只是一个别称,根文件系统本身不存在,假如一个文件系统结构符合FHS结构,并包含了特定的目录,这么这个文件系统就称作根文件系统。(在本机第二块硬碟上安装grub,并做简略执行命令的实验中,这个现象十分显著linux内核启动流程图,在根文件系统中,只有相应的目录,每位目录都没有对应的文件,而且还是可以运行系统的。)
如今就有了一个比较烧脑的问题,内核代码储存在/boot目录中,只有内核启动了能够辨识根(简单来讲,使用内核须要根文件系统,并且挂在根文件系统须要内核),这么在启动系统的时侯怎样去找/boot目录呢?所以在内核程序启动之前须要一个程序将内核代码装入显存运行。