Linux系统内核与内存相关知识
目录
文件系统
NTFS文件系统的概述
从用户的角度来看,NTFS 继续将文件组织到目录(与 HPFS 一样)中。 但是,与 FAT 或 HPFS 不同,磁盘上没有“特殊”对象,并且不依赖于基础硬件,例如 512 字节扇区。 此外,磁盘上没有特殊位置,例如 FAT 表或 HPFS 超级块。
NTFS 的目标是提供:
- 可靠性,这对于高端系统和文件服务器尤其理想
- 用于添加功能的平台
- 支持 POSIX 要求
- 删除 FAT 和 HPFS 文件系统的限制
可靠性
为确保 NTFS 的可靠性,解决了三个主要方面:可恢复性、消除致命的单扇区故障和热修复。
NTFS 是可恢复的文件系统,因为它跟踪针对文件系统的事务。 在 FAT 或 HPFS 上执行 CHKDSK 时,将检查目录、分配和文件表中指针的一致性。 在 NTFS 下,会维护针对这些组件的事务日志,以便 CHKDSK 只需将事务回滚到最后一个提交点,即可恢复文件系统中的一致性。
在 FAT 或 HPFS 下,如果作为文件系统一个特殊对象位置的扇区发生故障,则会发生单个扇区故障。 NTFS 通过两种方式避免此问题:首先,不使用磁盘上的特殊对象,以及跟踪和保护磁盘上的所有对象。 其次,在 NTFS 下,多个副本 (数量取决于主文件表的卷大小) 。
与 HPFS 的 OS/2 版本类似,NTFS 支持热修复。
添加了功能
每个级别Windows NT的主要设计目标之一是提供一个可以添加到和构建的平台,NTFS 也不例外。 NTFS 为其他文件系统提供了一个丰富而灵活的平台,可供其他文件系统使用。 此外,NTFS 完全支持Windows NT安全模型,并支持多个数据流。 数据文件不再是单个数据流。 最后,在 NTFS 下,用户可以将自己的用户定义属性添加到文件中。
POSIX 支持
NTFS 是受支持的文件系统中最符合 POSIX.1 的,因为它支持以下 POSIX.1 要求:
区分大小写的命名:
在 POSIX 下,README.TXT、Readme.txt 和 readme.txt 都是不同的文件。
其他时间戳:
附加时间戳提供上次访问文件的时间。
硬链接:
硬链接是当两个不同的文件名(可以位于不同目录中)指向相同的数据时。
删除限制
首先,NTFS 大大增加了文件和卷的大小,因此它们现在最多可以达到 2^64 字节 (16 EB 或 18,446,744,073,709,551,616 字节) 。 NTFS 还返回了群集的 FAT 概念,以避免固定扇区大小的 HPFS 问题。 之所以这样做,是因为Windows NT是一种便携式操作系统,并且在某些时候可能会遇到不同的磁盘技术。 因此,每个扇区 512 字节被视为很有可能并不总是适合分配。 这是通过允许将群集定义为硬件自然分配大小的倍数来实现的。 最后,在 NTFS 中,所有文件名都基于 Unicode,8.3 文件名与长文件名一起保留。
NTFS 的优点
NTFS 最适合用于大约 400 MB 或更大的卷。 这是因为在 NTFS 下,性能不会像 FAT 下那样降低,因为卷大小较大。
设计为 NTFS 的可恢复性使用户永远不必在 NTFS 分区上运行任何类型的磁盘修复实用工具。 有关 NTFS 的其他优势,请参阅以下内容:
- Windows NT服务器“概念和规划指南”,第 5 章,标题为“选择文件系统”
- Windows NT工作站 4.0 资源工具包,第 18 章“选择文件系统”
- Windows NT Server 4.0 资源工具包“资源指南”第 3 章,标题为“在哪些卷上使用哪个文件系统”
NTFS 的缺点
不建议在小于大约 400 MB 的卷上使用 NTFS,因为 NTFS 中涉及的空间开销。 此空间开销采用 NTFS 系统文件的形式,这些文件通常在 100 MB 分区上使用至少 4 MB 的驱动器空间。
目前,NTFS 中没有内置的文件加密。 因此,某人可以在 MS-DOS 或其他操作系统下启动,并使用低级别的磁盘编辑实用工具查看存储在 NTFS 卷上的数据。
无法使用 NTFS 文件系统格式化软盘;Windows NT使用 FAT 文件系统格式化所有软盘,因为 NTFS 中涉及的开销无法容纳软盘。
有关 NTFS 缺点的进一步讨论,请参阅以下内容:
- Windows NT服务器“概念和规划指南”,第 5 章,标题为“选择文件系统”
- Windows NT工作站 4.0 资源工具包,第 18 章“选择文件系统”
- Windows NT Server 4.0 资源工具包“资源指南”第 3 章,标题为“在哪些卷上使用哪个文件系统”
NTFS 命名约定
文件和目录名称的长度最多为 255 个字符,包括任何扩展名。 名称保留大小写,但不区分大小写。 NTFS 不根据大小写区分文件名。 名称可以包含除以下字符以外的任何字符:
? " / \ < > * | :
目前,从命令行只能创建最多 253 个字符的文件名。
备注
础硬件限制可能会在任何文件系统中施加额外的分区大小限制。 特别是,启动分区的大小只能为 7.8 GB,分区表中有 2 TB 的限制。
FAT 概述
FAT 是Windows NT支持的最简单文件系统。 FAT 文件系统的特点是文件分配表 (FAT) ,它实际上是一个位于卷“顶部”的表。 为了保护卷,将保留 FAT 的两个副本,以防第一个副本损坏。 此外,FAT 表和根目录必须存储在固定位置,以便正确定位系统的启动文件。
使用 FAT 格式化的磁盘在群集中分配,其大小取决于卷的大小。 创建文件时,在目录中创建一个条目,并建立包含数据的第一个群集编号。 FAT 表中的此项指示这是文件的最后一个群集,或指向下一个群集。
更新 FAT 表非常重要且非常耗时。 如果未定期更新 FAT 表,可能会导致数据丢失。 这很耗时,因为每次更新 FAT 表时,都必须将磁盘读取头重新定位到驱动器的逻辑轨迹零。
FAT 目录结构没有组织,并且文件位于驱动器上的第一个打开位置。 此外,FAT 仅支持只读、隐藏、系统和存档文件属性。
FAT 命名约定
FAT 使用传统的 8.3 文件命名约定,并且必须使用 ASCII 字符集创建所有文件名。 文件或目录的名称最多可以包含 8 个字符,然后是句号 (.) 分隔符,最多可以有三个字符的扩展名。 名称必须以字母或数字开头,并且可以包含除以下字符以外的任何字符:
. " / \ [ ] : ; | = ,
如果使用这些字符中的任何一个,可能会出现意外结果。 名称不能包含任何空格。
保留以下名称:
CON、AUX、COM1、COM2、COM3、COM4、LPT1、LPT2、LPT3、PRN、NUL
所有字符都将转换为大写。
FAT 的优点
在任何受支持的文件系统上,都无法在Windows NT下执行撤消删除。 取消删除实用工具会尝试直接访问硬件,这无法在 Windows NT 下完成。 但是,如果文件位于 FAT 分区上,并且系统在 MS-DOS 下重启,则可以取消删除该文件。 FAT 文件系统最适合在大约 200 MB 以下的驱动器和/或分区,因为 FAT 开始时开销很小。 有关 FAT 优势的进一步讨论,请参阅以下内容:
- Windows NT服务器“概念和规划指南”,第 5 章,标题为“选择文件系统”
- Windows NT工作站 4.0 资源工具包,第 18 章“选择文件系统”
- Windows NT Server 4.0 资源工具包“资源指南”第 3 章,标题为“在哪些卷上使用哪个文件系统”
FAT 的缺点
最好是,使用超过 200 MB 的驱动器或分区时,不应使用 FAT 文件系统。 这是因为随着卷大小的增加,FAT 的性能将迅速下降。 无法对属于 FAT 分区的文件设置权限。
FAT 分区的大小限制在 Windows NT 以下最大为 4 GB (GB) ,MS-DOS 中最大为 2 GB。
有关 FAT 的其他缺点的进一步讨论,请参阅以下内容:
- Windows NT服务器“概念和规划指南”,第 5 章,标题为“选择文件系统”
- Windows NT工作站 4.0 资源工具包,第 18 章“选择文件系统”
- Microsoft Windows NT Server 4.0 资源工具包“资源指南”第 3 章,标题为“在哪些卷上使用哪个文件系统”部分
NTFS文件系统和FAT32系统的区别
区别
NTFS和FAT32是两种不同的文件系统格式,它们在功能、安全性和性能等方面存在一些区别。
1、功能和性能:NTFS是一种高度可恢复的文件系统,具有许多高级功能,如数据恢复、加密、压缩、磁盘配额等。相比之下,FAT32文件系统在功能和性能方面较为有限。
2、磁盘分区大小:NTFS支持的磁盘分区大小最大可达2TB(2048GB),而FAT32支持的分区大小最大为32GB。因此,对于需要使用大容量磁盘的用户来说,NTFS是更好的选择。
3、单个文件大小:NTFS突破了单个文件4GB的容量限制,目前来说似乎没容量限制,只要硬盘空间容量有多大,那么就NTFS就可以分到多大。而FAT32在实际运行中不支持单个文件大于4GB的文件,一旦超过容量限制那么系统就会提示磁盘空间不足。
4、安全性:NTFS提供了更高级的安全功能,可以对文件和文件夹进行加密和权限设置,而FAT32则不具备这样的安全功能。在NTFS下,用户可以对电脑用户对该格式下所有的文件夹、文件进行加密、修改、运行、读取目录及写入权限的设置。此外,在磁盘分区下任意文件夹或文件上右键属性,在高级属性窗口中勾选中加密内容以便保护数据即可做到加密。
5、碎片和空间利用:随着时间的推移和使用次数的增加,文件可能会产生碎片。从FAT16的文件系统格式,到之后的FAT32然后再到现在的NTFS文件系统格式,从磁盘分区的格式不同,那么所产品的磁盘碎片也是越来越小。
6、磁盘配额:NTFS支持磁盘配额,可以在一个NTFS分区上为不同用户设置不同的磁盘空间配额,而FAT32不支持磁盘配额。
7、文件恢复:NTFS具有更好的文件恢复功能,可以恢复意外删除或格式化的文件,而FAT32的文件恢复功能相对较弱。
8、压缩和加密:NTFS支持文件和文件夹的压缩和加密,而FAT32不支持。
9、日志记录:NTFS支持事务日志记录,可以记录对文件系统的更改,而FAT32不支持。
10、文件链接:NTFS支持硬链接和符号链接,而FAT32不支持。
11、文件访问控制:NTFS支持更复杂的文件访问控制,可以针对不同用户或用户组设置不同的访问权限,而FAT32不支持。
12、安全性:NTFS具有更高的安全性,可以防止恶意软件或黑客对文件进行修改或删除,而FAT32的安全性相对较低。
综上所述,NTFS和FAT32在功能、性能、磁盘分区大小、单个文件大小、安全性和碎片和空间利用等方面存在显著差异。因此,在选择文件系统格式时,需要根据实际需求和使用场景进行选择。如果需要使用大容量磁盘并需要高级安全功能和数据恢复能力,则建议使用NTFS文件系统。如果只需要一个简单的文件系统用于存储少量数据,并且不需要高级功能,则FAT32文件系统可能是一个更好的选择。
Linux内核的作用
一、前言
Linux操作系统是当今世界上最为广泛使用的开源操作系统之一,内核则是一个操作系统的核心和灵魂所在。对于一名Linux驱动开发者来说,了解Linux内核的运行机制和Linux内核提供的一些关键功能(如虚拟内存管理、进程管理、文件系统、网络协议栈等)都是我们日常工作和学习的重点。
二、Linux内核的作用
Linux内核的功能主要是将应用层请求传递给硬件,并作为底层驱动程序,以寻址系统中的各种设备和组件。下面从几个不同的角度简单的总结一下Linux内核的作用:
从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。
内核是一个资源管理程序。负责将可用的共享资源CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。
通过上面的介绍我们知道了Linux内核是链接硬件和上层应用的桥梁,通过这个桥梁我们可以直接在上层完成对硬件的操作。
Linux内核的作用主要体现在一下几个方面:
- 硬件与软件的中间层。Linux内核充当操作系统中硬件与应用程序之间的桥梁,为应用程序提供与硬件交互的接口。应用程序通过系统调用与内核通信,内核则通过驱动程序与硬件设备进行交互。
- 资源管理。内核负责管理CPU、内存、磁盘空间、网络连接等系统资源,确保系统进程能够公平地访问和利用这些资源。
- 进程管理。内核负责进程的创建、调度、同步和终止,以及进程间的通信。
- 文件系统管理。内核支持多种文件系统,如Ext4、Btrfs、XFS等,并负责文件的创建、删除、读写、权限控制等操作。
- 设备驱动。内核包含大量的设备驱动程序,支持各种硬件设备,如显示器、键盘、网络接口等,使得这些设备能够在Linux系统上正常运行。
- 网络通信。内核提供网络协议栈的支持,如TCP/IP协议,负责网络数据包的收集、标识和分发等任务。
- 安全性。内核提供了多种安全机制,如用户和组权限管理、访问控制列表(ACL)、安全模块(如SELinux)等,以保护系统安全。
- 虚拟化支持。内核支持虚拟化技术,如KVM,允许在单个物理机上运行多个虚拟机。
- 电源管理。内核负责管理电源使用,包括节能模式、休眠和唤醒等,以延长电池寿命和提高能效。
- 系统调用接口。内核提供了系统调用接口,允许用户空间的应用程序请求内核提供的服务。
- 错误处理和日志记录。内核负责记录系统运行中的错误信息,并通过日志系统提供日志记录功能。
总的来说,Linux内核是操作系统的核心,负责管理系统硬件资源、提供应用程序与硬件之间的接口,并确保系统的正常运行和资源的有效利用。
三、驱动开发为什么要学习内核
通过上面的介绍我们知道驱动开发其实也属于内核开发的一部分, 驱动的作用也是处理上层发送的请求,并传递给硬件。所以作为一名驱动开发工程师我们不但要学习如何编写Linux驱动程序,还要熟悉Linux内核的运行机制是非常重要的。
我认为作为一名驱动开发工程师之所以需要学习和熟悉Linux内核主要出于以下几点考虑:
3.1 理解系统底层机制与架构
Linux内核是一个复杂而庞大的项目,它涵盖了各种子系统、模块和设备驱动程序。作为一个驱动开发工程师,理解Linux内核的体系结构和机制可以让你更熟悉操作系统的底层工作原理。这包括进程管理、内存管理、文件系统、网络协议栈等。了解这些底层机制可以帮助我们更好地编写高效且稳定的设备驱动程序。
3.2 与内核接口进行交互
驱动开发工程师经常需要与Linux内核中的各种接口进行交互,以实现设备的初始化、配置和数据传输等操作。学习Linux内核知识可以帮助我们理解这些接口的使用方法和特点。例如,了解设备模型和总线框架可以帮助你构建设备驱动程序;了解字符设备和块设备接口可以帮助你进行输入输出操作。
3.3 故障排查和错误调试
在驱动开发过程中,经常会遇到各种故障和错误。这可能涉及设备初始化失败、数据传输错误、性能下降等问题。熟悉Linux内核可以帮助我们更有效地进行故障排查和错误调试。我们可以使用内核日志、调试工具和跟踪技术来定位问题,并深入了解内核中相关模块的行为。这样能够快速识别和解决问题,提高驱动程序的质量和可靠性。
3.4 驱动程序优化与性能提升
学习Linux内核知识有助于掌握一些高级技术和最佳实践,以优化驱动程序的性能。Linux内核提供了丰富的功能和特性,如中断处理、内存管理、数据缓存、并发控制等机制。了解这些机制可以更好地利用内核资源,减少不必要的开销,并提高驱动程序的性能,使你能够编写更高效、可扩展和可维护的驱动程序。
四、需要学习内核哪些知识
为了更好地编写驱动程序需要学习的方向,首先就是系统级别的进程管理、内存管理、文件系统、设备驱动、网络等知识。
进程管理进程管理的重点是进程的执行。它的作用是调度控制系统中的多个进程对CPU 的访问,使得多个进程能在CPU 中微观串行,宏观并行地执行。进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。
内存管理它主要提供对内存资源的访问控制。Linux系统会在硬件物理内存和进程所使用的内存(称作虚拟内存)之间建立一种映射关系,这种映射是以进程为单位,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。
虚拟文件系统随着计算机技术的进步,存储和组织数据的方法也是在不断进步的,从而导致有多种类型的文件系统(如:FAT、FAT32)。而为了兼容,操作系统或者内核,要以相同的表现形式,同时支持多种类型的文件系统,这就延伸出了虚拟文件系统(VFS)的概念。VFS的功能就是管理各种各样的文件系统,屏蔽它们的差异,以统一的方式,为用户程序提供访问文件的接口。
网络接口网络子系统在Linux内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能。
MMU内存管理单元的基本概念及工作原理
1. 什么是MMU
MMU是 MemoryManagementUnit 的缩写即,内存管理单元. 针对各种CPU, MMU是个可选的配件. MMU负责的是虚拟地址与物理地址的转换. 提供硬件机制的内存访问授权.(现代 CPU 的应用中,基本上都选择了使用 MMU)
现代的多用户多进程操作系统, 需要MMU, 才能达到每个用户进程都拥有自己的独立的地址空间的目标. 使用MMU, OS划分出一段地址区域,在这块地址区域中, 每个进程看到的内容都不一定一样. 例如MICROSOFT WINDOWS操作系统, 地址4M-2G处划分为用户地址空间. 进程A在地址 0X400000映射了可执行文件. 进程B同样在地址 0X400000映射了可执行文件. 如果A进程读地址0X400000, 读到的是A的可执行文件映射到RAM的内容. 而进程B读取地址0X400000时则读到的是B的可执行文件映射到RAM的内容.
2. MMU的产生
许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一个办法,这就是虚拟存储器(virtual memory).虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上比如对一个16MB的程序和一个内存只有4MB的机器,OS通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割
3. MMU 作用
MMU 的作用:
- 将虚拟地址翻译成为物理地址,然后访问实际的物理地址
- 访问权限控制
4. MMU 工作过程
MMU 进行虚拟地址转换成为物理地址的过程是 MMU 工作的核心
大多数使用虚拟存储器的系统都使用一种称为分页(paging)。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame).页和页框的大小必须相同。接下来配合图片我以一个例子说明页与页框之间在MMU的调度下是如何进行映射的:
在这个例子中我们有一台可以生成16位地址的机器,它的虚拟地址范围从0x0000~0xFFFF(64K),而这台机器只有32K的物理地址,因此他可以运行64K的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放64K程序的外部存储器(例如磁盘或是FLASH)以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页框大小与页相同(这点是必须保证的,内存和外围存储器之间的传输总是以页为单位的),对应64K的虚拟地址和32K的物理存储器,他们分别包含了16个页和8个页框。
我们先根据上图解释一下分页后要用到的几个术语,在上面我们已经接触了页和页框,上图中绿色部分是物理空间,其中每一格表示一个物理页框。橘黄色部分是虚拟空间,每一格表示一个页,它由两部分组成,分别是Frame Index(页框索引)和位p(present 存在位),Frame Index的意义很明显,它指出本页是往哪个物理页框进行映射的,位p的意义则是指出本页的映射是否有效,如上图,当某个页并没有被映射时(或称映射无效,Frame Index部分为X),该位为0,映射有效则该位为1。
我们执行下面这些指令(本例子的指令不针对任何特定机型,都是伪指令)
例1:
MOVE REG,0 //将0号地址的值传递进寄存器REG
虚拟地址0将被送往MMU,MMU看到该虚地址落在页0范围内(页0范围是0到4095),从上图我们看到页0所对应(映射)的页框为2(页框2的地址范围是8192到12287),因此MMU将该虚拟地址转化为物理地址8192,并把地址8192送到地址总线上。内存对MMU的映射一无所知,它只看到一个对地址8192的读请求并执行它。MMU从而把0到4096的虚拟地址映射到8192到12287的物理地址。
例2:
MOVE REG,8192
被转换为
MOVE REG,24576
因为虚拟地址8192在页2中,而页2被映射到页框6(物理地址从24576到28671)
例3:
MOVE REG,20500
被转换为
MOVE REG,12308
虚拟地址20500在虚页5(虚拟地址范围是20480到24575)距开头20个字节处,虚页5映射到页框3(页框3的地址范围是 12288到16383),于是被映射到物理地址12288+20=12308。
通过适当的设置MMU,可以把16个虚页隐射到8个页框中的任何一个,但是这个方法并没有有效的解决虚拟地址空间比物理地址空间大的问题。从上图中我们可以看到,我们只有8个页框(物理地址),但我们有16个页(虚拟地址),所以我们只能把16个页中的8个进行有效的映射。我们看看例4会发生什么情况:
例4:
MOV REG,32780
虚拟地址32780落在页8的范围内,从上图总我们看到页8没有被有效的进行映射(该页被打上X),这是又会发生什么?MMU注意到这个页没有被映射,于是通知CPU发生一个缺页故障(page fault).这种情况下操作系统必须处理这个页故障,它必须从8个物理页框中找到1个当前很少被使用的页框并把该页框的内容写入外围存储器(这个动作被称为page copy),随后把需要引用的页(例4中是页8)映射到刚才释放的页框中(这个动作称为修改映射关系),然后从新执行产生故障的指令(MOV REG,32780)。假设操作系统决定释放页框1,那么它将把虚页8装入物理地址的4-8K,并做两处修改:首先把标记虚页1未被映射(原来虚页1是被影射到页框1的),以使以后任何对虚拟地址4K到8K的访问都引起页故障而使操作系统做出适当的动作(这个动作正是我们现在在讨论的),其次他把虚页8对应的页框号由X变为1,因此重新执行MOV REG,32780时,MMU将把32780映射为4108。
我们大致了解了MMU在我们的机器中扮演了什么角色以及它基本的工作内容是什么,下面我们将举例子说明它究竟是如何工作的(注意,本例中的MMU并无针对某种特定的机型,它是所有MMU工作的一个抽象)。
首先明确一点,MMU的主要工作只有一个,就是把虚拟地址映射到物理地址。
我们已经知道,大多数使用虚拟存储器的系统都使用一种称为分页(paging)的技术,就象我们刚才所举的例子,虚拟地址空间被分成大小相同的一组页,每个页有一个用来标示它的页号(这个页号一般是它在该组中的索引,这点和C/C++中的数组相似)。在上面的例子中04K的页号为0,48K的页号为1,8~12K的页号为2,以此类推。而虚拟地址(注意:是一个确定的地址,不是一个空间)被MMU分为2个部分,第一部分是页号索引(page Index),第二部分则是相对该页首地址的偏移量(offset). 。我们还是以刚才那个16位机器结合下图进行一个实例说明,该实例中,虚拟地址8196被送进MMU,MMU把它映射成物理地址。16位的CPU总共能产生的地址范围是0~64K,按每页4K的大小计算,该空间必须被分成16个页。而我们的虚拟地址第一部分所能够表达的范围也必须等于16(这样才能索引到该页组中的每一个页),也就是说这个部分至少需要4个bit。一个页的大小是4K(4096),也就是说偏移部分必须使用12个bit来表示(2^12=4096,这样才能访问到一个页中的所有地址),8192的二进制码如下图所示:
该地址的页号索引为0010(二进制码),既索引的页为页2,第二部分为000000000100(二进制),偏移量为4。页2中的页框号为6(页2映射在页框6,见上图),我们看到页框6的物理地址是24~28K。于是MMU计算出虚拟地址8196应该被映射成物理地址24580(页框首地址+偏移量=24576+4=24580)。同样的,若我们对虚拟地址1026进行读取,1026的二进制码为0000010000000010,page index="0000"=0,offset=010000000010=1026。页号为0,该页映射的页框号为2,页框2的物理地址范围是8192~12287,故MMU将虚拟地址1026映射为物理地址9218(页框首地址+偏移量=8192+1026=9218)。以上就是MMU的工作过程。
5. MMU 的 TLB
由上面的例子可知,在 MMU 工作的时候,软件也需要进行配合,软件需要准备一张表,来告诉 MMU 当前的地址映射的关系(即,虚拟地址和物理地址的对应关系)。而这张表存储在内存中(代码的数据结构),每次 MMU 工作的时候,都去便利这个表里面的关系,然后找到对应的映射,这个过程叫做 table walk。这样会严重影响系统效率。于是乎,MMU 中增加了 Cache,这个 Cache 叫做 TLB。
为了减少存储器访问的平均消耗, 转换表遍历结果被高速缓存在一个或多个叫作 Translation Lookaside Buffers(TLBs)的结构中。通常在ARM 的实现中每个内存接口有一个TLB。当存储器中的转换表被改变或选中了不同的转换表(通过写CP15 的寄存器,先前高速缓存的转换表遍历结果将不再有效。MMU 结构提供了刷新TLB 的操作。MMU 结构也允许特定的转换表遍历结果被锁定在一个TLB 中,这就保证了对相关的存储器区域的访问绝不会导致转换表遍历,这也对那些把指令和数据锁定在高速缓存中的实时代码有相同的好处。
当ARM 要访问存储器时,MMU 先查找 TLB 中的虚拟地址表,如果没有命中,则,还是要去走 table walk 的流程。即,如果TLB 中没有虚拟地址的入口,则转换表遍历硬件从存在主存储器中的转换表中获取转换和访问权限。一旦取到,这些信息将被放在 TLB 中,它会放在一个没有使用的入口处或覆盖一个已有的入口。
关于更多的 ARM 架构的 MMU 以及如何和 Linux 分页机制进行配合的步伐,在后续进行分析。
Linux中目录和文件的区别是什么
区别:1、存储的数据不同,目录中存储了一张表,该表包含了该目录文件下所有文件名和索引的映射关系;而文件中存储了普通数据,一般就是字符串。2、权限不同,文件的权限有r(读)、w(增删改)、x(可执行);而目录的权限有r(读)、w(增删目录中文件)、x(目录可访问)、x(只给目录x权限,不给无执行权限的文件x权限)。
本教程操作环境:Linux7.3系统、Dell G3电脑。
linux中目录和文件的区别
区别一:存储的数据不同
-
普通文件:存储普通数据,一般就是字符串。
-
目录文件:存储了一张表,该表就是该目录文件下,所有文件名和索引(inode)的映射关系。
通常父目录会存储有它目录下文件的索引映射,说白了就是一张对应关系的索引表。(Everything is file)
想要操作目录里面的文件,有了索引还不行,还要有权限。
而且不单单只是看该普通文件的权限,还受到该文件的父目录、父父目录...的权限有关。
区别二:权限不同
1、对文件的权限:
-
r:可以获得这个普通文件的名字和内容。
-
w:可以对文件进行增删改的操作。
-
x:该文件是否具有被执行的权限。
可以把此文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行)
2、对目录的权限:
- r 可以使用ls查看此目录中文件列表
- w 可在此目录中创建文件,也可删除此目录中的文件,而和此被删除的文件的权限无关
- x 可以cd进入此目录,可以使用ls -l查看此目录中文件元数据(须配合r权限),属于目录的可访问的最小权限
- X 只给目录x权限,不给无执行权限的文件x权限
**对于目录文件来说,rwx的意义是:
- r-x:可以进入cd该目录,可以获得该目录下存储情况,但是不能修改这个目录内部存储的文件(目录)的名字,也不能在该目录下新建文件和目录
- -wx:可以进入cd该目录,但是看不到该目录下的存储情况(ls不可用),可以往该目录下添加、修改、删除文件。可以通过cat来读取该目录下的文件or目录的内容,由于得不到该目录下存储了那些文件,在不知情的情况下只能通过猜,cat + 文件名获得文件内容,所以这样依然不保密。
- --x:可以进入cd该目录,看不到存储情况,也不能往该目录下添加、修改、删除文件。但是依然可以通过cat + xx(猜)来获得该目录下的文件的内容。
- rw-:不能进入cd该目录,用ls仅仅可以获得文件名和目录名,因为获取不到这些文件的inode号,当然也不能获得该目录下的文件的内容。不能往该目录下添加、修改、删除文件。
注:
1、用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限
2、r和w权限对root用户无效,即权限的修改不影响root用户的r和w,但会影响x
3、只要所有者,所属组或other三者之一有x权限,root就可以执行
4、文件能不能删,和所在文件夹的权限有关