AddressSpace Part1

AddressSpace,看名字就知道很牛。其中也囊括、关联了很多数据结构。这次我们主要讲讲它和MemoryRegion之间的关系。

初始化 -- address_space_init

这个初始化函数倒是不长,不过包含了很多重要的内容,这里我们只说两个:

  • QTAILQ_INSERT_TAIL(&address_spaces, as, address_spaces_link);

  • as->root = root;

不止一个的地址空间

从上面第一条看,所有的地址空间都会链接在一个链表上。这就说明了在qemu中不止有一个地址空间,而不是我最开始想象的一个虚拟机公用一个地址空间。

在初始化函数中我们看到两个地址空间: address_space_memory, address_space_io。所以此时这个链表长成这样:

    address_space(global)
    +-------------------------------+
    |tqh_last                       |
    |tqh_first                      |
    +-+-----------------------------+
      |        
      |   address_space_memory             address_space_io
      |   (AddressSpace)                   (AddressSpace)
      |   +------------------------+       +------------------------+
      +-->|address_spaces_link     | ----->|address_spaces_link     |
          |                        |       |                        |
          +------------------------+       +------------------------+

AddressSpace和MemoryRegion

这个root参数是一个MemoryRegion类型,所以我们得到了AddressSpace和一个MemoryRegion对应。

慢着,我们刚才看到了什么?MemoryRegion可以是一颗树是不是?那实际上我们得到的是:

AddressSpace和一颗MemoryRegion树对应

做了一个简单的图示意:

隐藏内容

地址空间就这么简单么?再看一眼初始化函数,发现其中还有两个子函数并没有打开。其中包含的奥秘让我们接着打开。

Last updated

Was this helpful?