1 from ..symbols import LunaixSymbols
2 from ..structs.page import PageStruct
3 from ..structs.pmem import PMem
4 from ..pp import MyPrettyPrinter
10 class PhysicalMemProfile:
11 def __init__(self) -> None:
13 self._pmem = PMem(LunaixSymbols.debug_sym("pmm", "memory").value().address)
15 self.max_mem_pg = self._pmem.list_len()
16 self.max_mem_sz = self.max_mem_pg * 4096
19 def rescan_pmem(self, distr_granule = 256):
20 self.__mem_distr_granule = distr_granule
21 self.mem_distr.clear()
23 pplist = self._pmem.pplist()
24 page_per_granule = int(self.max_mem_pg) // self.__mem_distr_granule
25 remainder = self.max_mem_pg % self.__mem_distr_granule
28 contig_state = LEAVE_CONTIG
29 new_state = LEAVE_CONTIG
32 while i < self.max_mem_pg:
33 element = PageStruct(pplist[i].address)
36 if element.lead_page():
37 nr_pgs = 1 << element.order
40 new_state = ENTER_CONTIG
42 new_state = LEAVE_CONTIG
46 if contig_state != new_state:
47 non_contig += int(new_state == LEAVE_CONTIG)
48 contig_state = new_state
50 if i % page_per_granule == 0:
51 self.mem_distr.append(bucket)
56 bucket += page_per_granule - remainder
57 self.mem_distr.append(bucket)
59 self.consumed_pg = sum(self.mem_distr)
60 self.utilisation = self.consumed_pg / self.max_mem_pg
61 self.fragmentation = 2 * non_contig / self.max_mem_pg
62 self.discontig = non_contig
63 self.page_per_granule = page_per_granule