OSDev

для всех
Текущее время: 21 ноя 2017, 20:06

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




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Страницы
СообщениеДобавлено: 03 апр 2015, 21:33 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1056
stlw писал(а):
pavia писал(а):
Наконец-то закончил дебажить. Судя по всему в борще invlpg не работает. Пришлось заменить на передёргивание cr3


Слишком серьезное заявление. Без invlpg ни один современный OS не поднимется.
Скорее всего что-то ты не так делаешь.

Станислав

Я прекрасно знаю что современные ОС работают на invlpg. Поэтому и не понимаю как это возможно. Но я специально ставил invlpg перед обнулением памяти, но это не помогало.

У меня есть код, который вызывается при изменении страницы.

Код:
procedure INVLPG(_addr:TAddrVirtual);
begin
asm
INVLPG [_addr]
end;
end;


Как только заменил на
Код:
procedure INVLPG(_addr:TAddrVirtual);
begin
asm
MOV EAX, CR3
MOV CR3, EAX
end;
end;


Всё заработало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Страницы
СообщениеДобавлено: 03 апр 2015, 22:34 

Зарегистрирован: 12 май 2012, 14:02
Сообщения: 15
Проверь как следует что видно на месте твоего INVLPG в дебаггере Bochs.
Я точно не знаю как правильно пишется inline asm на ... это Pascal?
Самая распространенная ошибка, что вместо invalpg ADDR гедериться invlpg *ADDR, то есть в качестве адреса берется значение по адресу ADDR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Страницы
СообщениеДобавлено: 03 апр 2015, 22:40 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1025
Откуда: Балаково
Если в INVLPG [_addr] скобки означают косвенную адресацию, то работать не будет, т.к. будет адресоваться сама переменная _addr. Делай MOV EAX,[_addr]; INVLPG EAX


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Страницы
СообщениеДобавлено: 04 апр 2015, 00:03 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1056
Похоже что опкод неверно генерируется. Прописал руками вроде нормально. Но надо будет тест написать.
Код:
procedure INVLPG(_addr:TAddrVirtual);
begin
asm
mov EAX,[_addr]
DB 0Fh, 01h, 038h;//INVLPG [EAX]
end;
end;


Код:
procedure INVLPG(const _addr);
begin
asm
INVLPG [_addr]
end;
end;

Наверно второй вариант будет работать тоже только мне первый больше по душе. Там проверка типов есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Страницы
СообщениеДобавлено: 04 апр 2015, 00:22 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1025
Откуда: Балаково
Если возможно, то в объявлении _addr используй атрибут register, тогда INVLPG [_addr] сработает.
Надо ещё смотреть ассемблерный или дизассемблерный код скомпилированного файла, чтобы видеть конечный результат.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Страницы
СообщениеДобавлено: 04 апр 2015, 17:07 

Зарегистрирован: 04 ноя 2007, 14:48
Сообщения: 113
Предполагаю что референсная реализация будет выглядеть как нибудь так (хотя и не уверен: негде проверить, да я и не знаю что за инструкция invlpg):

Код:
procedure InvLPG(const Addr: pointer);
asm
  invlpg Addr;
end;


Полезно было бы иметь такую, чтобы можно было быстро вставить в свой проект.
В паскале (delphi7) по умолчанию первые 3 параметра передаются через регистры, а отдельно указать кто пойдёт через регистр - нельзя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Страницы
СообщениеДобавлено: 04 апр 2015, 18:11 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
dragon писал(а):
Предполагаю что референсная реализация будет выглядеть как нибудь так

Да, именно так. Набросал два варианта (Delphi 6):
Код:
procedure InvLPG(Page: Pointer);
asm
        INVLPG [Page]
end;

procedure ConstInvLPG(const Page);
asm
        INVLPG [Page]
end;

Без квадратных скобок у [Page] Delphi не компилит, ругается на несовместимость команды и операндов. DCU32Int выдает одинаковые опкоды для обоих вариантов:
Код:
procedure InvLPG (Page: System.Pointer);
begin
// -- Line #308 --
  0: ..8    [0F 01 38            | INVLPG WORD PTR [EAX]
// -- Line #309 --
  3: Γ      |C3                  | RET NEAR
end;

procedure ConstInvLPG (var Page: void);
begin
// -- Line #313 --
  0: ..8    [0F 01 38            | INVLPG WORD PTR [EAX]
// -- Line #314 --
  3: Γ      |C3                  | RET NEAR
end;

Коды совпадают с теми, что выдает FASM. В Delphi, стало быть, всё реализовано верно. Ну и DCU32Int хороший инструмент, советую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Страницы
СообщениеДобавлено: 07 май 2015, 19:54 

Зарегистрирован: 09 янв 2015, 04:04
Сообщения: 35
Тоже долго мучался с invlpg, Си и борщом. В итоге пришел к этому. Если еще актуально.
Код:
   asm volatile (
   "movl  addr,%eax\n\t"
   "invlpg (%eax)\n\t"
   );


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу Пред.  1, 2

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


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

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


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

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