Модели памяти

Тема в разделе "WASM.OS.DEVEL", создана пользователем AntiB, 28 ноя 2007.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    бит направления должен быть установлен для роста вниз в дескрипторе, что для данных имхо лучше не делать.
     
  2. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    n0name
    Этот бит имеет смысл, если используется защита от переполнения стека с помощью предела сегмента. Но в плоской модели сегменты фактически не используются, поэтому на сей бит глубоко плевать. А защита стека осуществляется на уровне страниц (когда при очередном обращении к стеку возникает прерывание по отсутствию страницы (не выгруженности, а именно по отсутствию), ОС либо выделяет стеку ещё одну страницу, либо снимает задачу из-за переполнения стека)
     
  3. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    я использую fasm - то что jmp надо это я понимаю - но куда? когда у меня бил дескриптор кода именно - то я делал jmp по pm_entry, но сейчас у меня дескриптор указывает на всю память - тогда наверно нада вычислить физический адрес pm_entry и делать jmp туда - это верно? если да - то как это сделать?
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. SEG = 0x9000
    2.  
    3. org 0x7C00
    4. use16
    5. start:
    6. ; код boot-сектора (загрузка дополнительных секторов по адресу SEG:0000)
    7.     jmp far SEG:0
    8. db 0 dup(512 - ($ - start))
    9. org 0
    10. @@:
    11.     mov ax, SEG
    12.     mov ds, ax
    13.     db 0x66
    14.     lgdt fword [gdtr - SEG SHL 4]
    15. ...
    16.     db 0x66
    17.     db 0xEA
    18.     dd @F
    19.     dw CS_SEL
    20. org SEG SHL 4 + $ - @B
    21. use32
    22. @@:
    23. ...
    24. gdtr:
    25.     dw GDT_SIZE - 1
    26.     dd gdt
    27. gdt:
    28. ...
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    а если перескочить страницы-ловушки?
    тут в отличие от проверки лимита не стопроцентная защита
     
  6. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    rei3er
    я говорю, что если дескриптор загрузить с базой 0 - а у тебя дескриптор с физическим адресом cs!!!
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    у меня дескриптор с селектором CS_SEL
    он может соответствовать любому дескриптору (с люой базой)
     
  8. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    rei3er
    смотри:
    Код (Text):
    1. mov eax, cr0
    2. or al, 1
    3. mov cr0, eax
    4.  
    5. db 0x66
    6. db 0xea
    7. dd pm_entry
    8. dw full_descr
    9. ;jmp fword [code_descr:pme_entry]
    10.  
    11. section pmode use32
    12. pm_entry:
    вот такой код у меня не работает! Почему?
    code_descr - это дескриптор, базу которого, нахожу за формулой base = cs*16 и лимитом в размер секции кода
    full_descr - это дескриптор с базой в 0 и лимитом в 0xffff
     
  9. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    AntiB
    Возможно, оффсет pm_entry не тот. Надо посчитать абсолютный адрес для pm_entry.
     
  10. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    SadKo
    всё норм работает, если вместо full_descr поставить code_descr - но в этом и загвоздка - я, же хочу перейти к флат модели памяти - я думал о варианте что надо вычислить физический адрес pm_entry - но когда пробую - что-то наработает, вот код:
    Код (Text):
    1. mov eax, cr0
    2. or al, 1
    3. mov cr0, eax
    4.  
    5. xor eax, eax
    6. mov ax, pmode
    7. shl eax, 0x04
    8. add eax, pm_entry
    9. mov [pm], eax
    10.  
    11. db 0x66
    12. db 0xea
    13. pm dd 0x00
    14. dw full_descr
    15.  
    16. section pmode use32
    17. pm_entry:
     
  11. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    прерыванийа вырубаешь? full_desс покожи...
     
  12. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Freeman
    сначала (до перехода) - да
    Код (Text):
    1. full_desc desc_struc    0xffff,0,0,data_acc,0xc0,0
    2. ...
    3. struc   desc_struc op1,op2,op3,op4,op5,op6
    4. {
    5. .limit_l                dw  op1
    6. .base_l     dw  op2
    7. .base_m     db  op3
    8. .access     db  op4
    9. .lim_h_f               db   op5
    10. .base_h     db  op6
    11. }
    fasm
     
  13. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    прыготь надо в сегмент кода ;)
     
  14. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    ой, сорри - просто уже переделал - с начала бил code_acc
     
  15. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    вот полной код:
    Код (Text):
    1. format  MZ
    2. heap    0
    3. stack   0x800
    4. entry   _code:start
    5.  
    6.     include 'pmode.inc'
    7.  
    8. fcode_descr =   (fcode_desc-null_desc)
    9. fdata_descr =   (fdata_desc-null_desc)
    10.  
    11. segment _code   use16
    12. start:
    13.     mov     ax, _data
    14.     mov     ds, ax
    15.  
    16.     mov     ax, 0x03
    17.     int     0x10
    18.  
    19.     cli
    20.  
    21.     in      al, 0x70
    22.     or      al, 0x80
    23.     out     0x70, al
    24.  
    25.     in      al, 0x92
    26.     or      al, 0x02
    27.     out     0x92, al
    28.  
    29.     xor     eax, eax
    30.     mov     ax, _gdt
    31.     shl     eax, 0x04
    32.     mov     [gdtr+0x02], eax
    33.  
    34.     lgdt    fword [gdtr]
    35.  
    36.     mov     eax, cr0
    37.     or      al, 1
    38.     mov     cr0, eax
    39.  
    40.     db      0x66
    41.     db      0xea
    42.     dd      pm_entry
    43.     dw      fcode_descr
    44.  
    45. segment pmode   use32
    46. pm_entry:
    47.     mov     ax, fdata_descr
    48.     mov     ds, ax
    49.     mov     es, ax
    50.  
    51.     jmp     $
    52.  
    53. code_size   =   ($-pm_entry)
    54.  
    55. segment _data   use32
    56. gdtr:
    57.     dw  gdt_size-1
    58.     dd  0
    59.  
    60. segment _gdt    use16
    61. gdt:
    62.     null_desc   desc_struc  0,0,0,0,0,0
    63.     fcode_desc  desc_struc  0xffff,0,0,code_acc,0xc0,0
    64.     fdata_desc  desc_struc  0xffff,0,0,data_acc,0xc0,0
    65.  
    66. gdt_size    =   ($-gdt)
    может кто-то подскажет, где ошибка?
     
  16. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    ну поидее надо линейный адрес, т.е.
    dd pm_entry+pmode*10h
    или чото в этом роде
     
  17. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Freeman
    я так и думал :) - но почему-то не работает даже так :dntknw:
    Код (Text):
    1. ...
    2. mov ax, _code
    3. mov ds, ax
    4.  
    5. xor eax, eax
    6. mov ax, pmode
    7. shl eax, 0x04
    8. mov [pm], eax
    9.  
    10. db 0x66   ;имхо чтобы сделать jmp fword ...
    11. db 0xea
    12. pm dd 0x00
    13. dw fcode_descr
    14. ...
     
  18. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    а не просто
     
  19. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Freeman
    а разница? я же создаю новый сегмент pmode, тесть pm_entry = 0 - пробивал ваш вариант - не работает
     
  20. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rei3er
    Да, от любого неверного указателя она не спасёт. Но точно так же от произвольного неверного указателя не спасёт и лимит, поскольку указатель может указывать на допустимую область памяти, но делать это всё равно неправильно (т.е. обращаться не к той ячейке, которую имел ввиду программист). Ну а от банального переполнения стека из-за, например, зациклившейся рекурсии страничная защита вполне спасает.