windows如何区分光盘?

How does windows distinguishes between discs?

我想知道 windows 如何区分不同的驱动器和内存模块,我的意思是 windows 如何将某些内容专门写入 C 盘或 D 盘。 在每种编程语言中,当您声明变量时,它会被保存到内存中,而当您需要将某些内容存储到硬盘时,您必须使用一些库。 那么,windows是如何处理的呢? 它是否将所有光盘和内存模块视为单行数据,并且只保存每个媒体的起始地址? - 就像 0x00000 是光盘 C 开始的地方,0x15616 是光盘 D 开始的地方。

在现代 Windows(2000 年或以后)中,C:Device\HarddiskVolume1 之类的符号链接。那里的数字可能会有所不同。通常,\Device\Bootpartition 也是指向相同 HarddiskVolume.

的符号链接

Windows 不使用 写入磁盘。相反,它使用 驱动程序 。主要区别在于驱动程序 运行 作为 OS 内核的一部分,而库 运行 作为应用程序的一部分。

正如@MSalters 所说,

C: is a symlink to something like Device\HarddiskVolume1.

这意味着 Windows 上的磁盘驱动程序是作为虚拟文件系统实现的,有点像 Linux 上的。我将对 Linux 进行解释,因为有更多文档,但 Windows 的答案非常相似,尽管两个 OS 的处理方式不同。

基本上,在 Linux 上,一切都是文件。 Linux 附带磁盘驱动程序,因为它们是每台计算机的基础。 Linux 像每个 OS 一样公开了一个驱动程序模型。文件(包括硬盘)的 Linux 驱动程序模型将内核将​​调用的函数公开到 read/write 到磁盘。内核希望文件驱动程序具有打开、读取和写入功能。

如果你愿意,你可以编写一个磁盘驱动程序并替换现有的。您将驱动程序编写为模块,然后可以使用 Linux 附带的某些实用程序将其加载到内核中。我不会分享更多细节,因为我不太了解。一旦您的代码加载到内核中,它就可以访问所有内核代码和所有硬件,因为它在内核模式下运行。

今天,磁盘驱动程序可能使用 PCI DMA,这是一个连接到 PCI 总线的控制器,它允许执行忽略 CPU 的磁盘操作并将磁盘数据直接加载到 RAM。 PCI 公约规定所有兼容设备(如 PCI DMA 控制器)必须向计算机公开特定接口。该接口主要是一些内存映射寄存器,可用于向控制器发送命令。 OS会将数据写入这些寄存器,告诉DMA控制器进行磁盘操作。一旦完成,DMA 控制器将触发中断。然后 OS 将知道数据已准备好加载到 RAM 中并准备好使用。这同样适用于写作

OS 通过在启动时查看 ACPI 表知道这些寄存器的位置。