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 |
О! Это то, что мне и нужно. ![]() |
Автор: | Сергей Оборотов [ Воскресенье, 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 |
Роман М. писал(а): О! Это то, что мне и нужно. ![]() В 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; } Спасибо за наводку. ![]() |
Автор: | Евгений Темиргалеев [ Вторник, 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 к загрузчику? |
Автор: | Илья Ермаков [ Пятница, 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/ |