OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 20 Май, 2024 21:42

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Загрузка каркаса BlackBox
СообщениеДобавлено: Суббота, 16 Январь, 2010 19:25 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Есть ли у кого-нибудь описание этапов загрузки BlackBox [.exe] или же сам исходник?
Интересует загрузка модулей в память и инициализация подсистем.


Последний раз редактировалось Роман М. Суббота, 06 Февраль, 2010 22:05, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Суббота, 16 Январь, 2010 19:51 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
У всех есть исходник - 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


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

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Роман М. писал(а):
Есть ли у кого-нибудь описание этапов загрузки BlackBox [.exe]
У Oberon microsystems.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Ну, право же.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Воскресенье, 17 Январь, 2010 14:32 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
О! Это то, что мне и нужно. :roll:


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

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Нестандартные загрузчики кто-нибудь пробовал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Воскресенье, 31 Январь, 2010 17:04 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Как раз провожу опыты по запуску каркаса посредством "ядерной" библиотеки каркаса libBB.dll, по мотивам темы о порте в X11/Linux. Разбираюсь с загрузкой в InitSystem.


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

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


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

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Роман М. писал(а):
О! Это то, что мне и нужно. :roll:

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Понедельник, 01 Февраль, 2010 17:03 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Попытка загрузить каркас с помощью библиотеки 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.


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Так эта, Вы статически линкуете 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ку, содержащую динамический загрузчик. Попробуйте


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Вторник, 02 Февраль, 2010 12:58 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Иван Горячев писал(а):
И потом, у Вас таким макаром получается два Kernelа - один в dllке и один - в exeшнике.

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Вторник, 02 Февраль, 2010 13:39 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Иван Горячев писал(а):
Если короче:
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:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Вторник, 02 Февраль, 2010 14:33 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
InitSystem у Димыча в линуховом загрузчике передаёт внутрь ББ параметры командной строки. В винде, где нужно, используется соотв-я API-функция.

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


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Роман М. писал(а):
Вот оно что... А я полагал, что инициализацию нужно вызывать явно из загрузчика (BBloader).

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

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


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

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Роман М. писал(а):
Вот код загрузчика
Вообще-то здесь описан старт системы. Он платформозависим и желательно от Kernel его отделить.


Последний раз редактировалось Сергей Оборотов Пятница, 05 Февраль, 2010 21:33, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Вторник, 02 Февраль, 2010 21:41 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Сергей Оборотов писал(а):
Роман М. писал(а):
Вот код загрузчика
Вообще-то здесь описан старт системы. Он платформеннозависим и желательно от Kernel его отделить.

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

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


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

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Да, каркаса. Загрузчик в каркасе уже есть.


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

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Роман М. писал(а):
Сергей Оборотов писал(а):
...Он платформозависим и желательно от Kernel его отделить.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка фреймворка BlackBox
СообщениеДобавлено: Пятница, 05 Февраль, 2010 22:10 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Роман М. писал(а):
Только не понял: какое отношение Kernel к загрузчику?


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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB