OSDev

для всех
Текущее время: 01 июн 2024, 15:23

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




Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12, 13, 14 ... 16  След.
Автор Сообщение
СообщениеДобавлено: 21 авг 2013, 04:04 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Первый косяк:
Код:
002034eb:   sub $0x18,%esp
Скорее всего именно это привело к появлению leave вместо pop ebp в эпилоге. Плюс это же вынуждало бы нас увеличить размер стекового кадра потока перед его запуском на 0x18 байт (ранее я говорил, что нужно следить за действиями, выполняемыми в прологе над стеком).

Цитата:
Картинки мелкие делаю - превью, чтобы модеры не ругались
Проще делать текстовые ссылки. На миниатюрах все равно почти ничего не разглядеть.

Цитата:
Оставил push ebp/pop ebp в прологе/эпилоге для совместимости, хотя теперь можно и без них.
Нет, правильно сделал, что оставил. Содержимое ebp может использоваться в коде, из которого вызывается переключалка, т.е. внешний код может понадеяться на то, что ebp сохраняется в переключалке, и не сохранять/восстанавливать ebp самостоятельно. Плюс ты можешь через esp[-2] (образ ebp в стартовом стековом кадре) передавать в новый поток адрес запуска в прикладном пространстве (или еще какой-нибудь параметр).

Цитата:
Что же делал leave такого пакостного?
Портил esp. Эта инструкция неявно делает mov esp,ebp (esp=ebp), а у нас внутри переключалки до выполнения pop ebp в регистре ebp хранится значение, ассоциируемое с потоком, выполняющим переключение, а не с активируемым потоком (т.е. после переключения на новый стек у нас продолжает использоваться старое значение ebp). Прежде чем использовать новое значение ebp, его нужно взять из контекста активируемого потока. Например, можно расширить стартовый стековый кадр до 16 байт, разместив в esp[-2] или в esp[-3] значение ebp, указывающее на esp[-1], а внутри переключалки вокруг основных команд, осуществляющих переключение, добавить push ebp/pop ebp. Можно сделать еще проще - оставить размер стартового стекового кадра прежним (не добавлять push ebp/pop ebp), а в переключалке после команды загрузки esp для нового потока просто сделать mov ebp,esp (ebp=esp) или для нашего последнего случая lea ebp,[esp+18h] (ebp=esp+18h).

Цитата:
Чем опасно использование EBP указателя и как оно инициирует #TS?
Описал причину выше. Если нам нужно использовать новое значение ebp еще до завершения переключения на новый поток, то нам нужно предварительно это значение сформировать. Возникновение #TS - это лишь один из возможных сценариев развития при использовании некорректного указателя в ebp. Поэтому я и говорил, что ошибка какая-то странная. По сути это неопределенная ошибка, непосредственно не связанная с TSS.

Цитата:
Это одна из немногих функций на асме полностью написанная мной самостоятельно, да ещё и для интеграции в код на C
Можно смещениям полей дать символические названия. Можно в структуре потока хранить указатель на вершину стека, чтобы не вычислять его каждый раз.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 07:00 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Да уж, этот квест становится всё интереснее :) Думаю что переключатель стоит оставить в новой реализации, так как эта функция всё равно состоит практически полностью из ассемблерных вставок.
По поводу миниатюр - так они ж кликабельны: при щелчке отображается полная версия, а большие рисунки не загромождают ветку
phantom-84 писал(а):
Можно смещениям полей дать символические названия. Можно в структуре потока хранить указатель на вершину стека, чтобы не вычислять его каждый раз

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

P.S.: Запустил свое "творчество" на реальной машине - получил исключение деления на ноль. Может из-за того что машина у меня x86_64 (intel core i7 sandy bridge). Хотя ведь совместимость у них с x86...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 10:32 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
maisvendoo писал(а):
Думаю что переключатель стоит оставить в новой реализации, так как эта функция всё равно состоит практически полностью из ассемблерных вставок.
Очень здравая мысль. Я поражаюсь, почему многие этого не понимают. А если еще учесть, что нам сделал Си, то уверенности в правильности такого решения должно еще прибавиться.

Цитата:
Запустил свое "творчество" на реальной машине - получил исключение деления на ноль. Может из-за того что машина у меня x86_64 (intel core i7 sandy bridge). Хотя ведь совместимость у них с x86...
Надо расставлять бряки и смотреть, где хотя бы примерно происходит исключение. А вообще нужно запускать почаще на реальном железе, причем лучше на разном. Я например до сих пор не отказываюсь от совместимости моего ядра с Pentium MMX. Стоит тестовая машина с Pentium MMX 166, работает как швейцарские часики. Мамке уже наверно лет 15, кондеры как новые (хотя они и не твердотельные).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 10:39 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
добавил в ключи as флаг -g - теперь можно топать в эклипсе по самописным ассемблерным модулям, а то не заходило туда, я чесал репу что да как, сегодня стоял в поликнинике в регистратуре - дошло
phantom-84 писал(а):
Я поражаюсь, почему многие этого не понимают

боятся ассемблера, хотя реализация конкретных архитектурных вещей без него невозможна - сишный код всё равно истыкивается асм волатилами.
phantom-84 писал(а):
Стоит тестовая машина с Pentium MMX 166, работает как швейцарские часики. Мамке уже наверно лет 15, кондеры как новые (хотя они и не твердотельные)

дома валяется без дела двухпроцессорный комп на pentium pro, живой, собрал по кускам на подаренной в Мюнхене старой матери. Не хватает SCSI винта (на матери нет IDE), так и проваляется наверное всю жизнь теперью И мой первый комп на Celeron 366 внезапно померший тоже пылится, если бы знать как починить, можно было бы приспособить


Последний раз редактировалось maisvendoo 21 авг 2013, 10:43, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 10:43 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
maisvendoo писал(а):
боятся ассемблера, хотя реализация конкретных архитектурных вещей без него невозможна - сишный код всё равно истыкивается асм волатилами.
Я про это и говорю: "эта функция всё равно состоит практически полностью из ассемблерных вставок".

Цитата:
Не хватает SCSI винта (на матери нет IDE), так и проваляется наверное всю жизнь теперь
На моем IDE. Это наверно единственное, что на нем менялось (делал самолично много раз). А, нет, еще пишущий привод воткнул. Насчет оперативки уже не помню. Кажется, делалось расширение, но еще тогда, когда он был новый.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 10:57 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Нашел причину глюков на реальном железе - из новой реализации убрал проверку флага готовности планировщика. Вынес его проверку на уровень выше - отлично работает на настоящем железе. Надо сказать без него на виртуальной машине тоже нерегулярно сбоило вываливая исключение страничной адресации. Так что всё вроде норм теперь. Загрузчик что интересно видит все мои 16 Гб озу


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 11:10 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
maisvendoo писал(а):
Нашел причину глюков на реальном железе - из новой реализации убрал проверку флага готовности планировщика. Вынес его проверку на уровень выше - отлично работает на настоящем железе.
Cool :) Я тебе давно говорил, нечего делать этой проверке в переключалке. Плюс ее можно совместить с какой-нибудь другой проверкой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 15:29 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Вобщем я вышел в пользовательский режим. Подробности когда очухается мой провайдер, пишу с телефона.
Проверка в отладке показывает, что при переключении потоков между ядерным и пользовательским изменяются селекторы кода данных и стека. Правда пока пришлось всю отображенную память пометить флагом доступа из кольца 3, чтобы убедится что я могу перейти в этот уровень. Но это временно


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 20:17 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
maisvendoo писал(а):
Проверка в отладке показывает, что при переключении потоков между ядерным и пользовательским изменяются селекторы кода данных и стека.
Можно еще более жестко тестировать. Сделать точку входа в ядро и запускать в нескольких потоках примерно такой прикладной код:
Код:
start:
  call SystemService
  jmp start
Обратите внимание, данный код не требует наличия прикладного стека.

Цитата:
Правда пока пришлось всю отображенную память пометить флагом доступа из кольца 3, чтобы убедится что я могу перейти в этот уровень. Но это временно
Я защищаю пространство ядра на уровне каталога. Т.е. у меня все страницы кроме таблиц страниц ядра обычно являются "пользовательскими". При таком подходе пространство ядра защищается практически автоматически. А точечно я сбрасываю PF_APL лишь тогда, когда мне нужно защитить какой-то участок внутри прикладного пространства.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2013, 20:58 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Для переключения понадобилось явно загрузить DS и сформировать в стеке такой кадр
Код:
SS
ESP
EFLAGS
CS
EIP

где последнее - точка входа в прикладную задачу, а потом дать команду на выход из прерывания.
Кстати теперь если убрать загрузку TR происходит перезагрузка :) Значит шлюз реально во всем этом участвует. Переключение селекторов при переключении задач разного уровня как я понял происходит через TSS?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12, 13, 14 ... 16  След.

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


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

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


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB