内核的基本概念
跟各种应用程序一样,内核也是一种应用程序,只不过,这种应用程序是直接操作硬件的。内核直接面对的是硬件,调用的是硬件接口,是通过个硬件厂商和CPU厂商提供的指令集进行开发。开发应用程序面对的是内核,系统调用,或库调用进行的,故简单得多。为编写内核级的应用程序,又为了避免过于底层,固有很多库文件,可以让内核编译时使用。
内核是直接面向硬件的,故可用资源权限很大,但内核是工作在有限地址空间内的,在linux而言,32位系统上,线性地址空间中,内核只认为自己有1G的,虽然可以掌握4G,但是自己的运行只能使用1G,剩下的3G给其他应用程序。win是各2G。故我们开发内核时可用的内存空间很有限,尤其是开发驱动,要明白自己的可用空间很有限,故需高效。
内核核心功能
(1)内存管理
如果没有操作系统,内存需要程序自己来管理。譬如在uboot中要使用哪块内存,由程序自己决定的,没有注册也没有限制。此时如果程序不小心把同一块内存重复使用,就会出现程序逻辑错误。
有了操作系统之后,操作系统负责管控所有的内存。应用程序需要使用内存时,都要向操作系统去申请和注册,由操作系统的内存管理模块来分配内存。这样好处是可以保证内存使用不会冲突。
(2)进程调度
操作系统下支持多个应用程序同时运行,这是宏观上的并行。实际上在单核心CPU上微观上是不能并行的,宏观上的并行就是操作系统提供的分时复用机制。操作系统的进程调度模块负责在各个进程之间进行切换。
(3)硬件设备管理
没有操作系统时,控制任何硬件都要自己写代码,有了操作系统后操作系统本身会去控制各个硬件,应用程序就不用考虑硬件的具体细节了。
操作系统的硬件设备管理模块就是驱动模块。
(4)文件系统
文件系统是管理存储设备的一种方式。存储设备由很多扇区组成,每个扇区有512/1024/2048/4096字节,存储设备以扇区为单位进行读写。如果没有文件系统,程序要自己去读写扇区,就得记得哪个文件在哪个扇区。有了文件系统之后,我们不用再关注某个文件在物理磁盘的哪个扇区,只用关注文件系统中的目录和文件名。
比较CPU的时间与内核的空间区别
因为内存中每一个进程都以为直接是独占CPU的,故内核即是将CPU虚拟化,提供给进程,CPU在内核级别就已经虚拟化了,通过将CPU切成时间片,随着时间流逝而完成在个进程之间分派计算能力的,CPU是以时间提供其计算能力的。而内存是站在空间角度进行数据容纳的。
这就是所谓的时空转换。在单位时间内要能够提供的计算能力越大,必须速度越快,否则只能延长时间。这也就是我们需要更快的CPU,以节约时间。
对于内存而言考虑的是空间问题。
CPU的运算特性
I/O是最慢的设备,我们CPU有大量时间都拿来等待I/O完成,为避免空余的没有任何意义的等待,需要等待时,就让CPU运行别的进程或线程。
我们应该最大能力榨取CPU的计算能力,因为CPU的计算能力是随着时间时钟频率的振荡器在震荡,你用或者不用他都在跑。如果你让CPU空闲着,他依然耗电,而且随时间流逝,计算能力白白消逝了,因此能够让CPU工作在80-90%的利用率下,这就意味着他的生产能力得到了充分的发挥。CPU是用不坏的,没有什么磨损很消耗,是电器设备,除了功率大是发热量大,散热足够就好了,对于电器设备而言不用反而会坏。
从硬件看系统启动
内核没有生产力,生产力是由个被调用的应用程序产生,故我们应该尽量让系统运行在应用程序模式中,故内核占据的时间越少越好。而内核主要在进程切换、中断处理等相关功能上,占据时间,模式切换到目的也是为了生产完成,但进程切换与生产就没有任何意义了,中断处理可以认为与生产本身相关,因为应用要执行I/O。
内核的主要目的是完成硬件管理,而linux中有一个思想,各进程都是由其父进程衍生的,由父进程fork()而来的,那么由谁来fork()以及管理这些进程,于是有了大管家程序init,统筹管理用户空间的所有进程。用户空间的管理工作都不会由内核执行,故我们启动完内核之后,要想启动用户空间首先需要启动init,故init的PID号永远为1。 init也是由其父进程fork()而来,是内核空间中的用来专门引导用户空间进程的机制。init是一个应用程序,在/sbin/init下,是一个可执行文件。
还没有评论,来说两句吧...