Пытаюсь запустить под ARM, часть 2
Re: Пытаюсь запустить под ARM, часть 2
Переместил за skip там же - мигает.
Re: Пытаюсь запустить под ARM, часть 2
Попытался поместить в код инициализации модуля Environment - не работает. Да и вообще, какой-то он не живой на вид, в дизассемблинге не видно, чтобы там что-то вызывалось.
Re: Пытаюсь запустить под ARM, часть 2
Воткнул вызов прямо в Modules.Main - работает.
Ну что, продвижение за сегодня неплохое. Дальше нужно, чтобы функции вызывались. Нужно разобраться с этими "фиксапами" - похоже, что они там есть, а я что-то сомневаюсь, что они там должны быть, ведь статическая же сборка. Мне кажется, что либо должен где-то быть код, который их разрешает и превращает в настоящие адреса, либо что-то не так с линковкой.
Код: Выделить всё
PROCEDURE {FINAL} Main;
PROCEDURE InitializeGC EXTERN "GarbageCollector.Initialize";
PROCEDURE TerminateGC EXTERN "GarbageCollector.Terminate";
BEGIN {UNCOOPERATIVE, UNCHECKED}
CODE
mov r0,#3F000000H
orr r0,r0,#200000H
mov r2,#8000H
Loop:
str r2,[r0,#20H]
mov r1,#0100000H
WaitA:
subs r1,r1,#1
bne WaitA
str r2,[r0,#2CH] ; clear bit
mov r1,#010000H ; wait a while
WaitB:
subs r1,r1,#1
bne WaitB
b Loop ; again and again
(* SYSTEM.SetActivity (NIL);
SYSTEM.SetFramePointer (NIL);
Environment.Initialize;
InitializeGC;
Processors.Initialize;
Activities.Execute (PublishRegisteredModules);
Processors.Terminate;
FinalizeModules;
Activities.Terminate;
Queues.Terminate;
Environment.Terminate;
TerminateGC;
Environment.Exit (Environment.status); *)
END END Main;
Re: Пытаюсь запустить под ARM, часть 2
Изменил команду линковки, теперь сборка делается так:
Так тоже мигает:
Следующая задача - чтобы процедура мигания вызывалась из другого модуля (а что-то не факт, что она вызывается) - это уже на завтра.
Код: Выделить всё
Release.Build --build --path="./" A2RPiCooperative ~
StaticLinker.Link -a --fileName=kernel.img --extension=Gof --displacement=8000H --path="./" Trace CPU Runtime Counters Processors Queues BaseTypes Timer Activities ExclusiveBlocks HeapManager Interrupts Environment Mutexes Machine Heaps Modules GarbageCollector Objects Kernel ~
Так тоже мигает:
Код: Выделить всё
PROCEDURE {NOPAF} Led1*;
CODE
mov r0,#3F000000H
orr r0,r0,#200000H
mov r2,#8000H
Loop:
str r2,[r0,#20H]
mov r1,#010000H
WaitA:
subs r1,r1,#1
bne WaitA
str r2,[r0,#2CH] ; clear bit
mov r1,#010000H ; wait a while
WaitB:
subs r1,r1,#1
bne WaitB
b Loop ; again and again
END Led1;
PROCEDURE {FINAL} Main;
PROCEDURE InitializeGC EXTERN "GarbageCollector.Initialize";
PROCEDURE TerminateGC EXTERN "GarbageCollector.Terminate";
BEGIN {UNCOOPERATIVE, UNCHECKED}
Led1;
Led1;
Led1;
(* SYSTEM.SetActivity (NIL);
SYSTEM.SetFramePointer (NIL);
Environment.Initialize;
InitializeGC;
Processors.Initialize;
Activities.Execute (PublishRegisteredModules);
Processors.Terminate;
FinalizeModules;
Activities.Terminate;
Queues.Terminate;
Environment.Terminate;
TerminateGC;
Environment.Exit (Environment.status); *)
END Main;
Последний раз редактировалось БудДен 27.10.21 23:49, всего редактировалось 1 раз.
Re: Пытаюсь запустить под ARM, часть 2
Перенёс пр-ру мигания в RPI.Environment.Mod - мигает.
Re: Пытаюсь запустить под ARM, часть 2
Код: Выделить всё
tag = 00000005
memtag = 0000011C
memTag.size = 989855744
Re: Пытаюсь запустить под ARM, часть 2
Оно теперь падает где-то в районе включения остальных процессоров - загрузка начинает выполняться повторно. Либо я своими отладочными выводами вмешался в какую-то гонку и изменил в ней победителя, либо достигнут предел работоспособности. Пойду читать их учебные курсы...
Re: Пытаюсь запустить под ARM, часть 2
Имеется устойчивое ощущение, что код инициализации модуля не то, что не вызывается, а даже не линкуется. Картина слегка смазана тем, что я довольно долго читал дизассемблерный листинг от старого ядра, однако то, что не вызывается - это факт. Это непохоже на правду, т.к. там инициализируются некие константы. Возможно, я что-то не понял. Попробую найти хоть одну работающую кооперативную сборку для любой платформы и посмотрим, как она линкуется и вызывается ли там этот код.
Re: Пытаюсь запустить под ARM, часть 2
В некооперативной сборке код вызывается.
Re: Пытаюсь запустить под ARM, часть 2
Посмотрел на современной (октябрь 2021) ЯОС - поломана генерация кода, ассемблерные инструкции кривые. Нахаляву не прокатило :)
Re: Пытаюсь запустить под ARM, часть 2
В общем, принимаем гипотезу, что блоки между begin..end должны всё же выполняться, будем смотреть их судьбу и выяснять, почему не выполняются.
Re: Пытаюсь запустить под ARM, часть 2
Что-то не так в начале многопроцессорности. Попытался обойтись одним процессором, но логика на это не рассчитана и сразу падает. Видимо, нужно прочитать исходник. Также нужно внимательно смотреть - любая пр-ра без атрибута Cooperative сама по себе ожидает работающей многозадачности (т.к. компилятор вставляет куски кода).
Короче, сегодня ни черта не продвинулся.
Короче, сегодня ни черта не продвинулся.
Re: Пытаюсь запустить под ARM, часть 2
Не понял, почему и как, но дела пошли чуть лучше после удаления одной строчки, которая зависала. Блоки инициализации модулей, оказывается, вызываются из процедуры PublishRegisteredModules, Однако, до модуля Kernel дело всё же не доходит - похоже, виснет в Objects при создании активного объекта "clock".
Последний раз редактировалось БудДен 30.10.21 00:33, всего редактировалось 1 раз.
Re: Пытаюсь запустить под ARM, часть 2
EmitCooperativeSwitch -> Activities.Switch
Re: Пытаюсь запустить под ARM, часть 2
Итог работы - под RPi2 кооперативное ядро загружается, см. https://tvoygit.ru/budden/ja-o-s/src/br ... erry-pi.md