OSDev

для всех
Текущее время: 25 авг 2025, 12:46

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




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

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
phantom-84 писал(а):
Нет в режиме совместимости поддержки 64-битных регистров, т.к. в нем не работает REX-префикс.

Я думал что есть, не проверял.


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

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


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

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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Ну, всё, у меня прямо-таки зашкаливает ЧСВ :D

Размер участка стека, который используется в прологе функции, лучше замерять экспериментально во время компиляции или во время выполнения (первое конечно лучше, хотя второе может быть даже проще и особо не влияет на эффективность, т.к. этот замер нужно сделать однократно). Ну, или по крайней мере следить за этим.

Еще мне не очень нравится проверка флага многозадачности внутри переключалки. Есть много способов избежать этой проверки. Например, подставлять вместо планировщика какую-нибудь подпрограмму-заглушку, когда многозадачность не требуется, или оставлять в очереди только текущий поток, ссылающийся сам на себя (хотя я помню, что ты держишь в очереди все потоки).

Если ты будешь "замерять" EFLAGS с гарантированно установленным IF, то его не нужно будет устанавливать в образе EFLAGS.


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

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

Средствами предпроцессора C?

Ещё такой вопрос
Код:
proc SwitchToNext ; cs=KCODE, ds=es=ss=KDATA
  push fs
  push gs
  pushf
  cli
;  mov eax,[TSS.sp0]
  mov [eax+TS.stackpointer],esp
  mov eax,[eax+TS.next]
  mov esp,[eax+TS.stackpointer]
  mov [TSS.sp0],eax
  popf
  pop gs
  pop fs
  ret

Зачем указатель на текущую задачу помещается в поле esp0 TSS?

phantom-84 писал(а):
Чтобы это все работало на прикладном уровне, нужно разместить структуру потока (TS) в вершине стека, а current совместить с TSS.esp0

мм, непонятно, что это дает

Пытаюсь перейти в user mode, вообще нигде толком не нашел как это сделать (


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

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

Цитата:
Зачем указатель на текущую задачу помещается в поле esp0 TSS?
Чтобы выполнять два разных действия одной командой. Иначе придется по отдельности обновлять current и TSS.esp0 во время переключения. Обновлять TSS.esp0 не нужно только в случае использования накладывающихся друг на друга стеков ядра (я использовал этот подход, когда экспериментировал с fork'ом). Ну, или когда есть полная уверенность, что поток будет выполняться только в режиме ядра.

Цитата:
Пытаюсь перейти в user mode, вообще нигде толком не нашел как это сделать (
Это элементарно. Нужно сформировать в стеке кадр возврата (включающий в том числе и указатель на прикладной стек) и сделать retf/iret. Это базовый механизм. Есть еще инструкции быстрого возврата sysexit/sysret. Переходить на прикладной код с помощью jump нельзя.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
TSS.esp0 указывает на стек потока работающего в ring 0? И если мы переключаемся на поток работающий в ring 3 это поле не надо обновлять?
phantom-84 писал(а):
Это элементарно. Нужно сформировать в стеке кадр возврата (включающий в том числе и указатель на прикладной стек) и сделать retf/iret. Это базовый механизм. Есть еще инструкции быстрого возврата sysexit/sysret. Переходить на прикладной код с помощью jump нельзя.

То есть необходимо иметь задачу которая работает в пользовательском режиме? Её нужно поставить в ту же очередь что и потоки ядра? Соответственно при переключении необходима модификация DS и CS с загрузкой туда селекторов пользовательских сегментов?


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
maisvendoo писал(а):
TSS.esp0 указывает на стек потока работающего в ring 0? И если мы переключаемся на поток работающий в ring 3 это поле не надо обновлять?
Это все есть в руководстве. Поле esp0 используется процом, когда происходит переключение в режим ядра. В нем хранится вершина стека ядра, т.е. указатель на конец стека. Естественно, обычно это значение является постоянным для конкретного потока.

Цитата:
То есть необходимо иметь задачу которая работает в пользовательском режиме? Её нужно поставить в ту же очередь что и потоки ядра?
Нет. Поток может работать в обоих режимах. Любой поток начинает свою работу в режиме ядра и имеет стек ядра. Но прикладные потоки потом переключаются в user mode (и могут в любой момент повторно войти в kernel mode). А потоки ядра продолжают работу в kernel mode на всем протяжении своей жизни. Естественно, для единообразия и для большей надежности для них тоже можно переустанавливать поле esp0 - я так и делаю, хотя в принципе это не обязательно.


Последний раз редактировалось phantom-84 19 авг 2013, 21:33, всего редактировалось 1 раз.

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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
phantom-84 писал(а):
Это все есть в руководстве

а в каком? :)


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
В руководстве по процам, естественно. Это я отвечал на первую группу вопросов. Добавил ответ и на появившуюся позже вторую. Вот еще:
Цитата:
Соответственно при переключении необходима модификация DS и CS с загрузкой туда селекторов пользовательских сегментов?
cs и ss будут загружены из стека. Другие сегментные регистры нужно загружать непосредственно. Я загружаю только ds и es, т.к. fs и gs инициализируются нулями при старте потока и больше не модифицируются перед переходом в user mode.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Качнул доки по i386 и Pentium. Вместе более 1000 страниц, буду изучать :)
Что-то чем больше вникаю в архитектуру x86 тем больше мне кажется что там много избыточных нелогичностей - вот есть страничная адресация, но мы продолжаем использовать селекторы и сегменты, иначе никак не изменить уровень привелегий, никто не применяет аппаратную многозадачность, а огрызок TSS все равно используется при переключении и т.п... Утверждение что x86 чуть более чем полностью состоит из костылей кажется более обоснованным теперь

P.S.: Что интересно, вот тут и ещё в паре мест наткнулся на до боли знакомый код :D . Насколько распространился этот кривой мануал, ужас просто


Последний раз редактировалось maisvendoo 19 авг 2013, 23:25, всего редактировалось 2 раз(а).

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

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


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

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


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

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