ОС с нуля

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,118
    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,118
    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,118
    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,118
    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,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