Вопрос 1. Объясните организацию страничной адресации памяти в защищенном режиме работы процессора IBM PC . Приведите фрагмент программы, переключающий процессор из реального режима в защищенный со страничной адресацией и обратно в реальный режим.


Добавил:DMT
Дата создания:30 декабря 2007, 18:54
Дата обновления:31 января 2008, 12:40
Просмотров:8598 последний сегодня, 15:15
Комментариев: 5

Вопрос 1. Объясните организацию страничной адресации памяти в защищенном режиме работы процессора IBM PC . Приведите фрагмент программы, переключающий процессор из реального режима в защищенный со страничной адресацией и обратно в реальный режим.

1. Объясните организацию страничной адресации памяти в защищенном режиме работы процессора IBM PC. Приведите фрагмент программы, переключающий процессор из реального режима в защищенный со страничной адресацией и обратно в реальный режим.

i 386

Процессор i80386 в защищённом режиме использует трёхступенчатую схему преобразования адреса.

Программы используют логический адрес, состоящий из селектора и смещения (аналогично процессору i80286). Компонента смещения является 32-разрядной, т.к. допустимый размер сегмента значительно превышает 64 килобайта.

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

Вторая ступень - получение из логического адреса 32-разрядного линейного адреса. Линейный адрес берётся из глобальной или локальной таблицы дескрипторов (GDT или LDT) в зависимости от соответствующего бита селектора (бит 2). Механизм получения линейного адреса напоминает механизм получения 24-разрядного физического адреса в процессоре i80286. Однако линейный адрес не отображается непосредственно на адресную шину памяти, то есть он не является физическим адресом.

Для получения из линейного адреса физического адреса используется третья ступень - механизм страничной адресации. С помощью этого механизма 20 старших бит линейного адреса используются для выбора блока памяти размером 4 килобайта. Такой блок называется страницей физической памяти. Оставшиеся 12 бит линейного адреса представляют собой смещение внутри страницы.

Процесс преобразования логического адреса в линейный иллюстрируется рис. 1.

Рис. 1. Рис. 2.

Значение из поля индекса селектора используется в качестве индекса в таблице LDT или GDT для выборки 32-разрядного базового адреса. Этот базовый адрес складывается со второй компонентой логического адреса - смещением. В результате получается 32-разрядный линейный адрес.

Преобразование линейного адреса в физический иллюстрируется рис. 2.

Процесс вычисления адреса страницы часто называют трансляцией страниц. Старшие 10 бит линейного адреса используются как индекс в таблице, называемой каталогом таблиц страниц. Расположение каталога таблиц страниц в физической памяти определяется содержимым системного регистра процессора CR3.

Каталог таблиц страниц содержит дескрипторы таблиц страниц, определяющие физический адрес таблиц страниц. В каталоге таблиц страниц всего может быть 1024 дескриптора. Самих же каталогов может быть сколько угодно, но в каждый момент времени используется только один - тот, на который указывает регистр CR3.

Следующие 10 бит линейного адреса предназначены для индексации таблицы страниц, выбранной с помощью старших 10 бит адреса. Таблица страниц содержит 1024 дескриптора, определяющих физические адреса страниц памяти. Размер одной страницы составляет 4 килобайта, т.е. 4096 байт.

Младшие 12 бит линейного адреса указывают смещение к адресуемому байту внутри страницы.

На рис. 3 представлен формат дескриптора таблицы страниц.

Рис. 3.

Для представления старших 20 битов физического адреса таблицы сраниц в дескрипторе используются биты 12-31. Младшие 12 битов адреса таблицы всегда равны нулю, таким образом, таблица страниц должна быть выровнена в памяти на границу 4096 байт (на границу страницы).

Формат дескриптора страницы представлен на рис. 4.

Рис. 4.

Биты 12-31 в дескрипторе страниц указывают старшие 20 бит физического адреса страницы. Младшие 12 бит адреса страницы всегда равны нулю.

Назначение бит 0-11 одинаково и для дескриптора таблицы страниц, и для дескриптора страницы. В таблице 4 приведено описание этих бит.

Для процессора i80386 добавилось ещё два типа таблиц, содержащих дескрипторы и, соответственно, два типа дескрипторов - дескриптор таблиц страниц и дескриптор страниц.

Для использования механизма трансляции страниц операционная система должна установить в 1 старший бит системного регистра CR0. Если этот бит не установлен в 1, физический адрес будет равен линейному, содержимое регистра адреса каталога таблиц страниц CR3 при этом для преобразования адреса использоваться не будет.

Форматы дескрипторов, располагающихся в таблицах GDT, LDT и IDT претерпели изменения по сравнению с используемыми в процессоре i80286. Например, вместо 24-битового физического адреса в дескрипторах должен находиться 32-битовый линейный адрес.

Напомним, что в дескрипторах процессора i80286 было зарезервировано два байта. Эти байты используются процессором i80386 (рис. 5 ).

Рис.5

Процессор i80386 использует 32-разрядный базовый адрес сегмента и 20-разрядное поле предела. В зарезервированном для процессора i80286 поле в битах 24-31 находится старший байт 32-разрядного базового адреса сегмента. Биты 16-19 используются для хранения старших четырёх битов предела.

В процессоре i80286 поле предела указывало размер сегмента в байтах. Для процессора i80486 интерпретация поля предела зависит от установки бита G - бита гранулярности . Если бит G установлен в 1, поле предела содержит размер сегмента в страницах (размером 4096 байт). Если бит G сброшен, размер сегмента вычисляется в байтах.

Бит гранулярности G также находится в поле, которое в процессоре i80286 было отмечено как зарезервированное.

Поле, обозначенное на рис. 5 как X, указывает разрядность выполняемых команд, принятых по умолчанию. Если этот бит установлен в 1, используются 32-разрядные команды, если сброшен в 0 - 16-разрядные.

Бит AVL предназначен для использования системным программным обеспечением.

Бит S - признак системного сегмента. Если этот бит сброшен в 0, то сегмент системный.

Назначение остальных полей дескриптора аналогично используемому в процессоре i80286.


Фрагмент программы, переключающий процессор из реального режима в защищенный со страничной адресацией и обратно в реальный режим.

После выполнения сброса (или после отключения) процессор переходит в реальный режим и управление передаётся в BIOS. BIOS анализирует содержимое ячейки CMOS-памяти с адресом 0Fh - байта состояния отключения. Дальнейшие действия определяются содержимым этой ячейки.

Байт состояния отключения 0Fh используется BIOS для определения способа возврата из защищённого режима в реальный после аппаратного сброса. Для обеспечения возврата в реальный режим после сброса по адресу, записанному в области данных BIOS 0040h:0067h можно использовать байты 5 и 0Ah. В следующем фрагменте программы мы записываем в ячейку CMOS-памяти с адресом 0Fh значение 5.

Код на ASM
  1. cli
  2. mov al,8f
  3. out CMOS_PORT,al
  4. jmp next1 ; небольшая задержка
  5. next1:
  6. mov al,5
  7. out CMOS_PORT+1,al
  8.  
  9. ; Процедура открывает адресную линию A20
  10. PROC enable_a20 NEAR
  11. mov al,A20_PORT
  12. out STATUS_PORT,al
  13. mov al,A20_ON
  14. out KBD_PORT_A,al
  15. ret
  16. ENDP enable_a20
При использовании обязательна ссылка на http://DMTSoft.ru

Следующий этап - запоминание содержимого сегментных регистров, которые будут нужны при возврате в реальный режим. Это сегментные регистры SS и ES:

Код на ASM
  1. mov [real_ss],ss ; запоминаем указатель стека
  2. mov [real_es],es ; для реального режима
При использовании обязательна ссылка на http://DMTSoft.ru

На последнем перед переключением в защищённый режим этапе мы загружаем регистр GDTR адресом подготовленной заранее GDT:

Код на ASM
  1. lgdt [QWORD gdt_gdt]
При использовании обязательна ссылка на http://DMTSoft.ru

Переключение в защищённый режим . Для перевода процессора i80286 из реального режима в защищённый можно использовать специальную команду LMSW, загружающую регистр состояния процессора ( Mashine Status Word ). Младший бит этого регистра указывает режим работы процессора. Значение, равное 0, соответствует реальному режиму работы, а значение 1 - защищённому. Если установить младший бит регистра состояния процессора в 1, процессор переключится в защищённый режим:

Код на ASM
  1. mov ax, 1
  2. lmsw ax
При использовании обязательна ссылка на http://DMTSoft.ru

Возврат в реальный режим . Для того , чтобы вернуть процессор 80286 из защищённого режима в реальный, необходимо выполнить аппаратный сброс (отключение) процессора.

Код на ASM
  1. mov ax, 0FEh ; команда отключения
  2. out 64h, ax
  3.  
При использовании обязательна ссылка на http://DMTSoft.ru

Перед выдачей команды отключения необходимо запомнить содержимое регистра SP, так как после передачи управления по адресу, записанному в области данных BIOS 0040h:0067h, регистры SS:SP будет указывать на стек BIOS.

После выдачи команды отключения надо подождать, когда произойдёт сброс процессора. Это можно сделать, выдавая в цикле команду HLT.

Код на ASM
  1. ; Запоминаем содержимое указателя стека, так как после
  2. ; сброса процессора оно будет потеряно
  3. mov [real_sp],sp
  4.  
  5. ; Выполняем сброс процессора
  6. mov al,SHUT_DOWN
  7. out STATUS_PORT,al
  8.  
  9. ; Ожидаем сброса процессора
  10. wait_reset:
  11. hlt
  12. jmp wait_reset
При использовании обязательна ссылка на http://DMTSoft.ru

Далее необходимо восстановить содержимое сегментных регистров, записанное в оперативную память на этапе подготовки к переключению в защищённый режим, закрыть адресную линию A20 и размаскировать прерывания.

Код на ASM
  1. ; Процедура закрывает адресную линию A20
  2. PROC disable_a20 NEAR
  3. mov al,A20_PORT
  4. out STATUS_PORT,al
  5. mov al,A20_OFF
  6. out KBD_PORT_A,al
  7. ret
  8. ENDP disable_a20
  9.  
  10. ;Размаскируем все прерывания
  11. mov ax,000dh ; разрешаем немаскируемые прерывания
  12. out CMOS_PORT,al
  13.  
  14. in al,INT_MASK_PORT ; разрешаем маскируемые прерывания
  15. and al,0
  16. out INT_MASK_PORT,al
  17. sti
При использовании обязательна ссылка на http://DMTSoft.ru
up

Комментарии для "Вопрос 1. Объясните организацию страничной адресации памяти в защищенном режиме работы процессора IBM PC . Приведите фрагмент программы, переключающий процессор из реального режима в защищенный со страничной адресацией и обратно в реальный режим. "


Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 1 января 2008, 10:56 Сообщение № 1
Код на ASM
  1. IDEAL
  2. RADIX 16
  3. P286
  4. ; Используем модель памяти LARGE, при этом мы организуем
  5. ; несколько отдельных сегментов и для каждого сегмента
  6. ; создадим дескриптор в таблице GDT.
  7. MODEL LARGE
  8. ; ------------------------------------------------------------
  9. ; Определения структур данных и констант
  10. ; ------------------------------------------------------------
  11. STRUC desc_struc ; структура дескриптора
  12. limit dw 0 ; предел
  13. base_l dw 0 ; мл. слово физического адреса
  14. base_h db 0 ; ст. байт физического адреса
  15. access db 0 ; байт доступа
  16. rsrv dw 0 ; зарезервировано
  17. ENDS desc_struc
  18. ; Биты байта доступа
  19. ACC_PRESENT EQU 10000000b ; сегмент есть в памяти
  20. ACC_CSEGEQU 00011000b ; сегмент кода
  21. ACC_DSEGEQU 00010000b ; сегмент данных
  22. ACC_EXPDOWN EQU 00000100b ; сегмент расширяется вниз
  23. ACC_CONFORM EQU 00000100b ; согласованный сегмент
  24. ACC_DATAWR EQU 00000010b ; разрешена запись
  25. ; Типы сегментов
  26. ; сегмент данных
  27. DATA_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR
  28. ; сегмент кода
  29. CODE_ACC = ACC_PRESENT OR ACC_CSEG OR ACC_CONFORM
  30. ; сегмент стека
  31. STACK_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR OR ACC_EXPDOWN
  32. ; Селекторы, определённые в таблице GDT
  33. DS_DESCR= (gdt_ds - gdt_0)
  34. CS_DESCR= (gdt_cs - gdt_0)
  35. SS_DESCR= (gdt_ss - gdt_0)
  36. BIOS_DESCR = (gdt_bio - gdt_0)
  37. CRT_DESCR = (gdt_crt - gdt_0)
  38. MDA_DESCR = (gdt_mda - gdt_0)
  39. ; Константы
  40. STACK_SIZE EQU 0400 ; размер стека
  41. B_DATA_SIZE EQU 0300 ; размер области данных BIOS
  42. B_DATA_ADDR EQU 0400 ; адрес области данных BIOS
  43. CMOS_PORT EQU 70h ; порт для доступа к CMOS-памяти
  44. PORT_6845 EQU 0063h ; адрес области данных BIOS,
  45. ; где записано значение адреса
  46. STATUS_PORT EQU 64h ; порт состояния клавиатуры
  47. SHUT_DOWN EQU 0feh ; команда сброса процессора
  48. VIRTUAL_MODE EQU 0001h ; бит перехода в защищённый режим
  49. A20_PORTEQU 0d1h ; команда управления линией A20
  50. A20_ON EQU 0dfh ; открыть A20
  51. A20_OFF EQU 0ddh ; закрыть A20
  52. KBD_PORT_A EQU 60h ; адреса клавиатурных
  53. KBD_PORT_B EQU 61h ; портов
  54. INT_MASK_PORT EQU 21h ; порт для маскирования прерываний
  55. STACK STACK_SIZE ; сегмент стека
  56. DATASEG ; начало сегмента данных
  57. DSEG_BEG= THIS WORD
  58. ; Память для хранения регистров SS, SP, ES. Содержимое
  59. ; этих регистров будет записано здесь перед входом в
  60. ; защищённый режим и восстановлено отсюда после возврата
  61. ; из защищённого режима в реальный.
  62. real_ss dw ?
  63. real_sp dw ?
  64. real_es dw ?
  65. ; Глобальная таблица дескрипторов GDT,
  66. ; содержит следующие дескрипторы:
  67. ;
  68. ; gdt_0 - дескриптор для пустого селектора
  69. ; gdt_gdt - дескриптор для GDT
  70. ; gdt_ds - дескриптор для сегмента, адресуемого DS
  71. ; gdt_cs - дескриптор для сегмента кода
  72. ; gdt_ss - дескриптор для сегмента стека
  73. ; gdt_bio - дескриптор для области данных BIOS
  74. ; gdt_crt - дескриптор для видеопамяти цветного дисплея
  75. ; gdt_mda - дескриптор для видеопамяти монохромного дисплея
  76. GDT_BEG = $
  77. LABEL gdtr WORD
  78. gdt_0 desc_struc <0,0,0,0,0>
  79. gdt_gdt desc_struc <GDT_SIZE-1,,,DATA_ACC,0>
  80. gdt_ds desc_struc <DSEG_SIZE-1,,,DATA_ACC,0>
  81. gdt_cs desc_struc <CSEG_SIZE-1,,,CODE_ACC,0>
  82. gdt_ss desc_struc <STACK_SIZE-1,,,DATA_ACC,0>
  83. gdt_bio desc_struc <B_DATA_SIZE-1,B_DATA_ADDR,0,DATA_ACC,0>
  84. gdt_crt desc_struc <CRT_SIZE-1,CRT_LOW,CRT_SEG,DATA_ACC,0>
  85. gdt_mda desc_struc <MONO_SIZE-1,MONO_LOW,CRT_SEG,DATA_ACC,0>
  86. GDT_SIZE= ($ - GDT_BEG) ; размер таблицы дескрипторов
  87. CODESEG ; сегмент кода
  88. PROC start
  89. ; Инициализируем регистр сегмента данных
  90. ; для реального режима
  91. mov ax,DGROUP
  92. mov ds,ax
  93. ; Определяем базовый адрес видеопамяти
  94. call set_crt_base
  95. ; Стираем экран дисплея (устанавливаем серый фон)
  96. mov bh, 77h
  97. call clrscr
  98. ; Выполняем все подготовительные действия для перехода
  99. ; в защищённый режим и обеспечения возможности возврата
  100. ; в реальный режим
  101. call init_protected_mode
  102. ; Переключаемся в защищённый режим
  103. call set_protected_mode
  104. ENDP start
  105. ; ------------------------------------------------------------
  106. ; Макрокоманда для записи в дескриптор 24-битового
  107. ; базового адреса сегмента
  108. ; ------------------------------------------------------------
  109. MACRO setgdtentry
  110. mov [(desc_struc bx).base_l],ax
  111. mov [(desc_struc bx).base_h],dl
  112. ENDM
  113. PROC enable_a20 NEAR
  114. mov al,A20_PORT
  115. out STATUS_PORT,al
  116. mov al,A20_ON
  117. out KBD_PORT_A,al
  118. ret
  119. ENDP enable_a20
  120. ; ------------------------------------------------------------
  121. ; Процедура подготовки процессора к переходу в защищённый
  122. ; режим с последующим возвратом в реальный режим
  123. ; ------------------------------------------------------------
  124. PROC init_protected_mode NEAR
  125. ; Заполняем глобальную таблицу дескрипторов GDT
  126. ; Вычисляем 24-битовый базовый адрес сегмента данных
  127. mov ax,DGROUP
  128. mov dl,ah
  129. shr dl,4
  130. shl ax,4
  131. ; Регистры dl:ax содержат базовый адрес, сохраняем его в di:si
  132. mov si,ax
  133. mov di,dx
  134. ; Подготавливаем дескриптор для GDT
  135. add ax,OFFSET gdtr
  136. adc dl,0
  137. mov bx,OFFSET gdt_gdt
  138. setgdtentry
  139. ; Подготавливаем дескриптор для сегмента ds
  140. mov bx,OFFSET gdt_ds
  141. mov ax,si
  142. mov dx,di
  143. setgdtentry
  144. ; Подготавливаем дескриптор для сегмента cs
  145. mov bx,OFFSET gdt_cs
  146. mov ax,cs
  147. mov dl,ah
  148. shr dl,4
  149. shl ax,4
  150. setgdtentry
  151. ; Подготавливаем дескриптор для сегмента стека
  152. mov bx,OFFSET gdt_ss
  153. mov ax,ss
  154. mov dl,ah
  155. shr dl,4
  156. shl ax,4
  157. setgdtentry
  158. ; Записываем адрес возврата в реальный режим в область
  159. ; данных BIOS по адресу 0040h:0067h
  160. push ds
  161. mov ax,40
  162. mov ds,ax
  163. mov [WORD 67],OFFSET shutdown_return
  164. mov [WORD 69],cs
  165. pop ds
  166. ; Маскируем все прерывания, в том числе немаскируемые.
  167. ; Записываем в CMOS-память в ячейку 0Fh код 5,
  168. ; этот код обеспечит после выполнения сброса процессора
  169. ; передачу управления по адресу, подготовленному нами
  170. ; в области данных BIOS по адресу 0040h:0067h.
  171. ; Для того, чтобы немаскируемые прерывания были запрещены,
  172. ; устанавливаем в 1 старший бит при определении ячейки CMOS.
  173. cli
  174. mov al,8f
  175. out CMOS_PORT,al
  176. jmp next1 ; небольшая задержка
  177. next1:
  178. mov al,5
  179. out CMOS_PORT+1,al ; код возврата
  180. ret
  181. ENDP init_protected_mode
  182. PROC set_protected_mode NEAR
  183. mov ax,[rl_crt] ; записываем в es сегментный
  184. mov es,ax ; адрес видеопамяти
  185. call enable_a20 ; открываем адресную линию A20
  186. mov [real_ss],ss ; запоминаем указатель стека
  187. mov [real_es],es ; для реального режима
  188. ; Загружаем регистр GDTR
  189. lgdt [QWORD gdt_gdt]
  190. ; Устанавливаем защищённый режим работы процессора
  191. mov ax,VIRTUAL_MODE
  192. lmsw ax
  193. ; Мы находимся в защищённом режиме
  194. ; Очищаем внутреннюю очередь команд процессора
  195. ; Выполняем команду межсегментного прерхода,
  196. ; в качестве селектора указываем селектор текущего
  197. ; сегмента кода, в качестве смещения - метку flush
  198. ; jmp far flush
  199. db 0ea
  200. dw OFFSET flush
  201. dw CS_DESCR
  202. LABEL flush FAR
  203. ; Загружаем сегментные регистры SS и DS селекторами
  204. mov ax,SS_DESCR
  205. mov ss,ax
  206. mov ax,DS_DESCR
  207. mov ds,ax
  208. ret
  209. ENDP set_protected_mode
  210. END start
  211.  
При использовании обязательна ссылка на http://DMTSoft.ru

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 1 января 2008, 13:17 Сообщение № 2
Код конечно огромныйsmsm Может, кто-нибудь предложит компактныйsmsm
Пользователь: lilo
Сообщений: 38
Статус: Незримый
Зарегистрирован:
8 января 2008, 12:39
Был:9 апреля 2008, 19:55
lilo
smsup
Дата: 8 января 2008, 12:53 Сообщение № 3
там же фрагмент нужен, как я поняла в среднем коды программ не более 15 строк sm
Пользователь: litovets
Сообщений: 4
Статус: Незримый
Зарегистрирован:
8 января 2008, 14:36
Был:26 января 2008, 17:33
litovets
smsup
Дата: 13 января 2008, 2:31 Сообщение № 4
тут разобрана адресация памяти для 286 процессоров, в них не было еще страничной адресации памяти. вот. а надо для 386
Пользователь: lilo
Сообщений: 38
Статус: Незримый
Зарегистрирован:
8 января 2008, 12:39
Был:9 апреля 2008, 19:55
lilo
smsup
Дата: 15 января 2008, 0:51 Сообщение № 5
мои ответы выложите там как раз про i386