[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
помогите с сегментами
Хочу реализовать многозадачность. В статьях на sasm.narod.ru эта тема объяснялась (Глава 9, Реализация многозадачности), но пример, прилагавшийся в конце статьи, с сайта куда-то исчез, а без примера ой как нелегко с этим разбираться...(по данным в статье отрывкам кода идея понятна, но нехватает структур, на которые идут сылки) Подскажите, как реализовать многозадачность с использованием сегментов TSS, где про это можно почитать еще ("Процессор Интел в защищенном режиме", "Пишем операционку с нуля", sasm.narod.ru не предлагать).
PS:
вот то, что есть на данный момент:
Код:
Или, подскажите, если можно, где реализацию сегментов надо прописывать в этом коде.
Хотелось бы узнать ваше мнение: что лучше: сегменты, страничная адресация или примерно одинаково? И те, кто писали свои операционки, скажите, что использовали вы?
И используя механизм страниц, создается виртуальная память, которые создают для каждой задачи свои 4ГБ.
Преобразования адреса идет так.
Есть Логический адрес = сегмент :смещение он отображается на линейный адрес. А вот далее используя страницы линейный адрес преобразуется в физические адреса.
Если не используется страничный механизм. То линейный адрес соответствует физическому.
Если не использовать страничный механизм. То вся память у тебя будет делиться между программами. Тут два пути либо каждой задачи отводиться небольшой кусочки памяти. Либо тебе продеться все выгружать из памяти при переключении озадачь, что будет медленно.
Поэтому и использует страничный механизм преобразования адресов.
Настоятельно советую почитать мануэлы от Интел.
я тоже настаиваю:
Код:
in al,0x92
or al,1
mov cr0,eax
or al,1
mov cr0,eax
Ты ничего не пропустил?
2Phantom-84 спс, исправил )
Да. Не даром в Long Mode для x86-64 отказались от сегментной модели.