Несколько вопросов начинающего

Тема в разделе "WASM.BEGINNERS", создана пользователем s3dworld, 6 окт 2010.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Хм. Написал следующее, файл boot.asm:

    Код (Text):
    1. ; *******************************************************************************
    2. ; Имя:           boot
    3. ; Описание:     Загрузочный сектор
    4. ; Автор:       Дубровкин Сергей
    5. ; Начало:     21.10.2010 - 17:54
    6. ; Завершение: ??.??.???? - ??:??
    7. ; *******************************************************************************
    8.  
    9. use16
    10. org 0x7C00
    11.  
    12. ; *******************************************************************************
    13. ;                                      К О Д
    14. ; *******************************************************************************
    15.  
    16. boot__Code16:
    17.     mov AX,CS
    18.     mov DS,AX
    19.     mov ES,AX
    20.     mov FS,AX
    21.     mov GS,AX
    22.     mov AX,boot__Stack16
    23.     mov SS,AX
    24.     mov AX,boot__StackStart16
    25.     mov SP,AX
    26.    
    27.     call Boot__SaveScreen
    28.     call Boot__InitScreen
    29.    
    30.     mov BL,00000000b
    31.     call Boot__ClearScreen
    32.    
    33.     mov SI,boot__TextTitle
    34.     mov BL,00001111b
    35.     mov DH,2
    36.     mov DL,32
    37.     call Boot__DrawText
    38.    
    39.     mov SI,boot__TextDescription
    40.     mov BL,00001111b
    41.     mov DH,3
    42.     mov DL,27
    43.     call Boot__DrawText
    44.    
    45.     mov SI,boot__TextKey1
    46.     mov BL,00001111b
    47.     mov DH,10
    48.     mov DL,26
    49.     call Boot__DrawText
    50.    
    51.     mov SI,boot__TextKey2
    52.     mov BL,00001111b
    53.     mov DH,12
    54.     mov DL,28
    55.     call Boot__DrawText
    56.    
    57.     mov SI,boot__TextAutors
    58.     mov BL,00001111b
    59.     mov DH,22
    60.     mov DL,20
    61.     call Boot__DrawText
    62.    
    63.     mov SI,boot__TextYear
    64.     mov BL,00001111b
    65.     mov DH,23
    66.     mov DL,36
    67.     call Boot__DrawText
    68.    
    69.     call Boot__KeyDown
    70.     cmp AL,0x00
    71.     jz Boot__LabelEnd
    72.     jmp Boot__LabelContinue
    73.    
    74.     Boot__LabelEnd:
    75.         call Boot__LoadScreen
    76.         int 0x18
    77.    
    78.     Boot__LabelContinue:
    79.         mov DH,0x00
    80.         mov DL,0x00
    81.         call Boot__SetCursorPos
    82.        
    83.         mov BL,00010000b
    84.         call Boot__ClearScreen
    85.        
    86.         mov AX,CS
    87.         mov ES,AX
    88.         mov AH,0x02         ; Функция
    89.         mov AL,0x02         ; Количество секторов
    90.         mov CH,00000000b    ; Номер цилиндра
    91.         mov CL,00000010b    ; Номер сектора
    92.         mov DH,0x00         ; Номер головки
    93.         mov DL,0x00         ; Номер дисковода
    94.         mov BX,boot__End
    95.         int 0x13
    96.        
    97.         jmp boot__End
    98.  
    99. ; *******************************************************************************
    100. ;                                П Р О Ц Е Д У Р Ы
    101. ; *******************************************************************************
    102.  
    103. ; ------------------------------------------------------------------------------{
    104. ; Название: BootKeyDown()
    105. ; Описание: Нажатие клавиши
    106. ; Вход:     Нет
    107. ; Выход:   AL - код
    108. ; -------------------------------------------------------------------------------
    109. Boot__KeyDown:
    110.     Boot__KeyDownRepeat:
    111.         mov AH,0x00
    112.         int 0x16
    113.         cmp AH,0x01
    114.     jz Boot__KeyDownEscape
    115.         cmp AH,0x1C
    116.     jz Boot__KeyDownEnter
    117.         jmp Boot__KeyDownRepeat
    118.    
    119.     Boot__KeyDownEscape:
    120.         mov AL,0x00
    121.         jmp Boot__KeyDownEnd
    122.    
    123.     Boot__KeyDownEnter:
    124.         mov AL,0x01
    125.        
    126.     Boot__KeyDownEnd:
    127. ret
    128. ; ------------------------------------------------------------------------------}
    129.  
    130. ; ------------------------------------------------------------------------------{
    131. ; Название: BootSaveScreen()
    132. ; Описание: Сохранение видео-режима
    133. ; Вход:     Нет
    134. ; Выход:   Нет
    135. ; -------------------------------------------------------------------------------
    136. Boot__SaveScreen:
    137.     mov AH,0x0F
    138.     int 0x10
    139.     mov [boot__ScreenMode],AL
    140.     mov [boot__Symbols],AH
    141.     mov [boot__PageNumber],BH
    142. ret
    143. ; ------------------------------------------------------------------------------}
    144.  
    145. ; ------------------------------------------------------------------------------{
    146. ; Название: BootLoadScreen()
    147. ; Описание: Загрузка видео-режима
    148. ; Вход:     Нет
    149. ; Выход:   Нет
    150. ; -------------------------------------------------------------------------------
    151. Boot__LoadScreen:
    152.     mov AH,0x00
    153.     mov AL,[boot__ScreenMode]
    154.     int 0x10
    155.     mov AL,[boot__PageNumber]
    156.     call Boot__SetScreenPage
    157. ret
    158. ; ------------------------------------------------------------------------------}
    159.  
    160. ; ------------------------------------------------------------------------------{
    161. ; Название: BootInitScreen()
    162. ; Описание: Инициализация видео-режима
    163. ; Вход:     Нет
    164. ; Выход:   Нет
    165. ; -------------------------------------------------------------------------------
    166. Boot__InitScreen:
    167.     mov AH,0x00
    168.     mov AL,0x03
    169.     int 0x10
    170. ret
    171. ; ------------------------------------------------------------------------------}
    172.  
    173. ; ------------------------------------------------------------------------------{
    174. ; Название: BootClearScreen()
    175. ; Описание: Очистка экрана
    176. ; Вход:     BL - цвет
    177. ; Выход:   Нет
    178. ; -------------------------------------------------------------------------------
    179. Boot__ClearScreen:
    180.     mov AH,0x09
    181.     mov AL,' '
    182.     mov BH,0x00
    183.     mov CX,2000
    184.     int 0x10
    185. ret
    186. ; ------------------------------------------------------------------------------}
    187.  
    188. ; ------------------------------------------------------------------------------{
    189. ; Название: BootSetScreenPage()
    190. ; Описание: Установка страницы
    191. ; Вход:     AL - номер страница
    192. ; Выход:   Нет
    193. ; -------------------------------------------------------------------------------
    194. Boot__SetScreenPage:
    195.     mov AH,0x05
    196.     int 0x10
    197. ret
    198. ; ------------------------------------------------------------------------------}
    199.  
    200. ; ------------------------------------------------------------------------------{
    201. ; Название: BootSetCursorPos()
    202. ; Описание: Установка положения курсора
    203. ; Вход:     DH - номер строки
    204. ;           DL - номер столбца
    205. ; Выход:   Нет
    206. ; -------------------------------------------------------------------------------
    207. Boot__SetCursorPos:
    208.     mov AH,0x02
    209.     mov BH,0x00
    210.     int 0x10
    211. ret
    212. ; ------------------------------------------------------------------------------}
    213.  
    214. ; ------------------------------------------------------------------------------{
    215. ; Название: BootDrawText()
    216. ; Описание: Вывод текста
    217. ; Вход:     BL - атрибуты текста
    218. ;           DH - номер строки
    219. ;           DL - номер столбца
    220. ; Выход:   Нет
    221. ; -------------------------------------------------------------------------------
    222. Boot__DrawText:
    223.     mov CX,1
    224.  
    225.     Boot__DrawTextLoop:
    226.         call Boot__SetCursorPos
    227.         mov AH,0x09
    228.         mov BH,0x00
    229.         lodsb
    230.         cmp AL,0x00
    231.         jz Boot__DrawTextExit
    232.         int 0x10
    233.         inc DL
    234.     jmp Boot__DrawTextLoop
    235.  
    236.     Boot__DrawTextExit:
    237. ret
    238. ; ------------------------------------------------------------------------------}
    239.  
    240. ; *******************************************************************************
    241. ;                                   Д А Н Н Ы Е
    242. ; *******************************************************************************
    243.  
    244. boot__Data16:
    245.     boot__ScreenMode        db 0x00
    246.     boot__Symbols           db 0x00
    247.     boot__PageNumber        db 0x00
    248.     boot__TextTitle         db "Hello in BOS!",0x00
    249.     boot__TextDescription   db "(Basic Operation System)",0x00
    250.     boot__TextKey1          db "Press 'Enter' for continue.",0x00
    251.     boot__TextKey2          db "Press 'Escape' for exit.",0x00
    252.     boot__TextAutors        db "Dubrovkin Sergei & Konstantin Dement'ev",0x00
    253.     boot__TextYear          db "(2010)",0x00
    254.  
    255. ; *******************************************************************************
    256. ;                                    С Т Е К
    257. ; *******************************************************************************
    258.  
    259. boot__Stack16:
    260.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    261.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    262.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    263.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    264.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    265.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    266.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    267.     boot__StackStart16:
    268.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    269.  
    270. ; *******************************************************************************
    271. ;                           Д О П О Л Н И Т Е Л Ь Н О
    272. ; *******************************************************************************
    273.  
    274. ; Заполнение до 510 байт
    275. rb 510-($-$$)
    276. ; Метка загрузочного сектора
    277. db 0x55,0xAA
    278.  
    279. boot__End:
    280.     include "translation_pmode.asm"
    281.  
    282. ; Дубровкин Сергей © 2010
    А вот файл translation_pmode.asm:

    Код (Text):
    1. ; Имя:           translation_pmode
    2. ; Описание:     Перевод процессора в защищённый режим
    3. ; Автор:       Дубровкин Сергей
    4. ; Начало:     23.10.2010 - 11:48
    5. ; Завершение: ??.??.???? - ??:??
    6. ; *******************************************************************************
    7.  
    8. use16
    9.  
    10. ; *******************************************************************************
    11. ;                                      К О Д
    12. ; *******************************************************************************
    13.  
    14. translation_pmode__Code16:
    15.     cli
    16.     in AL,0x92
    17.     or AL,2
    18.     out 0x92,AL
    19.     lgdt [translation_pmode__GDTR]
    20.     mov EAX,CR0
    21.     or AL,1
    22.     mov CR0,EAX
    23.     jmp 0000000000001000b:translation_pmode__Code32 ; Index(13), TI(1), RPL(2)
    24.  
    25. translation_pmode__Code32:
    26.     sti
    27.     hlt
    28.  
    29. ; *******************************************************************************
    30. ;                                   Д А Н Н Ы Е
    31. ; *******************************************************************************
    32.  
    33. translation_pmode__Data16:
    34.     translation_pmode__GDTR:
    35.         dw 8*5-1
    36.         dq translation_pmode__gdt
    37.        
    38.     translation_pmode__gdt:
    39.         translation_pmode__descriptor0:
    40.             db 00000000b            ; Base Address(8)
    41.             db 00000000b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    42.             db 00000000b            ; P(1), DPL(2), S(1), Type(4)
    43.             db 00000000b            ; Base Address(8)
    44.             dw 0000000000000000b    ; Base Address(16)
    45.             dw 0000000000000000b    ; Segment Limit(16)
    46.         translation_pmode__descriptor1:
    47.             db 00000000b            ; Base Address(8)
    48.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    49.             db 10011000b            ; P(1), DPL(2), S(1), Type(4)
    50.             db 00000000b            ; Base Address(8)
    51.             dw 0000000000000000b    ; Base Address(16)
    52.             dw 1111111111111111b    ; Segment Limit(16)
    53.         translation_pmode__descriptor2:
    54.             db 00000000b            ; Base Address(8)
    55.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    56.             db 10010010b            ; P(1), DPL(2), S(1), Type(4)
    57.             db 00000000b            ; Base Address(8)
    58.             dw 0000000000000000b    ; Base Address(16)
    59.             dw 1111111111111111b    ; Segment Limit(16)
    60.         translation_pmode__descriptor3:
    61.             db 00000000b            ; Base Address(8)
    62.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    63.             db 11111000b            ; P(1), DPL(2), S(1), Type(4)
    64.             db 00000000b            ; Base Address(8)
    65.             dw 0000000000000000b    ; Base Address(16)
    66.             dw 1111111111111111b    ; Segment Limit(16)
    67.         translation_pmode__descriptor4:
    68.             db 00000000b            ; Base Address(8)
    69.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    70.             db 11110010b            ; P(1), DPL(2), S(1), Type(4)
    71.             db 00000000b            ; Base Address(8)
    72.             dw 0000000000000000b    ; Base Address(16)
    73.             dw 1111111111111111b    ; Segment Limit(16)
    74.  
    75. translation_pmode__Data32:
    76.  
    77. ; *******************************************************************************
    78. ;                                    С Т Е К
    79. ; *******************************************************************************
    80.  
    81. translation_pmode__Stack16:
    82.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    83.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    84.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    85.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    86.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    87.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    88.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    89.     translation_pmode__StackStart16:
    90.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    91.  
    92. translation_pmode__Stack32:
    93.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    94.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    95.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    96.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    97.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    98.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    99.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    100.     translation_pmode__StackStart32:
    101.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    102.  
    103. rb (1024*1024*1)-1-($-$$)
    104. db 0x00
    И что-то я не так написал. При нажатии на кнопку Enter у меня должен осуществляться переход в защищённый режим, а вместе этого у меня компьютер как-будто сбрасывается. Что я не так сделал?
     
  2. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Наверное, потому что после перехода в PM прерывания разрешили, а таблицу прерываний не настроили? Не?
     
  3. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    FatMoon
    Вы не поверите, но некоторые с этого и начинают.
    Берут ПЛИСину...
    :):):):):)
     
  4. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    KIV
    Убрал sti и всё равно тоже самое. Что не так?
     
  5. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    У тебя вроде бы дескрипторы сегментов задом на перёд (поля дескриптора в обратном порядке).
     
  6. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    KIV
    Вот у меня так:

    Код (Text):
    1. translation_pmode__descriptor1:
    2.     db 00000000b            ; Base Address(8)
    3.     db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    4.     db 10011000b            ; P(1), DPL(2), S(1), Type(4)
    5.     db 00000000b            ; Base Address(8)
    6.     dw 0000000000000000b    ; Base Address(16)
    7.     dw 1111111111111111b    ; Segment Limit(16)
    А как надо, так что ли:

    Код (Text):
    1. translation_pmode__descriptor1:
    2.     dw 1111111111111111b    ; Segment Limit(16)
    3.     dw 0000000000000000b    ; Base Address(16)
    4.     db 00000000b            ; Base Address(8)
    5.     db 10011000b            ; P(1), DPL(2), S(1), Type(4)
    6.     db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    7.     db 00000000b            ; Base Address(8)
    Или у меня просто в каждом поле биты были задом наперёд?
     
  7. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    И сегменты вроде бы правильно настроил:

    Код (Text):
    1. mov AX,0000000000010000b
    2. mov DS,AX
    3. mov ES,AX
    4. mov FS,AX
    5. mov GS,AX
    6. mov SS,AX
    7. mov EAX,translation_pmode__StackStart32
    8. mov ESP,EAX
     
  8. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    KIV
    Спасибо большое! Теперь всё работает:

    Код (Text):
    1. ; Имя:           translation_pmode
    2. ; Описание:     Перевод процессора в защищённый режим
    3. ; Автор:       Дубровкин Сергей
    4. ; Начало:     23.10.2010 - 11:48
    5. ; Завершение: ??.??.???? - ??:??
    6. ; *******************************************************************************
    7.  
    8. use16
    9.  
    10. ; *******************************************************************************
    11. ;                                      К О Д
    12. ; *******************************************************************************
    13.  
    14. translation_pmode__Code16:
    15.     cli
    16.     in AL,0x92
    17.     or AL,2
    18.     out 0x92,AL
    19.     lgdt [translation_pmode__GDTR]
    20.     mov EAX,CR0
    21.     or AL,1
    22.     mov CR0,EAX
    23.     jmp 0000000000001000b:translation_pmode__Code32 ; Index(13), TI(1), RPL(2)
    24.  
    25. translation_pmode__Code32:
    26.     use32
    27.     mov AX,0000000000010000b
    28.     mov DS,AX
    29.     mov ES,AX
    30.     mov FS,AX
    31.     mov GS,AX
    32.     mov SS,AX
    33.     mov EAX,translation_pmode__StackStart32
    34.     mov ESP,EAX
    35.     hlt
    36.  
    37. ; *******************************************************************************
    38. ;                                   Д А Н Н Ы Е
    39. ; *******************************************************************************
    40.  
    41. translation_pmode__Data16:
    42.     translation_pmode__GDTR:
    43.         dw 8*3-1
    44.         dq translation_pmode__gdt
    45.        
    46.     translation_pmode__gdt:
    47.         translation_pmode__descriptor0:
    48.             ;db 00000000b           ; Base Address(8)
    49.             ;db 00000000b           ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    50.             ;db 00000000b           ; P(1), DPL(2), S(1), Type(4)
    51.             ;db 00000000b           ; Base Address(8)
    52.             ;dw 0000000000000000b   ; Base Address(16)
    53.             ;dw 0000000000000000b   ; Segment Limit(16)
    54.             dw 0000000000000000b    ; Segment Limit(16)
    55.             dw 0000000000000000b    ; Base Address(16)
    56.             db 00000000b            ; Base Address(8)
    57.             db 00000000b            ; P(1), DPL(2), S(1), Type(4)
    58.             db 00000000b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    59.             db 00000000b            ; Base Address(8)
    60.         translation_pmode__descriptor1:
    61.             ;db 00000000b           ; Base Address(8)
    62.             ;db 11001111b           ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    63.             ;db 10011000b           ; P(1), DPL(2), S(1), Type(4)
    64.             ;db 00000000b           ; Base Address(8)
    65.             ;dw 0000000000000000b   ; Base Address(16)
    66.             ;dw 1111111111111111b   ; Segment Limit(16)
    67.             dw 1111111111111111b    ; Segment Limit(16)
    68.             dw 0000000000000000b    ; Base Address(16)
    69.             db 00000000b            ; Base Address(8)
    70.             db 10011000b            ; P(1), DPL(2), S(1), Type(4)
    71.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    72.             db 00000000b            ; Base Address(8)
    73.         translation_pmode__descriptor2:
    74.             ;db 00000000b           ; Base Address(8)
    75.             ;db 11001111b           ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    76.             ;db 10010010b           ; P(1), DPL(2), S(1), Type(4)
    77.             ;db 00000000b           ; Base Address(8)
    78.             ;dw 0000000000000000b   ; Base Address(16)
    79.             ;dw 1111111111111111b   ; Segment Limit(16)
    80.             dw 1111111111111111b    ; Segment Limit(16)
    81.             dw 0000000000000000b    ; Base Address(16)
    82.             db 00000000b            ; Base Address(8)
    83.             db 10010010b            ; P(1), DPL(2), S(1), Type(4)
    84.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    85.             db 00000000b            ; Base Address(8)
    86.         ;translation_pmode__descriptor3:
    87.         ;   db 00000000b            ; Base Address(8)
    88.         ;   db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    89.         ;   db 11111000b            ; P(1), DPL(2), S(1), Type(4)
    90.         ;   db 00000000b            ; Base Address(8)
    91.         ;   dw 0000000000000000b    ; Base Address(16)
    92.         ;   dw 1111111111111111b    ; Segment Limit(16)
    93.         ;translation_pmode__descriptor4:
    94.         ;   db 00000000b            ; Base Address(8)
    95.         ;   db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    96.         ;   db 11110010b            ; P(1), DPL(2), S(1), Type(4)
    97.         ;   db 00000000b            ; Base Address(8)
    98.         ;   dw 0000000000000000b    ; Base Address(16)
    99.         ;   dw 1111111111111111b    ; Segment Limit(16)
    100.  
    101. translation_pmode__Data32:
    102.  
    103. ; *******************************************************************************
    104. ;                                    С Т Е К
    105. ; *******************************************************************************
    106.  
    107. translation_pmode__Stack16:
    108.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    109.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    110.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    111.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    112.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    113.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    114.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    115.     translation_pmode__StackStart16:
    116.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    117.  
    118. translation_pmode__Stack32:
    119.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    120.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    121.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    122.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    123.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    124.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    125.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    126.     translation_pmode__StackStart32:
    127.     db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    128.  
    129. rb (1024*1024*1)-1-($-$$)
    130. db 0x00
     
  9. Miyamoto

    Miyamoto New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    46
    s3dworld, читайте "Микропроцессоры Intel: 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro Processor, Pentium 4. Архитектура, программирование и интерфейсы" Барри Брэя, параллельно c этим изучая английский. После английского читайте Intel Manuals. Если до мануалов прочтете и поймете Брэя, то разберетесь с мануалами малой кровью.

    В любом случае, продолжать сыпать элементарными вопросами, несмотря на неоднократные советы-предупреждения от опытных и умных людей и не имея за плечами не то что базы, а даже минимума -- значит зарекомендовать себя как человека недалекого.
     
  10. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго утра!

    Моя задача: разобраться в работе процессора и написать операционную систему для длинного режима (L-Mode) работы процессора. Но прежде чем переходить к длинному режиму (L-Mode), следует разобраться в защищённом режиме (P-Mode) и в естественное в режиме реальных адресов (R-Mode).

    С режимом реальных адресов (R-Mode) я разобрался. Теперь меня мучают вопросы, связанные с оперативной памятью (ОЗУ) и со страничной организацией памяти.

    Пока не рассматриваю длинный режим (L-Mode) работы процессора, так как не разобрался ещё в защищённом режиме (P-Mode) - то есть пока у меня адресная память имеет предел в 4 ГБ. Так вот, под все эти 4 ГБ под оперативную память (ОЗУ) отводится только определённая часть адресов (эта часть большая, по сравнению с другими).

    Слышал я что через функции BIOS можно определить какие диапазоны адресов доступны для оперативной памяти (ОЗУ). Но вот что меня мучает: если через BIOS мы можем определить, то это только в режиме реальных адресов (R-Mode) или в режиме совместимости (V-Mode). А как же определить диапазон адресов для оперативной памяти (ОЗУ) на 4 ГБ адресном пространстве? А на 16777216 ТБ адресном пространстве?

    И как вообще дело обстоит со страничной адресацией, ведь тут же нужно учитывать адреса, отведённые под оперативную память (ОЗУ)? Ведь глупо просто взять и заполнить все странички (одна страничка будет у меня на 4 МБ) в одноуровневой таблице из 1024 элементов, описывающих всё адресное пространство? А то ведь тогда страничка будет обращаться не к оперативной памяти (ОЗУ), а к памяти какого-нибудь устройства. Так ведь?

    Что я хочу понять, так это алгоритм как делать. Нужно странички описывать только лишь на адреса, отведённые для оперативной памяти (ОЗУ). Так ведь? Это я имею в виду для программ пользователя. А для программ операционной системы (ОС) можно составить странички для видеопамяти и прочих устройств. Всё так? И потом странички прикладных программ (программ пользователя) выгружать и подгружать. А странички с программами операционной системы (ОС) и памяти устройств - постоянно держать в памяти.

    Это тут мои доводы, вариантов кучу. Хочу услышать Ваше мнение.
     
  11. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    s3dworld
    На осдевовской вике я в своё время написал, как определять диапазоны памяти. Всё необходимое там сказано. А

    тем способом, что делаете Вы (и подавляющая часть других осеписателей) невозможно: там очень много различных нюансов, сложностей и т.п., так что написать её с наскока, без тщательного предварительного проектирования, не сможет даже высококвалифицированный программист, собаку съевший на системном программировании (максимум, что он сможет сделать без проекта, -- это выдать систему типа MS DOS или нечто подобное -- работающее, но примитивное).
     
  12. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    SII
    Не эта ли статья?

    http://ru.osdev.wikia.com/wiki/Определение_объёма_памяти

    Вот я начал составлять таблицу прерываний:

    Код (Text):
    1. translation_pmode__Data32:
    2.     translation_pmode__IDTR:
    3.         dw 8*18-1
    4.         dq translation_pmode__idt
    5.    
    6.     translation_pmode__idt:
    7.         translation_pmode__vector0:
    8.             dw 0000000000000000b    ; Смещение(16)
    9.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    10.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    11.             dw 0000000000000000b    ; Смещение(16)
    12.         translation_pmode__vector1:
    13.             dw 0000000000000000b    ; Смещение(16)
    14.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    15.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    16.             dw 0000000000000000b    ; Смещение(16)
    17.         translation_pmode__vector2:
    18.             dw 0000000000000000b    ; Смещение(16)
    19.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    20.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    21.             dw 0000000000000000b    ; Смещение(16)
    22.         translation_pmode__vector3:
    23.             dw 0000000000000000b    ; Смещение(16)
    24.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    25.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    26.             dw 0000000000000000b    ; Смещение(16)
    27.         translation_pmode__vector4:
    28.             dw 0000000000000000b    ; Смещение(16)
    29.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    30.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    31.             dw 0000000000000000b    ; Смещение(16)
    32.         translation_pmode__vector5:
    33.             dw 0000000000000000b    ; Смещение(16)
    34.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    35.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    36.             dw 0000000000000000b    ; Смещение(16)
    37.         translation_pmode__vector6:
    38.             dw 0000000000000000b    ; Смещение(16)
    39.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    40.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    41.             dw 0000000000000000b    ; Смещение(16)
    42.         translation_pmode__vector7:
    43.             dw 0000000000000000b    ; Смещение(16)
    44.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    45.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    46.             dw 0000000000000000b    ; Смещение(16)
    47.         translation_pmode__vector8:
    48.             dw 0000000000000000b    ; Смещение(16)
    49.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    50.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    51.             dw 0000000000000000b    ; Смещение(16)
    52.         translation_pmode__vector9:
    53.             dw 0000000000000000b    ; Смещение(16)
    54.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    55.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    56.             dw 0000000000000000b    ; Смещение(16)
    57.         translation_pmode__vector10:
    58.             dw 0000000000000000b    ; Смещение(16)
    59.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    60.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    61.             dw 0000000000000000b    ; Смещение(16)
    62.         translation_pmode__vector11:
    63.             dw 0000000000000000b    ; Смещение(16)
    64.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    65.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    66.             dw 0000000000000000b    ; Смещение(16)
    67.         translation_pmode__vector12:
    68.             dw 0000000000000000b    ; Смещение(16)
    69.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    70.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    71.             dw 0000000000000000b    ; Смещение(16)
    72.         translation_pmode__vector13:
    73.             dw 0000000000000000b    ; Смещение(16)
    74.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    75.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    76.             dw 0000000000000000b    ; Смещение(16)
    77.         translation_pmode__vector14:
    78.             dw 0000000000000000b    ; Смещение(16)
    79.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    80.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    81.             dw 0000000000000000b    ; Смещение(16)
    82.         translation_pmode__vector15:
    83.             dw 0000000000000000b    ; Смещение(16)
    84.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    85.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    86.             dw 0000000000000000b    ; Смещение(16)
    87.         translation_pmode__vector16:
    88.             dw 0000000000000000b    ; Смещение(16)
    89.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    90.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    91.             dw 0000000000000000b    ; Смещение(16)
    92.         translation_pmode__vector17:
    93.             dw 0000000000000000b    ; Смещение(16)
    94.             dw 1000111100000000b    ; P(1), DPL(2), 0(1), D(1), 111(3), 000(3), NULL(5)
    95.             dw 0000000000001000b    ; Селектор сегмента(16): Index(13), TI(1), RPL(2)
    96.             dw 0000000000000000b    ; Смещение(16)
    Это получается что в GDT я могу для каждого прерывания отдельный дескриптор описать (через смещение на нужную процедуру обращаться), могу несколько прерываний в один дескриптор объединить и могу все в один. Да?
     
  13. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Это всё ладно, разберусь. Вот меня мучает страничная адресация памяти. Физический адрес формируется из 32 битного значения линейного значения: 10 бит указывают на каталог таблиц + 10 бит указывают на каталог страниц + 12 бит указывают на смещение (максимальное 4 КБ). Всё это показано на рисунке:

    [​IMG]

    Но как обращаться к странице, где хранить это 32-битное значение? Нужен дли для этого сегментный регистр (правда он же 16-битный). Вот это я не понимаю. Или же достаточно загрузить значение в регистр общего назначения и потом его использовать:

    Код (Text):
    1. ; 1-ая таблица, 3-яя страница, 0-ое смещение
    2. mov EAX,00000000010000000011000000000000b    ; Таблица(10), Страница(10), Смещение(12)
    3. mov [EAX],0xFFFFFFFF
    Но ведь при адресации обязательно используется сегментный регистр по умолчанию (если нет переопределения сегментного регистра). Вот я и не понимаю где и как нужно обращаться к определённой страничке.

    Всё это было описано для 4 КБ страничек. А я хочу использовать странички по 4 МБ, то есть таблица будет одноуровневой. И как тогда идёт обращение к страничке? Пускай те же 32 бита. Из них 10 бит используется для определения индекса странички из таблицы, но остальные 22 для чего? Смещение в 4 МБ можно описать через 22 бита. Неужели всё так просто?

    Но всё же, сегменты, странички. Вот я и запутался. Где указывать какую страничку я хочу выбрать? Есть у меня предположение, что в в сегментном регистре указать тупо дескриптор данных на всё адресное пространство (чтобы от процессора отвязаться), а уже в регистре общего назначения (он же на 32 бита) указывать данные именно для таблицы.
     
  14. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Давно я эти режимы изучал. Вроде так.
    Вы в GDTR загружаете адрес глобальной таблицы описателей, а в LDTR адрес адрес локальной таблицы дескрипторов, в CR3 - адрес каталога страниц.
    Когда используете адрес например SS:ESP , то проц сам определяет по сегментному регистру какой по счёту описатель в какой таблице использовать, затем извлекает из описателя базу и складывает её со смещением ESP, получается 32-битное значение.

    s3dworld
    Но как обращаться к странице, где хранить это 32-битное значение?

    Это как раз то 32-битное значение про которое вы спрашиваете. Нигде вроде оно не хранится, этот виртуальный адрес как вы видите - временно полученный результат.
    Затем используя заданный в CR3 каталог страниц, проц преобразует этот виртуальный адрес в физический.
     
  15. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    s3dworld
    Она самая.
     
  16. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Зачем? Это же обычный адрес
    Код (Text):
    1. mov dword[00000000010000000011000000000000b], 0xFFFFFFFF
     
  17. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Хорошо, пускай всё так, будет выбираться страница из 32-битного смещения. А вот как дело обстоит с заполнением таблицы прерываний IDT. В качестве её элементов выступают дескрипторы прерываний, ловушек и задач. Они имеют указатель на сегмент (хорошо, таким образом я могу всё слить на один единственный сегмент кода во всю адресную память), и задают 32-битное смещение. Именно это 32-битное смещение и будет определять страницу и смещение в ней?
     
  18. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Да.
     
  19. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    s3dworld
    Нет не это 32-битное смещение.

    Когда вы вызовете прерывание, по номеру будет найден соответствующий дескриптор1 в IDT. В этом дескрипторе1 будет информация Селектор:Cмещение - для соответствующего обработчика прерывания. Затем проц полезет в GDT или LDT(в зависимости от селектора), чтоб найти дескриптор2 соответствующий селектору. База взятая из дескриптора2 сложится со смещением - этот виртуальный адрес и будет определять страницу и смещение в ней.
    Вот настолько сложен реальный мир.
     
  20. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Nafanya
    Но если база дескриптора, на который указывает сегментный регистр (селектор дескриптора), равна 0x00000000, тогда будет так, как я и описал - 32-битный регистр и будет определять страничку и смещение в ней. Правильно?