Linux系统的组成部分:
除去硬件部分linux系统由,内核+根文件系统组成。内核启动后不是在执行内核代码,就是在执行根文件系统下某个路径中的应用程序的代码(用户代码)。
内核主要功能:
简述
进程管理、内存管理、网络管理、文件系统、驱动程序、安全功能,这些功能就是通过系统调用输出的。
进程管理:
如一个父进程可以fork一个子进程,在必要时还可以将自己的数据复制给子进程一份。在子进程完成任务后还可以将其收回。
内存管理:
如c语言编程是可以使用命令malloc函数申请一段内存,使用完成后通过free来释放内存
文件系统:
如打开,读取,编辑一个文件都是通过系统调用实现的。
Glibc:
现在程序员在写程序的时候虽然需要发起系统调用,但是有些时候在编程时不是通过发起系统调用完成的,而是,调用把系统调用二次封装的离用户更近的库文件实现的。在linux叫做glibc。Glibc是用户空间的内容了,如/usr/lib下的文件。
整个操作系统最核心的是内核、用户空间的应用程序以及必要库文件,其他的都是非必要。如man命令提供的帮助文档。
Lib(库):
库是函数的集合,一个功能模块,lib有其调用接口。通过函数名调用lib文件。库文件也是一个二进制文件,但是他不能独立运行,只能被调用。
过程调用:
procedure,没有返回值的函数
函数调用:
function,有返回值的函数
头文件:不同函数可接受的参数数量和类型不同,所以说每一个库中有多少个函数,每个函数可接受多少参数,以及每个参数类型都应该有一个文件对其加以描述,这个文件就是头文件。
内核设计流派:
单内核设计:如,Linux
把所有功能集成于同一个程序;每个功能都是在此程序中通过线程实现。这就是linux内核线程。一般来讲效率高,但是可能任何一个程序出现问题会影响整个系统
微内核设计:如,Windows, Solaris
每种功能使用一个单独子系统实现;一般来讲效率比单内核设计低,但是一个子系统出现问题不会影响整个系统。
Linux内核特点:
微内核设计思想比单内核更前卫,但是linux也借鉴了微内核有点,在内核内部支持模块化。
支持模块化:
linux内核支持将每个功能设计为一个独立的功能模块。格式为*.ko。
支持模块的动态装载和卸载。
动态装卸载的优点:(小、维护)
由于动态装卸载的存在,我们可以仅保留内核最基本和核心的功能,当需要某模块提供的功能时,只需要临时将其装载进内核。这样内核体系就变得非常小了。
我们知道硬件的驱动程序一般都是由内核提供的,如果内核模块不支持模块化的,得来的结果是:任何一个硬件驱动程序想要被使用,必须提前将其编写整合进内核。如果作为一个内核维护者,在没有充分检验情况下将别人开发的驱动整合进内核,万一有,此驱动带有恶意代码可能造成很大危害(例如对方植入病毒等)。造成内核崩溃,操作系统关闭等。而有了模块化后,任何一个厂商都可自行开发模块,作为用户,我们可以自行选择使用那些模块。维护工作也由厂商自己负责,以保证自己模块的安全性。这也是的linux能随时使用更多的硬件设备了
内核组成部分:
核心文件:
/boot/vmlinuz-VERSION-release 。可以看到内核文件很小,是因为它将很多功能做成了模块
模块文件:
/lib/modules/VERSION-release 。模块文件需要和内核版本严格匹配的。模块文件名就是核心文件的后缀名。*.ko文件就是内核模块
Ramdisk:
Init文件在centos5和6上不同:
Centos5使用的是initrd,即init ram disk
CentOS 5: /boot/initrd-VERSION-release.img ,基于内存的磁盘。
Centos6使用的是init ram file-system
CentOS 6: /boot/initramfs-VERSION-release.img ,基于内存的文件系统。
Ramdisk生成工具
Ramdisk是在安装系统时由工具自动生成的
Centos5使用的是initrd,由mkinitrd
Centos6使用的是initramfs,由dracut
问题二:为什么centos5到6从ramdisk 变成ramfs
这要从,“内核中的特性之一:使用缓冲(写)和缓存(读)来加速对磁盘上的文件访问;”说起centos5中使用的是ramdisk是将内存当做磁盘使用,在linux中cpu 认为磁盘的访问速度太慢,为了加速磁盘访问,会将磁盘内容加载至内存,这样会造成这个“磁盘”会再次被加载到内存一次当做缓冲和缓存。两次缓存,使得资源访问变慢。而ramfs是将内存当做了文件系统。文件系统自己就可以管理自己的缓存和缓冲,避免了两次加载。
除去核心文件和模块文件还有第三个文件它是非必要的,但是在很多场景中被用到了他就是ramdisk。例如linux开机后加载内核,由内核去加载根文件系统,但是内核中没有根文件系统驱动(都放在/lib/modules下)。/lib在根文件系统上。这就没法去加载硬件驱动。解决此问题有两种方法:
1、直接将驱动编译进内核,但是驱动有千万种,都将他们编译进内核,会使内核变得太大。这样显然不合适
2、借助于外在的辅助机制。 将所有驱动硬盘的必要工具全部做成一个文件系统,这个文件系统称为虚拟文件系统。这个根文件系统仅仅包含了驱动硬盘的驱动和文件系统。在开机时此文件系统跟随内核一起加载至内存。内核先去加载虚拟文件系统,从虚拟文件系统加载到驱动磁盘的驱动
存放的是只适用于本机磁盘类型的驱动。所以虚拟根文件系统不是提前制作好的,而是在安装操作系统时,在安装最后一步自动生成的适用于自己的电脑的磁盘。
这个虚拟文件系统是一个本地回环设备文件,并且该文件在系统启动时会自动加载到内存。在内存中把这个文件当做磁盘使用,从而使得内核能加载到临时根文件系统,并装载临时根文件系统中的驱动。随后进行根切换。将临时根切换为真正根。
原文:https://www.cnblogs.com/wxxjianchi/p/9879502.html