OberonCore
https://forum.oberoncore.ru/

Загрузка каркаса BlackBox
https://forum.oberoncore.ru/viewtopic.php?f=2&t=2234
Страница 1 из 2

Автор:  Роман М. [ Суббота, 16 Январь, 2010 19:25 ]
Заголовок сообщения:  Загрузка каркаса BlackBox

Есть ли у кого-нибудь описание этапов загрузки BlackBox [.exe] или же сам исходник?
Интересует загрузка модулей в память и инициализация подсистем.

Автор:  Евгений Темиргалеев [ Суббота, 16 Январь, 2010 19:51 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

У всех есть исходник - Kernel
DevLinker docu писал(а):
...
$ main module: the body of this module is called when the program starts.
+ identifies the kernel. A kernel must be present if the standard function NEW is used in some module. The kernel must export the procedures NewRec and NewArr.
...
Examples

Standard BlackBox:

^Q DevLinker.Link
BlackBox.exe := Kernel$+ Files HostFiles StdLoader
1 Applogo.ico 2 Doclogo.ico 3 SFLogo.ico 4 CFLogo.ico 5 DtyLogo.ico
1 Move.cur 2 Copy.cur 3 Link.cur 4 Pick.cur 5 Stop.cur 6 Hand.cur 7 Table.cur

Автор:  Сергей Оборотов [ Суббота, 16 Январь, 2010 23:54 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Роман М. писал(а):
Есть ли у кого-нибудь описание этапов загрузки BlackBox [.exe]
У Oberon microsystems.

Автор:  Info21 [ Воскресенье, 17 Январь, 2010 08:56 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Ну, право же.

F1,
Особенности платформы (Platform-Specific Issues),
и там раздел
Процесс загрузки системы Блэкбокс (Startup of BlackBox)

Автор:  Роман М. [ Воскресенье, 17 Январь, 2010 14:32 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

О! Это то, что мне и нужно. :roll:

Автор:  Сергей Оборотов [ Воскресенье, 17 Январь, 2010 15:26 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Нестандартные загрузчики кто-нибудь пробовал?

Автор:  Роман М. [ Воскресенье, 31 Январь, 2010 17:04 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Как раз провожу опыты по запуску каркаса посредством "ядерной" библиотеки каркаса libBB.dll, по мотивам темы о порте в X11/Linux. Разбираюсь с загрузкой в InitSystem.

Автор:  id_ler [ Понедельник, 01 Февраль, 2010 10:07 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Сергей Оборотов писал(а):
Нестандартные загрузчики кто-нибудь пробовал?
На диске журнала Мир ПК (2005г.) есть большая коллекция Оберонов. Установил ETH PlugIn Oberon for Windows 9x/ME/NT/2000/XP. Он запускается как GUI-приложение, есть исходники. Идея менять местами BlackBox.exe и Oberon.exe была. Когда сравнил их дизассемблерные листинги, то не стал даже пробовать. Слишком уж они разные, мне показалось.

Автор:  Димыч [ Понедельник, 01 Февраль, 2010 12:56 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Роман М. писал(а):
О! Это то, что мне и нужно. :roll:

В Linux на текущий момент инициализация протекает по-другому.
Сначала инициализируется Kernel, затем инициализируются модули, вшитые в код (слинкованные статически). Это происходит при загрузке so-файла.

Затем из модуля Init вызывается процедура InitSystem, помеченная как экспортированная из so-файла.

Такой костыль был сделан из-за передачи command line внутрь ББ. В настоящий момент это работает, но требует переделки.

Автор:  Роман М. [ Понедельник, 01 Февраль, 2010 17:03 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Попытка загрузить каркас с помощью библиотеки libBB.dll проваливается.

Изменил модуль Init:
Код:
MODULE Init;

   IMPORT Kernel, WinApi, Initsys;

VAR r: INTEGER;
BEGIN
   r := WinApi.MessageBox (0, "Calling Initsys.InitSystem", "BlackBox", {});
   Initsys.InitSystem (0, 0)
END Init.

DevLinker.LinkDll libBB.dll := Kernel$+ Files HostFiles StdLoader Dialog Init# ~
Почему требуются модули Host для связывания dll? Как сделать, чтобы происходила динамическая загрузка модулей?

Код:
MODULE Initsys;
   

   IMPORT Kernel, Dialog, WinApi , HostMenus;

VAR
   res: INTEGER;
   m: Kernel.Module;

PROCEDURE InitSystem*(argc, argv: INTEGER);
VAR r: INTEGER;
BEGIN
   r := WinApi.MessageBox (0, "Inside of InitSystem", "BlackBox", {});
   HostMenus.OpenApp;
   r := WinApi.MessageBox (0, "OpenApp", "BlackBox", {});
   m := Kernel.ThisMod("DevDebug");
   IF m = NIL THEN Kernel.LoadMod("StdDebug") END;
   (*Converters.Register("Documents.ImportDocument", "Documents.ExportDocument", "", "odc", {});
   Dialog.Call("StdMenuTool.UpdateAllMenus", "", res);*)
   Kernel.LoadMod("OleServer");
   (*Dialog.Call("Config.Setup", "", res);*)
   r := WinApi.MessageBox (0, "Debug", "BlackBox", {});
   Dialog.Call("TestConsole.Do", " ", res);
   r := WinApi.MessageBox (0, "Do", "BlackBox", {});
   HostMenus.Run
END InitSystem;

END Initsys.


Загрузчик:
Код:
MODULE TestBBloader;

IMPORT WinApi, TestBB;

PROCEDURE Init;
VAR r: INTEGER;
BEGIN
   r := WinApi.MessageBox (0, "Running InitSystem from libBB.dll ...", "BlackBox", {});
   TestBB.InitSystem (0, 0)
END Init;

BEGIN
   Init;
END TestBBloader.

^Q DevLinker.LinkExe BBloader.exe := Kernel+ TestBBloader~

Код:
MODULE TestBB ["libBB"];

IMPORT Init;

PROCEDURE InitSystem*(argc, argv: INTEGER);

END TestBB.

Автор:  Иван Горячев [ Вторник, 02 Февраль, 2010 11:42 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Так эта, Вы статически линкуете Init, который импортирует Initsys, который импортирует HostMenus, который импортирует...

И зачем Вы линкуете Dialog? Его главные функции (в том числе Dialog.Call) реализуются хуками в других модулях и без этих модулей работать не будут (для Dialog.Call требуется StdInterpreter, например).

В стандартном всё ББ работает через StdLoader:
1. В самом StdLoader реализуется хук для Kernel.ThisMod со товарищи.
2. В секции StdLoader.BEGIN сначала устанавливается этот хук (StdLoader.Init), а затем через Kernel (с помощью свежеустановленного хука) динамически загружается модуль Init.
3. Модуль Init в списке импорта имеет HostMenus, который импортирует кучу модулей, в том числе и StdInterpreter, реализующий хук для Dialog.Call.
4. Вся эта куча модулей грузится загрузчиком до модуля Init, исполняются все их секции BEGIN, в которых устанавливаются нужные хуки.
5. А только потом выполняется Init.BEGIN. И поскольку всё что нужно уже проинициализировано - всё работает.

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

Если короче:
DevLinker.LinkDll libBB.dll := Kernel$+ Files HostFiles StdLoader# ~ разве не работает?

И потом, у Вас таким макаром получается два Kernelа - один в dllке и один - в exeшнике. Загрузчик должен быть вообще тупым, с использованием только WinApi

P.S. Документация говорит, что есть DevLinker.LinkDynDll, которая вообще-то непонятно зачем нужна, но для полноты включили. Создаёт dllку, содержащую динамический загрузчик. Попробуйте

Автор:  Илья Ермаков [ Вторник, 02 Февраль, 2010 12:58 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Иван Горячев писал(а):
И потом, у Вас таким макаром получается два Kernelа - один в dllке и один - в exeшнике.

P.S. Документация говорит, что есть DevLinker.LinkDynDll, которая вообще-то непонятно зачем нужна, но для полноты включили. Создаёт dllку, содержащую динамический загрузчик. Попробуйте


Как раз очень интересный вариант - одно адресное пространство, несколько Оберонов :)

Автор:  Роман М. [ Вторник, 02 Февраль, 2010 13:39 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Иван Горячев писал(а):
Если короче:
DevLinker.LinkDll libBB.dll := Kernel$+ Files HostFiles StdLoader# ~ разве не работает?

И потом, у Вас таким макаром получается два Kernelа - один в dllке и один - в exeшнике. Загрузчик должен быть вообще тупым, с использованием только WinApi

Вот оно что... А я полагал, что инициализацию нужно вызывать явно из загрузчика (BBloader).

Выходит, что StdLoader всё сам инициализирует при загрузке библиотеки. Таким образом, никаких InitSystem не нужно.

Вот код загрузчика
Код:
/* gcc -o BBloader BlackBoxW.c */

#include <windows.h>

int main(int argc, char **argv){
   HINSTANCE handle;
   void (*InitSystem)(int, int);

   handle=LoadLibrary("libBB.dll");
   if (!handle){
      MessageBox (NULL, "Failed to load libBB.dll", "BlackBox", MB_OK + MB_ICONSTOP);
      exit(1);
   }

   /* этот кусок кода более не нужен */
/*   *(void **) (&InitSystem) = GetProcAddress(handle,"InitSystem");
   if (!InitSystem){
      MessageBox (NULL, "Symbol not found.", "BlackBox", MB_OK + MB_ICONSTOP);
      exit(2);
   }

   MessageBox (NULL, "Running InitSystem", "BlackBox", MB_OK);
   InitSystem(argc, (int)argv);*/

   FreeLibrary(handle);

   return 0;
}

Спасибо за наводку. :wink:

Автор:  Евгений Темиргалеев [ Вторник, 02 Февраль, 2010 14:33 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

InitSystem у Димыча в линуховом загрузчике передаёт внутрь ББ параметры командной строки. В винде, где нужно, используется соотв-я API-функция.

От ком. строки зависит инициализация HostFiles. Первичный каталог, вторичный...

Автор:  Info21 [ Вторник, 02 Февраль, 2010 19:36 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Роман М. писал(а):
Вот оно что... А я полагал, что инициализацию нужно вызывать явно из загрузчика (BBloader).

Выходит, что StdLoader всё сам инициализирует при загрузке библиотеки. Таким образом, никаких InitSystem не нужно. ..

В который раз всё оказывается гораздо проще, чем ожидалось :)

Автор:  Сергей Оборотов [ Вторник, 02 Февраль, 2010 20:32 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Роман М. писал(а):
Вот код загрузчика
Вообще-то здесь описан старт системы. Он платформозависим и желательно от Kernel его отделить.

Автор:  Роман М. [ Вторник, 02 Февраль, 2010 21:41 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Сергей Оборотов писал(а):
Роман М. писал(а):
Вот код загрузчика
Вообще-то здесь описан старт системы. Он платформеннозависим и желательно от Kernel его отделить.

Старт каркаса - имелось в виду? Насчёт платформы - согласен. Но на этапе эксперимента вполне приемлемо. Только не понял: какое отношение Kernel к загрузчику?

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

Автор:  Сергей Оборотов [ Вторник, 02 Февраль, 2010 21:52 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Да, каркаса. Загрузчик в каркасе уже есть.

Автор:  Сергей Оборотов [ Пятница, 05 Февраль, 2010 21:32 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Роман М. писал(а):
Сергей Оборотов писал(а):
...Он платформозависим и желательно от Kernel его отделить.

... Насчёт платформы - согласен. Но на этапе эксперимента вполне приемлемо. Только не понял: какое отношение Kernel к загрузчику?
Зависит от опций. Если ядро (Kernel) главный модуль, то он запускается следующим.

Автор:  Илья Ермаков [ Пятница, 05 Февраль, 2010 22:10 ]
Заголовок сообщения:  Re: Загрузка фреймворка BlackBox

Роман М. писал(а):
Только не понял: какое отношение Kernel к загрузчику?


См. документацию на ядро http://oberoncore.ru/wiki/blackbox/addn_docu

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/