OS 16 bits (Hello) CD-ROM boot

1. OS 16 bits (Hello) CD-ROM boot

???
gokernel

(usa Linux Mint)

Enviado em 29/07/2017 - 08:55h

Olá Pessoal !

Fazia uma semana que estava tentando criar CD-ROM de boot ( boot loader ) com o "stage 0" e não sabia como compilar.

Depois de muita pesquisa ... Glória a Deus consegui ! ...

Vamos lá:
01: Primeiro criar a pasta( /temp/hello_boot )
02: Ao recompilar é indicado apagar todos os arquivos exceto ( hello.s, link.ld ) OK ?

Um simples exemplo do ("stage 0") Hello World:

//-------------------------------------------------------------------
// 
// Um simples "Hello World" com BOOT:
//
// ARQUIVO:
//   hello.s
//
// ##############################################
//
// COMPILA O BINARIO:
//
//   cd /temp/hello_boot
//
//   gcc -s -c hello.s -o hello.o -Wall
//   ld hello.o -o hello.bin -T link.ld
//   objcopy -O binary hello.bin bkernel
//
// GERA UM CD BOOTAVEL:
//   mkdosfs -C hello.flp 1440 || exit
//   dd status=noxfer conv=notrunc if=bkernel of=hello.flp || exit
//   mkisofs -R -b hello.flp -o /temp/hello_boot.iso /temp/hello_boot
//
// ##############################################
//
// LIMITACAO:
//   Programa maximo com 510 bytes.
//
// VANTAGEM:
//   MODO REAL(16 bits): Pode-se usar interrupcao a vontade ...
//
// FONTES DO SCRIPT CD-ROM BOOT:
//
//   Projeto MikeOS ( OS 16 bits ), arquivo ( build-linux.sh )
//
//   https://github.com/mig-hub/mikeOS
//
// POR:
//   Francisco - gokernel@hotmail.com
//
//-------------------------------------------------------------------
//
.code16
.text
.globl _start;
_start:

     jmp _boot
     nop

_boot:

    // Display: "Hello"
    //
    mov   $0xe,%ah
    mov   $72,%al
    int   $0x10
    mov   $101,%al
    int   $0x10
    mov   $108,%al
    int   $0x10
    int   $0x10
    mov   $111,%al
    int   $0x10

label_forever:
    hlt
    jmp label_forever

msgHello: .asciz "Hello World - CD BOOT MINI OS"


//-----------------------------------------------
//---------- ESSENCIAL: nao mudar aqui ----------
//-----------------------------------------------
. = _start + 510
.word 0xaa55
//-----------------------------------------------
 


Arquivo ( link.ld ):


SECTIONS
{
     . = 0x7c00;
     .text :
     {
          _ftext = .;
     } = 0
}

 


Esse código vou utilizar como arranque do gardenOS ( CD-ROM BOOT ) sem o grub.

01 - Testando no QEMU:

  qemu -cdrom hello_boot.iso
 



Já gravei o CD-ROM e guardei esse como relíquia ..."COISA PRECIOSA" !

E sim o CD-ROM funcionou perfeitamente no boot ... até funcionou com as teclas ( CTRL + ALT + DEL ) ... talvez não funcione se acrescentar ( cli ) no código ( não testei com asm("cli"); ).

Se alguém gostou e se interessar depois vou tentar traduzir esse com BOOT e postarei aqui:
http://wiki.osdev.org/Real_mode_assembly_I

Para quem não sabe todos os bootloaders(grub, lilo, etc) iniciam em MODO REAL ( 16 bits ) e depois muda para 32/64 bits se necessário.

Compartilhando !!!



  


2. Re: OS 16 bits (Hello) CD-ROM boot

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/07/2017 - 12:28h

Cara esse projeto parece ser legal, tenta fazer um shell proprio para assim deixar o bash, tenta postar no github o trabalho para dar uma testada.



Meu github:
#===============================#
# https://github.com/Python-Library-Work #
#===============================#
O universo e um infinito de possibilidades!!!



3. Re: OS 16 bits (Hello) CD-ROM boot

???
gokernel

(usa Linux Mint)

Enviado em 29/07/2017 - 15:57h

Olá "AndrewUser" !

Sim o projeto é "legal acho" ;)

Já tem um mini shell implementado ( em parte ) ... mas vou codando nas horas vagas, está ainda em fase inicial.
Depois atualizarei o novo código.

Decidi mudar os comentários para o nosso BR ... motivo?: talvez o meu garoto(agora com 2 anos e 6 meses) no futuro se interesse neste, então será melhor para nossos "jovens" que não entendem bem o inglês.

Quando o projeto tiver numa fase mais adiantada então "talvez" disponibilizarei no github.
OBS: o projeto inicialmente está hospedado aqui:
https://sourceforge.net/projects/garden-linux/files/

OBS2: esse é somente o código inicial e cheio de "erros de gramática" exemplo( veja ao baixar o .iso ):
---------------------------------------------------------------------
To compile the OPERATION SISTEM ( gardenOS ) type:
---------------------------------------------------------------------

T+.




4. Re: OS 16 bits (Hello) CD-ROM boot

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/07/2017 - 07:17h

gokernel escreveu:

Decidi mudar os comentários para o nosso BR ... motivo?: talvez o meu garoto(agora com 2 anos e 6 meses) no futuro se interesse neste, então será melhor para nossos "jovens" que não entendem bem o inglês.


Outra possibilidade seria você falar Inglês com seu garoto. Faço isso com minha filha desde o útero, e, agora, com quase oito anos ela tem muita facilidade de se comunicar em Inglês. É muito interessante vê-la brincando com suas bonecas em Inglês, ver como ela ajuda mãe com o Inglês, e saber que ela sonha em Inglês, mesmo sendo eu praticamente a única pessoa que interage sempre com ela nessa língua.


5. Re: OS 16 bits (Hello) CD-ROM boot

???
gokernel

(usa Linux Mint)

Enviado em 30/07/2017 - 09:34h

"Paulo1205" escreveu:

Outra possibilidade seria você falar Inglês com seu garoto. Faço isso com minha filha desde o útero, e, agora, com quase oito anos ela tem muita facilidade de se comunicar em Inglês. É muito interessante vê-la brincando com suas bonecas em Inglês, ver como ela ajuda mãe com o Inglês, e saber que ela sonha em Inglês, mesmo sendo eu praticamente a única pessoa que interage sempre com ela nessa língua.


Tá me zoando né ? rarsrsrs

Se for interagir com o "boyzinho" em inglês vai ser uma piada ;) ... meu inglês não é bom para escrever ... e péssimo para falar ( não pratico ).

Talvez me interesse em praticar o inglês quando for convidado para passar umas férias na casa de minha prima na Flórida .

Por enquanto quero que ele brinque com coisas(físicas) tipo: areia, água, bicicleta, brinquedos de plásticos.

Divertido é quando ele vai brincar no muro com areia ... ou dar um passeio de moto comigo.



6. Re: OS 16 bits (Hello) CD-ROM boot

???
gokernel

(usa Linux Mint)

Enviado em 30/07/2017 - 18:04h

Caramba!, passei praticamente a tarde toda tentando fazer esse funcionar corretamente no ( WINDOWS com GCC ):


//-------------------------------------------------------------------
// ARQUIVO:
//   stage0.s
//
// COMPILE:
//   gcc -c -Wall -Werror stage0.s -o stage0.o
//   ld stage0.o -o stage0.elf -T stage0.ld
//   objcopy -R .pdr -R .comment -R.note -S -O binary stage0.elf stage0_kernel
//
// Author:
//   Ashakiran Bhatter
//   https://www.codeproject.com/KB/cpp/737545/sourcecode.rar
//
// USAGE:
//   qemu stage0_kernel
//
// stage0.ld:
//-----------------------------------------------
// SECTIONS
// {
//     . = 0x7c00;
//     .text :
//     {
//          _ftext = .;
//     } = 0
// }
//
//-----------------------------------------------
//
//-------------------------------------------------------------------
//
.code16
.text
.globl _start;
_start:
     jmp _boot
     nop
     /*bios parameter block                             description of each entity             value          datatype            width(in bytes) */
     /*--------------------                             --------------------------             -----          --------            --------------- */
     .byte 0x6b,0x69,0x72,0x55,0x58,0x30,0x2e,0x31      /* oem label                         : kirUX0.1     , type: string      , length:    8    */
     .byte 0x00,0x02                                    /* total bytes per sector            : 512          , type: word        , length:    4    */
     .byte 0x01                                         /* total sectors per cluster         : 1            , type: byte        , length:    1    */
     .byte 0x01,0x00                                    /* total reserved sectors            : 1            , type: word        , length:    4    */
     .byte 0x02                                         /* total fat tables                  : 2            , type: byte        , length:    1    */
     .byte 0xe0,0x00                                    /* total directory entries           : 224          , type: word        , length:    4    */
     .byte 0x40,0x0b                                    /* total sectors                     : 2880         , type: word        , length:    4    */
     .byte 0xf0                                         /* media description                 : 0xf0         , type: byte        , length:    1    */
     .byte 0x09,0x00                                    /* size in sectors of each fat table : 9            , type: word        , length:    4    */
     .byte 0x02,0x01                                    /* total sectors per track           : 18           , type: word        , length:    4    */
     .byte 0x02,0x00                                    /* total heads per cylinder          : 2            , type: word        , length:    4    */
     .byte 0x00,0x00, 0x00, 0x00                        /* total hidden sectors              : 0            , type: double word , length:    4    */
     .byte 0x00,0x00, 0x00, 0x00                        /* total big sectors                 : 0            , type: double word , length:    4    */
     .byte 0x00                                         /* boot drive identifier             : 0            , type: byte        , length:    4    */
     .byte 0x00                                         /* total unused sectors              : 0            , type: byte        , length:    4    */
     .byte 0x29                                         /* external boot signature           : 0x29         , type: byte        , length:    4    */
     .byte 0x22,0x62,0x79,0x20                          /* serial number                     : "by          , type: string      , length:    4    */
     .byte 0x41,0x53,0x48,0x41,0x4b,0x49                /* volume label first 6 bytes of 11  : ASHAKI       , type: string      , length:    6    */
     .byte 0x52,0x41,0x4e,0x20,0x42                     /* volume label second 5 bytes of 11 : RAN B        , type: string      , length:    5    */
     .byte 0x48,0x41,0x54,0x54,0x45,0x52,0x22           /* file system type                  : HATTER"      , type: string      , length:    8    */

//-----------------------------------------------
// MACROS:
//-----------------------------------------------
//
.macro initEnvironment
     call _initEnvironment
.endm

.macro writeString message
     pushw \message
     call  _writeString
     addw  $0x02, %sp
.endm

//-----------------------------------------------
// inicio real:
//-----------------------------------------------
_boot:

    // initialize the environment
    initEnvironment 

    writeString $msgHello

label_forever:
    hlt
    jmp label_forever


/* user-defined routines */
/* this function is used to set-up the */
/* registers and stack as required     */
/* parameter(s): none                  */
_initEnvironment:
     pushw %bp
     movw  %sp, %bp
_initEnvironmentIn:
     cli
     movw  %cs, %ax
     movw  %ax, %ds
     movw  %ax, %es
     movw  %ax, %ss
     movw  $0x7c00, %sp
     sti
_initEnvironmentOut:
     movw  %bp, %sp
     popw  %bp
ret

/* this function is used to display a string */
/* onto the screen                           */
/* parameter(s): input string                */
_writeString:
     pushw %bp
     movw  %sp   , %bp
     movw 4(%bp) , %si
     jmp  _writeStringCheckByte
_writeStringIn:
     movb $0x000e, %ah
     movb $0x0000, %bh
     int  $0x0010
     incw %si
_writeStringCheckByte:
     movb (%si)  , %al
     orb  %al    , %al
     jnz  _writeStringIn
_writeStringOut:
     movw %bp    , %sp
     popw %bp
ret


// user-defined variables
bootDrive : .byte 0x0000
msgHello  : .asciz "Hello World - BOOT CD-ROM MINIOS"
msgAbort  : .asciz "* * * F A T A L  E R R O R * * *"
#fileStage2: .ascii "STAGE2  BIN"
fileStage2: .ascii  "KERNEL  BIN"
clusterID : .word 0x0000

//-----------------------------------------------
//---------- ESSENCIAL: nao mudar aqui ----------
//-----------------------------------------------
. = _start + 510
.word 0xaa55
//-----------------------------------------------
 


SAIDA DO PROGRAMA:
Hello World - BOOT CD-ROM MINIOS

Ao tentar compilar no LINUX funcionou perfeitamente ... CONCLUSÃO:
Vou trocar o GCC pelo NASM no meu projeto, pois não pretendo deixar o OS do tio Gates sem uso. ;).

Ufa !... ainda bem que compilou !







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts