Skip to the content.

裸金属二进制翻译器的技术细节

Serial

从这里找信息: https://github.com/loongson-community/docs

file

https://www.cs.cmu.edu/afs/cs/academic/class/15213-f12/www/lectures/12-linking.pdf

裸机中的注意点

如果看 7A1000 用户手册,似乎 uart 似乎是 8 号,而 QEMU 上测试显示是 2 号

但是实际上,串口走的是 legacy inct 的 10 位

softmmu 和 memory model 的移植的设计

设计

  1. segments 直接初始化为固定大小的数组
  2. 所有的 MemoryRegion 在按照顺序排放
  3. 使用二分查找来找到 MemoryRegion
  4. 以后增加一个 mru 的 cache 维持生活这个样子的

TODO

重写的函数接口

o | function | 作用 | |————————————-|—————————————————————————————————————–| | address_space_translate_for_iotlb | 根据 addr 得到 memory region 的 | | memory_region_section_get_iotlb | 计算出来当前的 section 是 AddressSpaceDispatch 中的第几个 section, 之后就可以通过 addr 获取 section 了 | | qemu_map_ram_ptr | 这是一个神仙设计的接口,如果参数 ram_block 的接口为 NULL, 那么 addr 是 ram addr, 如果不是,那么是 ram 内偏移 | | cpu_addressspace | | | iotlb_to_section | |

真的需要移除掉 iotlb 机制吗

而 IOTLB 的 MMIO 移除掉,让 io_readxio_writex 中直接走 memory region translate 的操作

需要修改的内容,将其尽可能变为空的:

address_space_translate_for_iotlbaddress_space_translate 的关系

function para res
address_space_translate_for_iotlb cpu asidx addr attrs prot MemoryRegionSection, xlat
address_space_translate as, addr, is_write attrs MemoryRegion, xlat, len
address_space_translate_internal d, addr, resolve_subpage xlat, plen

到底那些地方可以简化

设备直通