Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

помогите с сегментами

4.4K
05 мая 2007 года
erzik
47 / / 08.04.2006
Здраствуйте.
Хочу реализовать многозадачность. В статьях на sasm.narod.ru эта тема объяснялась (Глава 9, Реализация многозадачности), но пример, прилагавшийся в конце статьи, с сайта куда-то исчез, а без примера ой как нелегко с этим разбираться...(по данным в статье отрывкам кода идея понятна, но нехватает структур, на которые идут сылки) Подскажите, как реализовать многозадачность с использованием сегментов TSS, где про это можно почитать еще ("Процессор Интел в защищенном режиме", "Пишем операционку с нуля", sasm.narod.ru не предлагать).

PS:
вот то, что есть на данный момент:

Код:
[BITS 16]
;------------------------------------для FAT
jmp short BootStart
nop
BS_OEMNAME:     db '>New OC<'
BPB_BytsPerSec: dw 0200h
BPB_SecPerClus: db 1
BPB_RsvdSecCnt: dw 1
BPB_NumFATs:    db 2
BPB_RootEntCnt: dw 00E0h
BPB_TotSec16:   dw 0B40h
BPB_Media:  db 0F0h
BPB_FATsz16:    dw 9
BPB_SecPerTrk:  dw 12h
BPB_NumHeads:   dw 2
BPP_HiddSec:    dd 0
BPB_TotSec32:   dd 0
;Заголовок для FAT12/16
BS_DrvNum:  db 0
BS_ResNT:   db 0
BS_BootSig: db 29h
BS_VolID:   dd 0B0AAE9FEh
BS_VolLab:  db '>New OC<   '
BS_FilSysType:  db 'FAT12   '

[ORG 0x7c00]
;------------------------------------реальный режим
BootStart:
cli
mov ax,0
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0x7c00
mov bp,sp
sti

mov si, msg_intro
call kputs

cli

lgdt [gd_reg]

in al,0x92
or al,1
mov cr0,eax

jmp 0x8: _protected


kputs:
    pusha
    .loop
    lodsb
    test al,al
    jz .quit
    mov ah,0x0e
    int 0x10
    jmp short .loop
    .quit
    popa
ret

gdt:
dw 0,0,0,0
db 0ffh,0ffh,0,0,0,10011010b,0cfh,0 ;сегмент кода
db 0ffh,0ffh,0,0,0,10010010b,0cfh,0 ;сегмент данных
db 0ffh,0ffh,0,80h,0Bh,10010010b,01000000b,0; сегмент видеопамяти

gd_reg:
dw 8192
dd gdt

msg_intro: db "OC start...OK",0ah,0dh,0

;------------------------------------защищенный режим


[BITS 32]

segment PM_CODE ;--------------------сегмент кода
_protected:
mov ax,10h
mov ds,ax
mov es,ax
mov ss,ax


mov ax,00010000b    ;селектор на второй дескриптор данные
mov ds,ax
mov ax,00011000b    ;селектор на третий дескриптор видеопамять
mov es,ax

xor si,si
mov si,dannie   ;номер сенмента данных
shl esi,4
mov esi,msg_entering_pmode
mov edi,0A0h    ;вторая строка (в VM-ware)
mov ecx,msg_len
rep movsb

Restart:
jmp $


segment PM_DATA ;--------------------сегмент данных
dannie:
msg_entering_pmode: db ">",0eh,"W",0eh,"e",0eh,"l",0eh,"c",0eh,"o",0eh,"m",0eh,"e",0eh
msg_len equ $-msg_entering_pmode

Или, подскажите, если можно, где реализацию сегментов надо прописывать в этом коде.
4.4K
06 мая 2007 года
erzik
47 / / 08.04.2006
Сейчас пересматривал цикл статей "Проц интел в защищенном режиме" и наткнулся на пример защищенного режима со страничной адресацией. (Это ж что со мной было, чтобы при чтении в первый раз такое не заметить :confused:).
Хотелось бы узнать ваше мнение: что лучше: сегменты, страничная адресация или примерно одинаково? И те, кто писали свои операционки, скажите, что использовали вы?
551
06 мая 2007 года
Pavia
357 / / 22.04.2004
Перечитай статьи и разберись что такое сегменты и страницы. Одно отвечает за одно другое за другое. В большинстве ОС применяют модель FLAT. 2 сегмента кода и данных придел в 4ГБайта.
И используя механизм страниц, создается виртуальная память, которые создают для каждой задачи свои 4ГБ.

Преобразования адреса идет так.
Есть Логический адрес = сегмент :смещение он отображается на линейный адрес. А вот далее используя страницы линейный адрес преобразуется в физические адреса.
Если не используется страничный механизм. То линейный адрес соответствует физическому.

Если не использовать страничный механизм. То вся память у тебя будет делиться между программами. Тут два пути либо каждой задачи отводиться небольшой кусочки памяти. Либо тебе продеться все выгружать из памяти при переключении озадачь, что будет медленно.

Поэтому и использует страничный механизм преобразования адресов.

Настоятельно советую почитать мануэлы от Интел.
261
06 мая 2007 года
ahilles
1.5K / / 03.11.2005
я тоже настаиваю:
посмотри собщение #19
http://forum.codenet.ru/showthread.php?t=31103&page=2
349
06 мая 2007 года
Phantom-84
656 / / 27.10.2005
Что это за хитрый код такой?
 
Код:
in al,0x92
or al,1
mov cr0,eax

Ты ничего не пропустил?
4.4K
06 мая 2007 года
erzik
47 / / 08.04.2006
2Pavia то есть лучше будет использовать страничную адресацию?
2Phantom-84 спс, исправил )
551
06 мая 2007 года
Pavia
357 / / 22.04.2004
Да. Не даром в Long Mode для x86-64 отказались от сегментной модели.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог