1 from ..symbols import LunaixSymbols
2 from ..structs.page import PageStruct
3 from ..pp import MyPrettyPrinter
6 class PhysicalMemProfile:
7 def __init__(self) -> None:
9 self._pm_list = LunaixSymbols.debug_sym("pmm", "pm_table")
11 self.max_mem_pg = int(LunaixSymbols.debug_sym("pmm", "max_pg").value())
12 self.max_mem_sz = self.max_mem_pg * 4096
15 def rescan_pmem(self, distr_granule = 256):
16 self.__mem_distr_granule = distr_granule
17 self.mem_distr.clear()
19 page_per_granule = self.max_mem_pg / self.__mem_distr_granule
20 page_per_granule = math.ceil(page_per_granule)
21 remainder = self.max_mem_pg % self.__mem_distr_granule
25 for i in range(self.max_mem_pg):
26 element = PageStruct(self._pm_list[i].address)
27 bucket += int(element.ref > 0)
29 last_contig = element.ref > 0
30 non_contig += int(not last_contig)
32 last_contig = element.ref > 0
34 if (i + 1) % page_per_granule == 0:
35 self.mem_distr.append(bucket)
40 bucket += page_per_granule - remainder
41 self.mem_distr.append(bucket)
43 self.consumed_pg = sum(self.mem_distr)
44 self.utilisation = self.consumed_pg / self.max_mem_pg
45 self.fragmentation = 2 * non_contig / self.max_mem_pg
46 self.discontig = non_contig
47 self.page_per_granule = page_per_granule