Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2008, 21:26   #1
drRobert
Пользователь
 
Аватар для drRobert
 
Регистрация: 07.08.2008
Сообщений: 33
Восклицание разработка ОС: многозадачность

При прыжке на сегмент состояния задачи (в ГДТ) генерируется исключение страничной адрессации #PF, а в регистр СR2 записывается значение 0xffff0030. Отображение страниц на память - 1:1 (определено 8 таблиц). Задача представляет собой пустой цикл for.
Юзаю gcc и qemu для Винды. Помогите, плз.

вот часть исходника..

....
Код:
asm("mov %cr4,%eax");
 asm("and $0xffffffcf,%eax"); //Clear PSE,PAE bits
 asm("or $0x80,%eax"); //SET PGE-bit
 asm("mov %eax,%cr4");
 asm("or $0x0,%0"::"a"(system_PD0)); //PCD, PWT
 asm("mov %eax,%cr3"); //PAGE DIRECTORY
 *((int *) system_PD0) = system_PT0 | 0x107; //PDE for PT0
 *((int *) (system_PD0+4)) = system_PT0+0x1000 | 0x107; //PDE for PT1
 *((int *) (system_PD0+8)) = system_PT0+0x2000 | 0x107; //PDE for PT0
 *((int *) (system_PD0+12)) = system_PT0+0x3000 | 0x107; //..etc
 *((int *) (system_PD0+16)) = system_PT0+0x4000 | 0x107; //
 *((int *) (system_PD0+20)) = system_PT0+0x5000 | 0x107; //
 *((int *) (system_PD0+24)) = system_PT0+0x6000 | 0x107; //
 *((int *) (system_PD0+28)) = system_PT0+0x7000 | 0x107; //
  //fill PAGE TABLES
 int i;
 for (i=0; i<4096*system_PTcount; i=i+4)  //32Mb
 {
     *((int *)(system_PT0+i))=1024*i | 0x107;
 }
  
 asm("mov %cr0, %eax"); //Enable
 asm("bts  $31, %eax"); //Paging
 asm("mov %eax, %cr0"); //......

 asm("mov $0x18,%ax");
 asm("ltr %ax");
 asm("jmp %w0"::"d"(0x18));
...
"... Раньше мы жили завтра, а теперь и сегодня - вчера
Вместо Роллингов - хакеры, вместо Битлов - юзера..."
(с) Б.Г.

Последний раз редактировалось Stilet; 11.08.2008 в 11:26.
drRobert вне форума Ответить с цитированием
Старый 08.08.2008, 09:53   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Если я правильно понял (непривычная запись), то проблема вот в чем.
после

ltr [TSS 0x18]

задача, описанная в 0x18 становится текущей. Для нее в TSS устанавливается бит занятости. Повторный вызов той же задачи
(jmp 0x18) вызывает исключение.

Нужно предварительно очистить бит зщанятости. Что-то вроде:

mov bx, [ds:GDTOfs]
add bx, TSS_Main // адрес таблицы TSS 0x18
and byte [ds:bx+5], 11111101b

А еще проще вместо jmp 0x18 - сделать jmp на другую задачу. Тогда для текущей задачи (TR) (поскольку считается что она уже работает) будет сделано сохранение состояния, контекст переключится на другую и выполнение продолжится до возврата из нее.
alexBlack вне форума Ответить с цитированием
Старый 08.08.2008, 18:02   #3
drRobert
Пользователь
 
Аватар для drRobert
 
Регистрация: 07.08.2008
Сообщений: 33
По умолчанию

не-а =)) Это было бы #GP исключение (общей защиты), а так генерится страничное #PF. Все страницы определены как присутствующие, для записи/чтения и доступные пользовательскому коду (биты p, r/w, u/s). В ТСС cr3 записываю тот же, что и был раньше, системный.. В чем причина - не пойму.
"... Раньше мы жили завтра, а теперь и сегодня - вчера
Вместо Роллингов - хакеры, вместо Битлов - юзера..."
(с) Б.Г.
drRobert вне форума Ответить с цитированием
Старый 12.08.2008, 08:38   #4
drRobert
Пользователь
 
Аватар для drRobert
 
Регистрация: 07.08.2008
Сообщений: 33
По умолчанию

Вопрос снят. Ошибка в джампе на сегмент состояния задачи и не все поля TSS были инициализированы
"... Раньше мы жили завтра, а теперь и сегодня - вчера
Вместо Роллингов - хакеры, вместо Битлов - юзера..."
(с) Б.Г.
drRobert вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ScreenPlayer Shaitan63 Софт 29 09.06.2008 12:34
РАЗРАБОТКА DLL Leo Общие вопросы Delphi 2 26.10.2007 21:35
Разработка протокола OrdJONY Общие вопросы по программированию, компьютерный форум 2 04.10.2007 13:21