OSDev

для всех
Текущее время: 10 май 2024, 14:33

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




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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Цитата:
Кстати теперь если убрать загрузку TR происходит перезагрузка :) Значит шлюз реально во всем этом участвует. Переключение селекторов при переключении задач разного уровня как я понял происходит через TSS?
Нет. Только при переходе на более привилегированный уровень. У тебя падение скорее всего произошло из-за прерывания в user mode, что вызвало неявную попытку войти в kernel mode.

Edited. Еще в блоге заметил... TSS/дескриптор TSS лучше не называть шлюзом, т.к. это вносит путаницу в терминологию - в IA-32 и без того шлюзов хватает.


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

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

И главное - надо описать вчерашнюю проблему с #TS так как очень показательно


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

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


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Только нужно учитывать повторную входимость. Системный вызов можно выполнять и через шлюз вызова. Хотя я тоже использую программное прерывание (int 60h), на основе шлюза ловушки.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Обещанные подробности

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

Инициализация режима пользователя
Код:
/*-----------------------------------------------------------------------------
 *      Switch to user mode
 *---------------------------------------------------------------------------*/
void init_user_mode(void* entry_point, size_t stack_size)
{
   void* user_stack = kmalloc(stack_size);

   user_mode_switch(entry_point, (u32int) user_stack + stack_size);
}

Переключение в режим пользователя
Код:
/*-----------------------------------------------------------------------------
/
/      Switch to ring 3
/      (c) maisvendoo, 21.08.2013
/
/----------------------------------------------------------------------------*/
.set        USER_CS,        0x1B    /* user mode code selector */   
.set        USER_SS,        0x23    /* user mode stack selector */
.set        USER_DS,        0x23    /* user mode data selector */

.global user_mode_switch

user_mode_switch:
 
    mov     4(%esp), %edx           /* entry_point --> EDX  */
   
    /* Set user data selector */
    mov     $USER_DS, %ax
    mov     %ax, %ds
    mov     %ax, %es
   
    /* Prepare to SS, CS and EIP register loading */   
    mov     8(%esp), %eax   /* user_stack_top --> EAX */
    pushl   $USER_SS        /* Push SS value into stack */
    pushl   %eax            /* Push ESP value into stack */
    pushf                   /* Push EFLAGS into stack  */
    push    $USER_CS        /* Push CS value into stack */
    push    %edx            /* Push EIP unto stack */
                            /* (user mode thread entry point) */
   
    iret                    /* Return from interrupt to ring 3! */




Тут не обошлось и без "дурости". В начале, вчера, пропихнул в стек указатель на стек используемый главным потоком ядра. Это привело к тому, что при попытке "обернуть" системный вызов функцией C при выходе из подпрограмм из стека начали выталкиваться значения типа 0x23 и 0x1B, то есть загруженные ранее в этот же стек селекторы. Полезли #PF и #GP в произвольном порядке. в итоге вспомнил что
phantom-84 писал(а):
Еще нужно сохранить в стеке указатель на прикладной стек

Сделал свой стек этому потоку, косяки сразу исчезли, всё пашет пока как часы.
Понял что при переходе в ring 3, после вызова iret, происходит загрузка всех селекторов из стека ядра, оттуда же берется и устанавливается в ESP указатель на прикладной стек, загружается EIP точкой входа на прикладной код.
Для реализации системных вызовов использую шлюз ловушки - запись в IDT с байтом доступа 0xEF и селектором 0x8. Номер программного прерывания int 50h.

P.S.: На скринах можно увидеть открытый мануал JM. Да, я "стырил" оттуда некоторые макросы, на время, уже думаю избавится, хотя может и не буду. Весь приведенный код - самописный, по руководству Intel на 80386 и советам phantom-84


Последний раз редактировалось maisvendoo 22 авг 2013, 17:50, всего редактировалось 7 раз(а).

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

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
maisvendoo писал(а):
ох и "офигенно" же здесь табы в коде обрабатываются...


Вот потому табуляциями в исходном тексте программы пользоваться крайне не рекомендуется: оформление разваливается при попытке просмотреть где угодно, где они не так настроены.


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

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

Да это понятно, сталкивался много раз, просто в IDE удобно шлепнуть по TAB один раз, а о том что куда-то вставлять никогда не задумываешся.

Потестил syscall'ы - вроде ничего. Привилегированный код выполняют, при вставке этого же кода непосредственно в ring 3 поток закономерный #GP. Так получается это уже вполне себе ядро... Процессы ещё не умеет


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

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
maisvendoo писал(а):
Да это понятно, сталкивался много раз, просто в IDE удобно шлепнуть по TAB один раз, а о том что куда-то вставлять никогда не задумываешся.


Все IDE, с которыми встречался, имеют настройку, требующую от них вставлять вместо табуляции необходимое число пробелов.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
SII писал(а):
Все IDE, с которыми встречался, имеют настройку, требующую от них вставлять вместо табуляции необходимое число пробелов.

Уже подумал об этом. Пороюсь в эклипсе, там точно есть

P.S.: Нашел, исправил пост. Прошу прощения за неуместную критику.
P.P.S: Чтобы никакое знание не пропадало зря
Изображение


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
maisvendoo писал(а):
Инициализация режима пользователя
Естественно, нужно будет потом сделать распределение прикладного стека в прикладном пространстве.

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


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

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


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

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


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

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