Эмуляция Zynq - альт раскладка памяти

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Эмуляция Zynq - альт раскладка памяти

Сообщение БудДен » 24.11.22 23:37

Код: Выделить всё

System Start:	00000000
System Stop:	00030000
System Size:	00030000
	Interrupt Stack Start:		1C116000
	Interrupt Stack Stop:		1C11E000
	Interrupt Stack Size:		00008000
	First Page Table Start:	1C100000

Код: Выделить всё

	First Page Table Stop:		1C104000
	First Page Table Size:		00004000
	Second Page Table Start:	1C104000
	Second Page Table Stop:	1C114400
	Second Page Table Size:	00010400

Код: Выделить всё

Heap Start:		00100000
Heap Stop:		1C100000
Heap Size:		1C000000
Stack Start:	1C200000
Stack Stop:		1FFFF000
Stack Size:		03DFF000
Config Start:	1FFFF000
Config Stop:	20000000
Config Size:	00001000
I/O Start:		40000000
I/O Stop:		FE000000

Код: Выделить всё

I/O Size:		BE000000
SysHigh Start:	FFF00000
SysHigh Stop:	FFFFFFFE
	Interrupt Vector Start:	FFFF0000
	Interrupt Vector Stop:	FFFF1000
	Interrupt Vector Size:	00001000
	Cache References Start:	FFFF1000
	Cache References Stop:	FFFF4FC0
	Cache References Size:	00003FC0
	Cache References Stack Offset:	000001C0
Последний раз редактировалось БудДен 25.11.22 20:09, всего редактировалось 2 раза.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Эмуляция Zynq - альт раскладка памяти

Сообщение БудДен » 25.11.22 16:02

Код: Выделить всё

Entering NewStack
GetSecondLevelEntry: virtualAddress = 1C37F000
GetSecondLevelEntry: address in table = 1C104DFC
GetSecondLevelEntry: entry = 00000000
Entering SetSecondLevelEntry, vAddr = 1C37F000, phAddress = 1C37F000, flags = 0000047C
SetSecondLevelEntry: address in table = 1C104DFC
NewStack: ok, initSP = 1C380000
Entering NewStack
GetSecondLevelEntry: virtualAddress = 1C3BF000
GetSecondLevelEntry: address in table = 1C104EFC
GetSecondLevelEntry: entry = 00000000

Код: Выделить всё

Entering SetSecondLevelEntry, vAddr = 1C3BF000, phAddress = 1C3BF000, flags = 0000047C
SetSecondLevelEntry: address in table = 1C104EFC
NewStack: ok, initSP = 1C3C0000
Disk SD0 is now available
Entering ExtendStack: virtAdr = 1C2FFBFC
GetSecondLevelEntry: virtualAddress = 1C2FF000
GetSecondLevelEntry: address in table = 1C104BFC
GetSecondLevelEntry: entry = 1C2FF47E
Stack address already mapped: 1C2FF000
ExtendStack: ok

Код: Выделить всё

^A[1] TRAP 19 invalid memory location at 1C2FFBFC A2 on ARM, revision 4677 (15.10.2017)^N
 R0=00000000  R1=00000002  R2=002850DC  R3=00000000
 R4=1C2FFF8C  R5=1C2FFE3F  R6=1FFFF253  R7=1FFFF253
 R8=00000053  R9=00000000  R10=00000000 R11=FFFFFFFF
 FP=1C2FFE00  SP=1C2FFC00  LR=00285A94  PC=002850F8
 PSR=2000015F  Ticks=0000004F Timer=02C69488
 CPU=1  Location=1C2FFBFC Status=0000000F
Process:   -1 run 0 300287CC0:Objects.ProtectedObjectEntering ExtendStack: virtAdr = 00003800
Address not in stack

Код: Выделить всё

00003800 ExtendStack: ok
 ^A[2] TRAP 19 invalid memory location at 00003800 A2 on ARM, revision 4677 (15.10.2017)
 Location=00003800 Status=0000000F
Process:   -1 run 0 300287CC0:Objects.ProtectedObject Modules.PublishRegisteredModules:288 pc=1409720 [001582B8H] = 1409432 + 288 crc=8A912AF4 {28}

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Эмуляция Zynq - альт раскладка памяти

Сообщение БудДен » 25.11.22 22:07

Дела пошли по плохому сценарию, похоже.

Код: Выделить всё

{
        // Используйте IntelliSense, чтобы узнать о возможных атрибутах.
        // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов.
        // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
                {
                        "name": "(gdb) Запустить",
                        "type": "cppdbg",
                        "request": "launch",
                        "program": "/e/xemu/build/aarch64-softmmu/qemu-system-aarch64",
                        "args": [
                                "-M",
                                "arm-generic-fdt-7series",
                                "-serial",
                                "/dev/null",
                                "-serial",
                                "stdio",
                                "-dtb",
                                "/e/xlnx-dtb/zynq-zybo-z7.dtb",
                                "-device",
                                "loader,addr=0xf8000008,data=0xDF0D,data-len=4",
                                "-device",
                                "loader,addr=0xf8000140,data=0x00500801,data-len=4",
                                "-device",
                                "loader,addr=0xf800012c,data=0x1ed044d,data-len=4",
                                "-device",
                                "loader,addr=0xf8000108,data=0x0001e008,data-len=4",
                                "-device",
                                "loader,addr=0xF8000910,data=0xF,data-len=0x4",
                                "-drive",
                                "file=/y/jaos/Linux64/work/build/ZyboZ710.ZynqA2.img,if=sd,format=raw",
                                "-device",
                                "loader,file=/y/jaos/Linux64/work/Zbl.Bin,addr=0x0",
                                "-m",
                                "1G",
                                "-smp",
                                "2"
                        ],
                        "stopAtEntry": true,
                        "cwd": "${workspaceFolder}",
                        "environment": [],
                        "externalConsole": false,
                        "MIMode": "gdb",
                        "setupCommands": [
                                {
                                        "description": "Включить автоматическое форматирование для gdb",
                                        "text": "-enable-pretty-printing",
                                        "ignoreFailures": true
                                }
                        ]
                }
        ]
}

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Эмуляция Zynq - альт раскладка памяти

Сообщение БудДен » 26.11.22 01:01

Код: Выделить всё

ARM.Machine.Mod/NewStack: 
b := AllocatePage(s.adr - PS, FullAccess, flags); (* allocate one physical page first *)
FullAccess = SrwUrw*10H = 30H
SrwUrw = 3
flags = CB = C + B + 10H 
C = 8
B = 4
Аргументы accessPermissions и flags складываются, получаем:

Код: Выделить всё

3*0x10 + 8 + 4 + 0x10 = 76 = 0x4c
Уже в SetSecondLevelEntry добавляется slSmall = 2 (что страница маленькая), итого в хвосте должно быть 0x4e. А у нас чо? А у нас - 47e. Что бы это означало?
Последний раз редактировалось БудДен 26.11.22 01:27, всего редактировалось 1 раз.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Эмуляция Zynq - альт раскладка памяти

Сообщение БудДен » 26.11.22 01:27

Код: Выделить всё

>>> "{0:b}".format(0x47e)
10001111110
* бит 0(XN) равен 0
* бит 1 = 1 (признак маленькой страницы)
* бит 2 = B = 1
* бит 3 = C = 1
* биты 5-4 = AP[1:0] = 11
* биты 8-7-6 = TEX[2:0] = 001
* бит 9 = AP[2] = 0
* бит 10 (S) = 1
* бит 11 (nG) = 0

C = 1, B = 1
TEX[2:0] = 001 (outer and inner write-back, write allocate).
S = 1 (shareable)

Короче, всё должно быть прекрасно. Но всё не прекрасно.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Эмуляция Zynq - альт раскладка памяти

Сообщение БудДен » 26.11.22 01:49

helper.c/строка 10335

Код: Выделить всё

            phys_addr = (desc & 0xfffff000) | (address & 0xfff);
            /* budden ap = (desc >> (4 + ((address >> 9) & 6))) & 3; */
            ap = (((desc >> 9)&1) << 2) | ((desc >> 4)&3); /* budden */

Ответить