OberonCore https://forum.oberoncore.ru/ |
|
Специфика инициализации Kernel.baseStack под Linux https://forum.oberoncore.ru/viewtopic.php?f=34&t=3728 |
Страница 1 из 1 |
Автор: | Kubanych [ Пятница, 23 Декабрь, 2011 06:36 ] |
Заголовок сообщения: | Специфика инициализации Kernel.baseStack под Linux |
Ошибка сегментирования при запросе памяти в Linux У меня тут выходит ошибка сегментирования с таким сообщением Код: ~/work$ ./BlackBox **** * BlackBox * illegal memory read [ad = BFF42A88] - Kernel.CheckCandidates (pc=00002194, fp=BFF429CC) - Kernel.MarkLocals (pc=00002389, fp=BFF429E8) - Kernel.FastCollect (pc=00002855, fp=BFF429F8) - Kernel.NewBlock (pc=00002A52, fp=BFF42A1C) - Kernel.NewArr (pc=00000BFC, fp=BFF42A48) - FibDriver.SetCacheSize (pc=000004CC, fp=BFF42A70) - FibDriver.InitCache (pc=00000576, fp=BFF42A84) - FibDriver.Driver.EndExec (pc=00002A78, fp=BFF42AA8) - FibSqlDB.DoEndExec (pc=00002419, fp=BFF42AD0) - FibSqlDB.StdTable.Exec (pc=000029BA, fp=BFF42B68) - MyjfsLinFiles.WriteNewFile (pc=00000331, fp=BFF42BB8) - MyjfsLinFiles.Process (pc=0000045B, fp=BFF439EC) **** Ошибка сегментирования при попытке запуска t.Exec('SELECT DATA FROM BIN WHERE BIN_ID=:MyjfsLinFiles.n.n'); DATA - BLOB поле. Причем, маленькие тесты с BLOB полями проходят нормально. До этого в программе были многократные выборки из обычных таблиц (без BLOB). Ошибка обнаруживается как с fb2.1 так и с fb2.5 в Linux (в Windows все проходит нормально.) Проверял, FibDriver.SetCacheSize размер запрашиваемой через NEW памяти всегда > 0 Видимо, проблема с нехваткой памяти. Попробую разбить программу на отдельные бинарные кусочки, чтобы было в каждом было минимум обращений к памяти. Какие могут быть рекомендации? |
Автор: | Илья Ермаков [ Пятница, 23 Декабрь, 2011 07:12 ] |
Заголовок сообщения: | Re: Ошибка сегментирования при запросе памяти в Linux |
Это ошибка при сборке мусора. У Вас нарушена структура памяти. Где-то "переиграно" с SYSTEM, возможно? |
Автор: | Kubanych [ Пятница, 23 Декабрь, 2011 07:32 ] |
Заголовок сообщения: | Re: Ошибка сегментирования при запросе памяти в Linux |
Илья Ермаков писал(а): Это ошибка при сборке мусора. У Вас нарушена структура памяти. Где-то "переиграно" с SYSTEM, возможно? Это от прежних структур данных (до вызова запроса с BLOB)? Я попробовал в LinKernel заменить ассемблерную вставку на закоментированный код на КП Код: PROCEDURE Next (b: Block): Block; (* next block in same cluster *)
VAR size: INTEGER; BEGIN SYSTEM.GET(SYSTEM.VAL(INTEGER, b.tag) DIV 4 * 4, size); IF ODD(SYSTEM.VAL(INTEGER, b.tag) DIV 2) THEN INC(size, b.last - SYSTEM.ADR(b.last)) END; RETURN SYSTEM.VAL(Block, SYSTEM.VAL(INTEGER, b) + (size + 19) DIV 16 * 16) END Next; (* PROCEDURE [code] Next (b: Block): Block (* next block in same cluster *) (* MOV ECX,[EAX] b.tag AND CL,0FCH b.tag DIV * 4 MOV ECX,[ECX] size TESTB [EAX],02H ODD(b.tag DIV 2) JE L1 ADD ECX,[EAX,4] size + b.last SUB ECX,EAX SUB ECX,4 size + b.last - ADR(b.last) L1: ADD ECX,19 size + 19 AND CL,0F0H (size + 19) DIV 16 * 16 ADD EAX,ECX b + size *) 08BH, 008H, 080H, 0E1H, 0FCH, 08BH, 009H, 0F6H, 000H, 002H, 074H, 008H, 003H, 048H, 004H, 029H, 0C1H, 083H, 0E9H, 004H, 083H, 0C1H, 013H, 080H, 0E1H, 0F0H, 001H, 0C8H; *) [/code] Теперь на самый верх выходит Kernel.Next [code] **** * BlackBox * illegal memory read [ad = 00000000] - Kernel.Next (pc=00002049, fp=BFAAF0E0) - Kernel.CheckCandidates (pc=000021E0, fp=BFAAF10C) - Kernel.MarkLocals (pc=000023BE, fp=BFAAF128) - Kernel.FastCollect (pc=0000286F, fp=BFAAF138) - Kernel.NewBlock (pc=00002A6C, fp=BFAAF15C) - Kernel.NewArr (pc=00000BFC, fp=BFAAF188) - FibDriver.SetCacheSize (pc=000004CC, fp=BFAAF1B0) - FibDriver.InitCache (pc=00000576, fp=BFAAF1C4) - FibDriver.Driver.EndExec (pc=00002A78, fp=BFAAF1E8) - FibSqlDB.DoEndExec (pc=00002419, fp=BFAAF210) - FibSqlDB.StdTable.Exec (pc=000029BA, fp=BFAAF2A8) - MyjfsLinFiles.WriteNewFile (pc=00000331, fp=BFAAF2F8) **** Segmentation fault |
Автор: | Роман М. [ Пятница, 23 Декабрь, 2011 13:35 ] |
Заголовок сообщения: | Re: Ошибка сегментирования при запросе памяти в Linux |
Вот, гадаю: может, это как-то перекликается с реализацией модуля (Lin)HostFiles? В моём проекте консольный компилятор в Линуксе вылетает с той же ошибкой при попытке перекомпляции модуля Kernel. Причём, после многочисленных исследований я обнаружил, что каким-то образом повреждается служебная структура данных и затем на этапе кодогенерации падает. |
Автор: | Евгений Темиргалеев [ Пятница, 23 Декабрь, 2011 15:37 ] |
Заголовок сообщения: | Re: Ошибка сегментирования при запросе памяти в Linux |
Скорее всего, проблема с инициализацией Kernel.baseStack. См. viewtopic.php?p=68857#p68857 |
Автор: | Kubanych [ Суббота, 24 Декабрь, 2011 06:21 ] |
Заголовок сообщения: | Re: Ошибка сегментирования при запросе памяти в Linux |
Все заработало, спасибо. |
Автор: | Роман М. [ Среда, 15 Февраль, 2012 19:00 ] |
Заголовок сообщения: | Re: Открытая консольная версия от Oberon Microsystems |
В файле BlackBox.c из (LinConsole в первом сообщении) есть такие строки: Код: asm ("movl %%esp, %[res]" : [res] "=m" (res) ); skbsProc(res - 8); // <return adr> <caller ebp> -> base stack = locals of main proc mainProc() Что означает эта ассемблерная вставка? Верно ли, что здесь в переменную res сохраняется вершина стека? (модератор) перенесено из темы: viewtopic.php?f=34&t=1159 |
Автор: | Евгений Темиргалеев [ Среда, 15 Февраль, 2012 22:21 ] |
Заголовок сообщения: | Re: Открытая консольная версия от Oberon Microsystems |
Роман М. писал(а): Что означает эта ассемблерная вставка? Верно ли, что здесь в переменную res сохраняется вершина стека? Да.
|
Автор: | Роман М. [ Четверг, 16 Февраль, 2012 16:51 ] |
Заголовок сообщения: | Re: Открытая консольная версия от Oberon Microsystems |
Хотел бы прояснить кое-что насчёт запуска через пускач BlackBox.c. Исходя из описания специфики загрузки библиотеки .so, приведённой выше, корректный сбор мусора сборщиком зависит от корректного значения вершины стека в переменной Kernel.baseStack. Тут понятно. Цитата: В результате Kernel.baseStack, запомненный в Kernel.Init, оказывается не верен после возврата управления в сишный пускач и вызова "главной" процедуры Init. Хотел бы знать: почему?То есть, если не использовать приладу в виде SetKernelBaseStack, с помощью SYSTEM.GETREG(SP, baseStack) мы получаем некорректное значение. Так выходит? С другой стороны, какое отношение имеет вершина стека пускача к вершине стека вызываемой библиотеки? У них ведь могут использоваться разные менеджеры памяти, каждый со своим сборщиком мусора. Вдобавок хотел бы понять, почему в baseStack передаётся значение вершины стека со смещением 8 байт. |
Автор: | Евгений Темиргалеев [ Пятница, 17 Февраль, 2012 10:03 ] |
Заголовок сообщения: | Re: Специфика инициализации Kernel.baseStack под Linux |
Код: // <return adr> <caller ebp> -> base stack = locals of main proc Роман М. писал(а): Вдобавок хотел бы понять, почему в baseStack передаётся значение вершины стека со смещением 8 байт. Роман, изучите соглашения о вызове процедур http://en.wikipedia.org/wiki/Calling_convention, и, думаю, комментарий станет Вам понятен. Если времени мало, более конкретный случай, ближе к теме, с картинкой: http://en.wikipedia.org/wiki/Call_stack
|
Автор: | Евгений Темиргалеев [ Пятница, 17 Февраль, 2012 10:18 ] |
Заголовок сообщения: | Re: Специфика инициализации Kernel.baseStack под Linux |
Роман М. писал(а): Цитата: В результате Kernel.baseStack, запомненный в Kernel.Init, оказывается не верен после возврата управления в сишный пускач и вызова "главной" процедуры Init. Хотел бы знать: почему?...Код: SYSTEM.GETREG(SP, baseStack); (* TODO: Check that this is ok. *) Предположение на практике подтвердилось, но теорию никто не проверял (хотя это плохо и не правильно...). Поэтому на Ваш вопрос "почему?" у меня ответа нет. Поищите и почитайте документацию, где описывается реализация механизма загрузки .so линухом. Нам потом расскажете. Dum docemus discimus
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |