DPMI memory allocation

Тема в разделе "WASM.ZEN", создана пользователем afw2004, 26 окт 2006.

  1. afw2004

    afw2004 New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2006
    Сообщения:
    14
    Пытаюсь освоить DPMI.

    Выделил селекторы для кода и для данных, установил для них базы и максимальный лимит (4Гб); вошел в защищенный режим.

    Вопросы:

    1. Каким образом нужно инициализировать stack? (например, хочется stack размером в 1М).

    2. Если у меня есть селектор для данных ds (насколько я понимаю, внутри этого селектора можно адресовать 4Гб памяти), как внутри этого селектора динамически выделять и освобождать память? (Например, если в винде вызываю LocalAlloc(LMEM_FIXED...), то могу обращаться к памяти непосредственно через возвращенный указатель; сегментные регистры при этом не меняются, т.е. выделенный блок адресуется тем же селектором). Есть ли в DPMI функции, которые делают что-то подобное?

    Функция DPMI 0501 выделяет блок памяти, но, насколько я понял, для него нужно создавать отдельный селектор. Или может можно выделенный этой функцией блок привязать к уже существующему селектору (ds)?
     
  2. UDN

    UDN New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    7
    format MZ
    heap 0
    segment RMode use16 ;==============================================
    mov ax,1687h ; Âêëþ÷àåì DPMI-(es:di-âõîä â ProtectMode
    int 2Fh ; âûõîä:si=3 (çíà÷èò 48 byte äëÿ XP
    push es di ax ; ax=0,es:di- êëàäåì â ñòåê äëÿ ïåðåõîäà
    mov ax,PMode ;
    mov ds,ax ;
    shl eax,4 ;
    or dword [ds:GDTCS+2],eax ;
    or dword [ds:GDTDS+2],eax ;
    pop es ; es=0
    mov ax, 1 ; pm32
    call dword ptr esp ; ïåðåõîäèì es:di
    jc $ ; âèñèì åíñëè íå ïåðåøëè
    ;==========================================;
    ; Èíèöèàëèçàöèÿ ñåãìåíòîâ ;
    ;==========================================;
    push ds ;
    pop es ;
    mov dx,2 ;
    mov edi,GDTDS ;
    mov cx,1 ;
    @@: xor ax,ax ;
    int 31h ;
    jc $ ;
    push ax ;
    mov bx,ax ;
    mov ax,000Ch ;
    int 31h ;
    jc $ ;
    mov edi,GDTCS ;
    dec dx ;
    jnz @b ;
    push PM_entry ;
    retf ;
    jmp $ ;
    ;==========================================;
    ;
    segment PMode use32 ; áàçà CS:lol: S:ES:SS=P;Mode ; âñå ëèìèòû - 4 Ãá
    ;
    PM_entry: ;
    pop ax ;
    mov ds,ax ;
    mov es,ax ;
    mov ss,ax ;
    mov esp,PMstack ; è óñòàíîâè;òü ñòåê
    ;
    mov ax,'1';---------------- ;
    int 29h ; me_test ;
    int 16h;------------------- ;
    mov ah,4Ch ; âûõîäèì
    int 21h ;
    ;
    GDTCS dd 0x0000FFFF,0x00CFFA00 ; Code
    GDTDS dd 0x0000FFFF,0x00CFF200 ; Date
    PMstack:segment RMstack use16
    db 1024 dup (?) ; ñòåê 3 ïàðàãðàôà -íàâñÿêèé
     
  3. UDN

    UDN New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    7
    Блин язык((
    db 1024 dup (?) ; размер стека для тебя db 1024*1024 dup (?)

    2Fh ax:1687h вкл. DPMI
    31h ax:0x0000 создать дескриптор
    31h ax:0x000C загрузить ;GDTCS (Code),GDTDS(Date) должны быть настроены
     
  4. UDN

    UDN New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    7
    ОПС прости не дочитал до динамически.
    INT 31h, АХ = 0500h — Получить информацию о свободной памяти
    INT 31h, AX = 0501h — Выделить блок памяти
    INT 31h, АХ = 0502h — Освободить блок памяти
    INT 31h, AX = 0503h — Изменить размер блока памяти
     
  5. UDN

    UDN New Member

    Публикаций:
    0
    Регистрация:
    11 май 2009
    Сообщения:
    7
    INT 31h, AX = 0501h
    ВХ:СХ = размер блока в байтах, больше нуля
    Вывод: если CF = 0,
    ВХ:СХ = линейный адрес блока;
    SI:lol: I = идентификатор блока для функций 0502 и 0503

    функция сама берет на себя твои заморочки