一、Linux内核 
一个完整可用的操作系统主要由 4 部分组成:硬件、操作系统内核、操作系统服务和用户应用程序,如下图所示:
            
  用户应用程序:是指那些自处理程序、 Internet 浏览器程序或用户自行编制的各种应用程序;
  操作系统服务程序:是指那些向用户所提供的服务被看作是操作系统的部分功能的程序。在 Linux 操作系统上,这些程序包括 X 窗口系统、 shell 命令解释系统以及那些内核编程接口等系统程序。
  操作系统内核程序:它主要用于对硬件资源的抽象和访问调度。Linux 内核的主要用途就是为了与计算机硬件进行交互,实现对硬件部件的编程控制和接口操作,调度对硬件资源的访问,并为计算机上的用户程序提供一个高级的执行环境和对硬件的虚拟接口。

二、Linux 内核模式
  目前,操作系统内核的结构模式主要可分为【整体式的单内核模式】和【层次式的微内核模式】。而 Linux 0.11 内核,则是采用了单内核模式。
  单内核模式的主要优点是内核代码结构紧凑、执行速度快,不足之处主要是层次结构性不强。
  在单内核模式的系统中,操作系统所提供服务的流程为:应用主程序使用指定的参数值执行系统调用指令(int x80),使 CPU 从用户态( User Mode)切换到核心态( Kernel Model),然后操作系统根据具体的参数值调用特定的系统调用服务程序,而这些服务程序则根据需要再底层的一些支持函数以完成特定的功能。在完成了应用程序所要求的服务后,操作系统又从核心态切换回用户态,返回到应用程序中继续执行后面的指令。
  因此概要地讲,单内核模式的内核也可粗略地分为三个层次:调用服务的主程序层、执行系统调用的服务层和支持系统调用的底层函数。如下图所示:

三、Linux 内核系统体系结构
Linux 内核主要由 5 个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。
  【进程调度模块】用来负责控制进程对 CPU 资源的使用。所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作。
  【内存管理模块】用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得 Linux 支持进程使用比实际内存空间更多大的内存容量。并可以利用文件系统把暂时不用的内存数据块会被交换到外部存储设备上去,当需要时再交换回来。
  【文件系统模块】用于支持对外部设备的驱动和存储。虚拟文件系统模块通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节。从而提供并支持与其它操作系统兼容的多种文件系统格式。
  【进程间通信模块子系统】用于支持多种进程间的信息交换方式。
  【网络接口模块】提供对多种网络通信标准的访问并支持许多网络硬件。
若从单内核模式结构模型出发,我们还可以根据 linux 0.11 内核源代码的结构将内核主要模块绘制成下图所示的框图结构:

 四、Linux 内核源代码的目录结构
  由于 Linux 内核是一种单内核模式的系统,因此,内核中所有的程序几乎都有紧密的联系,它们之间的依赖和调用关系非常密切。所以在阅读一个源代码文件时往往需要参阅其它相关的文件。因此有必要在开始阅读内核源代码之前,先熟悉一下源代码文件的目录结构和安排。
  这里我们首先列出 Linux 内核完整的源代码目录,包括其中的子目录。然后逐一介绍各个目录中所包含程序的主要功能,使得整个内核源代码的安排形式能在我们的头脑中建立起一个大概的框架,以便于后面开始的源代码阅读工作。当我们使用 tar 命令将 linux-4.9.tar.gz 解开时,内核源代码文件被放到了 linux 目录中。

其中的目录结构为:

linux———
       |————arch                与架构相关,里面存放了许多CPU架构,比如arm,x86,MIPS,PPC等。
       |————block               块设备(以块为单位来整体访问),譬如说SD卡、iNand、Nand、硬盘等都是块设备。你几乎可以认为块设备就是存储设备。
       |————crypto              加密,这个目录下放了一些各种常见的加密算法的C语言代码实现。譬如crc32、md5、sha1等。
       |————Documentation       里面放了一些文档。
       |————drivers             驱动目录,分别列出了linux内核支持的所有硬件设备的驱动源代码 。
       |————firmware            固件,固件其实是软件,不过这个软件是固化到I^2C里面运行的,就像S5PV210里的iROM代码。
       |————fs                  文件系统,里面列出了linux支持的各种文件系统的实现。
       |      |——asm            与CPU体系结构相关的部分
       |      |——linux          linux内核专用部分
       |      |——sys            系统数据结构部分
       |————include             头文件,公共的(各种CPU架构共用的)头文件都在这里。
       |————init                内核初始化程序,这个目录下的代码就是linux内核启动时初始化内核的代码。
       |————ipc                 ipc就是inter process commuication,进程间通信,里面都是linux支持的IPC的代码实现。
       |————kernel              就是linux内核,所以这个文件夹下放的就是内核本身需要的一些代码文件。
       |      |——blk_drv        块设备驱动程序
       |      |——chr_drv        字符设备驱动程序
       |      |——math           数学协处理器仿真处理程序
       |————lib                 内核库函数,这里面都是一些公用的有用的库函数,注意这里的库函数和C语言的库函数不一样的。
       |————mm                  是memory management,内存管理,linux的内存管理代码都在这里。
       |————net                 该目录下是网络相关的代码,譬如TCP/IP协议栈等都在这里。
       |————scripts             这个目录下全部是脚本文件,这些脚本文件不是linux内核工作时使用的,而是用来辅助对linux内核进行配置编译生产的。我们并不会详细进入分析这个目录下的脚本,而是通过外围来重点学会配置和编译linux内核即可。
       |————security            安全相关的代码。
       |————sound               音频处理相关的。
       |————tools               生成内核Image文件的工具程序
       |————usr                 目录下是initramfs相关的,和linux内核的启动有关,暂时不用去管。
       |————virt                内核虚拟机相关的,暂时不用管。
       |————Kbuild              Kbuild是kernel build的意思,就是内核编译的意思。这个文件就是linux内核特有的内核编译体系需要用到的文件。
       |————Makefile            这个是linux内核的总makefile,整个内核工程用这个Makefile来管理的。

Linux内核解析的更多相关文章

  1. Linux内核解析:进程间通信:管道

    管道的定义管道的用途管道的操作管道非法read与write内核实现解析管道通信原理及其亲戚通信解析父子进程通信解析亲缘关系的进程管道通信解析管道的注意事项及其性质管道有以下三条性质shell管道的实现 ...

  2. Linux内核解析之标准I/O库

    当Linux创建一个进程时,会自动创建3个文件描述符0,1,2,分别对应标准输入,标准输出,错误输出.C库中与文件描述符对应的是文件指针.查看C库头文件stdio.h中的源码 typedef stru ...

  3. linux内核编程笔记【原创】

    以下为本人学习笔记,如有转载请注明出处,谢谢 DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex); mutex_unlock(& ...

  4. 基于tiny4412的Linux内核移植 --- aliases节点解析

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  5. Linux内核:sk_buff解析

    sk_buff 目录 1 sk_buff介绍 2 sk_buff组成 3 struct sk_buff 结构体 4 sk_buff成员变量 4.1 Layout布局 4.2 General通用 4.3 ...

  6. Linux内核很吊之 module_init解析 (下)【转】

    转自:https://blog.csdn.net/richard_liujh/article/details/46758073 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  7. linux内核启动参数解析及添加

    1.环境: ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x ...

  8. 深入解析Linux内核I/O剖析(open,write实现)

    Linux内核将一切视为文件,那么Linux的文件是什么呢?其既可以是事实上的真正的物理文件,也可以是设备.管道,甚至还可以是一块内存.狭义的文件是指文件系统中的物理文件,而广义的文件则可以是Linu ...

  9. 基于tiny4412的Linux内核移植 --- aliases节点解析【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/5252348.html 阅读目录(Content) 作者信息 平台简介 正文 回到顶部(go to top) ...

随机推荐

  1. afinal 文件上传、下载、图片加载实例

    // Afinal框架讲解 public class AfinalActivity extends FinalActivity { @ViewInject(id=R.id.bt_afinal_load ...

  2. MySQL常用代码

    create database 数据库名 create table CeShi1( Uid varchar(50) primary key, Pwd varchar(50), Name varchar ...

  3. 【leetcode刷题笔记】Anagrams

    Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...

  4. html编辑器的调用

    <html><head>     <metahttp-equiv="Content-type"content="text/html; cha ...

  5. Hibernate技术

    Hibernate中3个重要的类: 配置类(configuration) 负责管理Hibernate的配置信息,包含数据库连接URL.数据库用户.数据库密麻麻.数据库驱动等. 会话工厂类(Sessio ...

  6. java中的向上转型

    Person 可以表示为一个抽象的东西 就是人.比如说人可以唱歌, 就好比Person类中有一个sing方法.那么这个抽象的类(Person 人)可以具体到两类或者更多类 比如 男人,女人 .Man ...

  7. linux shell编程(二) 条件测试

    bash中常用的条件测试有三种 条件测试的表达式:[ expression ]  [[ expression]] 第一种:整数测试: -eq 测试两个整数是否相等,比如[ $A -eq $B ] -n ...

  8. php数据结构课程---1、数据结构基础介绍(程序是什么)

    php数据结构课程---1.数据结构基础介绍(程序是什么) 一.总结 一句话总结: 程序=数据结构+算法 设计好数据结构,程序就等于成功了一半. 数据结构是程序设计的基石. 1.数据的逻辑结构和物理结 ...

  9. 八 Django框架,模板语言

    模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到html用模板语言渲染 {{...}}接收一 ...

  10. [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...