热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

驱动程序和应用程序之间的体系结构不匹配_【001】一文带你全面掌握Linux系统体系结构

总第77篇本篇将全面梳理Linux系统的体系结构,相信你阅读完本文定能对Linux系统有一个更深刻地认识和更全面的掌握。Linux系统一般有四个主要部分:
3434fc3adffcff9bc0a91d4005dc2300.png

总第77篇

本篇将全面梳理Linux系统的体系结构,相信你阅读完本文定能对Linux系统有一个更深刻地认识和更全面的掌握。

Linux系统一般有四个主要部分:内核、shell、文件系统、应用程序。 前三者一起构成了基本的操作系统结构,它使得用户可以使用这个操作系统并在系统中完成特定的任务。其结构如下图所示。

fe7c8553304aa477cd05218bf0fc0035.png

1.Linux内核

内核是操作系统的核心,提供很多的基本功能,它负责管理系统的进程、内存、设备驱动程序、文件系统和网络系统等,决定着系统的性能和稳定性。Linux内核主要由以下几部分组成:内存管理、进程管理、设备驱动程序、文件系统、网络管理等,其体系结构可表示成如下图所示:

03098c9613cddeed0a062c201337d0bb.png

从上图可以看出,用户与内核之间的交互是通过系统调用接口来完成的。

系统调用接口(System Call Interface)这一层提供了 某些机制执行从用户空间到内核空间的函数调用,接口依赖于体系结构。SCI可以看作是一个非常有用的函数调用式的多路复用、多路分解服务,在目录./linux/kernel下可以找到SCI层的具体实现,在目录./linux/arch 下可以找到其依赖的体系结构。

1.1 内存管理

对于计算机而言,内存资源总是有限的,为了让有限的物理内存满足应用程序的需求,Linux采用了“虚拟内存”管理方式, 它使得应用程序认为它拥有连续可用的内存(实际上是多个物理内存碎片,甚至部分暂存在外部磁盘上),让大型程序的编写变得更容易,对物理内存的使用也更有效率。Linux将物理内存划分为容易处理的内存页,目前大多数系统的页面都是4kb

Linux包括了管理可用内存的方式以及物理、虚拟映射所使用的硬件机制。当然,内存管理不光是管理4kb缓冲区, 系统提供了对4kb缓冲区的抽象, 它是以4kb为基数,从中分配结构,并跟踪内存页的使用情况,从而达到根据系统的需要动态调整的效果。

为了支持多用户使用内存,有时内存可能被消耗光,系统可以将暂时不用的页面放入磁盘中,这个过程称为交换。内存管理的源代码可以在目录./linux/mm中查看。

1.2 进程管理

进程是某特定应用程序的一个运行实体。Linux系统支持多任务,它是通过在“时间片”间隔内轮流执行这些进程来实现的,进程轮流执行的方法称为“进程调度”,完成调度的程序为调度程序。 进程调度就是控制进程对CPU的访问, 每次由调度程序选择“最值得”运行的进程(可运行进程是仅等待CPU资源的进程),这种“最值得”是系统基于优先级的进程调度算法实现的。

通用多任务机制,每个进程可认为只有自己独占计算机,从而简化了程序的编写。每个进程有自己单独的地址空间,并只有自己可以访问,这样可以有效避免进程间的干扰。对于某项任务需要多个进程协作完成的,操作系统提供了进程间通讯机制来辅助完成。Linux系统中常见的进程间通讯机制有:信号、管道、共享内存、信号量、套接字等

内核通过SCI层提供了一个应用程序编程接口来创建一个新进程(fork 、exec或POSIX函数)、停止进程(kill、exit),并在它们之间进行通信和同步(signal或POSIX机制)。

1.3 文件系统

Linux系统将独立的文件系统组合成了一个层次化的树形结构, 并由一个单独的实体代表这一文件系统。对于一个外部新的文件系统,Linux系统通过“挂载”的方式将其挂载到某个目录上,从而让不同的文件系统结合成一个整体。

Linux支持多种不同的文件系统,其中Ext2是其原生文件系统外,它也能够支持FATVFATFAT32MINIX等文件系统,从而可以方便地与其它操作系统交换数据。Linux系统之所以能支持不同的文件系统,是因为它将各种文件系统组织成了一个统一的虚拟文件系统(Virtual File System)。

虚拟文件系统为所有设备提供了统一的接口,它在用户和内核所支持的文件系统之间提供了一个交换层,如下图所示:

b3310cf89c7be80f64b39abcad3e889a.png

从上图可以看出,在VFS上面是对文件的openclosereadwrite等通用API的抽象,在VFS下面是文件系统的抽象,定义了上层函数的实现。文件系统的源代码可以在目录./linux/fs中查看。

有了虚拟文件系统,用户和进程不需要知道文件所在的文件系统类型,而只需要像使用Ext2文件系统一样使用即可。

1.4 设备驱动程序

设备驱动程序是Linux系统内核的主要部分,它控制着操作系统和硬件设备间的交互。一般,设备驱动程序与设备的控制芯片有关。

1.5 网络接口

网络接口提供了各种网络标准的存取和各种网络硬件的支持。Linux的网络实现支持BSD套接字,支持全部的TCP/IP协议。

2. Linux Shell

shell是系统的用户界面,提供了用户与内核进行交互操作的接口,它接收用户输入的命令并将它送到内核去执行。shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其它应用程序具有同样的效果。

目前大部分GNU操作系统上默认的就是bash shell

3. Linux文件系统

文件系统是文件存放在存储设备上的组织方法。Linux系统支持的文件系统非常多,除Ext2Ext3Ext4 之外,还能支持FATNTFSWindows文件系统,较常见的文件系统如下表所示。

文件系统详细描述
ExtLinux 中最早的文件系统,由于在性能和兼容性上具有很多缺陷,现在已经很少使用
Ext2是 Ext 文件系统的升级版本,Red Hat Linux 7.2 版本以前的系统默认都是 Ext2 文件系统。于 1993 年发布,支持最大 16TB 的分区和最大 2TB 的文件
Ext3是 Ext2 文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性。支持最大 16TB 的分区和最大 2TB 的文件
Ext4是 Ext3 文件系统的升级版。Ext4 在性能、伸缩性和可靠性方面进行了大量改进。Ext4 的变化可以说是翻天覆地的,比如向下兼容 Ext3、最大 1EB 文件系统和 16TB 文件、无限数量子目录、Extents 连续数据块 概念、多块分配、延迟分配、持久预分配、快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等。它是 CentOS 6.3 的默认文件系统
swapswap 是 Linux 中用于交换分区的文件系统(类似于 Windows 中的虚拟内存),当内存不够用时,使用交换分区暂时替代内存。一般大小为内存的 2 倍,但是不要超过 2GB。它是 Linux 的必需分区
NFSNFS 是网络文件系统(Network File System)的缩写,是用来实现不同主机之间文件共享的一种网络服务,本地主机可以通过挂载的方式使用远程共享的资源
ISO9660光盘的标准文件系统。Linux 要想使用光盘,必须支持 iso9660 文件系统
FAT就是 Windows 下的 fatl6 文件系统,在 Linux 中识别为 fat
VFAT就是 Windows 下的 fat32 文件系统,在 Linux 中识别为 vfat。支持最大 32GB 的分区和最大 4GB 的文件
NTFS就是 Windows 下的 NTFS 文件系统,不过 Linux 默认是不能识别 NTFS 文件系统的,如果需要识别,则需要重新编译内核才能支持。它比 fat32 文件系统更加安全,速度更快,支持最大 2TB 的分区和最大 64GB 的文件
UFSSun 公司的操作系统 Solaris 和 SunOS 所采用的文件系统
procLinux 中基于内存的虚拟文件系统,用来管理内存存储目录 /proc
sysfs和 proc —样,也是基于内存的虚拟文件系统,用来管理内存存储目录 /sysfs
tmpfs也是一种基于内存的虚拟文件系统,不过也可以使用 swap 交换分区

3.1 Linux文件类型

Linux系统主要有以下文件类型:

  • 普通文件:分为纯文本文件和二进制文件,如C语言代码、shell脚本、二进制可执行文件等;
  • 目录文件:目录是存储文件的唯一地方;
  • 链接文件:指向同一个文件或目录的文件;
  • 设备文件:与系统外设相关的,一般在目录/dev下面。设备分为块设备和字符设备;
  • 管道文件:提供进程间通信的一种方式;
  • 套接字文件:与网络通信相关的文件;

可以通过命令ls -lfilestat等命令来查看文件的类型相关信息。

3.2 Linux目录

Linux使用标准的目录结构,在安装时就已经为用户创建了文件系统和完整固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。 在系统中,使用/来表示根目录,用../表示当前目录,用..../表示上一层目录。若一个目录或文件名以.开始,则表示这个目录或文件是一个隐藏目录或文件,如.bashrw,在默认方式查找时,不显示该目录或文件。

Linux系统的通过目录结构如下图所示:

098af629be06b0fa290d7da9facee8ba.png

下表列出了这些目录的作用与存储内容。

目录名称详细描述
/binbin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的程序和指令。
/boot存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
/devdev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
/etcetc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录,更改目录下的文件可能会导致系统不能启动。
/home用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。
/liblib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。
/sys这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。
/sbin只有系统管理员才能使用的程序和指令。
/medialinux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
/mnt临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
/run是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
/lost+found一般情况下为空的,系统非法关机后,这里就存放一些文件。
/tmp这个目录是用来存放一些临时文件的。
/optopt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
/procproc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
/root该目录为系统管理员,也称作超级权限者的用户主目录。
/sbins 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。
/selinux这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
/srv该目录存放一些服务启动之后需要提取的数据
/usrusr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。
/usr/bin系统普通用户使用的应用程序。
/usr/sbin超级用户使用的比较高级的管理程序和系统守护程序。
/usr/src内核源代码默认的放置目录。
/varvar 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

Linux系统中,有下面几个目录是非常重要的,注意不误删除或随意修改内部文件:

  • /etc:这个是系统配置文件,修改了目录下的某个文件可能导致系统无法启动;
  • /bin,/sbin,/usr/bin,/usr/sbin:这是系统预设执行文件的放置目录, 不要轻易修改;
  • /var:这是非常重要的一个目录,相当于Windows下的Program files文件夹,系统上运行的很多程序的日志文件也存储于此。

3.2 Linux磁盘分区

Linux分区不同于Windows,硬盘和硬盘分区在Linux系统中都表示为设备。硬盘分区一共有三种:主分区、扩展分区和逻辑分区。主分区与扩展分区的数目之和不能大于四个

  • 主分区(Primary Partion):可以马上被使用,但不能再分区;
  • 扩展分区(Extension Partion):必须再进行分区后才能使用;
  • 逻辑分区(Logical Partion):由扩展分区建立起来的分区,逻辑分区没有数量上的限制;

扩展分区只不过是逻辑分区的“容器”,实际上只有主分区与逻辑分区进行数据存储。

Linux系统下的硬盘分区标识一般使用/dev/hd[a-z]X(IDE接口的硬盘)或者/dev/sd[a-z]X(SCSI接口的硬盘)格式,其中[a-z]代表硬盘号,X代表硬盘内的分区号。 X的值是1到4时,表示为硬盘的主分区(包含扩展分区),逻辑分区是从5开始的。要注意:即使一块硬盘只有一个主分区,逻辑分区也是从5开始编号的。

总起来说,一个硬盘分区首先要确认在哪个硬盘,然后再确认它在哪个分区。可以使用fdisk -l命令查看硬盘的详细信息。

3.3 硬连接与软连接

Linux中连接有硬连接与软连接之分, 软连接又叫符号连接。它们的特点如下:

  • 硬连接:是指通过索引节点进行连接。文件系统中的文件都会给其分配一个编号,这个编号即索引节点,多个索引节点指向同一文件就是硬连接。硬连接的作用在于允许一个文件有多个路径名,从而建立了硬连接,以防止“误删除”。文件真正删除的条件是与之相关的所有硬连接文件均被删除。
  • 软连接:用ln -s命令建立文件的符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名,类似于Windows下的快捷方式。

硬连接与软连接的区别在于:

  • 硬连接原文件与新文件的inode编号一致,而软连接不一样;
  • 对原文件删除,会导致软连接不可用,而硬连接不受影响;
  • 对原文件的修改,软硬连接文件内容都同样的修改,因为指向的是同一个文件内容的。

3.4 文件目录管理的相关命令

文件目录管理的相关命令列举如下:

磁盘与文件空间管理:fdiskdfdu;

文件目录与管理:cdpwdmkdirrmdirlscprmmv

查看文件内容:cattacmorelessheadtail

文件目录与权限:chmodchownchgrpumask

文件查找:whichwhereislocatefind

4.Linux内核参数优化

内核参数是用户与系统内核之间交互的一个接口,通过这个接口,用户可以在系统运行的同时,动态更新内核配置。这些内核参数是通过Linux proc文件系统实现的,因此,可以通过调整proc文件系统达到优化Linux系统性能的目的。

本文到此结束!下篇继续!

如果对你有帮助,请随手 点赞赞赏!关注本专栏,更多干货与你分享。

=======================================================

欢迎【关注、私信 @武三郎。我们一起交流一起进步。



推荐阅读
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
author-avatar
曾经沧海难为水95531837155423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有