slap
Гость
|
|
« Ответ #2 : 22-08-2008 17:19 » |
|
Я на миниксе тренируюсь, там отображать не надо ничего. Страничной адресации нет. Есть специальный системный вызов, в который передается сегмент и смещение источника, сегмент и смещение приемника и размер массива данных. Эти данные отправляются в ядро, которое после преобразований выполняет копирование следующим образом:
! PUBLIC void phys_copy(phys_bytes source, phys_bytes destination, ! phys_bytes bytecount); ! Copy a block of physical memory.
PC_ARGS = 4 + 4 + 4 + 4 ! 4 + 4 + 4 ! es edi esi eip src dst len
.align 16 _phys_copy: cld push esi push edi push es
mov eax, FLAT_DS_SELECTOR mov es, ax
mov esi, PC_ARGS(esp) mov edi, PC_ARGS+4(esp) mov eax, PC_ARGS+4+4(esp)
cmp eax, 10 ! avoid align overhead for small counts jb pc_small mov ecx, esi ! align source, hope target is too neg ecx and ecx, 3 ! count for alignment sub eax, ecx rep eseg movsb mov ecx, eax shr ecx, 2 ! count of dwords rep eseg movs and eax, 3 pc_small: xchg ecx, eax ! remainder rep eseg movsb pop es pop edi pop esi ret
Может, где-то здесь баг или я должен адреса как-то выровнять? Я в ассемблере не силен... Сделал ради интереса копирование больше 10 байт (12) - запись прошла, а вот ровно 4 - не проходит...
|