Решение выравнивания в режиме реального адреса - PullRequest
0 голосов
/ 03 мая 2020

Цитирование из Руководство по оптимизации Intel (248966-042b сентябрь 2019 г.):

Правило 11. Кодирование сборки / компилятора (влияние M, H обобщение) При выполнении кода из В декодированном Icache прямые ветвления, которые в основном используются, должны иметь все свои байты инструкций в строке кэша 64B и ближе к концу этой строки кэша. Их цели должны находиться в начале или около начала строки кэша 64B.

Правило 47 кодирования сборки / компилятора. (Воздействие H, универсальность M) Постарайтесь расположить структуры данных так, чтобы они допускали последовательный доступ. (*)

Правило 51 кодирования сборки / компилятора. (Воздействие H, обобщенность L) Всегда размещайте код и данные на отдельных страницах. По возможности избегайте самоизменяющегося кода. Если код должен быть изменен, попробуйте сделать все сразу и убедитесь, что код, который выполняет изменения, и код, который изменяется, находятся на отдельных страницах размером 4 КБ или на отдельных выровненных подстраницах размером 1 КБ.

(*) Более ранняя версия того же руководства содержала:

Правило 45 кодирования сборки / компилятора (H-влияние, H-общность). Выравнивание данных по границам адресов с натуральным размером операнда. ... Структура или массив данных размером 64 байта или более должны быть выровнены так, чтобы его базовый адрес был кратным 64.


Простой способ следовать этим правилам - использовать команды ALIGN 64 и ALIGN 4096 (или ALIGN 1024) в исходном тексте. Однако, поскольку MS-DOS загружает приложение только по 16-байтовому выровненному адресу памяти, маловероятно, что вышеприведенные ALIGN действительно выполнят соответствующее выравнивание, как требуется для оптимальной производительности.

Я написал Следующая программа, чтобы убедиться, что любое приложение будет загружено DOS в начале страницы памяти объемом 4 КБ. После этого все возможные ALIGN в приложении будут работать должным образом, что соответствует физическим границам памяти.

; ALIGN.COM (c) 2020 Sep Roland
; This tool creates a memory block in order to achieve that any subsequent
; program will be loaded by DOS at the desired physical memory alignment.

    ORG 256

ALIGNMENT equ 4096      ; 16, 32, 64, ...

    mov dx, (ALIGNMENT/16)-1
    mov ax, cs
    and ax, dx
    jz  NOP             ; Alignment OK
    sub dx, ax          ; Filler paragraphs (MCB excluded)
    jnz .b
.a: add dx, (ALIGNMENT/16)
.b: cmp dx, 6           ; (a)
    jb  .a
TSR:
    mov es, [002Ch]     ; (b)
    mov ah, 49h         ; DOS.ReleaseMemory
    int 21h
    mov ax, 3100h       ; DOS.TerminateAndStayResident
    int 21h
NOP:
    ret

    END

(a) DOS (version 6.20) refuses a TSR with fewer than 6 paragraphs. Important PSP data.
(b) Releasing the environment is necessary to avoid that allocating a new environment for the next task messes up the established alignment. And of course the left behind paragraphs are just (unused) data - not code that could be needing an environment string.

Существуют ли какие-либо IDE, существующие оболочки или клоны DOS, которые выполняют такое выравнивание базы перед загрузкой программы для запуска?

Когда запуск программы выровнен всего на 16 байт, каковы альтернативные способы сделать выравнивание кода и данных правильным - по сравнению с процессором?

...