Пытаюсь запустить под ARM, часть 2

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 27.10.21 22:11

Переместил за skip там же - мигает.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 27.10.21 22:23

Попытался поместить в код инициализации модуля Environment - не работает. Да и вообще, какой-то он не живой на вид, в дизассемблинге не видно, чтобы там что-то вызывалось.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 27.10.21 22:49

Воткнул вызов прямо в 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;
Ну что, продвижение за сегодня неплохое. Дальше нужно, чтобы функции вызывались. Нужно разобраться с этими "фиксапами" - похоже, что они там есть, а я что-то сомневаюсь, что они там должны быть, ведь статическая же сборка. Мне кажется, что либо должен где-то быть код, который их разрешает и превращает в настоящие адреса, либо что-то не так с линковкой.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 27.10.21 23:09

Изменил команду линковки, теперь сборка делается так:

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

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 раз.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 27.10.21 23:48

Перенёс пр-ру мигания в RPI.Environment.Mod - мигает.

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

Re: Пытаюсь запустить под ARM, часть 2

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

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

tag = 00000005
memtag = 0000011C
memTag.size = 989855744

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 28.10.21 12:25

Оно теперь падает где-то в районе включения остальных процессоров - загрузка начинает выполняться повторно. Либо я своими отладочными выводами вмешался в какую-то гонку и изменил в ней победителя, либо достигнут предел работоспособности. Пойду читать их учебные курсы...

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 28.10.21 16:13

Имеется устойчивое ощущение, что код инициализации модуля не то, что не вызывается, а даже не линкуется. Картина слегка смазана тем, что я довольно долго читал дизассемблерный листинг от старого ядра, однако то, что не вызывается - это факт. Это непохоже на правду, т.к. там инициализируются некие константы. Возможно, я что-то не понял. Попробую найти хоть одну работающую кооперативную сборку для любой платформы и посмотрим, как она линкуется и вызывается ли там этот код.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 28.10.21 19:08

В некооперативной сборке код вызывается.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 28.10.21 20:40

Посмотрел на современной (октябрь 2021) ЯОС - поломана генерация кода, ассемблерные инструкции кривые. Нахаляву не прокатило :)

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 28.10.21 20:43

В общем, принимаем гипотезу, что блоки между begin..end должны всё же выполняться, будем смотреть их судьбу и выяснять, почему не выполняются.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 29.10.21 00:41

Что-то не так в начале многопроцессорности. Попытался обойтись одним процессором, но логика на это не рассчитана и сразу падает. Видимо, нужно прочитать исходник. Также нужно внимательно смотреть - любая пр-ра без атрибута Cooperative сама по себе ожидает работающей многозадачности (т.к. компилятор вставляет куски кода).

Короче, сегодня ни черта не продвинулся.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 29.10.21 23:21

Не понял, почему и как, но дела пошли чуть лучше после удаления одной строчки, которая зависала. Блоки инициализации модулей, оказывается, вызываются из процедуры PublishRegisteredModules, Однако, до модуля Kernel дело всё же не доходит - похоже, виснет в Objects при создании активного объекта "clock".
Последний раз редактировалось БудДен 30.10.21 00:33, всего редактировалось 1 раз.

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 30.10.21 00:32

EmitCooperativeSwitch -> Activities.Switch

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

Re: Пытаюсь запустить под ARM, часть 2

Сообщение БудДен » 27.03.22 15:42

Итог работы - под RPi2 кооперативное ядро загружается, см. https://tvoygit.ru/budden/ja-o-s/src/br ... erry-pi.md

Ответить