Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.32.86] |
|
Сообщ.
#1
,
|
|
|
Вот опять я что-то не понимаю
Допустим, дескриптор, описывающий область экрана: - Старшее слово адреса реального сегмента, на который указывает дескриптор 0B800h - Младшее слово 0 - Байт доступа 10010010b (как для сегмента данных) - Предел сегмента 0FFFFh - Резерв 0 Допустим, этот дескриптор шестой по счёту, т.е. обращаюсь к нему как 0028h (101000) Теперь, допустим, нужно в PMode произвести прямую запись в видеопамять, как теперь обращаться к нему ? Подозреваю, что после того, как выполнен JMP FAR на сегмент кода (тоже описывающийся в GDT) и после того, как в DS и SS загружены селекторы, дескрипторы которых тоже описаны в GDT, можно сделать хотя бы такой примитивный шаг: mov ax, 0028h ; селектор, соот. экрану mov es, ax xor di, di mov ax, <что-нибудь> STOSW Но это не работает ЧТО Я ПОНИМАЮ ЗДЕСЬ НЕ ТАК ???? |
Сообщ.
#2
,
|
|
|
Эээ.... Может я что-то не то сказал ???
|
Сообщ.
#3
,
|
|
|
Во-первых проверь, чтобы сегмент данных имел право на запись (не помню как это выглядит в битах). Во-вторых линейный адрес видеопамяти 0xB8000 !!! то есть младшее слово = 0x8000 и старшее 0xB !!! По-моему так, хотя я давно с этим не возился
|
Сообщ.
#4
,
|
|
|
> Во-первых проверь, чтобы сегмент данных имел право на запись
А я написал, что байт доступа 10010010b - соответствует сегменту данных и значит имеет право на запись. > Во-вторых линейный адрес видеопамяти 0xB8000 !!! Новость ! |
Сообщ.
#5
,
|
|
|
Из того что сегмент - данные не следует, что он имеет право на запись !!! Т.е. сегмент данных может быть только для чтения, а может быть чтение/запись. Для кода аналогичный флажок вроде бы значит подчиненный сегмент или нет
|
Сообщ.
#6
,
|
|
|
Да, я неправильно вырпазился. В этом не прав. Сегмент данных тоже можно защитить от
записи. |
Сообщ.
#7
,
|
|
|
Цитата ;******************************************************************************* ;Дескриптор сегмента ;******************************************************************************* SEG_DESCRIPTOR STRUC segd_wLimit_0_15 DW ? segd_wBase_0_15 DW ? segd_bBase_16_23 DB ? segd_bAR DB ? ;бит 0 = Accessed ;биты 1-3 = Type ;бит 4 = System ;биты 5-6 = DPL ;бит 7 = Present segd_bLimit_16_19 DB ? ;биты 0-3 = Limit (биты 16-19) ;бит 4 = Available ;бит 5 = Reserved ;бит 6 = DefaultSize ;бит 7 = Granularity segd_bBase_24_31 DB ? SEG_DESCRIPTOR ENDS В твоем случае segd_wLimit_0_15 = 0FFFFh segd_wBase_0_15 = 8000h segd_bBase_16_23 = 0Bh segd_bAR = 10010010b segd_bLimit_16_19 = 0 (16-ный код) или 01000000b (32-ный код) segd_bBase_24_31 = 0 Кроме того, ты должен сбросить старший бит в регистре CR0, чтобы механизм трансляции страниц был отключен и, соответственно, физический адрес был равен линейному. |
Сообщ.
#8
,
|
|
|
Как я мог упустить из виду страничную организацию памяти !
Но для чего нужно segd_bLimit_16_19 = 0 (16-ный код) или 01000000b (32-ный код) :-/ |