Bona Fide OS Development http://forums.osdever.net/ |
|
.img size problem, using Gregor Brunmar solution http://forums.osdever.net/viewtopic.php?f=15&t=878 |
Page 1 of 1 |
Author: | juanma268 [ Thu Jan 13, 2011 11:04 am ] |
Post subject: | .img size problem, using Gregor Brunmar solution |
Hi, the file a.img has a size bound? when i compile my source code it weights 30 kb and works fine, but when i add more code to the a.img, it weights 34 kb and the OS crashes. In the attachment files when i uncomment the function: "void llenarPantallaHileraAux(char* hilera,byte elColorChar,byte elColorFondo,int residuo)" in the video.cpp file, lines 319-354 it halts when i run it. I am using Oracle VM VirtualBox 3.2.12, windows xp 32-bits sp2, the built-utils of Mingw from CodeBlocks 10.05. I have tried Qemu but nothing. a_babel.img and a_cuadrado.img are examples of image files that works fine for me. Sorry for my english, Thanks! |
Author: | juanma268 [ Thu Jan 13, 2011 11:12 am ] |
Post subject: | Re: .img size problem, using Gregor Brunmar solution |
Sorry but i can not load files!, neither .zip, .tar, .7z, .h, .asm? |
Author: | juanma268 [ Fri Jan 14, 2011 10:48 am ] |
Post subject: | Re: .img size problem, using Gregor Brunmar solution |
Ok i used this bootloader.asm code from Brunmar: Code: ;CREDITOS: Gregor Brunmar, www.osdever.net/tutorials/brunmar/tutorial_03.php section .text [BITS 16] ; We need 16-bit intructions for Real mode [ORG 0x7C00] ; The BIOS loads the boot sector into memory fixed location 0x7C00 reset_drive: mov ah, 0 ; RESET-command int 13h ; Call interrupt 13h or ah, ah ; Check for error code jnz reset_drive ; Try again if ah != 0 mov ax, 0 mov es, ax mov bx, 0x1000 ; Destination address = 0000:1000 mov ah, 02h ; READ SECTOR-command mov al, 19h ; Number of sectors to read = 1 mov ch, 0 ; Cylinder = 0 mov cl, 02h ; Sector = 2 mov dh, 0 ; Head = 0 int 13h ; Call interrupt 13h or ah, ah ; Check for error code jnz reset_drive ; Try again if ah != 0 ;CAMBIAMOS A MODO GRAFICO, no hay retorno a modo texto con la implementacion actual... ;mov al,13h ;320*200, 256 colores mov ax,0012h ;640*480, 16 colores int 10h ; cli ; Disable interrupts, we want to be alone xor ax, ax mov ds, ax ; Set DS-register to 0 - used by lgdt lgdt [gdt_desc] ; Load the GDT descriptor mov eax, cr0 ; Copy the contents of CR0 into EAX or eax, 1 ; Set bit 0 mov cr0, eax ; Copy the contents of EAX into CR0 jmp 08h:clear_pipe ; Jump to code segment, offset clear_pipe [BITS 32] ; We now need 32-bit instructions clear_pipe: mov ax, 10h ; Save data segment identifyer mov ds, ax ; Move a valid data segment into the data segment register mov ss, ax ; Move a valid data segment into the stack segment register mov esp, 090000h ; Move the stack pointer to 090000h jmp 08h:01000h ; Jump to section 08h (code), offset 01000h gdt: ; Address for the GDT gdt_null: ; Null Segment dd 0 dd 0 gdt_code: ; Code segment, read/execute, nonconforming dw 0FFFFh dw 0 db 0 db 10011010b db 11001111b db 0 gdt_data: ; Data segment, read/write, expand down dw 0FFFFh dw 0 db 0 db 10010010b db 11001111b db 0 gdt_end: ; Used to calculate the size of the GDT gdt_desc: ; The GDT descriptor dw gdt_end - gdt - 1 ; Limit (size) dd gdt ; Address of the GDT times 510-($-$$) db 0 ; Fill up the file with zeros //RELLENA LOS 512 CON CEROS dw 0AA55h ; Boot sector identifyer and this .bat file: Code: @echo off ::codigo ensamblador nasm -f bin bootsect.asm -o bootsect.bin nasm funcionesAsm.asm -f win32 -o funcionesAsm.o ::codigo c/c++ gcc -w makeboot.c -o makeboot.exe g++ -c main.cpp -o main.o g++ -c ports.cpp -o ports.o -masm=intel g++ -c video.cpp -o video.o g++ -c sonido.cpp -o sonido.o ::linkeamos ld -e __Z9principalv -share -Ttext 0x01000 -o kernel.o main.o video.o ports.o sonido.o funcionesAsm.o ::otros objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin makeboot a.img bootsect.bin kernel.bin pause I know that because my kernel.bin is 33kb long it could be overlaping the bootloader at 0x7c00, to solve it i tried change the place in ram where the kernel is loaded from 0x1000 to 0xFFFFF (where te bios ram space end) in both: the bootloader.asm and the .bat file. But nothing. |
Author: | ctimko [ Fri Jan 14, 2011 11:51 am ] |
Post subject: | Re: .img size problem, using Gregor Brunmar solution |
What is the size of the floppy image file? It should be 1.44MB. |
Author: | juanma268 [ Fri Jan 14, 2011 12:43 pm ] |
Post subject: | Re: .img size problem, using Gregor Brunmar solution |
Well, the current size of the .img file is 34 kb, I have compiled smallest ones and they have work before with Virtual Box. them. |
Author: | juanma268 [ Mon Jan 17, 2011 12:04 am ] |
Post subject: | Re: .img size problem, using Gregor Brunmar solution |
Well, I realize that i can load the kernel after the boot loader, this is my plan: +-------------------+ | 0x7c00: bootstrap | +-------------------+ | 0xa000: kernel | +-------------------+ | 0x90000: stack | +-------------------+ so i modified the previous code into this: Bootsect.asm Code: ;CREDITOS: Gregor Brunmar, www.osdever.net/tutorials/brunmar/tutorial_03.php section .text [BITS 16] ; We need 16-bit intructions for Real mode [ORG 0x7C00] ; The BIOS loads the boot sector into memory fixed location 0x7C00 main: call imprimir call reset_drive call copiarFloppyAMemoria ;CAMBIAMOS A MODO GRAFICO, no hay retorno a modo texto con la implementacion actual... mov ax,0012h ;640*480, 16 colores int 10h cli ; Disable interrupts, we want to be alone xor ax, ax mov ds, ax ; Set DS-register to 0 - used by lgdt lgdt [gdt_desc] ; Load the GDT descriptor mov eax, cr0 ; Copy the contents of CR0 into EAX or eax, 1 ; Set bit 0 mov cr0, eax ; Copy the contents of EAX into CR0 jmp 08h:clear_pipe ; Jump to code segment, offset clear_pipe [BITS 32] ; We now need 32-bit instructions clear_pipe: mov ax, 10h ; Save data segment identifyer mov ds, ax ; Move a valid data segment into the data segment register mov ss, ax ; Move a valid data segment into the stack segment register mov esp, 090000h ; Move the stack pointer to 090000h jmp 08h:0a000h ; Jump to section 08h (code), offset 01000h, sin retorno ;imprimir cadena en ds:dx imprimir: pusha mov ah,0Ah mov al,'a' mov bh,0 mov bl,07h mov cx,1 int 10h popa ret reset_drive: pusha mov ah, 0 ; RESET-command int 13h ; Call interrupt 13h or ah, ah ; Check for error code jnz reset_drive ; Try again if ah != 0 popa ret copiarFloppyAMemoria: pusha ;inicializamos segmento(es):desplazamiento(bx) mov ax, 0 mov es, ax mov bx,0a000h ; Destination address = xxxx:xxxx, 7C00h + (18d*512d) = A000 ;inicializamos cilindro(ch) y cabeza (dh) mov ch,byte 1 ;el cilindro 0 (de 18 sectores) pertenece al bootstrap mov dh,0 ;basta con una cara del plato ((80-1) pistas * 18 sectores = 711Kbytes) ;especificamos funcion ah=2, int13h mov ah, 2 ; READ SECTOR-command mov al, 1 ; Number of sectors to read mov dl, 0 ; usar el floppy elFor1: mov cl,0 ;sector actual elFor2: int 13h or ah,ah ; Check for error code jz comprobarDesplazamiento ; ah=0 si no hubo errores ;sino reseteamos floppy call reset_drive comprobarDesplazamiento: ;incrementamos desplazamiento en 512 bytes y aumentamos # de sector add bx,512d inc cl ;comprobamos que bx<65536 sino hacemos bx=0 y es++ cmp bx,word 65535d jle finElFor2 ;sino xor bx,bx pusha mov ax,es inc ax mov es,ax popa finElFor2: cmp cl,18d jl elFor2 finElFor1: cmp ch,80d jl elFor2 ;salimos popa ret gdt: ; Address for the GDT gdt_null: ; Null Segment dd 0 dd 0 gdt_code: ; Code segment, read/execute, nonconforming dw 0FFFFh dw 0 db 0 db 10011010b db 11001111b db 0 gdt_data: ; Data segment, read/write, expand down dw 0FFFFh dw 0 db 0 db 10010010b db 11001111b db 0 gdt_end: ; Used to calculate the size of the GDT gdt_desc: ; The GDT descriptor dw gdt_end - gdt - 1 ; Limit (size) dd gdt ; Address of the GDT times 510-($-$$) db 0 ; Fill up the file with zeros //RELLENA LOS 512 CON CEROS dw 0AA55h ; Boot sector identifyer .bat Code: @echo off nasm -f bin bootsect.asm -o bootsect.bin nasm funcionesAsm.asm -f win32 -o funcionesAsm.o ::codigo c/c++ gcc -w makeboot.c -o makeboot.exe g++ -c main.cpp -o main.o g++ -c ports.cpp -o ports.o -masm=intel g++ -c video.cpp -o video.o g++ -c sonido.cpp -o sonido.o ld -e __Z9principalv -share -Ttext 0xA000 -o kernel.o main.o video.o ports.o sonido.o funcionesAsm.o objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin makeboot a.img bootsect.bin kernel.bin But without success, I can't even see the 'a' in the screen, any ideas would be appreciated. |
Author: | juanma268 [ Mon Jan 17, 2011 10:48 am ] |
Post subject: | Re: .img size problem, using Gregor Brunmar solution |
Sorry, pulse of idiocy... i changed into video mode after printing in screen the 'A'. |
Author: | juanma268 [ Mon Jan 17, 2011 11:48 am ] |
Post subject: | Re: .img size problem, using Gregor Brunmar solution |
Of course, "ret" does not function here, i have to implement it using jmp's and label's. |
Page 1 of 1 | All times are UTC - 6 hours [ DST ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |