s3dworld прочитайте документацию и не такое узнаете. например есть команда ud2 для генерации исключения недействительной операции
Подписываюсь под каждым словом. Нелёгкое чтиво, да и детальки торчащие есть, но это — основа. Без неё никак. ----8<---- s3dworld, Есть ещё AVX/FMA/XOP, там используются 256-битные YMMx. Картинка кривая, кто-то матрицами увлёкся. DR-ы не все живые (где как). Были ещё TR-ы, но в младенчестве померли. MTRR/MSR — немаловажный аспект. В общем, маны — наше всё.
Я подсел на книги серии: Микропроцессор i486 (Книга 1-4). Сейчас читаю про привилегии, так всё понятно: подчинённые сегменты, шлюзы вызова. Кстати, что предпочтительней? Или результат одинаков, только зависит от стиля. Мне бы найти такую-же книжку про x64. Может кто знает такую?
Не так уж это и плохо. Для ассемблера разрядность не даст существенного прироста производительности. А эмуляция 32 бит всё равно не помешает. Вы потратите время, которое могли бы писать ядро, а в итоге получите ассемблер сильно уступающий fasm. Или не уступающий, но за это время вам расхочется писать ОС)) Боюсь, что нет. Только на английском. Если вам не нужна загрузка с флоппи, то используйте расширенный дисковый сервис - не нужно будет мучатся с устаревшей CHS адресацией, а писать адрес в LBA формате. Заодно диск сможет быть не 2 ГБ (около того. не помню точно), а до 2 ТБ. Самое интересное, то что клава вполне может работать даже в PM. BIOS умеет специальными средствами эмулировать PS/2 клаву так что вы будуте работать с её регистрами, а на самом деле все обращения будут идти к USB. Правда это пока вы не напишите свой драйвер USB. Я пробовал - флешка будет видится как обычный жёсткий диск. Не рекоменую. Удобнее, когда сегмент 0 - частенько надо обращатся к нижним адресам. К тому же адреса будут соответствовать физическим. А это вам будет полезно поскольку вы будите переключаться в другой режим. Так что настоятельно не рекомендую вам делать базу кода 0.
baldr Ну так и процессоры развиваются. Не будешь же на каждый чих Интела или АМД править статью (хотя бы потому, что надо с этим чихом разобраться, на что нужно время и т.д.), тем более что сами принципы не меняются. Живость DRов особой рояли не играет: то, что регистр умер, не означает, что его нельзя закодировать в команде. Другое дело, к каким последствиям это приведёт -- но это уже не формат кодирования инструкций, а правила их выполнения.
baldr Ой как критичен. Ну имеется в виду что с русским переводом я лучше усваиваю материал))). А так я себе уже накачал этих: - AMD64 Architecture Programmer's Manual Volume 1. Application Programming - AMD64 Architecture Programmer's Manual Volume 2. System Programming - AMD64 Architecture Programmer's Manual Volume 3. General Purpose and System Instructions - AMD64 Architecture Programmer's Manual Volume 4. 128-Bit Media Instructions - AMD64 Architecture Programmer's Manual Volume 5. 64-Bit Media and x87 Floating-Point Instructions - AMD64 Architecture Programmer's Manual Volume 6. 128-Bit and 256-Bit - Volume 1. Application Architecture (Revision 2.3) - Volume 2. System Architecture (Revision 2.3) - Volume 3. Intel® Itanium® Instruction Set (Revision 2.3) - Volume 4. IA-32 Instruction Set (Revision 2.3) - Intel® 64 and IA-32 Architectures Optimization Reference Manual - Intel® 64 and IA-32 Architectures Software Developer's Manual - Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 1. Basic Architecture - Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2A. Instruction Set Reference, A-M - Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2B. Instruction Set Reference, N-Z - Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A. System Programming Guide - Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3B. System Programming Guide - Intel® 64 Architecture x2APIC Specification - Intel® Advanced Encryption Standard New Instructions (Intel® AES-NI) Set White Paper - Intel® Carry-Less Multiplication Instruction and its Usage for Computing the GCM Mode White Paper - Intel® Virtualization Technology FlexMigration (Intel® VT FlexMigration) Application Note
Да. Не удачный. Но всё равно лучше приучиться делать test вместо cmp и xor вместо mov в таких случаях. Чтобы не думать о размере при выборе команды. Всё равно не неоптимальнее.
baldr С префиксом REX. Другое дело, что отладочных регистров 8-15 вроде как в природе не существует, а значит, инструкция с таким кодом вызовет исключение, но технически возможность кодирования этих номеров присутствует (как, например, в случае с управляющими регистрами: там тоже далеко не полный набор имеется, но указать-то можно любой номер).
s3dworld Я тоже с русским лучше усваиваю. Обычно лучше -- но встречаются такие перлы, что проще на английском, чем пытаться понять, что хотели сказать на русском. Но вообще, без английского в программировании, особенно системном, никуда, так что привыкайте пользоваться оригиналами.
Размер не больше. Что это 2 байта, что то. Только xor reg, reg при больших размерах операнда будет по прежнему 2 байта, а mov 3. или даже 5 (dword в PM) или 9 (qword в LM). Битовые операции процессором выполняются очень быстро.
SII, Извини за ригоризм, но не подразумевает ли REX.R 64-битное счастье? А я про eax. Ну и в мурзилках про этот метод ничего не сказано (хотя DR8…15 в AMD APM упоминаются). P.S. Ну и оффтопик мы тут развели…
baldr Ну так флудерасты ж Да, на EAX я внимания не обратил -- подумал, что вопрос о номере несуществующего регистра. А что у АМД упоминается, не в курсе -- не глядел (у самого сплошь интелы, так что нужды не было).
А можно ли поступить так: для защищённого режима (P-Mode) сделать всего три дескриптора (нулевой, код и данные), каждый из которых описывают всё адресное пространство (от 0 до 4^32), и при этом всю работу организовать только лишь по страничкам (а не по сегментам)? Или обязательно нужно делать ещё один сегмент для стека? Я бы с удовольствием сделал всего два сегмента: нулевой и сегмент для всего остального. Но боюсь так нельзя (я не уверен). А была бы воля, я бы вообще без сегментов сделал (только лишь страничками). Хотя меня смущает тот момент, что странички должны быть фиксированной длины (4 КБ, либо 4 МБ (или 2 МБ, не помню)). Получается что будет много занятого (но не использованного) места программой. Хотя если посмотреть на это с другой стороны - какая разница: странички выгружаются, странички загружаются. Как я понял, всего может быть 256 прерываний (хотя про нулевое я не уверен): от 0x00 до 0xFF. И мне обязательно для всех них писать обработчик? А можно ли для каких-то делать один и тот же обработчик, но скажем по значению одного из регистров определять поведение обработчика?
Люди, разбирающиеся в FASM, подскажите: Есть оператор $ и есть оператор $$. Что они обозначают? $ - это вроде бы смещение. А $$ - вроде бы базовый адрес, только не понимаю адрес чего (может это значение, указанное в org). Я бы так и подумал, если бы не взглянул на это: Code (Text): rb 510 - ($ - $$) db 0x55,0xAA rb (2880 * 512) - ($ - $$) - 1 db 0 Если в начале я установил: Code (Text): org 0x7C00 И пускай команда: Code (Text): rb 510 - ($ - $$) Выполняется по смещению 0x00FF. То считаю: По моему никак не может быть заполнение 31999 значений, до недостающих 510. Скорее всего в данном случае $$ будет равняться 0. Но что она вообще обозначает и в каких случаях она обозначает значение не 0? Ещё интересно, почему записано так (это не мой код): Code (Text): rb 510 - ($ - $$) db 0x55,0xAA rb (2880 * 512) - ($ - $$) - 1 db 0 А разве вот это (убраны круглые скобки, объединяющие $ и $$): Code (Text): rb 510 - $ - $$ db 0x55,0xAA rb (2880 * 512) - $ - $$ - 1 db 0 Не приведёт к такому же результату?
s3dworld Во всех реально существующих и более-менее распространённых системах защита памяти организовывается исключительно на базе страничного механизма. Более того, основная масса процессорных архитектур не имеет никакого подобия сегментации ИА-32. Интел повыёживалась с ней, но, как видим, попусту: разработчики систем так и не стали ей пользоваться, поэтому в 64-разрядном режиме сегментация умерла. То же касается и аппаратной многозадачности: "гладко было на бумаге, да забыли про овраги"... Что же касается ИА-32, то обойтись без дескрипторов сегментов нельзя лишь по исключительно архитектурным причинам (сегментацию вырубить нельзя в принципе). Нулевой -- это пустой дескриптор; по большому счёту, он не нужен (только место занимает, и всё). Остаются два необходимых сегмента, причём невозможность обойтись одним сегментом объясняется опять-таки кривизной архитектуры: один и тот же сегмент не может быть одновременно доступен для чтения, записи и выполнения. Что касается стека, то это, по сути, просто обычный сегмент данных: ему нужен доступ на чтение и запись. Поэтому сегменты данных и стека объединяются вместе (в CS грузится селектор сегмента кода, во все остальные -- селектор сегмента данных).