Где хранить ТСС'ы и др.
Я пока выделяю для каждого malloc'ом в адресном пространстве ядра и храню во взаимосвязанном списке и при переключении задач или создании процесса загружаю cr3 ядра.
Или лучше выделить метр оперы и монтировать везде?
Просто это накладывает ограничение на количество ТСС'ов, но в то же время первый способ медленнее.
Что скажите?
И еще:
Почему в qemu при дальнем прыжке на собственный ТСС при старте многозадачности возникает Debug Exception?
Хотя в бочсе, вмваре и в реале все нормально?
И напоследок: Подскажите что-нибудь почитать про реализацию обмена процессов сообщениями.
Кроме того можно использовать всего 2 дескриптора ТСС, один текущий, а другой заполнять прямо перед переходом, попутно сбрасывая флаг занятости.
По поводу исключений отладки ничего толком сказать не могу, думаю стоит во время исключения заглянуть в отладочные регистры.
По поводу книг.. По поводу реализации обмена сообщениями между процессами ничего посоветовать не могу, зато в книге А.В. Гордеев "Операционные системы" можно найти описание принципов работы тех или иных методов (почтовые ящики, очереди сообщений, pipe)
Стоит ли так делать?
Если все же располагать ТСС'ы в одном месте то сколько памяти выделить под это дело?
Метра хватит!
qemu не нравиться прыжок на свой ТСС, это вообще нормально?
З.Ы.:Спасибо за книгу, скачать ее где-нибудь можно?
З.Ы.Ы.: Где можно взять инфу про GCC constraints?
К сожалению скачать не знаю где.
GCC constraints? А что именно интересует? Можно попробовать почитать официальную документацию по компилятору.
Или лучше отвести им память где-нибудь?
2) интересует оформление вставок. например в чем ошибка:
asm("movl %eax, %esi \n movl %ebx, %edi \n rep movsb"::"a"(src), "b"(dest));
И прочее, чем больше тем лучше)
Без разницы как выделены ТСС, главное чтобы перед переходом они были прописаны как сегменты ТСС в таблице GDT, причем этот сегмент не совпадал с текущим.
Значит придется расположить все ТСС'ы где-нибудь в одном месте и будет мне счастье!
И сколько под них выделить?
По поводу того сколько выделять под ТСС ничего сказать не могу, разве что память нужна собственно для таблицы ТСС (она немного занимает) и для битовой карты портов. Как работать с битовой картой портов я не в курсе, может быть даже можно исползовать одну карту для всех процессов...
Наверно лучше выделить под них кусок памяти, так как если они будут разбросаны по всей памяти то их будет проблематично монтировать для каждого процесса.
До и после перехода ТСС текущего потока должна лежать в одном и том же месте, все равно где, главное по одному и тому же адресу. В структуре, описывающей поток можно записывать местонахождение ТСС этого потока, а перед переходом на этот поток брать это значение и инициализировать им свободный на данный момент дескриптор GDT.
Поэтому я думаю для простоты хранить ТСС'ы вместе с описанием процесса в доступной всем памяти.
Так обычно и делается
Спасиб!