5.12

cpu_exec_init_all()->memory_map_init()

memory_map_init()  分配MemoryRegion结构,并初始化使用memory_region_init()

set_system_memory_map(system_memory)-〉memory_region_update_topology_>好像是完成对于内存的映射问题

出现了address_space_memory.root = mr;这个函数,adderess_space为AddressSpace结构根据上面提示可知这个结果代表的是system address space包括i/o memory

struct AddressSpace {//这个结构一个系统对应一个吧
    const AddressSpaceOps *ops;//一些函数
    MemoryRegion *root;//这里只需记载相关的root,在memoryregion 结构中的subregions 这个链表示连接的所有的address space 还是说将下面的所有的内存分成多块后在链接起来的。
    FlatView current_map;
    int ioeventfd_nb;
    MemoryRegionIoeventfd *ioeventfds;
};

struct FlatRange {
    MemoryRegion *mr;//
    target_phys_addr_t offset_in_region;//这里不是很明白
    AddrRange addr;
    uint8_t dirty_log_mask;
    bool readable;
    bool readonly;
};

/* Flattened global view of current active memory hierarchy.  Kept in sorted
 * order.
 */
struct FlatView {
    FlatRange *ranges;
    unsigned nr;//可以分配的
    unsigned nr_allocated;//已经分配的
};
按照上面的结构可猜测:flatview.range 连接的是所有的物理内存对应的flatrange结构,这里每个flatrange 中的mr指向了其所对应的mr结构,这里有个疑问对于AddrRange addr,来说按照其头文件中的说法是对应于物理内存,而mr中的target_phys_addr_t addr;//客户机的物理地址空间 target_phys_addr_t offset 也是对应于物理内存,是否重复?或者addrrange对应于虚拟内存。

 

memory_region_update_topology() 函数中

 if (address_space_memory.root) {
        address_space_update_topology(&address_space_memory);
    }
    if (address_space_io.root) {
        address_space_update_topology(&address_space_io);
    }

里面的这几个判断还不是很明白。

address_space_update_topology()保存原来的内存map  ,使用generate_memory_topology产生新的map,其中调用render_memory_region(&view, mr, int128_zero(),
                         addrrange_make(int128_zero(), int128_2_64()), false);这个函数的参数&new,mr,0,{ 0,2^64},flalse}

render_memory_region函数,完成将mr对应的内存区,映射到view->range中,其中 每一个mr 可能对应于几个分散的range中,address_space_update_topology()然后调用

 address_space_update_topology_pass(as, old_view, new_view, false);//这个和下面的函数不是很明白
    address_space_update_topology_pass(as, old_view, new_view, true);

    as->current_map = new_view;
    flatview_destroy(&old_view);
    address_space_update_ioeventfds(as);更新

(int128_nonneg(int128_sub(a, b));这里的函数的减法模拟的使用的是补码加1的方法。。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值