ОС с нуля

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by z01b, 28 Apr 2008.

  1. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    статья в первых постах - нечто странное из серии "галопам по европам"..
     
    1 person likes this.
  2. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    Возможно, можешь что-то толковое предложить? :)
     
  3. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    могу - нормально изучить основы работы ОС, например 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
     
    4 people like this.
  4. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Можно ещё добавить
    Свен Шрайбер "Недокументированные возможности Windows 2000"
     
  5. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    можно добавить много чего но к проектированию ОС это малое отношение имеет =) Всетаки нужно сначала определиться с структурой ядра, а тут неплохо было бы изучить руссиновича про ядро Windows и изучить ядро Linux (тут уже книги посоветовать не могу, ибо сам не знаю и не изучал.. надо будет исправить)
     
    6 people like this.
  6. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    _Great_ Спс. за инфу.

    Есть у кого-нибудь файлы к книге - Свен Шрайбер "Недокументированные возможности Windows 2000" ???
     
  7. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    http://gr8.cih.ms/uploads/schreiber.zip

    не помню откуда качал, поэтому залил скачанное
     
  8. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    Вы пытаетесь собрать то, что давно уже собрано на вот этом сайте:
    http://www.sysbin.com/
    System Coders Zone
     
    #28 taha, 2 May 2008
    Last edited: 2 May 2008
  9. v4567

    v4567 New Member

    Joined:
    9 May 2008
    Messages:
    7
    Likes Received:
    3
    Reputations:
    0
    Прочитал данную статью автора 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 если ты видешь где у меня ошибки или знаешь в чём проблема помоги пожалуйста, за ответ заранее благодарен.
     
    #29 v4567, 26 May 2008
    Last edited by a moderator: 26 May 2008
    1 person likes this.
  10. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Автор не z01b!
    Там есть копирайты если что...
     
    2 people like this.
  11. v4567

    v4567 New Member

    Joined:
    9 May 2008
    Messages:
    7
    Likes Received:
    3
    Reputations:
    0
    De-visible, если знаешь где у меня ошибка в программе или есть информация по даному вопросу или исходные тексты аналогичного загрузчика, помоги мне пожалуйста.
     
    1 person likes this.
  12. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    Сегодня нарыл еще одну интересную статейку по сабжу, кому интересно, может скачать и читать.
    http://wasm.ru/forum/attachment.php?item=2197
     
    2 people like this.
  13. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    ссылку на тему плз
     
  14. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    Вот перезалил http://slil.ru/25953519
     
    1 person likes this.
  15. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    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,0Ah0
    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     ax07c0h
    mov     ss
    ax
    mov     sp
    03feh вершина стека

    set data segment:
    push    cs
    pop     ds

    устанавливаем видео режим 80x25:
    mov     ah00h
    mov     al
    03h
    int     10h

    выдаем сообщение приветствия:
    lea     simsg
    call    print_string

    bios передает номер диска в dl:

    mov     ah02h
    mov     al
    10  чтение секторов
    mov     ch
    0   цилиндр
    mov     cl
    2   сектор
    mov     dh
    0   головка
    dl не меняется! - номер диска

    буфер данных:
    mov     bx0800h
    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     al0
    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 axcs
    mov ds
    ax
    mov es
    ax

    call clear_screen

    cp
    : xor cxcx
    mov cl
    , [80h]
    jcxz np
    mov si
    82h
    mov di
    offset filename
    cld
    rep movsb
    mov 
    [di-1], 0

    cld
    xor cxcx
    mov cl
    , [80h]
    mov dioffset 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_flag1
    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 dxs3
    mov ah
    9
    int 21h
    jmp s3s
    s3 db 0Dh
    ,0Ah," boot record "0Dh,0Ah'$'
    s3s:


    open file
    of
    mov ah3dh
    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 sioffset filename
    call print_string


    read bytes from file
    rd
    mov ah3fh
    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 ah03h
    mov al
    write 1 sector (512 bytes).
    mov clsect  sector (1..18)
    mov chcyld  cylinder (0..79)
    mov dhhead  head  (0..1)
    mov dldrive always 0 (A:)
    mov bxoffset 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 dxs1
    mov ah
    9
    int 21h
    jmp s1s
    s1 db 1Dh
    ,0Ah,"writing: $"
    s1s:
    mov axcounter
    call print_num_uns




    sectors... cylinders... heads...
    cmp kernel_flag1
    jne cf
    inc sect
    cmp sect
    18
    jbe rd           
    ; ^
    mov sect1
    inc cyld
    cmp cyld
    79
    jbe rd           
    ; ^
    mov cyld0
    inc head
    cmp head
    1
    jbe rd           
    ; ^



    close file
    cf
    mov bxhandle
    mov ah
    3eh
    int 21h
    jc er

    jmp ex


    co
    lea dxe0
    mov ah
    9
    int 21h
    jmp e0e
    e0 db 
    "  cannot open the file...",0Dh,0Ah,'$'
    e0e:
    jmp ex

    np
    lea dxe1
    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,'$'
    e1ejmp ex


    er
    lea dxe2
    mov ah
    9
    int 21h
    jmp e2e
    e2 db 
    "   i/o error...",0Dh,0Ah,'$'
    e2e:
    jmp ex

    wp
    lea dxe3
    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:


    exlea dxm1
    mov ah
    9
    int 21h
    jmp m1m
    m1 db 0Dh
    ,0Ah,"   total sectors: $"
    m1m:
    mov axcounter
    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 ah0
    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     cx1
    ; (result of "/ 10000" is always less or equal to 9).
    mov     bx10000       2710h divider.
    ax is zero?
    cmp     ax0
    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     cx0
    je      calc
    ; if ax<bx then result of div will be zero:
    cmp     axbx
    jb      skip
    calc
    :
    mov     cx0   set flag.
    mov     dx0
    div     bx      
    ax dx:ax bx   (dx=remainder).
    ; print 
    last digit
    ah is always zeroso 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