本文涉及到的代码,可查看对应的版本的链接:https://github.com/fslongjin/DragonOS/tree/1e8e6523dfde96cf359c5f329123f7cc0ca62d67
由于计算机上的很多设备都需要MMIO的地址空间,而每台计算机上所连接的各种设备的对MMIO地址空间的需求是不一样的。如果我们为每个类型的设备都手动指定一个MMIO地址,会使得虚拟地址空间被大大浪费,也会增加系统的复杂性。并且,我们在将来还需要为不同的虚拟内存区域做异常处理函数。因此,我们需要一套能够自动分配MMIO地址空间的机制。
这套机制本质上是使用了伙伴系统来对MMIO虚拟地址空间进行维护。在mm/mm.h中指定了MMIO的地址空间范围,这个范围是0xffffa10000000000开始的1TB的空间。也就是说,这个伙伴系统为MMIO维护了这1TB的虚拟地址空间。
一旦MMIO地址空间分配完成,它就像普通的vma一样,可以使用mmap系列函数进行操作。
在得到了虚拟地址空间之后,当我们尝试往这块地址空间内映射内存时,我们可以调用mm_map函数,对这块区域进行映射。
该函数会对MMIO的VMA的映射做出特殊处理。即:创建Page结构体以及对应的anon_vma
然后,会将对应的物理地址,填写到页表之中。
当设备被卸载时,驱动程序可以调用mmio_release函数对指定的mmio地址空间进行释放。
释放的过程中,mmio_release将执行以下流程:
转载请注明来源:https://longjin666.cn/?p=1528