Foros del Web » Programación para mayores de 30 ;) » C/C++ »

C/C++ Hola mundo sin Sistema Operativo

Estas en el tema de C/C++ Hola mundo sin Sistema Operativo en el foro de C/C++ en Foros del Web. Olaa^^ Quisiera realizar un Hola Mundo sin S.O. (Sistema Operativo) en C o C++. Preferiblemente para compilar en Dev C++ (es que e oído que ...
  #1 (permalink)  
Antiguo 08/08/2011, 05:18
 
Fecha de Ingreso: julio-2011
Ubicación: Canarias
Mensajes: 171
Antigüedad: 12 años, 9 meses
Puntos: 4
Pregunta C/C++ Hola mundo sin Sistema Operativo

Olaa^^
Quisiera realizar un Hola Mundo sin S.O. (Sistema Operativo) en C o C++.
Preferiblemente para compilar en Dev C++ (es que e oído que el código cambia apenas un poco en diferentes compiladores)
Necesito eso, estoi desorientado, sé que es creando mis popias librerías, y llevo muchos días intentándolo, crenado librerías, y anda, arranco la PC y me dice que no se puede ejecutar por falta de S.o. (Sitema Operativo)
Espero que alguien me oriente y me ayude...
Salu2 y gracias adelantademaente ;)
  #2 (permalink)  
Antiguo 08/08/2011, 08:04
 
Fecha de Ingreso: abril-2010
Mensajes: 21
Antigüedad: 14 años
Puntos: 5
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Hola mundo sin S.O ?¿ no se si entendi bien,para hhacer eso solo me queda pensar que quieres hacer el Toy O.S,que e sun Kernel que dice Hola mundo,en otras palabras,creo que quieres desarollar un BootLoader no?¿ eso lo debes de hacer en ASM,y el kernel en C/C++,entonces mediante interupciones del BIOS leer el sector donde se encuentra el kernel en C (Kernel k dice hola mundo) y mostrarlo por pantalla,lo hice miles de veces yo xD,para leer disco utiliza la interupcion 13h del BIOS,y una ultima cosa,descargate una maquina virtual,te recomiendo VirtualBox,asin no tendrás que ir reiniciando tu maquina para sabes si chuta!


saludos
  #3 (permalink)  
Antiguo 08/08/2011, 08:13
 
Fecha de Ingreso: julio-2011
Ubicación: Canarias
Mensajes: 171
Antigüedad: 12 años, 9 meses
Puntos: 4
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Perfecto, me vinee bien, podrías enseñarme?
Asm estoi recien aprendiendo y C/C++ se XDD
Salu2
  #4 (permalink)  
Antiguo 08/08/2011, 12:23
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: C/C++ Hola mundo sin Sistema Operativo

yo personalmente te recomiendo este tutorial:

http://www.jamesmolloy.co.uk/tutoria...t%20setup.html

y este otro tambien para ir viendo lo de bootloaders:

http://www.omninerd.com/articles/PC_...utorial_in_ASM
  #5 (permalink)  
Antiguo 11/08/2011, 06:00
 
Fecha de Ingreso: julio-2011
Ubicación: Canarias
Mensajes: 171
Antigüedad: 12 años, 9 meses
Puntos: 4
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Grcaias!, ahí va un punto positivo...
  #6 (permalink)  
Antiguo 11/08/2011, 13:45
poi
 
Fecha de Ingreso: octubre-2008
Mensajes: 73
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Estoy intentado hacer lo mismo y he encontrado esta pagina dondne te lo explica todo bastante bien:
http://www.codeproject.com/KB/tips/boot-loader.aspx

Lo unico que no consigo compilar con bcc en ubuntu. Probare pasarme a Windows y bajarme los compiladores que pone en la pagina
  #7 (permalink)  
Antiguo 13/08/2011, 12:18
 
Fecha de Ingreso: abril-2010
Mensajes: 21
Antigüedad: 14 años
Puntos: 5
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Bueno,el unico problema es que no es tan facil cargar el kernel solo leyendo el sector donde este reside,ademas tienes que pasar a 32 bits desde 16, si no nada podras hacer,yo puedo enseñarte a hacer el bootloader y a cargar su kernel apartir de alli no e profundzado mas el tema,ni loco are un S.O xD


saludos
  #8 (permalink)  
Antiguo 13/08/2011, 16:05
 
Fecha de Ingreso: julio-2011
Ubicación: Canarias
Mensajes: 171
Antigüedad: 12 años, 9 meses
Puntos: 4
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Ok, agregame y hablamos XD
con eso mismo me conformo
  #9 (permalink)  
Antiguo 14/08/2011, 04:48
poi
 
Fecha de Ingreso: octubre-2008
Mensajes: 73
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Puedes decirme a mi tambien como hacer el bootloader y que compilador usas?
gracias ;)
  #10 (permalink)  
Antiguo 14/08/2011, 11:35
 
Fecha de Ingreso: abril-2010
Mensajes: 21
Antigüedad: 14 años
Puntos: 5
Respuesta: C/C++ Hola mundo sin Sistema Operativo

bueno,el lenguaje Assembly no se compila,se ensambla sin más,para hacerlo primero busca que ensambaldor usaras,yo lo realize con MASM y tambien con FASM,recomiendo el FASM,almenos ami me iva de lujo,seguro encontrais ejemplos por internet,es sencillo hacer uno,el bootloader solo debe ocupar 512 bytes,y usar las interrupciones del BIOS para realizar las tareas que dije,hoy en dia se trabaja directamente con el hardware con IN y OUT si mal no recuerdo,pero vamos por hacer pruebas podeis hacerlo como se hacia/hacen (algunos)en fin mandenme un MP con sus MSN y les enseño


saludos
  #11 (permalink)  
Antiguo 14/08/2011, 16:00
poi
 
Fecha de Ingreso: octubre-2008
Mensajes: 73
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Os pongo mas o menos la parte de codigo que tengo:
Tengo en ensamblador el bootloader que no hace nada:
Código C:
Ver original
  1. ;*************************************************************************
  2. [BITS 16]
  3.  
  4. MAIN:
  5.    
  6. LOOP:
  7.     jmp LOOP
  8.  
  9.      TIMES 510-($-$$) DB 0
  10.      DW 0xAA55
  11. ;***********************************************************************
Ensamblado con:

nasm ejemplo1.asm -o ejemplo1.o

En este codigo asm quiero llamar al kernel hecho en C. He visto que es con la etiqueta:

[EXTERN archivo]

call archivo

Pero no se luego como linkarlo.
  #12 (permalink)  
Antiguo 16/08/2011, 10:45
 
Fecha de Ingreso: abril-2010
Mensajes: 21
Antigüedad: 14 años
Puntos: 5
Respuesta: C/C++ Hola mundo sin Sistema Operativo

primero tienes que especificar con ORG la direccion de segmento del BIOS,osea 0x7c00,alli empezara el codigo del programa,no lo tienes especificado,pudes hacer tu hola mundo de 3 formas,1 usnado la interrupcion del BIOS 10h que trabaja con la pantalla,con la funcion teletipo y avanza cursor,el parametro debe estar en la aprte alta de AX (AH),pero no recuerdo el num que hace referncia a dicha funcion,deberias cargar un texto en el registro SI,y conla funcion LODSB cargar BIT a BIT en AH lo que hay en SI,y con OR AH,AH JSZ saltaria cuando la cadena ya estubiese cargada del todo y finalmente aisn se motraria,aqui lo e explicado muy por encima,busca ma sinfo sobre esto

otra forma es hacer esto mismo en un archivo aparte,en ASM claro...y cargarlo desde este mismo con la funcion 0x13 del BIO (Leer sectores de disco)

o ya hacerlo en C,que es la mejor opcion....


eso del "[EXTERN]" creo que era en Linux fijate bine de donde lo viste,es bastante mas complicado que eso,para llamar el kernel echo en C deberas pasar a modo protegido antes,no puedes hacerlo en modo real (16 bits)


saludos
  #13 (permalink)  
Antiguo 16/08/2011, 15:06
poi
 
Fecha de Ingreso: octubre-2008
Mensajes: 73
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: C/C++ Hola mundo sin Sistema Operativo

Gracias. Ya mas o menos voy entendiendolo.
A ver, ahora tengo este bootloader:
Código C++:
Ver original
  1. [BITS 16]       ; We need 16-bit intructions for Real mode
  2.  
  3.  
  4.  
  5. [ORG 0x7C00]    ; The BIOS loads the boot sector into memory location 0x7C00
  6.  
  7.  
  8.  
  9. reset_drive:
  10.  
  11.         mov ah, 0               ; RESET-command
  12.  
  13.         int 13h                 ; Call interrupt 13h
  14.  
  15.         or ah, ah               ; Check for error code
  16.  
  17.         jnz reset_drive         ; Try again if ah != 0
  18.  
  19.  
  20.  
  21.         mov ax, 0
  22.  
  23.         mov es, ax
  24.  
  25.         mov bx, 0x1000          ; Destination address = 0000:1000
  26.  
  27.  
  28.  
  29.         mov ah, 02h             ; READ SECTOR-command
  30.  
  31.         mov al, 02h             ; Number of sectors to read = 1
  32.  
  33.         mov ch, 0               ; Cylinder = 0
  34.  
  35.         mov cl, 02h             ; Sector = 2
  36.  
  37.         mov dh, 0               ; Head = 0
  38.  
  39.         int 13h                 ; Call interrupt 13h
  40.  
  41.         or ah, ah               ; Check for error code
  42.  
  43.         jnz reset_drive         ; Try again if ah != 0
  44.  
  45.  
  46.  
  47.         cli                     ; Disable interrupts, we want to be alone
  48.  
  49.  
  50.  
  51.         xor ax, ax
  52.  
  53.         mov ds, ax              ; Set DS-register to 0 - used by lgdt
  54.  
  55.  
  56.  
  57.         lgdt [gdt_desc]         ; Load the GDT descriptor
  58.  
  59.  
  60.  
  61.         mov eax, cr0            ; Copy the contents of CR0 into EAX
  62.  
  63.         or eax, 1               ; Set bit 0
  64.  
  65.         mov cr0, eax            ; Copy the contents of EAX into CR0
  66.  
  67.  
  68.  
  69.         jmp 08h:clear_pipe      ; Jump to code segment, offset clear_pipe
  70.  
  71.  
  72.  
  73.  
  74.  
  75. [BITS 32]                       ; We now need 32-bit instructions
  76.  
  77. clear_pipe:
  78.  
  79.         mov ax, 10h             ; Save data segment identifyer
  80.  
  81.         mov ds, ax              ; Move a valid data segment into the data segment register
  82.  
  83.         mov ss, ax              ; Move a valid data segment into the stack segment register
  84.  
  85.         mov esp, 090000h        ; Move the stack pointer to 090000h
  86.  
  87.  
  88.  
  89.         jmp 08h:01000h          ; Jump to section 08h (code), offset 01000h
  90.  
  91.  
  92.  
  93.  
  94.  
  95. gdt:                    ; Address for the GDT
  96.  
  97.  
  98.  
  99. gdt_null:               ; Null Segment
  100.  
  101.         dd 0
  102.  
  103.         dd 0
  104.  
  105.  
  106.  
  107. gdt_code:               ; Code segment, read/execute, nonconforming
  108.  
  109.         dw 0FFFFh
  110.  
  111.         dw 0
  112.  
  113.         db 0
  114.  
  115.         db 10011010b
  116.  
  117.         db 11001111b
  118.  
  119.         db 0
  120.  
  121.  
  122.  
  123. gdt_data:               ; Data segment, read/write, expand down
  124.  
  125.         dw 0FFFFh
  126.  
  127.         dw 0
  128.  
  129.         db 0
  130.  
  131.         db 10010010b
  132.  
  133.         db 11001111b
  134.  
  135.         db 0
  136.  
  137.  
  138.  
  139. gdt_end:                ; Used to calculate the size of the GDT
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147. gdt_desc:                       ; The GDT descriptor
  148.  
  149.         dw gdt_end - gdt - 1    ; Limit (size)
  150.  
  151.         dd gdt                  ; Address of the GDT
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161. times 510-($-$$) db 0           ; Fill up the file with zeros
  162.  
  163.  
  164.  
  165.         dw 0AA55h                ; Boot sector identifyer

y este kernel en C:

Código C:
Ver original
  1. void main()
  2.  
  3. {
  4.  
  5.  
  6.  
  7.  
  8.  
  9.   for(;;);
  10.  
  11. }

lo compilo con este script:

nasm -f bin bootsect.asm -o bootsect.bin
gcc -ffreestanding -c main.c -o main.o
ld -e main -Ttext 0x1000 -o kernel.o main.o
ld -i -e main -Ttext 0x1000 -o kernel.o main.o
objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin

Y creo la imagen con:

rm boot.img
dd if=/dev/zero of=boot.img bs=512 count=15
dd if=bootloader.bin of=boot.img bs=512 count=1
dd if=kernel.bin of=boot.img bs=512 count=14 seek=1

Pero cuando prueba la imagen en la maquina virtual en un diskete, me sale el error que no encuentra un sector booteable.
¿Estoy creando mal la imagen?

Gracias.
  #14 (permalink)  
Antiguo 18/08/2011, 12:51
 
Fecha de Ingreso: abril-2010
Mensajes: 21
Antigüedad: 14 años
Puntos: 5
Respuesta: C/C++ Hola mundo sin Sistema Operativo

la vredad no lo se,yo no use ni ese esnamblador ni ese programa,pero te dire algo,ami siempre me daba problemas de ese tipo,i la solucion fue grabar la imagen en un DVD regrabable de esos que se pueden borrar,i hacia pruebas con eso y funcionava 100 %,era una simple tonteria,el bootloader parece estar bien,la imagen la creaba con el "quemu" es muy buen emulador i va de lujo,te lo recomiendo,si lo hicieras con el FASM,te lo aria automaticamente......sin complicarse la vida que fue como finalmente me decidi por ese,para mi es el mejor Ensambladoe que hay y MUY ligero ^^,y como te digo crea la imagen automaticamente (.BIN)



saludos

Etiquetas: mundo, operativo, sistema
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:21.