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)
bochs nie wykazuje pełnej struktury stronicowania pamięci liniowej
- Rejestracja: dni
- Ostatnio: dni
- Postów: 211
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1105
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)
# 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);
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 211
Coś jest nie tak jak powinno, skompilowane z wersją 2.6.6 (aktualna na 2014r.) oraz starą 2.6.2 (2013)
Prawidłowy wynik:
0x0000000000000000 - 0x00000000003FFFFF 0x0000000000000000 - 0x00000000003FFFFF
0x0000000100000000 - 0x0000000100000FFF 0x0000000000109000 - 0x0000000000109FFF
Wynik łatki:
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1105
Nie mam jak przetestować, ale może to zadziała:
--- 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);
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 211
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 :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1105
A teraz?
--- 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);
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 211
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:
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