一、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. hive查询注意及优化tips

    Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具.使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别, 所以需要去掉原有关系型数 ...

  2. session不能使用 ASP.NET MVC

    在web.coonfig中添加 <sessionState mode=" /> 如: <system.web> //... <sessionState mode ...

  3. jQuery图片水平滑动延迟加载动画

    在线演示 本地下载

  4. Android蓝牙串口通讯【转】

    本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...

  5. bzoj 3038: 上帝造题的七分钟2 线段树||hdu 4027

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 476[Submit][Status][Dis ...

  6. CSS控制表格嵌套

    网页设计应用中,当我们不能完全放弃表格的使用时,为了达到预期的效果,不免要用到表格嵌套(特别是多层嵌套)方式来进行布局.可能很多同仁都遇到过这样的问题,为了达到显示效果要为每一个(每一层)的表格写不同 ...

  7. C#实现网站登录

    public class HTMLHelper    {        /// <summary>           /// 获取CooKie          /// /// < ...

  8. django 链接地址匹配流程

    前提: 代码结构 步骤一: 下面为某个网页的链接地址 <body> {% if latest_article_list %} <ul> {% for article in la ...

  9. php判断是否是微信浏览器

    php判断是否是微信浏览器 直接上代码: <?PHP function is_wechat_browser(){ $user_agent = $_SERVER['HTTP_USER_AGENT' ...

  10. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...