我是一名数学本科生,目前正在学习操作系统课程,但计算机科学背景很少。
以下是我所知道的基础知识 - 操作系统恰好由两部分组成 -
- 文件管理系统,因为Linux中的一切都可以被视为文件
- 控制硬盘和其他设备的设备驱动程序
现在,假设我们要运行一个应用程序 A ,那么要执行应用程序 A ,我们需要将应用程序 A 的可执行文件从硬盘加载到内存中。
现在这就是我对如何完成它的想法。我不确定这是否正确,我非常感谢一些帮助。
操作系统的文件管理系统知道,要执行应用程序A,我们需要硬盘上应用程序A的可执行文件,其地址由文件描述符表提供(我不确定,但我想如果我想寻址文件A.out 的地址是 2475 那么在文件描述符表中我有一个变量,比如说 i,它存储文件 A.out 的地址以及进程将从文件中读取的指针(这就是为什么不同进程的文件描述符表不同吗?这个文件描述符表存储在RAM中吗?)。
现在,我们已经获得了关于我们应该处理什么的足够信息,我们从一个空白空间说“buff”(我假设是内存中的一个空间)开始,现在处理硬盘的设备驱动程序可能会从给定的硬盘上传信息位置并将其上传到“buff”中。
这是我的理解。如果我的理解与事实有太多矛盾,请原谅。需要一些帮助,还需要一些关于如何澄清我的概念的建议。
编辑1:假设我在内存中加载应用程序的可执行文件,那么我有一个文件描述符,它实际上是我们打开应用程序的可执行文件时打开的文件数量的索引,现在是这个文件描述符指向一个文件表(内核中只有一个文件表,它存储文件的详细信息,比如有多少个文件描述符指向它,此时它处于什么模式以及它的ID(它是带有相对于内存?)。不同的文件描述符表中的不同文件描述符可能指向相同的资源。
答案1
如果这是您从课程中学到的内容,则对该课程的质量存在严重怀疑。对操作系统和磁盘访问功能的完整解释远远超出了问答网站的范围。因此,我将向您提供一个简短的全局解释,其中缺少很多细节和细微差别。这些也是粗略的简化。
操作系统的功能远远超出两个基本功能。这在一定程度上取决于您使用的术语的确切定义以及您所使用的操作系统(例如 Windows,操作系统中包含 GUI),但功能至少包括:
- 作业调度
- 内存管理
- 文件/文件系统访问
- 流程管理和流程通信
- 联网
因此,回顾一下您的解释:
操作系统的文件管理系统知道,要执行应用程序A,我们需要硬盘上应用程序A的可执行文件,其地址由文件描述符表提供
呃没有。它不是操作系统的文件管理系统。除了第一个进程(不同形式的 init )之外,进程都是由另一个进程创建的。例如,如果您ls
从终端执行操作,则您使用的 shell 会要求操作系统加载该程序。
在 Linux 和 Unix 中,术语“文件描述符”可能与您课程中的含义有所不同;您应该(至少现在)将“文件描述符表”替换为“i-node 表”。
然后,操作系统的文件(系统)功能在 i 节点表中搜索文件在磁盘上的位置。 i节点表是文件系统的一部分,存储在磁盘上。但是,操作系统会在内存中保留一个副本(缓存),以防止不必要的磁盘访问。
那么,当您打开文件时会发生什么?用户进程使用文件名对操作系统进行文件打开调用。操作系统将名称转换为磁盘上的位置(使用 I 节点表),并分配一个文件描述符以供将来引用该文件,直到再次关闭为止。
下面,操作系统的设备函数告诉磁盘控制器将磁盘的某些扇区加载到内存中,因此文件系统函数可以将其转换为字节流或块流。
答案2
I 节点和文件描述符(简单版)
- 进程在 i 节点中查找目录列表。
- 然后它使用 i 节点打开文件。
- open 调用返回文件描述符表的索引。
- 所有其他文件系统调用都使用此文件描述符。
文件描述符索引存储在进程的用户空间中。该表位于内核空间中(如果您可以编辑它,那么您就可以破坏安全性)。文件描述符表中的字段将包括文件的 i 节点、查找偏移量、读取和写入标志(可以读取和/或写入),...
每个进程都有自己的文件描述符表。它跟踪该进程打开了哪些文件。权限检查仅在文件打开时进行,因此内核必须跟踪这一点。这就是文件描述符表位于内核中的原因,以及它存在的原因(如果没有安全性,那么进程可以自行跟踪它)。