1 from ..symbols import LunaixSymbols
2 from ..structs.page import PageStruct
3 from ..structs.pmem import PMem
4 from ..pp import MyPrettyPrinter
7 class PhysicalMemProfile:
8 def __init__(self) -> None:
10 self._pmem = PMem(LunaixSymbols.debug_sym("pmm", "memory").value().address)
12 self.max_mem_pg = self._pmem.list_len()
13 self.max_mem_sz = self.max_mem_pg * 4096
16 def rescan_pmem(self, distr_granule = 256):
17 self.__mem_distr_granule = distr_granule
18 self.mem_distr.clear()
20 pplist = self._pmem.pplist()
21 page_per_granule = self.max_mem_pg / self.__mem_distr_granule
22 page_per_granule = math.ceil(page_per_granule)
23 remainder = self.max_mem_pg % self.__mem_distr_granule
28 for i in range(self.max_mem_pg):
29 element = PageStruct(pplist[i].address)
30 bucket += int(element.busy())
32 last_contig = element.busy()
33 non_contig += int(not last_contig)
35 last_contig = element.busy()
37 if (i + 1) % page_per_granule == 0:
38 self.mem_distr.append(bucket)
43 bucket += page_per_granule - remainder
44 self.mem_distr.append(bucket)
46 self.consumed_pg = sum(self.mem_distr)
47 self.utilisation = self.consumed_pg / self.max_mem_pg
48 self.fragmentation = 2 * non_contig / self.max_mem_pg
49 self.discontig = non_contig
50 self.page_per_granule = page_per_granule