· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Дублирование адресов

Посл.отвђт Сообщенiе


Дата: Фев 27, 2004 10:54:32

Народ! Уже несколько месяцев без пищи и воды я пишу операционку (не Linux подобие). И постиг её страшный баг. Когда процессор находится в защищённом режиме и я пишу в самые старшие адреса памяти, происходит эффект дублирования, т.е. когда я пишу в последний, к примеру, байт памяти, это же значение оказывается и по другому адресу. Очень прошу помочь или хотябы намекнуть на столь неприятный баг.

До встречи


Дата: Мар 4, 2004 02:39:39

В догонку, это происходит на 486 проце, на Athlon XP вроде бы всё нормально. Может A20 надо как-нибудь особо открывать, хотя не знаю. Не ужели такой вполне ощутимый баг нигде не описан???


Дата: Мар 10, 2004 20:55:07

Kirk
Может на данной плате просто не проверяются состояние страрших линий адресной шины? Или младшие биты этих адресов не совпадают?


Дата: Мар 11, 2004 02:31:26

М-да нет, всё вроде бы корректно. И винда работает 95, 98... Интересен момент вот в чём, когда я пишу скажем в последний-512 байт, то это значение записывается также несколькью байтами ниже, причём разница - очень странное число, не похожее на степень двойки. Более того есть процедура (глюк с ней не связан, это так сказать в довершение) которая работает сразу после перехода в PMODE и определяет размер всей оперативной памяти путём записи значения в память и чтения его с проверкой оттуда. Так вот, пришлось последовательно писать одно значение, сверять его, а затем повторять то же для другого значения. Иначе возникает ещё один глюк:
запуск 1: размер верен
"-"-" 2: больше на 32 байта
3: верен
4: > 32 байта
. . . и т.д.
Не то, чтобы меня так сильно интересовал 486, но так как я пишу ось, хотелось бы наибольшей совместимости (сей старый комп у меня как своего рода полигон).


Дата: Мар 11, 2004 14:58:14

Скорее всего это просто баг где-то в коде.
Хотелось бы взглянуть на кусок кода который память подсчитывает.


Дата: Мар 12, 2004 01:02:35

; Memory test
	@WriteStr (aMem)
	mov	ax,SEL_FLAT_DS
	mov	es,ax
	mov	ds,ax
	mov	ecx,1024*1024*2		; scan from 2 mb to end
	mov	ah,1
	mov	bh,2
  @@:	mov	al,[ecx]
	mov	[ecx],ah
	cmp	[ecx],ah
	jne	@f
	mov	[ecx],bh ; это 2е сравнение, за счёт которого удалось избежать бага
	cmp	[ecx],bh
	jne	@f
	mov	[ecx],al
	add	ecx,512 ; шаг - 512 байт, на момент ошибки было 16 (так, на всякий случай)
	jmp	@b
  @@:	mov	eax,ecx
	mov	fs:total_memory,eax
	shr	eax,20
	@printnum eax
	@WriteStrFS (aMb)
	@CrLf


SEL_FLAT_DS - селектор всей оперативной памяти;
fs - указывает на локальный сегмент 32-битных данных


Дата: Мар 14, 2004 03:01:01

Kirk
Может причина этого бага та же что и бага с CALL?
Проверь все обращения к переменным и значения в сегментных регистрах, а также дескрипторы.


Дата: Мар 16, 2004 15:21:21

Что касается дублирования адресов, то вряд ли (я конечно поробую ещё как-следует всё посмотреть), а вот тест памяти по всей видимости так и делают. Мне попались исходники, аналогичные моим, но только там память тестировалась в unreal-режиме. Там тоже проверялись два значения, а объяснения на этот счёт не давались:-(


Дата: Мар 17, 2004 17:06:06

Тут на счёт дублирования адресов идея есть. Листал тут как то на lowlevel.ru статьи по разводу ОС и интсрукции по проникновению в ОСиный улий, ну и наткнулся во 2 статье на место, где товарищ утверждает, что в конце адресного пространства (по его утверждениям именно вообще, а не 1 Мб) находится EPROM. Может это то большое ТО, почему туда нельзя писать данные??? А???


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054