Я решил похукать KiTrap06(#UD, Invalid Opcode) и хандлер будет расширять систему команд. Скорость исполнения получится довольно высокой. Любой дизассемблер будет сломан.
Ещё есть вопрос, для исполнения кода последовательно на процессорах вроде в экспорте ядра ничего нет, придётся искать KeIpiGenericCall ?
t00x (Токо што переставил ехель) + SF. И CF - не просто бит а целый регистр (для mul и div). Кроме того в команде есть бит позволяющий выполняться как при установленом, так и при сброшеном указаном условии. SII Большинство одно и двухадресных команд с легкостью приводятся к 3х адресным. Примеры реализаций одноадресной команды трехадресной: not r0 == xor r0, r0, [ip++]; -1; ... (после считывания команды ip инкрементируется по определению и после считывания операнда (-1) команда инкрементирует его еще раз) neg r0 == xor r0++, r0, [ip++]; -1; ... (то-же самое + 'r0+1' в конце) Кроме того унификация команды и закрепление полей позволяют значительно упростить железную схему (несмотря на перегруженость команды), тк позволяют избавиться от дешифратора (имею подозрение, что в х86 от 1/2 до 3/4 транзисторов проца нужны только для быстрой дешифровки команды) Например? (очень длинные данные поддерживаются)
t00x для всех команд любой регистр может быть регистром или ссылкой R = r | [r] r = dst | src1 | src2 R = DST | SRC1 | SRC2 + 2 команды сложного доступа к памяти DST <- [ SRC1 + SRC2 ] DST -> [ SRC1 + SRC2 ] все инкеременты и условия для них сохраняются.
_basmp_ для доступа в память явно указывается SRC1 и(или) SRC2, или сегментные регистры тоже присутствуют?
t00x Только 32 регистра. 3 из них специальные (скажем: r31=IP, r30=Cf, r29=Fl) регистр флагов несет еще одну спец нагрузку, там лежит над какой частью числа операция производится. Каждый регистр может быть рассмотрен как число или указатель на число. Сегментных регистров нет. Работа с памятью (и работа вообще) очень отличается от х86. Есть доп ячейки размерности данных и адресов спец ситуаций(? не знаю как назвать точнее). К ним напрямую прога доступа не имеет. Они задаются при создании нового потока (спецкомандой), который может быть длиной и в одну команду.
_basmp_ А нельзя ли огласить весь список команд? А то я что-то не особо понимаю зачем нужен регистр флагов.
Black_mirror Прошу прощения за задержку. Система навернулась и винт прибила. Восстанавливаю теперь что могу. Значит команды прикидочно такие: mov-ы 1 - D <- [S1 + S2] 2 - D -> [S1 + S2] 3 - D <- S1; S1 <- S2 битовые 4 - D <- S1 | S2 5 - D <- S1 & S2 6 - D <- S1 ^ S2 логика (в начале выполняется S = S ? 1 : 0 7 - D <- S1 || S2 8 - D <- S1 && S2 9 - D <- S1 ^^ S2 10 - D <- S1 < S2 11 - D <- S1 < S2 (знаковое) (?) арифметика 12 - D <- S1 + S2 13 - D <- S1 - S2 14 - D <- S1 * S2 (?) 15 - D <- S1 / S2 (?) 16 - D <- S1 * S2 (знаковое) 17 - D <- S1 / S2 (знаковое) сдвиги 18 - D << S1 на S2 бит 19 - S1 >> D на S2 бит команды управления 20 - ноп (вообще-то, это спец команда. при значении ноп в поле кода команды она полностью + ip + дескриптор потока передаются на спец обработчик если он есть. Если обработчика нет, то ничего не делается) 21 - управление потоком (D = адрес дескриптора потока (0 - сам), S1 = команда или ip нового потока, S2 = мах разрядность нового потока + флаги (поставить в очередь, снять с очереди, S1 = команда, итд) (zf устан. при успехе, иначе сброс zf) 22 - установка новых параметров подслова для операций. (S1 = начало подслова в битах, S2 = количество бит в подслове. D = ??) 23 - получение параметров подслова. (S1 = начало подслова в битах, S2 = количество бит в подслове. D = ??) ПРИМЕЧАНИЯ D, S1, S2 - регистр | значение памяти по адресу в регистре регистр может постинкриментироваться на на 1 или длину подслова выровненую вверх на 8 бит если ссылка любая команда может изменять или не изменять флаги, любая команда может зависеть или не зависеть от флагов ФЛАГИ флаги лежат в 2-х регистрах 1-й - cf (при умножениях/делениях перенос/остаток по разрядности может быть не меньше подслова) 2-й - zf + sf + первый бит подслова + кол-во бит в подслове (что такое подслово - это когда, например, в 32х битном слове надо оперировать 3-мя битами начиная с 11го) Почему флаги - общие регистры 1) неохота вводить спецкоманды для работы с флагами 2) cf всегда можно использовать как tmp регистр 3) простота реализации алу 4) все данные потока включая содержимое регистров между операциями лежат в дескрипторе потока. 5) легко вводить самодельные команды (ноп) которые сами будут работать с флагами. ПРЕРЫВАНИЯ (выполняются если установлены) 1 - управление потоком 2 - ноп 3 - любая команда (для эмуляторов) 4 - чтение адреса 5 - запись адреса 6 - чтение очередной команды (?) 7 - деление на 0 (?) (перед выполнением обработчика вызвавший поток снимается с очереди выполнения, а обработчик получает адрес его дескриптора, скажем, в r0) ЗЫ Пишу по памяти и судя по количеству - что-то забыл или перепутал. Но коментариев хотелось бы.
_basmp_ к mov'ам мне кажется стоит добавить команды для чтения и записи битовых полей размером от 1 бита до размера регистра. D<-S1[S2],L S1 - базовый адрес S2 - смещение в битах (для этого регистра обязательно нужна возможность постинкремента/преддекремента на L) L - длина битового поля (скорее всего это тоже должен быть регистр или его младшие биты) К битовым командам наверно стоит добавить ANDN, которая вычисляет D=S1 AND NOT S2. В MMX её почему-то добавили, наверно чтобы проще было вычислять R=(А AND NOT MASK) OR (B AND MASK). Что касается флага CF, перед сложением или вычитанием предлагаю расширять операнды до двойного слова с заполнением старших разрядов нулём(беззнаковая операция) или знаком, а в CF записывать старшее слово результата. То есть при беззнаковом сложении там будет +1 в случае переполнения, а при вычитании -1. В случае знакового сложения и вычитания там может получиться как +1, так и -1. Еще стоит добавить команды сложения и вычитания с учётом перноса. Логические команды стоит исключить вообще, истину представлять как -1 (потому что в этом случае её можно будет использовать как маску в арифметических и логических выражениях), а вместо них использовать побитовые команды. Вычисление результатов проверки условий осуществляется следующим образом(для беззнакового случая): T=A-B, CF=-1 если A<B(для A>=B делаем NOT CF) T=A-B T=T-1, CF=-1 если A=B T=A-B T=0-T, CF=-1 если A<>B Что касается сдвигов, то думаю что лишние разряды лучше всего поместить в CF, а если нужен циклический сдвиг, потом можно сделать R=R OR CF. zf, sf на мой взгляд лишние. Подслова тоже штука сомнительной полезности, если сделать возможность чтения и записи памяти(а может и регистров) с любого бита.
Когда-то создавал такую же тему, в ней очень много скопилось полезных новаций, например параллельное вычисление веток до оценки выполнения условия, что должно работать лучше, чем предсказание переходов. Сейчас небольшое улучшение к выложенным там идеям добавлю: * Отдельный закрытый стек для кода (регистр CSP), с которым будут обращаться все операции передачи управления (call, ret, int, iret и т.п.). Программа не сможет из него читать, или писать в него, но для отладчика он будет доступен. Ради режима совместимости, адреса будут сохранятся и в стек данных (ESP), но забираться от туда не будут. Польза от такого стека очевидна - создавать эксплоиты на переполнении стека станет сложнее, а детектироваться существующие станут легче. * Команда разветвления fork - что-то наподобии jmp, но код по адресу будет выполнять дополнительным ядром (т.е. текущий поток пройдет мимо), до команды halt. Эксплуатировать эффективно такую команду будет можно в архитектуре Larabee, когда много упрощенных ядер.
alpet Ну первое мне тоже в голову приходила, не пойму почему так не сделают. А второе не вкурил доконца, нужны ли такие замуты.
SPA Программистам, для элементарной многопоточной обработки данных, приходится выполнять избыточную работу (если не используются готовые библиотеки), и получающиеся решения в итоге не всегда оптимальны (как правило это пул потоков, и простенький менеджер заданий). Суть моего нововведения, передать эту задачу отчасти компилятору. В простейшей реализации операция fork будет иметь два параметра - адрес обработчика задания, и параметр данных для обработчика (например ссылка на класс). Обработчик будет получать собственный контекст CPU, и фактически не будет обрываться операционной системой (если не задействовать синхронизирующие механизмы) - ядро процессора будет для него выделенным. Код (Text): void JOBFUNC Handler(PVOID64 pData) { // здесь выполняется обработка данных pData, и отправляется сообщение о завершении обработки, после чего миниядро ЦП высвобождается } void main() { FRAME frames[20]; .... for (int n = 0; n < 19; n ++) sys_fork(&Handler, &frames[n]); }
Почему-то правка поста недоступна, допишу здесь: Вобщем такая штука в условиях относительно небольших объемов работы (обработка кадра видеоигры), имхо может упростить разработку более производительного кода. Хотя процессор для этого потребуется сложный - придется следить за тем, чтобы не кончились свободные ядра, и приостанавливать выполнение операции fork в случае исчерпания их количества (можно так-же устанавливать флажки, или возбуждать исключение).
можно добавить аппаратное разделение на задачи и потоки; каждая задача может иметь несколько потоков; при инициализации, задача имеет 0 потоков, т.е. потоком не является.
Удивительно уродский броузер ие. Кто-то тут все требовал доказательств его уродскости. Так вот. Написал ответ. Не проверил есть-ли поключение к сети и отправил. Месага, что нет конекта. Подключился, вернулся назад, а поста-то моего уже нету, не вспомнинает, только поучения умные пишет. Как я ненавижу дюже умных очкариков, хоть сам очкарик. Блин. Все настроение испортил. Напишу завтра когда лисицу поставлю, ато счас свет вырубят.
utf-8. Perevedite poj na normalinyi Гђ”Гђ»Г‘Џ Г‘ЂГђ°Гђ±ГђѕГ‘‚Г‘‹ Г‘Ѓ Гђ±ГђёГ‘‚ГђѕГђІГ‘‹ГђјГђё ГђїГђѕГђ»Г‘ЏГђјГђё ГђїГ‘ЂГђёГђґГђВµГ‘‚Г‘ЃГ‘Џ ГђІГђІГђВµГ‘ЃГ‘‚Гђё Г‘ЃГђїГђВµГ‘†Г‘†ГђВµГђїГђё, ГђВєГ‘ЂГђѕГђјГђВµ Г‘‚ГђѕГђіГђѕ, ГђёГ‘ЃГђїГђѕГђ»Г‘ЊГђ·ГђѕГђІГђ°ГђЅГђёГђВµ ГђЅГђВµГђїГђѕГђ»ГђЅГ‘‹Г‘… Г‘ЃГђ»ГђѕГђІ (8 Гђ±ГђёГ‘‚, 16 Гђ±ГђёГ‘‚ ...) ГђѕГ‘‡ГђВµГђЅГ‘Њ Г‘ЂГђ°Г‘ЃГђїГ‘ЂГђѕГ‘ЃГ‘‚Г‘ЂГђ°ГђЅГђВµГђЅГђѕ. Гђ?ГђјГ‘…Гђѕ ГђёГђјГђВµГђВµГ‘‚ Г‘ЃГђјГ‘‹Г‘ЃГђ» ГђѕГђ±Г‘ЉГђВµГђґГђВµГђЅГђёГ‘‚Г‘Њ ГђёГ‘… Гђё Г‘ЂГђ°Г‘ЃГ‘ЃГђјГђѕГ‘‚Г‘ЂГђВµГђІ ГђїГђѕГђ»ГђЅГђѕГђВµ Г‘ЃГђ»ГђѕГђІГђѕ ГђВєГђ°ГђВє ГђІГђ°Г‘ЂГђёГђ°ГђЅГ‘‚ ГђЅГђВµГђїГђѕГђ»ГђЅГђѕГђіГђѕ/Гђ±ГђёГ‘‚ГђѕГђІГђѕГђіГђѕ ГђїГђѕГђ»Г‘Џ ГђёГђ·Гђ±Гђ°ГђІГђёГ‘‚Г‘ЊГ‘ЃГ‘Џ ГђѕГ‘‚ ГђВєГ‘ѓГ‘‡Гђё Г‘ЃГђїГђВµГ‘†ГђВєГђѕГђјГђ°ГђЅГђґ Гђё ГђґГђѕГђ±Гђ°ГђІГђёГ‘‚Г‘Њ Г‘‚ГђѕГђ»Г‘ЊГђВєГђѕ ГђѕГђґГђЅГ‘ѓ-ГђґГђІГђВµ ГђґГђ»Г‘Џ ГђїГ‘ЂГђѕГ‘ЃГ‘‚ГђѕГ‘‚Г‘‹ Г‘ЂГђ°Гђ±ГђѕГ‘‚Г‘‹ Г‘Ѓ ГђІГђЅГ‘ѓГ‘‚Г‘ЂГђВµГђЅГђЅГђёГђј Г‘„ГђѕГ‘ЂГђјГђ°Г‘‚ГђѕГђј ГђїГђѕГђ»ГђВµГђ№. ГђљГђѕГђјГђ°ГђЅГђґГ‘ѓ D = S1 & !S2 ГђІГђІГђВµГ‘ЃГ‘‚Гђё Гђ»ГђВµГђіГђВєГђѕ. ГђГ‘‚Гђѕ ГђїГ‘ЂГђѕГ‘ЃГ‘‚Гђѕ ГђВєГ‘ѓГ‘ЃГђѕГђВє xor, ГђїГ‘ѓГ‘ЃГ‘‚Г‘‹ГђВµ ГђјГђВµГ‘ЃГ‘‚Гђ° ГђІ Г‘ЃГђїГђёГ‘ЃГђВєГђВµ ГђВєГђѕГђјГђ°ГђЅГђґ еÑЃГ‘‚Г‘Њ. ГђџГ‘ЂГђВµГђґГ‘ЃГ‘‚Гђ°ГђІГђ»Г‘ЏГ‘‚Г‘Њ true ГђВєГђ°ГђВє -1 ГђјГ‘‹Г‘ЃГђ»Г‘Њ ГђёГђЅГ‘‚еÑЂГђВµГ‘ЃГђЅГђ°Г‘Џ. ГђћГ‘‚ГђВєГђ°Гђ·Г‘‹ГђІГђ°Г‘‚Г‘ЊГ‘ЃГ‘Џ ГђѕГ‘‚ Гђ»ГђѕГђіГђёГ‘‡ГђВµГ‘ЃГђВєГђёГ‘… ГђВєГђѕГђјГђ°ГђЅГђґ ГђЅГђВµГ‘‚ Г‘ЃГђјГ‘‹Г‘ЃГђ»Гђ°, Г‘‚ГђВє ГђѕГђЅГђё Г‘ѓГђґГђѕГђ±ГђЅГ‘‹, Гђ° Г‘ЂГђ°Г‘ЃГ‘…ГђѕГђґГ‘‹ ГђЅГђ° ГђЅГђёГ‘… ГђјГђёГђЅГђёГђјГђ°Гђ»Г‘ЊГђЅГ‘‹. Гђ”еÐ№Г‘ЃГ‘‚ГђІГђёГ‘‚еÐ»Г‘ЊГђЅГђѕ, Гђ·Гђ°ГђґГ‘ѓГђјГ‘‹ГђІГђ°ГђВµГ‘‚Г‘ЃГ‘Џ ГђјГђЅГђѕГђіГђѕГ‘ЏГђґГђВµГ‘ЂГђЅГђ°Г‘Џ Г‘ЃГђёГ‘ЃГ‘‚еÐјГђ°, Гђ° Г‘‚ГђѕГ‘‡ГђЅГђВµГђВµ ГђјГђЅГђѕГђіГђѕГђ°Гђ»Г‘ѓГ‘?ГђЅГђ°Г‘Џ. ГђџГ‘ЂГђёГ‘‡ГђВµГђј ГђВєГђѕГђ»ГђёГ‘‡ГђВµГ‘ЃГ‘‚ГђІГђѕ Гђ°Гђ»Г‘ѓ ГђјГђѕГђ¶ГђВµГ‘‚ ГђїГђѕ Гђ¶ГђВµГђ»Гђ°ГђЅГђёГ‘Ћ ГђјГђВµГђЅГ‘ЏГ‘‚Г‘ЊГ‘ЃГ‘Џ ГђѕГ‘‚ 1 ГђґГђѕ ГђґГђѕГ‘ЃГ‘‚Гђ°Г‘‚ГђѕГ‘‡ГђЅГђѕ Гђ±ГђѕГђ»Г‘ЊГ‘?ГђѕГђіГђѕ Г‘‡ГђёГ‘ЃГђ»Гђ°, Г‘ЃГђВєГђ°Гђ¶ГђВµГђј ГђВє ГђїГ‘ЂГђёГђјГђВµГ‘ЂГ‘ѓ 65535. ГђџГђѕГ‘ЌГ‘‚ГђѕГђјГ‘ѓ ГђІГђ°Гђ¶ГђЅГђ° ГђїГ‘ЂГђѕГ‘ЃГ‘‚ГђѕГ‘‚Гђ° Гђ°Гђ»Г‘ѓ. Гђ’еÐґГ‘Њ ГђІ ГђЅГђВµГђіГђѕ ГђґГђѕГђ»Гђ¶ГђЅГ‘‹ ГђІГђ»ГђВµГђ·Г‘‚Г‘Њ еÑ‰ГђВµ Гђё ГђїГ‘ЂГђѕГ‘‚ГђѕГђВєГђѕГђ»Г‘ЊГђЅГ‘‹ГђВµ Гђ±Гђ»ГђѕГђВєГђё Гђё ГђґГђѕГђ»Гђ¶ГђЅГђѕ Гђ±Г‘‹Г‘‚Г‘Њ ГђґГђВµГ‘?еÐІГђѕ. ГђЅГђВµ Г‘ЃГђѕГђІГ‘ЃГђВµГђј ГђїГђѕГђЅГ‘ЏГ‘‚ГђЅГђѕ ГђїГ‘ЂГђѕ Г‘ЂГђ°Гђ·ГђґГђВµГђ»ГђВµГђЅГђёГђВµ ГђЅГђ° Гђ·Гђ°ГђґГђ°Г‘‡Гђё Гђё ГђїГђѕГ‘‚ГђѕГђВєГђё. Гђ’ Г‘‡ГђВµГђј Г‘‚Г‘ѓГ‘‚ ГђїГђѕГђ»Г‘ЊГђ·Гђ°? ГђїГ‘ЂГђѕ Г‘ЃГђґГђІГђёГђіГђё Гђё Г‘„Гђ»Гђ°ГђіГђё ГђїГђѕГ‘‚ГђѕГђј. Гђ—Гђ°ГђІГ‘‚Г‘ЂГђ°.