bochs nie wykazuje pełnej struktury stronicowania pamięci liniowej

bochs nie wykazuje pełnej struktury stronicowania pamięci liniowej
CorruptedByCPU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

Jak zmusić bochs do okazywania struktury stronicowania powyżej adresu 0x100000000, czyli więcej niż 4 GiB pamięci liniowej? Nie znalazłem takiej opcji podczas kompilacji (debugger)

lukasz1235
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1105
0

Masz tutaj patcha, którego kiedyś popełniłem (może nie do końca pasować do obecnej wersji i zwiesić na chwilę Bochsa podczas włączania widoku Page Table)

Kopiuj
# This patch file was generated by NetBeans IDE
# It uses platform neutral UTF-8 encoding and \n newlines.
--- <html>enh_dbg.cc (<b>11250</b>)</html>
+++ <html><b>Current File</b></html>
@@ -1606,7 +1606,8 @@
 // lifted from bx_dbg_dump_table in dbg_main of the internal debugger
 void FillPAGE()
 {
-    Bit32u lin, start_lin, curlin; // show only low 32 bit
+    Bit64u lin, start_lin, curlin;
+    const Bit64u maxlin = In64Mode ? 0x0000fffffffff000 : 0xfffff000;
     bx_phy_address phy;
     Bit64u start_phy, phy64;
     int LineCount = 0;
@@ -1618,9 +1619,30 @@
     curlin = lin = 0;   // always start at linear address 0
     start_lin = 1;      // force a mismatch on the first line
     start_phy = 2;
-    while (LineCount < 1024 && curlin != 0xfffff000)
+    while (LineCount < 1024 && curlin < maxlin)
     {
         // get translation lin -> phys, and verify mapping is legal
+#if BX_SUPPORT_X86_64
+        if (In64Mode)
+        {
+            Bit64u entry;
+            BX_MEM(0)->readPhysicalPage(BX_CPU_THIS, (BX_CPU_THIS_PTR cr3 & 0x000ffffffffff000) + (lin >> 39) * 8, 8, &entry);
+            if (!(entry & 1))
+            {
+                curlin = lin;
+                lin += 1ll << 39;
+                continue;
+            }
+
+            BX_MEM(0)->readPhysicalPage(BX_CPU_THIS, (entry & 0x000ffffffffff000) + (lin >> 30 & 511) * 8, 8, &entry);
+            if (!(entry & 1))
+            {
+                curlin = lin;
+                lin += 1ll << 30;
+                continue;
+            }
+        }
+#endif
         if (BX_CPU(CurrentCPU)->dbg_xlate_linear2phy(lin, &phy) != FALSE)
         {
             phy64 = phy;
@@ -1628,7 +1650,8 @@
             {
                 if (start_lin != 1)
                 {
-                    sprintf (pa_lin,"0x%08X - 0x%08X",start_lin, lin - 1);
+                    sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
+                        start_lin, lin - 1);
                     sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
                         start_phy, start_phy + (lin-1-start_lin));
                     AddPagingLine (LineCount,pa_lin,pa_phy);
@@ -1642,7 +1665,8 @@
         {
             if (start_lin != 1)
             {
-                sprintf (pa_lin,"0x%08X - 0x%08X",start_lin, lin - 1);
+                sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
+                    start_lin, lin - 1);
                 sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
                     start_phy, start_phy + (lin-1-start_lin));
                 AddPagingLine (LineCount,pa_lin,pa_phy);
@@ -1656,7 +1680,7 @@
     }
     if (start_lin != 1)     // need to output one last line?
     {
-        sprintf (pa_lin,"0x%08X - 0x%08X", start_lin, -1);
+        sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,start_lin, -1);
         sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,start_phy, start_phy + (lin-1-start_lin));
         AddPagingLine (LineCount,pa_lin,pa_phy);
     }
CorruptedByCPU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

Coś jest nie tak jak powinno, skompilowane z wersją 2.6.6 (aktualna na 2014r.) oraz starą 2.6.2 (2013)
Prawidłowy wynik:

Kopiuj
0x0000000000000000 - 0x00000000003FFFFF   0x0000000000000000 - 0x00000000003FFFFF
0x0000000100000000 - 0x0000000100000FFF   0x0000000000109000 - 0x0000000000109FFF

Wynik łatki:user image

lukasz1235
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1105
0

Nie mam jak przetestować, ale może to zadziała:

Kopiuj
--- enh_dbg.cc	2013-02-18 21:52:19.000000000 +0100
+++ new_enh_dbg.cc	2014-06-17 08:53:18.265702799 +0200
@@ -1614,7 +1614,9 @@
 // lifted from bx_dbg_dump_table in dbg_main of the internal debugger
 void FillPAGE()
 {
-    Bit32u lin, start_lin, curlin; // show only low 32 bit
+    Bit64u lin, start_lin, curlin;
+    const Bit64u maxlin = In64Mode ? 0x0000fffffffff000 : 0xfffff000;
+    Bit64u skip;
     bx_phy_address phy;
     Bit64u start_phy, phy64;
     int LineCount = 0;
@@ -1626,9 +1628,27 @@
     curlin = lin = 0;   // always start at linear address 0
     start_lin = 1;      // force a mismatch on the first line
     start_phy = 2;
-    while (LineCount < 1024 && curlin != 0xfffff000)
+    while (LineCount < 1024 && curlin < maxlin)
     {
         // get translation lin -> phys, and verify mapping is legal
+        skip = 0x1000;
+#if BX_SUPPORT_X86_64
+        if (In64Mode)
+        {
+            Bit64u entry;
+            BX_MEM(0)->readPhysicalPage(BX_CPU_THIS, (BX_CPU_THIS_PTR cr3 & 0x000ffffffffff000) + (lin >> 39) * 8, 8, &entry);
+            if (!(entry & 1))
+            {
+                skip = 1ll << 39;
+            }
+
+            BX_MEM(0)->readPhysicalPage(BX_CPU_THIS, (entry & 0x000ffffffffff000) + (lin >> 30 & 511) * 8, 8, &entry);
+            if (!(entry & 1))
+            {
+                skip = 1ll << 30;
+            }
+        }
+#endif
         if (BX_CPU(CurrentCPU)->dbg_xlate_linear2phy(lin, &phy) != FALSE)
         {
             phy64 = phy;
@@ -1636,7 +1656,8 @@
             {
                 if (start_lin != 1)
                 {
-                    sprintf (pa_lin,"0x%08X - 0x%08X",start_lin, lin - 1);
+                    sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
+                        start_lin, lin - 1);
                     sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
                         start_phy, start_phy + (lin-1-start_lin));
                     AddPagingLine (LineCount,pa_lin,pa_phy);
@@ -1650,7 +1671,8 @@
         {
             if (start_lin != 1)
             {
-                sprintf (pa_lin,"0x%08X - 0x%08X",start_lin, lin - 1);
+                sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
+                    start_lin, lin - 1);
                 sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
                     start_phy, start_phy + (lin-1-start_lin));
                 AddPagingLine (LineCount,pa_lin,pa_phy);
@@ -1660,11 +1682,11 @@
             start_phy = 2;
         }
         curlin = lin;
-        lin += 0x1000;  // then test the next 4K page in the loop
+        lin += skip;  // then test the next pages in the loop
     }
     if (start_lin != 1)     // need to output one last line?
     {
-        sprintf (pa_lin,"0x%08X - 0x%08X", start_lin, -1);
+        sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,start_lin, -1);
         sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,start_phy, start_phy + (lin-1-start_lin));
         AddPagingLine (LineCount,pa_lin,pa_phy);
     }
CorruptedByCPU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

znacznie lepiej, pierwsze dwa wpisy są już prawidłowo, został ostatni nie wiadomo czym będący tj.
0x0001000000000000 - 0x00000000FFFFFFFF 0x0000000000000000 - 0x0000000000000FFF
i oczywiście nie powinien istnieć :)

PS: chwilka, zobacze czy moja tablica była czyszczona przed dodawaniem nowych wpisów xD
PS2: tak tablica była czyszczona, czyli patch gdzieś brudzi ;)
PS3: mnie wystarczy, taki jaki jest - jeśli masz ochote go naprawić o ten dziwny wpis to z chęcią sprawdzę czy jest sprawny, a później proszę abyś jeszcze raz poinformował społeczność bochs o dodaniu tej łatki do następnego wydania :)

lukasz1235
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1105
1

A teraz?

Kopiuj
--- enh_dbg.cc	2013-02-18 21:52:19.000000000 +0100
+++ new_enh_dbg.cc	2014-06-17 20:09:03.193656239 +0200
@@ -1614,7 +1614,9 @@
 // lifted from bx_dbg_dump_table in dbg_main of the internal debugger
 void FillPAGE()
 {
-    Bit32u lin, start_lin, curlin; // show only low 32 bit
+    Bit64u lin, start_lin;
+    const Bit64u maxlin = In64Mode ? 0x0000fffffffff000 : 0xfffff000;
+    Bit64u skip;
     bx_phy_address phy;
     Bit64u start_phy, phy64;
     int LineCount = 0;
@@ -1623,12 +1625,30 @@
     doDumpRefresh = FALSE;
 
     StartListUpdate(DUMP_WND);
-    curlin = lin = 0;   // always start at linear address 0
+    lin = 0;   // always start at linear address 0
     start_lin = 1;      // force a mismatch on the first line
     start_phy = 2;
-    while (LineCount < 1024 && curlin != 0xfffff000)
+    while (LineCount < 1024 && lin < maxlin)
     {
         // get translation lin -> phys, and verify mapping is legal
+        skip = 0x1000;
+#if BX_SUPPORT_X86_64
+        if (In64Mode)
+        {
+            Bit64u entry;
+            BX_MEM(0)->readPhysicalPage(BX_CPU_THIS, (BX_CPU_THIS_PTR cr3 & 0x000ffffffffff000) + (lin >> 39) * 8, 8, &entry);
+            if (!(entry & 1))
+            {
+                skip = 1ll << 39;
+            }
+
+            BX_MEM(0)->readPhysicalPage(BX_CPU_THIS, (entry & 0x000ffffffffff000) + (lin >> 30 & 511) * 8, 8, &entry);
+            if (!(entry & 1))
+            {
+                skip = 1ll << 30;
+            }
+        }
+#endif
         if (BX_CPU(CurrentCPU)->dbg_xlate_linear2phy(lin, &phy) != FALSE)
         {
             phy64 = phy;
@@ -1636,7 +1656,8 @@
             {
                 if (start_lin != 1)
                 {
-                    sprintf (pa_lin,"0x%08X - 0x%08X",start_lin, lin - 1);
+                    sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
+                        start_lin, lin - 1);
                     sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
                         start_phy, start_phy + (lin-1-start_lin));
                     AddPagingLine (LineCount,pa_lin,pa_phy);
@@ -1650,7 +1671,8 @@
         {
             if (start_lin != 1)
             {
-                sprintf (pa_lin,"0x%08X - 0x%08X",start_lin, lin - 1);
+                sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
+                    start_lin, lin - 1);
                 sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,
                     start_phy, start_phy + (lin-1-start_lin));
                 AddPagingLine (LineCount,pa_lin,pa_phy);
@@ -1659,12 +1681,11 @@
             start_lin = 1;
             start_phy = 2;
         }
-        curlin = lin;
-        lin += 0x1000;  // then test the next 4K page in the loop
+        lin += skip;  // then test the next pages in the loop
     }
     if (start_lin != 1)     // need to output one last line?
     {
-        sprintf (pa_lin,"0x%08X - 0x%08X", start_lin, -1);
+        sprintf (pa_lin,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,start_lin, -1);
         sprintf (pa_phy,"0x" FMT_LLCAPX " - 0x" FMT_LLCAPX,start_phy, start_phy + (lin-1-start_lin));
         AddPagingLine (LineCount,pa_lin,pa_phy);
     }
CorruptedByCPU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

idealnie :)

dziękuję

za wcześnie pochwaliłem :D znalazłem następny błąd, zmapowałem 4 KiB na koniec pamięci liniowej tj. pod adres 0xFFFFFFFFFFFF000, bochs nie wykazuje tej pozycji :)
jestem pewien że działa prawidłowo mój kod, bo jestem w stanie zapisać qword pod adres 0xfffffffffffffff8 :)

tak przykładowo kod procedury:

Kopiuj
	mov	rax,	cr3
	add	rax,	511 * 8	; przesuń wskaźnik na pml4[511]

	call	select_frame
	call	clear_frame

	xchg	rax,	rdi

	mov	al,	0x03	; ustaw bity Superuser, Read/Write, Present
	stosq	; zapisz do pml4[511]

	xor	al,	al	; usuń bity Superuser, Read/Write, Present
	add	rax,	511 * 8	; przesuń wskaźnik na pml3[511]

	call	select_frame
	call	clear_frame

	xchg	rax,	rdi

	mov	al,	0x03	; ustaw bity Superuser, Read/Write, Present
	stosq	; zapisz do pml3[511]

	xor	al,	al	; usuń bity Superuser, Read/Write, Present
	add	rax,	511 * 8	; przesuń wskaźnik na pml2[511]

	call	select_frame
	call	clear_frame

	xchg	rax,	rdi

	mov	al,	0x03	; ustaw bity Superuser, Read/Write, Present
	stosq	; zapisz do pml2[511]

	xor	al,	al	; usuń bity Superuser, Read/Write, Present
	add	rax,	511 * 8	; przesuń wskaźnik na pml1[511]

	call	select_frame
	call	clear_frame

	xchg	rax,	rdi

	mov	al,	0x03	; ustaw bity Superuser, Read/Write, Present
	stosq	; zapisz do pml1[511]

	mov	qword [0xfffffffffffffff8],	0xffffffffffffffff

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.