Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2013, 00:09   #81
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от notHaker Посмотреть сообщение
Запоздал с поздравлениями, но... гру3ин, поздравляю с авторской работой уровня системного программирования, не ожидал от вас такого
Два года уже

Цитата:
Сообщение от notHaker Посмотреть сообщение
З.Ы. А как же лурчанка?
Никак
rpy3uH вне форума Ответить с цитированием
Старый 14.11.2013, 01:29   #82
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
Два года уже
Дык примерно столько меня и не было
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 14.12.2013, 15:55   #83
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию Трансляция страниц

Здравствуйте, у меня вопрос. Разбираю код реализации механизма трансляции. Копирую два файла, но механизм реализован во втором.
pm.asm:
Код:
ORG 100h

     STACK_BASE_ADDRESS 	 equ 200000h
     USER_PM_CODE_BASE_ADDRESS	 equ 400000h
     USER_PM_CODE_SIZE equ USER_PM_CODE_END - USER_PM_CODE_BASE_ADDRESS

     CODE_SELEKTOR  equ 8h
     DATA_SELEKTOR  equ 10h
     VIDEO_SELEKTOR equ 18h

start:
		mov		ax,3
		int		10h

		in		al,92h
		or		al,2
		out		92h,al

		xor		eax,eax
		mov		ax, cs
		shl		eax,4
		add		eax, PROTECTED_MODE_ENTRY_POINT
		mov		[ENTRY_OFF],eax

		xor		eax,eax
		mov		ax,cs
		shl		eax,4
		add		ax, GDT

		mov		dword [GDTR+2],eax
		lgdt		fword [GDTR]

		cli
		in		al,70h
		or		al,80h
		out		70h,al

		mov		eax,cr0
		or		al,1
		mov		cr0,eax

		db		66h
		db		0EAh			
ENTRY_OFF	dd		PROTECTED_MODE_ENTRY_POINT		      
		dw		CODE_SELEKTOR

align 8
GDT:
	NULL_descr	db		8 dup(0)
	CODE_descr	db		0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h
	DATA_descr	db		0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h
	VIDEO_descr	db		0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h
	GDT_size	equ		$-GDT

label GDTR fword
		dw		GDT_size-1		
		dd		?		

use32

PROTECTED_MODE_ENTRY_POINT:
		mov	       ax, DATA_SELEKTOR
		mov	       ds, ax
		mov	       es, ax
		mov	       ss, ax
		mov	       esp, STACK_BASE_ADDRESS

		call delta
         delta:
		pop ebx
		add ebx, USER_PM_CODE_START-delta

		mov	       esi, ebx
		mov	       edi, USER_PM_CODE_BASE_ADDRESS
		mov	       ecx, USER_PM_CODE_SIZE
		rep	       movsb


		mov	       eax,USER_PM_CODE_BASE_ADDRESS
		jmp	       eax

USER_PM_CODE_START:
ORG USER_PM_CODE_BASE_ADDRESS

		include 'PM_CODE.ASM';

USER_PM_CODE_END:
PM_CODE.asm:
Код:
PAGE_DIR_BASE_ADDRESS equ	 01A00000h 
PAGE_TABLES_BASE_ADDRESS equ  01200000h 

            START_CODE:

   mov eax, START_CODE
   mov ebx, eax
   call create_PDEPTE

   mov eax, 0B8000h
   mov ebx, eax		;физический адрес
   call create_PDEPTE

   mov eax, 0FF000000h
   mov ebx, 0B8000h	;физический адрес
   call create_PDEPTE

   mov eax, 0EE000000h
   mov ebx, 0B8000h	;физический адрес
   call create_PDEPTE

   mov eax, PAGE_DIR_BASE_ADDRESS
   mov cr3, eax

   mov eax, cr0
   or eax, 80000000h
   mov cr0, eax

	 ;------------------------PAGING ENABLED-------------------------
		mov esi, message1
		mov edi, 0B8000h
		mov ecx,message2-message1
		rep movsb

		mov esi, message2
		mov ecx, message3-message2
		rep movsb

		mov esi, message3
		mov ecx, end_messages-message3
		rep movsb

		jmp    $

message1 db "152535455565758595 5 5"
message2 db "A5d5r5F5F5050505050505 5"
message3 db "A5d5r5E5E5050505050505 5"
end_messages:

create_PDEPTE:
; in
; EAX page address
; EBX phys page address
    pushad

    mov edi, ebx 
    mov edx, eax 

    shr eax, 22
    shl eax, 2
    mov esi, PAGE_DIR_BASE_ADDRESS
    add esi, eax
    shr eax, 2

    mov ebx, eax  
    shl ebx, 12	   

    mov eax, PAGE_TABLES_BASE_ADDRESS
    add eax, ebx
    or eax, 011b   ;
    mov [esi], eax
    and eax, 0FFFFF000h

   .create_PTE:      ;eax = table base address - ну не совсем
    mov esi, eax
    mov eax, edx
    shl eax, 10
    shr eax, 22
    shl eax, 2
    add esi, eax

    mov eax, edi
    or eax, 011b
    mov [esi], eax

   .end:
    popad
    ret
Ну во-первых, в самом начале второго файла объявлено:
PAGE_DIR_BASE_ADDRESS equ 01A00000h
PAGE_TABLES_BASE_ADDRESS equ 01200000h
адреса каталога страниц и таблицы страниц
По таким адресам у меня ничего не работает, и когда я пытаюсь по ним что-то записать возникает Illegal write to 1a003e7 CS:IP 8: 400000 например, на адрес 1a003e7 не смотрите это вообще из другой программы. Однако если написать, например:
PAGE_DIR_BASE_ADDRESS equ 0AA0000h
PAGE_TABLES_BASE_ADDRESS equ 0AB000h
то всё работает. Почему??
fipsiksi вне форума Ответить с цитированием
Старый 14.12.2013, 15:56   #84
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

Во-вторых, несмотря на то что прога работает, непонятно что она вообще делает. Она же нужна чтобы отображать виртуальные адреса на реальные. Вот в этом куске сопоставляются эти адреса:
Код:
  mov eax, START_CODE
   mov ebx, eax
   call create_PDEPTE

   mov eax, 0B8000h
   mov ebx, eax		;физический адрес
   call create_PDEPTE

   mov eax, 0FF000000h
   mov ebx, 0B8000h	;физический адрес
   call create_PDEPTE

   mov eax, 0EE000000h
   mov ebx, 0B8000h	;физический адрес
   call create_PDEPTE
Однако, потом это уже не используется(тут то все отправляется по адресу 0B8000h)!!!:
Код:
		mov esi, message1
		mov edi, 0B8000h
		mov ecx,message2-message1
		rep movsb

		mov esi, message2
		mov ecx, message3-message2
		rep movsb

		mov esi, message3
		mov ecx, end_messages-message3
		rep movsb

		jmp    $

message1 db "152535455565758595 5 5"
message2 db "A5d5r5F5F5050505050505 5"
message3 db "A5d5r5E5E5050505050505 5"
Похожая фишка кстати и в прошлой программе, описали дескрипторы, в итоге всем сегментным регистрам присвоили одно и то же, однако там если переписать программу так чтобы она делала то, для чего она написана, то она все же работает. А здесь, если написать например так,
чтобы попробовать применить этот механизм:
Код:
                mov esi, message1
                mov edi, 0B8000h
                mov ecx,message2-message1
                rep movsb

                mov esi, message2
                mov eax, 0FF000000h
                add eax, message3-message2
                mov edi, eax
                rep movsb

                mov esi, message3
                mov eax, 0EE000000h
                add eax, end_messages-message3
                mov edi, eax
                rep movsb 

                jmp    $

message1 db "152535455565758595 5 5"
message2 db "A5d5r5F5F5050505050505 5"
message3 db "A5d5r5E5E5050505050505 5"
end_messages:
То выводит просто первую строчку "123456789" и все. Куда посылаются остальные, неизвестно. В чём дело?

Последний раз редактировалось fipsiksi; 14.12.2013 в 20:01.
fipsiksi вне форума Ответить с цитированием
Старый 16.12.2013, 15:35   #85
western_digital
Пользователь
 
Регистрация: 20.11.2013
Сообщений: 45
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
Однако, потом это уже не используется(тут то все отправляется по адресу 0B8000h)!!!:
Код:
		mov esi, message1
		mov edi, 0B8000h
		mov ecx,message2-message1
		rep movsb

		mov esi, message2
		mov ecx, message3-message2
		rep movsb

		mov esi, message3
		mov ecx, end_messages-message3
		rep movsb

		jmp    $

message1 db "152535455565758595 5 5"
message2 db "A5d5r5F5F5050505050505 5"
message3 db "A5d5r5E5E5050505050505 5"
Этот код демонстрационный, там надо ещё EDI ставить, но это автор забыл, видимо.
western_digital вне форума Ответить с цитированием
Старый 16.12.2013, 15:41   #86
western_digital
Пользователь
 
Регистрация: 20.11.2013
Сообщений: 45
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
Похожая фишка кстати и в прошлой программе, описали дескрипторы, в итоге всем сегментным регистрам присвоили одно и то же, однако там если переписать программу так чтобы она делала то, для чего она написана, то она все же работает. А здесь, если написать например так,
чтобы попробовать применить этот механизм:
Код:
                mov esi, message1
                mov edi, 0B8000h
                mov ecx,message2-message1
                rep movsb

                mov esi, message2
                mov eax, 0FF000000h
                add eax, message3-message2
                mov edi, eax
                rep movsb

                mov esi, message3
                mov eax, 0EE000000h
                add eax, end_messages-message3
                mov edi, eax
                rep movsb 

                jmp    $

message1 db "152535455565758595 5 5"
message2 db "A5d5r5F5F5050505050505 5"
message3 db "A5d5r5E5E5050505050505 5"
end_messages:
То выводит просто первую строчку "123456789" и все. Куда посылаются остальные, неизвестно. В чём дело?
В регистре ECX должна быть длина строки. Код вот такой должен быть

Код:
                mov esi, message1
                mov edi, 0B8000h
                mov ecx,message2-message1
                rep movsb

                mov esi, message2
                mov eax, 
                add eax, message2-message1
                mov edi, eax
                mov ecx, message3-message2
                rep movsb

                mov esi, message3
                mov eax, 0EE000000h
                add eax, messages3-message2
                mov edi, eax
                mov ecx, end_messages-message3
                rep movsb
Надо проверять и смотреть.
western_digital вне форума Ответить с цитированием
Старый 16.12.2013, 15:43   #87
western_digital
Пользователь
 
Регистрация: 20.11.2013
Сообщений: 45
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
Ну во-первых, в самом начале второго файла объявлено:
PAGE_DIR_BASE_ADDRESS equ 01A00000h
PAGE_TABLES_BASE_ADDRESS equ 01200000h
адреса каталога страниц и таблицы страниц
По таким адресам у меня ничего не работает, и когда я пытаюсь по ним что-то записать возникает Illegal write to 1a003e7 CS:IP 8: 400000 например, на адрес 1a003e7 не смотрите это вообще из другой программы.
И не должно работать, потому что надо для них создать PTE и PDE.


Цитата:
Сообщение от fipsiksi Посмотреть сообщение
Однако если написать, например:
PAGE_DIR_BASE_ADDRESS equ 0AA0000h
PAGE_TABLES_BASE_ADDRESS equ 0AB000h
то всё работает. Почему??
Как вы это определили?
western_digital вне форума Ответить с цитированием
Старый 17.12.2013, 11:04   #88
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

Да, точно, про ecx забыл..И ещё добавить смещение, чтобы не затирать прошлую строчку в видеопамяти. Так работает:
Код:
                
                mov esi, message1
                mov edi, 0B8000h
                mov ecx,message2-message1
                rep movsb

                mov esi, message2
                mov eax, 0FF000000h
                add eax, message2-message1
                mov edi, eax
                mov ecx, message3-message2
                rep movsb

                mov esi, message3
                mov eax, 0EE000000h
                add eax, message3-message2
                add eax, message2-message1
                mov edi, eax
                mov ecx, end_messages-message3
                rep movsb

                jmp    $
Т.е. выводит три строчки друг за другом, как и нужно.
Насчёт PTE и PDE , то мы же их создавали переходя по метке call create_PDEPTE, или что? В итоге непонятно только почему по адресам
PAGE_DIR_BASE_ADDRESS equ 01A00000h
PAGE_TABLES_BASE_ADDRESS equ 01200000h
ошибки.
fipsiksi вне форума Ответить с цитированием
Старый 17.12.2013, 13:52   #89
western_digital
Пользователь
 
Регистрация: 20.11.2013
Сообщений: 45
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
В итоге непонятно только почему по адресам
PAGE_DIR_BASE_ADDRESS equ 01A00000h
PAGE_TABLES_BASE_ADDRESS equ 01200000h
ошибки.
Повторяю: потому что для них не создано таблиц страниц.
western_digital вне форума Ответить с цитированием
Старый 17.12.2013, 16:24   #90
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

Что-то я не догоняю... с адресацией запутался. Мы не можем записать по адресу 01A00000h потому-что он слишком большой по сравнению с адресом
0AA0000h? Поэтому для него нужны эти таблицы страниц?..Ну первый примерно 27Мб, второй 11Мб. Плюс, у меня же ещё таблица дескрипторов наверно используется, т.е. когда я пишу:
Код:
mov [esi], eax
на самом деле ещё же есть селектор, хм. но он у меня указывает на data дескриптор в котором база 0; Ну тогда все равно не понимаю, чем тот адрес лучше этого, для него ведь мы тоже не создавали таблиц страниц.
fipsiksi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование на Ассемблере Николай ПН Помощь студентам 3 23.03.2010 00:56
Программирование микроконтроллера 80С196КС на ассемблере KOCT9IH Фриланс 3 07.11.2008 13:03
На форуме был замечен супермодератор - Руслан. Alar О форуме и сайтах клуба 17 25.07.2008 21:01