Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #83, НОЯБРЬ 2005 г.

64-битный привет

Крис Касперски ака мыщъх

Хакер, номер #083, стр. 083-118-8


.data

mytit db 'PENUMBRA is awesome!', 0

mymsg db 'Hello World!', 0

; секция кода с атрибутами по умолчанию (чтение и исполнение)

.code

Main:

mov r9d, 0 ; uType = MB_OK

lea r8, mytit ; LPCSTR lpCaption

lea rdx, mymsg ; LPCSTR lpText

mov rcx, 0 ; hWnd = HWND_DESKTOP

call MessageBoxA

mov ecx, eax ; uExitCode = MessageBox(...)

call ExitProcess

End Main

Ассемблирование и линковка проходит так:

ml64 XXX.asm /link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib /entry:main

в результате чего образуется готовый к употреблению exe-файл с румяной поджаренной корочкой нашего ЦП (FASM ассемблирует намного быстрее).

Примеры более сложных программ легко найти в Сети. Как показывает практика, запросы типа x86-64 [AMD64] assembler example катастрофически неэффективны и гораздо лучше использовать что-нибудь вроде mov rax.

[заключение]

Вот мы и познакомились с архитектурой x86-64! Здесь действительно есть место, где развернутся и чему поучиться! Насколько эти знания окажутся востребованы на практике - так сразу и не скажешь. У AMD есть хорошие шансы пошатнуть рынок, но ведь и Intel не дремлет, активно продвигая собственные 64-разрядные платформы, известные под общем именем IA64, но о них как-нибудь в другой раз.

[переход в 64-разрдяный режим]

В исходниках FreeBSD можно найти файл amd64_tramp.S, быстро и грязно переводящий процессор в 64-режим. Откомпилировав, его можно записать в boot-сектор, загружающий нашу собственную операционную систему (вы ведь пишите ее, правда?) или слинковать com-файл, запускаемый из реального x86-режима (для этого потребуется чистая MS-DOS безо всяких экстендеров). В общем, вариантов много.

[перевод процессора в 64-разрядный режим]

//$FreeBSD: /repoman/r/ncvs/src/sys/boot/i386/libi386/amd64_tramp.S,v 1.4 2004/05/14

/*

* Quick and dirty trampoline to get into 64 bit (long) mode and running

* with paging enabled so that we enter the kernel at its linked address.

*/

#define MSR_EFER 0xc0000080

#define EFER_LME 0x00000100

#define CR4_PAE 0x00000020

#define CR4_PSE 0x00000010

#define CR0_PG 0x80000000

/* GRRR. Deal with BTX that links us for a non-zero location */

#define VPBASE 0xa000

#define VTOP(x) ((x) + VPBASE)

.data

.p2align 12,0x40

.globl PT4

PT4:

.space 0x1000

.globl PT3

PT3:

.space 0x1000

.globl PT2

PT2:

.space 0x1000

gdtdesc:

.word gdtend - gdt

.long VTOP(gdt) # low

.long 0 # high

gdt:

.long 0 # null descriptor

.long 0

.long 0x00000000 # %cs

.long 0x00209800

.long 0x00000000 # %ds

.long 0x00008000

gdtend:

.text

.code32

.globl amd64_tramp

amd64_tramp:

/* Be sure that interrupts are disabled */

cli

/* Turn on EFER.LME */

movl $MSR_EFER, %ecx

rdmsr

orl $EFER_LME, %eax

wrmsr

/* Turn on PAE */

movl %cr4, %eax

orl $(CR4_PAE | CR4_PSE), %eax

movl %eax, %cr4

/* Set %cr3 for PT4 */

movl $VTOP(PT4), %eax

movl %eax, %cr3

/* Turn on paging (implicitly sets EFER.LMA) */

movl %cr0, %eax

orl $CR0_PG, %eax

movl %eax, %cr0

/* Now we're in compatability mode. set %cs for long mode */

movl $VTOP(gdtdesc), %eax

Назад на стр. 083-118-7  Содержание  Вперед на стр. 083-118-9