Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Khronos14

#111
Bueno, conseguí arreglarlo, tras una semana rompiéndome la cabeza lo conseguí. Este es el linker script, usando MinGW:

Código (bash) [Seleccionar]

OUTPUT_FORMAT("pe-x86-64")
ENTRY(loader)
SECTIONS
{
    .text 0x001216 :
{
*(.text)
}
.rdata :
{
*(.rdata)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}


ld -nostdlib -nodefaultlibs -T linker.ld bin\Stage_3.o bin\kernel.o bin\idt.o bin\screen.o bin\string.o bin\io.o -o Kernel.out

Usando el comando ld de esa manera, nos generaría un ejecutable que trabajaría según la dirección de memoria 0x001216.

El Stage_2 de mi Kernel lo cargo en 0x001000, a lo que hay que sumarle el código del Stage_2 que luego carga el Kernel en C++. El tamaño del Stage_2 es de 0x216 bytes, por lo que sumándolo a la dirección base, se soluciona el problema.

Una vez linkeado nuestro ejecutable, lo convertimos a binario con objcopy, tal como hago en el bat que puse antes. Ahora tengo que portarlo a GCC para poder compilarlo en Linux, pero debería ser bastante fácil.

Saludos.
#112
ASM / Re: Bootloader 32-bit y segmentación
4 Septiembre 2012, 23:38 PM
¿Tienes algo hecho? Básicamente, primero tienes que comprender el sistema de archivos FAT12. A mi me llevó un poco y construí mi propia herramienta para crear imágenes FAT12:

http://sourceforge.net/projects/fat12maker/

Luego, usando NASM hice el bootstrap para el sector 0 de mi imagen del disquete. Este se encarga de leer todas las entradas del directorio raiz y busca el archivo Stage_2.bin. Una vez que encuentra la entrada, lee el StartingCluster.

Almacenamos ese valor y cargamos en memoria toda la FAT, y empezamos a cargar sectores en memoria según el StartingCluster y los siguientes...

Lo único que te queda luego es hacer un jump al buffer y listo!

Ahora estas en el Stage_2, entrar en modo protegido es bastante sencillo: tienes que crear la GDT, poner a 1 el bit menos significativo de CR0 y hacer un jump:

Código (asm) [Seleccionar]

jmp 08h:protected_mode


En http://wiki.osdev.org/Main_Page tienes mucha información, pero claro, hay que buscar en inglés.

Saludos.
#113
Puede que hay puesto demasiada información, tan solo necesito entender como colocar las secciones de un linker script para el linker de GCC, y para el formato ELF.

Si alguien tiene experiencia trabajando con el linker "a pelo" y puede ayudarme, se lo agradecería mucho.

Saludos.
#114
Programación General / Problema con linker script
4 Septiembre 2012, 13:39 PM
Hola, estoy desarrollando un Kernel y tengo un problema con los strings. El Kernel bootea desde la disquetera, carga el Stage2 y entra en modo largo, luego se inicia el Kernel en C++.

Hasta ahora, lo estaba desarrollando en Windows, usando Nasm y MinGW, pero me encontré con el problema de las cadenas y lo porté a GNU/Linux.

En Windows, mi linker script es este:

Código (bash) [Seleccionar]

OUTPUT_FORMAT("pe-x86-64")
ENTRY("loader")
SECTIONS
{
    . = 0x100000;
    .text :
    {
        code = .;
        *(.text)
        text_end = .;
    }
    .rodata :
    {
        rodata = text_end;
        *(.rodata)
*(.rdata)
        rodata_end  = .;     
    }   
    .data :
    {
        data = rodata_end;
        *(.data)
        data_end = .;
    }
    .bss : 
    {
        bss = data_end;
        *(.bss)
        bss__end = .;
    }
    end = .;
}


Y compilo todo, con el siguiente bat:


@echo off
set nasm="tools\nasm.exe"
set bochs="C:\Program Files (x86)\Bochs-2.5.1\bochs.exe"
set fat12maker="tools\fat12maker.exe"
set ld="..\MinGW64\bin\x86_64-w64-mingw32-ld.exe"
set cpp="..\MinGW64\bin\x86_64-w64-mingw32-g++.exe"
set objcopy="..\MinGW64\bin\x86_64-w64-mingw32-objcopy.exe"
set cpp_params=-I.\Kernel\ -nostdlib -nostartfiles -nodefaultlibs -masm=intel -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin

mkdir bin\

%nasm% -fbin bootloader\Stage_1.asm -o Stage_1.bin
if NOT %ERRORLEVEL%==0 goto error

%nasm% -fbin bootloader\Stage_2.asm -o Stage_2.bin
if NOT %ERRORLEVEL%==0 goto error

%cpp% %cpp_params% -c Kernel\kernel.cpp -o bin\kernel.o
%cpp% %cpp_params% -c Kernel\Drivers\screen.cpp -o bin\screen.o
%cpp% %cpp_params% -c Kernel\string.cpp -o bin\string.o
%cpp% %cpp_params% -c Kernel\io.cpp -o bin\io.o
%cpp% %cpp_params% -c Kernel\idt.cpp -o bin\idt.o
%nasm% -f win64 Kernel\Stage_3.asm -o bin\Stage_3.o
if NOT %ERRORLEVEL%==0 goto error

%ld% -nostdlib -nodefaultlibs -T linker.ld bin\Stage_3.o bin\kernel.o bin\idt.o bin\screen.o bin\string.o bin\io.o -o Kernel.out
%objcopy% -x -g -X -S -O binary Kernel.out kernel.bin

copy /b Stage_2.bin+kernel.bin Stage_2.bin
if NOT %ERRORLEVEL%==0 goto error

%fat12maker% -b Stage_1.bin -i Stage_2.bin -o Kernel.img
%bochs% -f bochsconf

goto fin

:error
echo Se produjo un error de compilacion
exit

:fin
echo Compilacion satisfactoria
rmdir /S /Q bin\


Se ejecuta bien, pero no se muestran las cadenas que son constantes globales. No puedo hacer algo como esto:

Código (cpp) [Seleccionar]

const char * interrupts_exceptions[] = {
"0 - Division by zero exception",
"1 - Debug exception",
"2 - Non maskable interrupt",
"3 - Breakpoint exception",
"4 - 'Into detected overflow",
"5 - Out of bounds exception",
"6 - Invalid opcode exception",
"7 - No coprocessor exception",
"8 - Double fault",
"9 - Coprocessor segment overrun",
"10 - Bad TSS",
"11 - Segment not present",
"12 - Stack fault",
"13 - General protection fault",
"14 - Page fault",
"15 - Unknown interrupt exception",
"16 - Coprocessor fault",
"17 - Alignment check exception",
"18 - Machine check exception",
"19 - Reserved exception",
"20 - Reserved exception",
"21 - Reserved exception",
"22 - Reserved exception",
"23 - Reserved exception",
"24 - Reserved exception",
"25 - Reserved exception",
"26 - Reserved exception",
"27 - Reserved exception",
"28 - Reserved exception",
"29 - Reserved exception",
"30 - Reserved exception"
"31 - Reserved exception"};

void idt::init_idt()
{
idt_ptr = (idt_ptr_t*)IDT_ADDRESS;
*idt_entries = (idt_entry_t*)IDT_ADDRESS;

clean_gates();
screen::kprintf("Exceptions pointer: 0x%p\n", ::interrupts_exceptions);
screen::kprintf("String: %s\n", ::interrupts_exceptions[0]); //<--------------------------

idt_set_gate(0, (QWORD)isr0, 0x08, 0x8E);
}


Esto es lo que muestra: http://forum.osdev.org/download/file.php?id=2342&mode=view

Estuve buscando información en http://wiki.osdev.org/Main_Page pero no consigo arreglar el problema.

El linker script de linux es este:

Código (bash) [Seleccionar]

OUTPUT_FORMAT(binary)
ENTRY(loader)
SECTIONS
{
    . = 0x100000;
    .text :
    {
        code = .;
        *(.text)
        text_end = .;
    }
    .rodata :
    {
        rodata = text_end;
        *(.rodata)
        rodata_end  = .;     
    }   
    .data :
    {
        data = rodata_end;
        *(.data)
        data_end = .;
    }
    .bss : 
    {
        bss = data_end;
        *(.bss)
        bss__end = .;
    }
    end = .;
}


Y el Makefile:

Código (bash) [Seleccionar]

CPP = g++
CPP_PARAMS = -I./Kernel/ -nostdlib -nostartfiles -nodefaultlibs -masm=intel -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin
OBJECTS = Stage_3.o kernel.o screen.o string.o io.o idt.o
FAT12MAKER = ./tools/fat12maker/fat12maker


all:
nasm -fbin bootloader/Stage_1.asm -o Stage_1.bin
nasm -fbin bootloader/Stage_2.asm -o Stage_2.o

nasm -felf64 Kernel/Stage_3.asm -o Stage_3.o
$(CPP) $(CPP_PARAMS) -c Kernel/kernel.cpp -o kernel.o
$(CPP) $(CPP_PARAMS) -c Kernel/Drivers/screen.cpp -o screen.o
$(CPP) $(CPP_PARAMS) -c Kernel/string.cpp -o string.o
$(CPP) $(CPP_PARAMS) -c Kernel/io.cpp -o io.o
$(CPP) $(CPP_PARAMS) -c Kernel/idt.cpp -o idt.o

ld -nostdlib -nodefaultlibs -T linker-linux.ld $(OBJECTS) -o Kernel.o
cat Stage_2.o Kernel.o > Stage_2.bin
$(FAT12MAKER) -b Stage_1.bin -i Stage_2.bin -o Kernel.img
bochs -f bochsconf-linux

clean:
rm *.o
rm *.bin


Pero en Linux, funciona peor. Sólo funcionan las cadenas que se declaran como variables locales:

Código (cpp) [Seleccionar]

extern "C" void kmain(WORD Foo, WORD Foo2)
{
char saludo[] = "Hello!\n";
screen::clear_screen();
screen::hide_cursor();

screen::kprintf("Adios\n"); //No funciona
screen::kprintf(saludo); //Funciona


Estoy muy perdido, espero que alguien pueda echarme una mano...

Saludos.
#115
ASM / Re: ¿Existen programas comerciales en ASM ?
2 Septiembre 2012, 23:37 PM
Cita de: Weeken en  2 Septiembre 2012, 21:27 PM
¿Existen programas comerciales en ASM ?

digo si existen  alguien conoce  que sean realmente buenos.

algo similares a programas de www.softonic.com



Con partes en ensamblador si. Completamente en ensamblador sólo conozco el compilador de Delphi: dcc32.exe (dcc64.exe), lo leí en un libro de Delphi 5. La empresa Borland creó el compilador en ensamblador y el IDE en Delphi.

Saludos.
#116
Hardware / Re: Portátil por 500 euros
28 Agosto 2012, 18:19 PM
Échale un ojo a este, seguramente sea el que me compre para mi. APU Trinity Quad-Core con Crossfire.

http://www.mercadoactual.es/mactual/PORTATIL_ACER_ASPIRE_V3-551G-A8458G75MN_NXM0HEB001_356289_mactual.html

Saludos.
#117
Hardware / Re: Necesito un nuevo PC
23 Agosto 2012, 13:22 PM
¿Tienes pensado hacer Overclock? ¿En el presupuesto va incluido el monitor?

Si no tienes pensado hacer Overclock podrías comprar algo como esto:

Intel Core i5-3570 3.4Ghz Box Socket 1155 - 205 € (el 3570K son 14€ más)
http://www.pccomponentes.com/intel_core_i5_3570_3_4ghz_box_socket_1155.html

Thermaltake Contac 39 CPU Cooler - 37 € (Puede ser opcional)
http://www.pccomponentes.com/thermaltake_contac_39_cpu_cooler.html

Gigabyte GA-Z77X-D3H - 134 €
http://www.pccomponentes.com/gigabyte_ga_z77x_d3h.html

G.Skill Ripjaws X DDR3 1600 PC3-12800 8GB 2x4GB CL9 - 43.95 €
http://www.pccomponentes.com/g_skill_ripjaws_x_ddr3_1600_pc3_12800_8gb_2x4gb_cl9.html

Seagate Barracuda 7200.12 500GB SATA3 - 62 €
http://www.pccomponentes.com/seagate_barracuda_7200_12_500gb_sata3.html

Sapphire Radeon HD 7870 GHz OC Edition 2GB GDDR5 - 245 €
http://www.pccomponentes.com/sapphire_radeon_hd_7870_ghz_oc_edition_2gb_gddr5.html

Thermaltake LitePower 700W - 54 €
http://www.pccomponentes.com/thermaltake_litepower_700w.html

Thermaltake V4 Black Edition - 34.95 €
http://www.pccomponentes.com/thermaltake_v4_black_edition.html

LG GH24NS90 Grabadora DVD 24X Negra OEM - 16.95 €
http://www.pccomponentes.com/lg_gh24ns90_grabadora_dvd_24x_negra_oem.html

Total: 829,85 €

Con este presupuesto tienes equipo para años, si te puedes estirar unos 100 € más podríamos meter un i7, una Nvidia 660 Ti (que es una bestia) / ATI 7950 o un disco duro SSD.

Saludos.
#118
Tendrás que tener conocimientos de programación GUI, porque si le entregas un programa así escrito en C y en modo consola...

Saludos.
#119
Buff yo todavía no había nacido de aquella jajaja. Te aconsejo que busques en google.

Saludos.
#120
Hardware / Re: Tasación de portátil
11 Agosto 2012, 21:22 PM
¿180 euros? Tu estas loco, yo no daba ni 20 euros por ese portatil.

Un portatil de 2 años de uso, no vale ni el 25% del precio original, imagínate uno de 6 años...

PD: Quédate con el y búscale un uso: mediacenter, servidor, etc..

Saludos.