Спасибо. А ты на гитхабе есть? может закоммитишь это все туда?
Спасибо. А ты на гитхабе есть? может закоммитишь это все туда?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
На гитхаб я пока не пойду
---------- Post added at 21:43 ---------- Previous post was at 21:42 ----------
Вот интересно, в библиотеке есть putenv.c и setenv.c, обе хранят в статической переменной (каждая в своей) предыдущий выделенный блок памяти. И как это работает?
у меня этот вариант и есть. хренатотам.. через раз пускается(
---------- Post added at 22:57 ---------- Previous post was at 22:55 ----------
кстати, третьим параметром в main() в твоём варианте envp не передать..
---------- Post added at 23:01 ---------- Previous post was at 22:57 ----------
лучше так:
тогда main( int argc, char* argv[], env** env); можно писать.ld hl, #6
add hl, sp
ld (_environ), hl
ld hl, #_exit ; return vector
push hl
jp _main ; go
---------- Post added at 23:44 ---------- Previous post was at 23:01 ----------
если у тебя всё работает и не глючит - дай исходники, коли не жалко. я просто сравню какие файлы у меня менялись. и окончательно решу - где собака зарыта.
Не взлетит. В environ попадут не те данные.
И потом, что за хрень с адресом возврата, чем тебе не нравится call _main / jp _exit?
Никак не могу поймать, кто пишет 01 по случайному адресу. Проблема с login-ом чаще всего из-за этого.
---------- Post added at 00:23 ---------- Previous post was at 00:17 ----------
Я думал, это из-за неправильной environ, но сейчас там правильный адрес, но всё равно глючит.
Кстати, putenv не дублирует входящую строку, эта процедура лишь накапливает адреса, смысла передавать туда локальный buf нет никакого.
---------- Post added at 00:33 ---------- Previous post was at 00:23 ----------
Ого, поставил бряк на начало программы, и записал в файл, что загрузилось. Сравнил с оригинальным init - 7 байт забиты числом 01! Стоят достаточно далеко друг от друга. Т.е. загрузка файла глючит! Понятно теперь, почему иногда рожица выскакивает в сообщении из issue
---------- Post added at 00:39 ---------- Previous post was at 00:33 ----------
Отключил прерывания - работает идеально. Надо копать прерывания в момент загрузки файла.
---------- Post added at 00:41 ---------- Previous post was at 00:39 ----------
Нахрена козе баян. envp сохраняется во вполне доступной статической переменной environ.
Кто, понятно - обработчик прерывания. Непонятно, каким образом это ему удаётся, что никто не видит
Я и раньше пробовал отключать прерывания, но всё равно глючило. Но это было из-за неправильного адреса переменных среды. А теперь, если прерывания отключить, то загруженный init в точности совпадает с оригиналом.
Да, спасибо за наводку, разобрался.
Глючат функции переключения банок - map_*. В паре мест там есть вероятность, что если в процессе работы произойдет прерывание, то предыдущее (временно сохраненное) значение аккумулятора пропадет. А т.к. эти функции дергаются кучу раз в цикле, то вероятность крайне велика.
Можно добавить DI везде в начале всех map_*. А можно более радикально - я переписал всё обратно на использование стека. Делал на переменных с тем, чтобы однажды перекинуть UDATA в банкуемую область, но ну нафиг, хоть бы сначала то, что есть, отладить
Сейчас логин всегда проходит и шелл всегда стартует. Но при попытке что-нибудь запустить всё гарантированно виснет. Надо дальше ковырять.
Кажется я понял, как всё глючит.
Глюк происходит внутри цикла __uput. В теории, прерывания в этот момент должны быть запрещены, но switch_bank подло разрешает их перед возвратом. В итоге, если прерывания возникает между ld (place_for_a),a в map_process_always и запрещением прерывания в switch_bank, то place_for_a портится несколько раз, и в конце концов вызовом map_restore. К этому моменту в регистре А находится флаг _kernel_flag, равный еденице.
Короче, надо switch_bank фиксить, как там в комментарии сказано.
---------- Post added at 15:30 ---------- Previous post was at 15:29 ----------
Опоздал![]()
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)