могу - нормально изучить основы работы ОС, например Windows (такие книжки пишут минимум на 500 страниц) и изучить процессор Intel в защищенном режиме (то, что здесь расписано на страницу, в статьях на васме занимает несколько статей). только тогда можно собраться писать ОС. http://wasm.ru/article.php?article=pipm01 http://wasm.ru/article.php?article=pipm02 http://wasm.ru/article.php?article=pipm03 http://wasm.ru/article.php?article=pipm04 http://wasm.ru/article.php?article=pipm05 http://wasm.ru/article.php?article=pipm06 http://wasm.ru/article.php?article=pipm07 http://wasm.ru/article.php?article=pipm08 http://wasm.ru/article.php?article=pipm09 http://wasm.ru/article.php?article=pipm10 http://wasm.ru/article.php?article=pipm11 http://wasm.ru/article.php?article=pipm12 http://wasm.ru/article.php?article=pipm13 + просите за саморекламу, моя статья в продолжение этого цикла: http://wasm.ru/article.php?article=ia32int М.Руссинович, Д.Соломон "Внутреннее устройство Microsoft Windows 2003/XP/2000" http://rapidshare.com/files/27758180/vnutrennee_ustroystvo_microsoft_windows.rar Пароль: www.booklandija.ru http://rapidshare.com/files/27758180/vnutrennee_ustroystvo_microsoft_windows.rar
можно добавить много чего но к проектированию ОС это малое отношение имеет =) Всетаки нужно сначала определиться с структурой ядра, а тут неплохо было бы изучить руссиновича про ядро Windows и изучить ядро Linux (тут уже книги посоветовать не могу, ибо сам не знаю и не изучал.. надо будет исправить)
_Great_ Спс. за инфу. Есть у кого-нибудь файлы к книге - Свен Шрайбер "Недокументированные возможности Windows 2000" ???
Вы пытаетесь собрать то, что давно уже собрано на вот этом сайте: http://www.sysbin.com/ System Coders Zone
Прочитал данную статью автора z01b видно что человек очень хорошо разбирается в данной теме. z01b, у меня ктебе есть вопрос, помоги разобраться с загрузчиком. Написал свой загрузчик но он почемуто не работает. Загрузчик записываю в первый сектор нулевого цилиндра на дискете, загружаюсь с неё. Далее информация с дискеты читается на аппаратном уровне, на уровне биоса, тоесть никакой файловой системы на ней нет, а информацию с неё читаю используя 13 прерывание и 2 функцию биоса, тоесть по секторам, цилиндрам и головкам. Данная программа читает информацию с шести цилиндров и передаёт управление дальним прыжком в другой сегмент оперативной памяти с нулевым смещением, куда и были считаны данные. Далее привожу текст программы: Code: ; zagr.asm - Загрузчик. cseg segment para 'code' org 100h begin proc near assume cs:cseg, ds:cseg, ss:cseg org 7c00h jmp start start: cli push ax push dx push cx push bx push es mov ax,cs mov ds,ax ;--------------Сброс дисковой системы.-------------------- mov cx,3d pov: mov ah,0h mov dl,0h int 13h cmp ah,0h jz povtor1 loop pov pop es pop bx pop cx pop dx pop ax sti ;--------------Чтение с дискеты.-------------------------- povtor1: mov ax,1117h mov es,ax mov ch,0h mov ah,2h mov al,8d mov cl,2h mov dh,0h mov dl,0h mov bx,0h int 13h gdem: nop nop nop nop nop nop nop nop nop nop cmp ah,0h jz pr jmp gdem pr: cmp al,8h jz pr1 jmp gdem pr1: mov ch,0h pr4: mov ah,2h mov al,9d mov cl,1h not dh mov dl,0h int 13h gdem1: nop nop nop nop nop nop nop nop nop nop cmp ah,0h jz pr2 jmp gdem1 pr2: cmp al,9h jz pr3 jmp gdem1 pr3: cmp [zil],0h jz pr6 jmp pr7 pr6: not [zil] jmp pr4 pr7: not [zil] inc ch cmp ch,6d jz pr5 jmp pr4 pr5: pop es pop bx pop cx pop dx pop ax jmp dword ptr [perex] perex dd 11170000h zil db 0h begin endp cseg ends end begin Данный загрузчик не работает, z01b если ты видешь где у меня ошибки или знаешь в чём проблема помоги пожалуйста, за ответ заранее благодарен.
De-visible, если знаешь где у меня ошибка в программе или есть информация по даному вопросу или исходные тексты аналогичного загрузчика, помоги мне пожалуйста.
Сегодня нарыл еще одну интересную статейку по сабжу, кому интересно, может скачать и читать. http://wasm.ru/forum/attachment.php?item=2197
v4567 ответ по вопросу v4567 - некогда проверять интересен только один вопрос: Сброс дисковой системы - то есть у тебя файловой системы там нет как таковой и соответственно компилируемый файл *.bin на выходе. Вопрос собственно такой - А ты правильно пишешь бинарник на флопик без файловой системы? Ниже просто приведу листинг рабочего загрузчика , программы записи бинарника на дискету! Полная версия Мини ОС[ скачать ] HTML: для установки вставить дискетку и запустить батник - он там один! листинги имеются PS: ниже даны листинги. Прошу прощения за множество копирайтов в этой версии просто это единственный экземпляр сохранившийся с тех времен когда я занималась данной темой, более поздние версии этой глупости невыжили. PHP: name "loader" #make_boot# org 7c00h ; пропустите данные и секцию декларации функции: jmp start ; секция данных msg db "welcome to MINI -os", 0Dh,0Ah, db "loading...",0Dh,0Ah, 0 err db "invalid data at sector: 2, cylinder: 0, head: 0 - integrity check failed.", 0Dh,0Ah db "refer to tutorial 11 - making your own operating system.", 0Dh,0Ah db "system will reboot now... press any key...", 0 start: push cs pop ds ; инициализируем стек: mov ax, 07c0h mov ss, ax mov sp, 03feh ; вершина стека ; set data segment: push cs pop ds ; устанавливаем видео режим 80x25: mov ah, 00h mov al, 03h int 10h ; выдаем сообщение приветствия: lea si, msg call print_string ; bios передает номер диска в dl: mov ah, 02h mov al, 10 ; чтение секторов mov ch, 0 ; цилиндр mov cl, 2 ; сектор mov dh, 0 ; головка ; dl не меняется! - номер диска ; буфер данных: mov bx, 0800h mov es, bx mov bx, 0 ; чтение! int 13h ; проверка целостности: cmp es:[0000],0E9h ; первый байт ядра должен быть 0E9 (jmp). je integrity_check_ok ; ошибкапри проверки целостности lea si, err call print_string ; ожидаем нажатия клавиши mov ah, 0 int 16h ; храним значение в 0040h:0072h: ; 0000h - холодная загрузка ; 1234h - перезапуск из памяти mov ax, 0040h mov ds, ax mov w.[0072h], 0000h ;холодная загрузка jmp 0ffffh:0000h ;reboot! integrity_check_ok: ; передача управления на ядро: jmp 0800h:0000h print_string proc near push ax push si next_char: mov al, [si] cmp al, 0 jz printed inc si mov ah, 0eh int 10h jmp next_char printed: pop si pop ax ret print_string endp Запись бинарника на дискетку PHP: name "writebin" org 100h jmp st filename db 128 dup(0) buffer db 512 dup (0) buffer_size = $ - offset buffer handle dw 0 kernel_flag db 0 counter dw 0 sect db 1 cyld db 0 head db 0 drive db 0 st: mov ax, cs mov ds, ax mov es, ax call clear_screen cp: xor cx, cx mov cl, [80h] jcxz np mov si, 82h mov di, offset filename cld rep movsb mov [di-1], 0 cld xor cx, cx mov cl, [80h] mov di, offset filename mov al, '/' repne scasb jz fs jmp boot fs: cmp [di-2], ' ' jne nsp mov [di-2], 0 nsp:mov [di-1], 0 or [di], 0010_0000b cmp [di], 'k' jne wp or kernel_flag, 1 mov sect, 2 lea dx, s0 mov ah, 9 int 21h jmp s0s s0 db 0Dh,0Ah,"[/k] - start from sector: 2 " , 0Dh,0Ah, '$' s0s: jmp of boot: lea dx, s3 mov ah, 9 int 21h jmp s3s s3 db 0Dh,0Ah," boot record ", 1 , 0Dh,0Ah, '$' s3s: ; open file of: mov ah, 3dh mov al, 0 mov dx, offset filename int 21h jc co mov handle, ax lea dx, m0 mov ah, 9 int 21h jmp m0m m0 db "opened: $" m0m: mov si, offset filename call print_string ; read bytes from file rd: mov ah, 3fh mov bx, handle mov cx, buffer_size mov dx, offset buffer int 21h jc er cmp ax, 0 ; no bytes left? jz cf ; write bytes to disk wr: mov ah, 03h mov al, 1 ; write 1 sector (512 bytes). mov cl, sect ; sector (1..18) mov ch, cyld ; cylinder (0..79) mov dh, head ; head (0..1) mov dl, drive ; always 0 (A:) mov bx, offset buffer int 13h jc er inc counter ; set cursor at 2,5 mov ah, 2 mov dh, 5 mov bh, 0 int 10h ; show current progress: lea dx, s1 mov ah, 9 int 21h jmp s1s s1 db 1Dh,0Ah,"writing: $" s1s: mov ax, counter call print_num_uns ; sectors... cylinders... heads... cmp kernel_flag, 1 jne cf inc sect cmp sect, 18 jbe rd ; ^ mov sect, 1 inc cyld cmp cyld, 79 jbe rd ; ^ mov cyld, 0 inc head cmp head, 1 jbe rd ; ^ ; close file cf: mov bx, handle mov ah, 3eh int 21h jc er jmp ex co: lea dx, e0 mov ah, 9 int 21h jmp e0e e0 db " cannot open the file...",0Dh,0Ah,'$' e0e: jmp ex np: lea dx, e1 mov ah, 9 int 21h jmp e1e e1 db " no parameters...",0Dh,0Ah db "==============================================================================",0Dh,0Ah db "this program was designed especially to test VeHG -operating system",0Dh,0Ah db "if you are emulating in emu8086, click file->set command line parameters.",0Dh,0Ah db "from command prompt type:", 0Dh,0Ah db " writebin [filename] [/k]",0Dh,0Ah, db "when /k parameter is specified file is written to second sector (kernel area).",0Dh,0Ah, db "==============================================================================",0Dh,0Ah,'$' e1e: jmp ex er: lea dx, e2 mov ah, 9 int 21h jmp e2e e2 db " i/o error...",0Dh,0Ah,'$' e2e: jmp ex wp: lea dx, e3 mov ah, 9 int 21h jmp e3e e3 db " wrong parameter. only [/k] is supported. use 8.3 short file names only.",0Dh,0Ah,'$' e3e: ex: lea dx, m1 mov ah, 9 int 21h jmp m1m m1 db 0Dh,0Ah," total sectors: $" m1m: mov ax, counter call print_num_uns lea dx, m2 mov ah, 9 int 21h jmp m2m m2 db 0Dh,0Ah, "thank your for using writebin! - VeHG.com - 2008 (c) freeware",0Dh,0Ah db " press any key...",0Dh,0Ah, '$' m2m: ; wait for any key... mov ah, 0 int 16h ret ; exit. ; this macro prints a char in AL and advances ; the current cursor position: PUTC MACRO char PUSH AX MOV AL, char MOV AH, 0Eh INT 10h POP AX PUTC ENDM ; prints out an unsigned value of AX register. ; allowed values from 0 to 65535 print_num_uns proc near push ax push bx push cx push dx ; flag to prevent printing zeros before number: mov cx, 1 ; (result of "/ 10000" is always less or equal to 9). mov bx, 10000 ; 2710h - divider. ; ax is zero? cmp ax, 0 jz print_zero begin_print: ; check divider (if zero go to end_print): cmp bx,0 jz end_print ; avoid printing zeros before number: cmp cx, 0 je calc ; if ax<bx then result of div will be zero: cmp ax, bx jb skip calc: mov cx, 0 ; set flag. mov dx, 0 div bx ; ax = dx:ax / bx (dx=remainder). ; print last digit ; ah is always zero, so it's ignored add al, 30h ; convert to ascii code. putc al mov ax, dx ; get remainder from last div. skip: ; calculate bx=bx/10 push ax mov dx, 0 mov ax, bx div cs:ten ; ax = dx:ax / 10 (dx=remainder). mov bx, ax pop ax jmp begin_print print_zero: putc '0' end_print: pop dx pop cx pop bx pop ax ret ten dw 10 ; used as divider. print_num_uns endp ; print null terminated string at ds:si print_string proc near push ax ; store registers... push si ; nxtch: mov al, [si] cmp al, 0 jz printed inc si mov ah, 0eh ; teletype function. int 10h jmp nxtch printed: pop si ; re-store registers... pop ax ; ret print_string endp clear_screen proc near push ax ; store registers... push ds ; push bx ; push cx ; push di ; mov ax, 40h mov ds, ax ; for getting screen parameters. mov ah, 06h ; scroll up function id. mov al, 0 ; scroll all lines! mov bh, 07 ; attribute for new lines. mov ch, 0 ; upper row. mov cl, 0 ; upper col. mov di, 84h ; rows on screen -1, mov dh, [di] ; lower row (byte). mov di, 4ah ; columns on screen, mov dl, [di] dec dl ; lower col. int 10h ; set cursor position to top ; of the screen: mov bh, 0 ; current page. mov dl, 0 ; col. mov dh, 0 ; row. mov ah, 02 int 10h pop di pop cx pop bx pop ds pop ax ret clear_screen endp