问题描述
我想知道 Windows 如何区分不同的驱动器和内存模块,我的意思是 Windows 如何将某些内容专门写入 C 盘或 D 盘。 在每种编程语言中,当您声明变量时,它都会保存到内存中,而当您需要将某些内容存储到硬盘时,您必须使用一些库。 那么,windows是如何处理的呢? 是不是把所有的盘片和内存条都当成一行数据,只保存每个介质的起始地址? - 比如0x00000是C盘开始的地方,0x15616是D盘开始的地方。
解决方法
就像@MSalters 所说,
C: 是指向 Device\HarddiskVolume1 之类的符号链接。
这意味着 Windows 上的磁盘驱动程序是作为虚拟文件系统实现的,有点像在 Linux 上。我将针对 Linux 进行解释,因为有更多文档,但 Windows 的答案非常相似,即使两种操作系统的处理方式不同。
基本上,在 Linux 上一切都是文件。 Linux 附带磁盘驱动程序,因为它们是每台计算机的基础。 Linux 像每个操作系统一样公开了一个驱动程序模型。文件(包括硬盘)的 Linux 驱动程序模型公开了将由内核调用以读取/写入磁盘的函数。内核希望为文件驱动程序提供打开、读取和写入函数。
如果您愿意,您可以编写一个磁盘驱动程序并替换现有的驱动程序。您将驱动程序编写为模块,然后您可以使用 Linux 附带的某些实用程序将其加载到内核中。我不会分享更多细节,因为我不是很了解。一旦您的代码加载到内核中,它就可以访问所有内核代码和所有硬件,因为它在内核模式下运行。
今天,磁盘驱动程序可能使用 PCI DMA,这是一个连接到 PCI 总线的控制器,它允许执行忽略 CPU 并将磁盘数据直接加载到 RAM 的磁盘操作。 PCI 约定说所有兼容设备(如 PCI DMA 控制器)必须向计算机公开某个接口。这个接口主要是一些内存映射寄存器,可以用来向控制器发送命令。操作系统将在这些寄存器中写入数据以告诉 DMA 控制器进行磁盘操作。然后 DMA 控制器将在完成后触发中断。操作系统随后将知道数据已轻松加载到 RAM 中并准备好使用。这同样适用于写作
操作系统通过在启动时查看 ACPI 表来知道这些寄存器的位置。
,在现代 Windows(2000 或更高版本)中,C:
是指向 Device\HarddiskVolume1
之类的符号链接。那里的数字可能会有所不同。通常,\Device\Bootpartition
也是同一个 HarddiskVolume
的符号链接。
Windows 不使用库来写入磁盘。相反,它使用驱动程序。主要区别在于驱动程序作为操作系统内核的一部分运行,而库作为应用程序的一部分运行。