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的方法。。)