• 进步一点点丨迅为4412开发板Linux内核开发基础


    Linux 体系结构
    如下图所示,Linux 体系结构,从大的方面可以分为用户空间(User Space)和内核空间(Kernel Space)。

    用户空间中包含了 C 库,用户的应用程序。在某些体系结构图中还包含了 shell,当然 shell 脚本也是Linux 体系中不可缺少的一部分。
    内核空间包括硬件平台、平台依赖代码、内核、系统调用接口。
    在任何一个现代操作系统中,都是分层的。为什么需要分层呢?
    从程序员的角度分析,将 linux 底层和和应用分开,将 linux 底层和应用分开,做应用的做应用,做底层的做底层,各干各的。经济学的基本原理是,分工产生效率。
    从安全性的角度分析,是为了保护内核。现代 CPU 通常都实现了不同的工作模式。
    以 ARM 为例:ARM 实现了 7 种工作模式,不同模式下 CPU 可以执行的指令或者访问的寄存器不同:
    (1) 用户模式 usr
    (2) 系统模式 sys
    (3) 管理模式 svc
    (4) 快速中断 fiq
    (5) 外部中断 irq
    (6) 数据访问终止 abt
    (7) 未定义指令异常。
    如果任何一个上层应用都可以调用都可以调用寄存器,那样肯定是无法稳定执行的。而且因为出现了这个问题,出现了一个新的学科“现代操作系统”,如果大家感兴趣可以看一下“现代操作系统”相关文章或者书籍。
    以 X86 为例:X86 实现了 4 个不同级别的权限,Ring0—Ring3 ;Ring0 下可以执行特权指令,可以访问
    IO 设备;Ring3 则有很多的限制
    如果分析一下 Android 的,这方面做的更加“丧心病狂”,Android 所有的 APK 应用程序,都是在 Java虚拟机上面运行,应用程序更加远离底层。
    另外,用户空间和内核空间是程序执行的两种不同状态,可以通过“系统调用”和“硬件中断”来完成用户空间到内核空间的转移。

    2 Linux 内核结构
    这一节,分析一下内核结构。如下图所示,是 Linux 内核结构图。

    SCI 层(System Call Interface),这一层是给应用用户空间提供一套标准的系统调用函数来访问 Linux。前面分析 Linux 体系结构的时候,介绍过任何一类现代操作系统都不会允许上层应用直接访问底层,在Linux 中,内核提供了一套标准接口,上层应用就可以通过这一套标准接口来访问底层。
    PM(Procees Management),这一部分包括具体创建创建进程(fork、exec),停止进程(kill、exit), 并控制他们之间的通信(signal 等)。还包括进程度,控制活动进程如何共享 CPU。这一部分是 Linux 已经做好的,在写驱动的时候,只需要调用对应的函数即可实现这些功能,例如创建进程、进程通信等等。
    MM(Memory Management),内存管理的主要作用是控制多个进程安全的共享内存区域。
    VFS(Virtual File Systems),虚拟文件系统,隐藏各种文件系统的具体细节,为文件操作提供统一的接口。在 Linux 中“一切皆文件”,这些文件就是通过 VFS 来实现的。Linux 提供了一个大的通用模型,使这个模型包含了所有文件系统功能的集合。如下图所示,是一个虚拟文件系统的结构图。

    Device Drivers 设备驱动,这一部分就是需要学习和掌握的。Linux 内核中有大量的代码在设备驱动程序部分,用于控制特定的硬件设备。
    Linux 驱动一般分为网络设备、块设备、字符设备、杂项设备,需要编写的只有字符设备,杂项设备是不容易归类的一种驱动,杂项设备和字符设备有很多重合的地方。
    网络协议栈,Linux 内核中提供了丰富的网络协议实现。

    3 Linux 内核源码目录结构
    Linux 内核源码采用树形结构。功能相关的文件放到不同的子目录下面,使程序更具有可读行。使用Source Insight 打开源码,如下图所示,可以看到源码是树形结构。

    下面来介绍每一个目录的作用。
    arch 目录是平台目录。处理器原厂提供一套 Linux 内核的源码,那么在这个目录下都有一套针对具体处理器 CPU 的子目录。每个 CPU 的子目录,又进一步分解为 boot,mm, kernel 等子目录,分别控制系统引导,内存管理,系统调用,动态调频,主频率设置部分等。
    在 arch 目录中有关键的平台文件。任何一款支持 Linux 的处理器,都有一部分内核代码是针对特定的处理器来提供的,具体的实现就是通过平台文件。
    迅为 iTOP-4412 的平台文件,是 arch→arm→mach-exynos→mach-itop4412.c。
    arch→arm→boot 目录,默认编译生成的内核镜像是在这个目录下。
    在 arch→arm→kernel 目录中,有针对具体 CPU 处理器的代码,有相关内核特性实现方式,如信号处理等。这一部分当然是芯片厂商做好了,4412 的这部分就是三星已经做好的部分。
    在 arch→arm→lib 目录 中,有 一些和 硬件相 关库函 数,后 面学习 驱动的 时候会 使用到 。在
    arch→arm→tools 目录中,包含了生成镜像的工具。

    如下图所示。
    在 binary 目录中,有一些无源码的驱动以二进制放到该文件夹,例如一些测试版本或者不愿意公布源码,都可以将二进制文件放到这个目录中。
    在 drivers 目录中,就是需要重点学习的部分,后面的实验都是围绕这一步进行的。
    在 include 目录中,通用的 Linux 头文件都在该文件下。

    如下图所示,部分目录如下。下面的这些目录,几乎不需要去动其中任何一个文件。

    如下图所示,有内核编程的范例,实现安全性的代码,声卡设备驱动等还有内核裁减配置工具目录 tools,这一部分实现的功能是将.c 编译成目标文件,连接合并成可运行的内核镜像文件等。提供给大家的内核源码一百多 M,最后编译成的 zImage 只有不到 5M,这都是依靠这个工具来实现的,后面会有针对性的实验来教大家如何使用编译工具。

  • 相关阅读:
    HTML5 浏览器设定
    c语言运算符优先级
    Jquery选择器
    asp.net中的<% %>用法
    Jquery技巧
    css选择器
    HTML5 Canvas 参考手册
    具有滑动效果的导航代码
    委托
    kubernetes 1.6 集群实践 (十)
  • 原文地址:https://www.cnblogs.com/liyue3/p/15213333.html
Copyright © 2020-2023  润新知