Emulando a Linus Torvalds: Crea tu propio sistema operativo desde 0 (I)

Antes de nada comentar que este es mi primer artículo y que deseo que os guste a todos.

Linus Torvals feliz

En esta serie vamos a emular a Linus Torvalds, vamos a crear nuestro sistema operativo desde 0. En este primer episodio vamos a ver el arranque y pondremos un texto en pantalla desde nuestro kernel.

En mi caso el sistema operativo se llama NextDivel. La primera decisión que debemos hacer nada más plantearnos el sistema operativo es ¿cuál va a ser el bootloader?

Aquí existen múltiples variantes, e incluso podríamos crear uno nosotros; sin embargo, en este tutorial voy a usar GRUB, porque la mayoría conoce más o menos algo de él. Creamos una carpeta que será el root de nuestro sistema operativo y allí creamos la carpeta /boot/grub

mkdir nextroot && cd nextroot

mkdir -p boot/grub

Allí creamos el fichero grub.cfg de la siguiente manera:

menuentry "NextDivel" {
echo "Booting NextDivel"
multiboot /next/START.ELF
boot
}

En este fichero hemos visto como GRUB cargará nuestro kernel, en este caso, en /next/START.ELF. Ahora debemos crear nuestro kernel.

Para ello necesitaremos el GCC y GAS (el ensamblador del proyecto GNU, suele venir con el gcc). Así pues vamos a crear el kernel.

Primero hacemos un archivo llamado kernel.asm. Este archivo contendrá el punto de inicio de nuestro kernel y además definirá el multiboot (una característica de algunos bootloaders como GRUB). El contenido de kernel.asm será:

.text
.globl start
start:
jmp multiboot_entry
.align 4
multiboot_header:
.long 0x1BADB002
.long 0x00000003
.long -(0x1BADB002+0x00000003)
multiboot_entry:
movl $(stack + 0x4000), %esp
call NextKernel_Main
loop: hlt
jmp loop
.section ".bss"
.comm stack,0x4000

Todo lo relacionando con multiboot es simplemente seguir la especificación nada más. Todo empezará en start, llamará a multiboot_entry, habremos definido el multiboot header en los primeros 4k y lo pondremos (con movl).

Más tarde llamamos a NextKernel_Main que es nuestra función en C del kernel. En el loop hacemos un halt para parar el ordenador. Esto se compila con:

as -o kernel.o -c kernel.asm

Ahora vamos a entrar a programar en C. Pensarás que ahora todo es pan comido, ponemos un printf en main y ya está, lo hemos hecho.

Pues no, ya que printf y main son funciones que define el sistema operativo, ¡pero nosotros lo estamos creando! Solo podremos usar las funciones que nosotros mismos definamos.

En capítulos posteriores hablaré de como poner nuestra propia libraría del C (glibc, bionic, newlibc) pero tiempo al tiempo. Hemos hablado que queremos poner texto en pantalla, bueno veremos como lo hacemos.

Hay dos opciones, una es llamar a la BIOS y otra es manejar la memoria de la pantalla directamente. Vamos a hacer esto último pues es más claro desde C y además nos permitirá hacerlo cuando entremos en modo protegido.

Creamos un fichero llamado NextKernel_Main.c con el siguiente contenido:

int NextKernel_Main()
{
char *str = "NextDivel says Hello World", *ch;
unsigned short *vidmem = (unsigned short*) 0xb8000;
unsigned i;
for (ch = str, i = 0; *ch; ch++, i++)
vidmem[i] = (unsigned char) *ch | 0x0700;
return 0;
}

Con esto manipulamos directamente la memoria VGA y caracter a caracter lo vamos escribiendo. Compilamos desactivando la stdlib:
gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding

Si has llegado hasta aquí querrás probar ya tu nuevo y flamante sistema operativo, pero todavía no hemos terminado. Necesitamos un pequeño fichero que diga al compilador en que posición del archivo dejar cada sección. Esto se hace con un linker script. Creamos link.ld:

ENTRY(start)
SECTIONS
{
. = 0x00100000;
.multiboot_header :
{
*(.multiboot_header)
}
.text :
{
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(4096);
}
.data :
{
data = .; _data = .; __data = .;
*(.data)
*(.rodata)
. = ALIGN(4096);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .; _end = .; __end = .;
}

Con esto definimos la posición de cada sección y el punto de entrada, start, que hemos definido en kernel.asm. Ahora ya podemos unir todo este mejunje:

gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding -lgcc

Ahora copiamos START.ELF al /next dentro de nuestra carpeta que simula el root de nuestro sistema operativo. Nos dirigimos a la carpeta root de nuestro sistema operativo nuevo con la consola y verificamos que hay dos archivos: uno /boot/grub/grub.cfg y otro /next/START.ELF.

Vamos al directorio superior y llamamos a una utilidad de creación ISOs con GRUB llamada grub-mkrescue

grub-mkrescue -o nextdivel.iso nextroot

Una vez hayamos hecho esto tendremos una ISO. Esta ISO puede abrirse en ordenadores x86 (64 bits también) y máquinas virtuales. Para probarlo, voy a usar QEMU. Llamamos a QEMU desde la línea de comandos:

qemu-system-i386 nextdivel.iso

Arrancará SeaBIOS y más tarde tendremos GRUB. Después si todo va correcto veremos nuestra frase.
Pensarás que esto es difícil, te respondo, sí lo es.

Realmente crear un sistema operativo es difícil y eso que este de aquí no hace nada útil. En próximos capítulos veremos como manejar colores en la pantalla, reservar memoria y si puedo, como obtener datos del teclado.

Si alguien no quiere copiar todo lo que hay aquí, tengo un repositorio en GitHub (más elaborado) con el sistema operativo NextDivel. Si quieres compilar NextDivel solo tienes que tener git y cmake:

git clone https://github.com/AdrianArroyoCalle/next-divel
cd next-divel
mkdir build && cd build
cmake ..
make
make DESTDIR=next install
chmod +x iso.sh
./iso.sh
qemu-system-i386 nextdivel.iso

Os animo a colaborar en NextDivel si tienes tiempo y ganas de crear un sistema operativo. Quizá incluso superior a Linux… el tiempo lo dirá.


85 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   elav dijo

    :O

    1.    marianogaudix dijo

      Torvalds tomo el el sistema operativo Minix ( derivado de UNIX ) a Andrew S. Tanenbaum y lo mejoro .

      Tanenbaum se ha peleado con Linus , se insultaron . Tanenbaum dice que el Microkernel es el futuro (HURD , Minix nuevo cono Microkernel ) .

      http://www.taringa.net/posts/linux/17215999/Linux-vs-Hurd-Kernel-Monolitico-vs-Microkernel.html

  2.   eliotime3000 dijo

    Éste ha sido el mejor post que he visto hasta ahora en este blog. Ya quiero saber qué más hacer.

  3.   Carlos.Gude dijo

    Impresionate.

  4.   axl dijo

    Realmente impresionante!!

  5.   rhoconlinux dijo

    FUUUUUUUA!
    es el post más geek que vi en mi vida jeje. Felicitaciones Adrián, un artículo de puta madre! híper interesante!!! 🙂

    1.    Joaquin dijo

      Concuerdo. Me imagino esta situación:
      Usuario avanzado de GNU/Linux (con cara de felicidad):
      «ya sé compilar mi Gentoo»

      Nerd (con actitud despectiva): «pff, yo he creado mi propia distro…»

      1.    desikoder dijo

        Si , yo se crear mi propia distro linux. De hecho en ello estoy desarrollando un initramfs y un kernel para un linux empotrado. No es lo mismo crear un sistema operativo que una distro linux. Lo primero es mucho más dificil , casi imposible , lo segundo tal y como lo has dicho puede ser cualquier cosa , incluso ubuntu con el logo cambiado xD. Asi que yo lo dejaría así :

        Usuario avanzado de GNU/Linux (con cara de felicidad)
        – ya sé compilar mi Gentoo

        Semi-Nerd
        – Pff , yo he seguido un linux from scratch y he hecho mi propia distro

        Nerd ( con actitud despreciativa )
        – pff , pues yo he programado un kernel en ensamblador y en C

        Saludos !

  6.   cronos dijo

    Esto me resulta interesante, a la espera de los siguientes capítulos.

  7.   abimaelmartell dijo
    1.    AdrianArroyoCalle dijo

      Gracias por el enlace, le echaré un vistazo.

  8.   José Jácome dijo

    Quisiera un Sistema Operativo 100% compatible con los gráficos AMD :/

    1.    IvanLinux dijo

      Windows

      1.    José Jácome dijo

        jajaja en Windows Catalyst no tiene soporte a OpenGL, aunque en Linux no puedo usarle toda la potencia gráfica seguiré esperando para ver que sucede!

        1.    beny_hm dijo

          solo espera que valve arrase con el mercado

  9.   KZKG^Gaara dijo

    Mágico, perfecto, excelente aporte, se vislumbra como una gran serie de posts 🙂

  10.   O_Pixote_O dijo

    Buah me gustaria saber programar para poder ayudarte, simplemente como forma de practicar con los conocimientos que vas aprendiendo ya ayuda uno. De momento te dejo el lema para captar la atención hacia el proyecto una vez lo acabes «Usa NextDivel, el porno se ve igual(o mejor).», arrasaras xD.

  11.   thisnameisfalse dijo

    Mooooooolaaa!!!!

  12.   nordri dijo

    Muy buen artículo, pero sólo por curiosidad por qué no has seguido el proyecto de Linux From Scratch??

    Saludos

    1.    AdrianArroyoCalle dijo

      Bueno, Linux from Scratch está muy bien, y puedes decir que es tuyo, pero realmente es muy mecánico:
      -Descargar fuentes
      -Parchearlas
      -Compilar
      -Instalar
      -Siguiente
      Aquí aunque al final el resultado sea peor puedes decir que has revisado todos los archivos.

    2.    desikoder dijo

      Como se deduce de mi anterior comentario , porque no tiene el mismo nivel de complejidad. Además , linux from scratch no es realmente , en contra de su nombre , crear un sistema desde 0. Crear un sistema desde cero es programarlo tu , escribir tu propio kernel , no el kernel linux , a ser posible incluso tu propio bootloader en vez de grub , lilo , syslinux , etc. Aunque un LFS no es moco de pavo y es bastante complejo , ni se le acerca a programar tu propio kernel …

      Además , concuerdo con AdrianArroyoCalle en que es demasiado mecánico , yo alguna vez me lo he leido y acabas desistiendo en la sexta página , además te dicen que uses nosecuales versiones de los paquetes porque si no las instrucciones no funcionan ( eso demuestra la falta de flexibilidad , en mi opinion ). Yo creo que es mejor tener algo de idea propia , compilar los paquetes que tu quieras , incluso programar alguno , compilar un kernel linux y en paz.

      Saludos !

  13.   cookie dijo

    uuuoooohh!! nunca me había capturado tanto un post como lo hizo este.
    Por favor, continua 😀

  14.   linux_user dijo

    No se que esta mal:

    error: no multiboot header found.
    error you need to load the kernel first

    1.    AdrianArroyoCalle dijo

      Si acaso te sirve de consuelo yo tuve el mismo error. Intenta usar las fuentes que están en GitHub, ahí el error ya se soluciona. De todos modos creo que si cambias la línea de grub.cfg de «multiboot /next/START.ELF» a «kernel /next/START.ELF» podría funcionar. No lo sé exactamente.

      1.    mcplatano dijo

        Antes que nada, magnífica entrada 🙂
        Estoy teniendo el mismo problema de cargar el kernel desde grub. Incluso usando las fuentes del GitHub o cambiando multiboot por kernel…

        error: no multiboot header found.
        error: no loaded kernel

        1.    AdrianArroyoCalle dijo

          ¿Estás usando clang como compilador? Cambialo por el gcc
          ¿Te has acordado de usar el linker script? Es necesario para que el linker (ld en nuestro caso) sepa en que lugar del archivo va a poner cada cosa. En este caso el multiboot header debe de estar al principio.
          ¿Estás usando el sistema de CMake? Si lo usas creo que no falla.
          Si tampoco te funciona intentaré encontrar otra solución.

  15.   khourt dijo

    [+100]
    Simplemente genial !!!

  16.   invisible15 dijo

    Mola mucho 🙂

  17.   Tanrax dijo

    Me quito el sombrero. Impresionante post. Muchas felicidades.

  18.   man dijo

    Woha!
    Estaria genial que se pudieran abrir aplicaciones echas en HTML5 y Javascript sin tener que usar un navegador, es eso posible?
    Hablo de que sean como aplicaciones nativas.
    Asi seria facil programar para este sistema operativo 😀

    1.    AdrianArroyoCalle dijo

      En este caso no lo voy a realizar porque lleva por detrás mucho más trabajo pero hay un sistema operativo llamado «es» que hace lo que tu dices. De hecho la línea de comandos es JavaScript y las ventanas se dibujan usando las funciones Canvas de JavaScript. Lo hicieron ingenieros de Nintendo y ahora es open source.

      http://code.google.com/p/es-operating-system/

      1.    man dijo

        Valla, gracias por la info 😀
        le dare un vistazo

  19.   patodx dijo

    Quien pueda hacer su propio S.O. puede morir tranquilamente, ya que el nivel intelectual que ha de conseguir con ello; lo hace prescindir del cielo o el infierno.
    Pedazo de posteo.

    1.    Miguel dijo

      hasta ahora nadie que se sepa ha hecho solo algo que se pueda decir que es un sistema operativo decente hecho desde cero, ni tan siquiera Linux Torvalds como decís al principio, ya que este partió de las fuentes de Unix y todo lo demás es autoría en común de más de una persona, la vida es muy corta y partir realmente desde cero es impensable para nadie aunque se quiera decir lo contrario es demostrable en muchos errores cometidos en copiar y pegar por Linux Torvalds

      1.    skarmiglione dijo

        Las fuentes de unix son cerradas, el uso minix… que es otra cosa.

      2.    Felipe Robaina dijo

        y los que hicieron QDOS que?
        se basaron en algo?

  20.   Tesla dijo

    Por lo que veo, quien no tiene su propio sistema operativo es porque no quiere, jajajajaja.

    Ahora en serio, muy interesante! Escapa mucho a mi escaso conocimiento de programación, pero leeré con ansia las demás partes de esta serie.

    Gracias por el post!

  21.   Manuel R dijo

    Me dejaste con cara de O_O… sin la intención de menospreciar los aportes de nadie, es de lo más «pro» que he visto últimamente. Saludos.

  22.   aitor_cz dijo

    Muy buen artículo, Adrián. Por favor, continúa…

  23.   mj dijo

    ¿Es broma por el dia de los inocentes?, no seas malo «Emulando a Linus Torvalds: Crea tu propio sistema operativo desde 0». No creo que sea dificil para el que cursa una carrera en algún instituto de tecnologia o universidad; pero para mí que soy un novato archer (hay quienes nos dicen «Noob» pero me considero más Newbie algo flojo) eso suena como a no pisar tierra. De todos modos ESTE ARTICULO CREA MUCHA CURIOSIDAD Y SIN DUDA ADMIRACION Y RESPETO POR SU REDACTOR, FELICITACIONES; lo primero que hare es tratar de comprender al menos un poco este valioso material.
    GRACIAS Adrian Arroyo Calle excelente trabajo y noble entrega de conocimientos.

  24.   Blaire Pascal dijo

    LEL Excelente post, sigue así.

  25.   F3niX dijo

    Que Grandioso post, esto es lo que extrañaba de desde linux. Que maravilla.

  26.   Ruby dijo

    Genial el post, muchas gracias.
    No entendí que hace el fichero link.ld, me lo puede explicar alguien??

    1.    AdrianArroyoCalle dijo

      El fichero link.ld dice al linker (en este caso ld) en que posición dentro del fichero resultante debe estar cada parte del código. También definimos el punto de entrada ya que al no tener sistema operativo no podemos usar main como un programa normal, en este caso seleccionamos la función start.

  27.   Maxi dijo

    Buenisimo todos tus post! Esperando por el 7! Lo que si me queda una duda, por ejemplo, si solo quisiera correr un algoritmo, sin SO, como se que puedo usar y que no de C?

    1.    AdrianArroyoCalle dijo

      Si lo usas así tal cual no podrías usar nada de la stdlib, que prácticamente es lo que todo el mundo usa (nada de malloc, free, printf, scanf, strcmp, etc). Todo se tiene que implementar directamente de memoria o ASM. Puede que en un capítulo superior enseñe como instalar una librería del C para el sistema operativo. Si usas C++ tampoco puedes usar excepciones y los operadores new y delete (y seguramente más cosas).

    2.    Swicher dijo

      Creo que esto te puede dar una mejor idea de como hacerlo.

  28.   Esteban dijo

    Hola, hace unos 5 años seguí una publicación similar y desarrollé un microkernel que inicia de la misma manera, tiene algunos aspectos a mejorar, pero puede que pueda interesarte, corre en modo protegido, ejecuta mutlitarea y realiza virtualización de memoria, ultimamente trabajé en el driver de disco y unidad de cd para poder hacerlo instalable y no solo corra en live cd… Saludos.

  29.   Johan dijo

    Estimados, tengo un error en al momento de ejecutar el comando:
    gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding -lgcc

    link.ld:5 syntax error
    collect2: error: ld returned 1 exit status

    link.ld
    . = 0x00100000;
    .multiboot_header :{
    *(.multiboot_header)
    }

    En la linea 5 no veo el error, alguien le pasa lo mismo?

    Estoy trabajando con un debian wheezy virtualizado en virtualbox

    1.    Julian Reyes Escrigas dijo

      agrega el «;» al final de *(.multiboot_header)

  30.   Eric Orellana Romero dijo

    Excelente iniciativa, seguiré sin duda los capítulos de este post, prentendo aprender mucho con ello. Muchas gracias por darte el tiempo de enseñarnos. Un solo detalle al respecto, cabe destacar que Linus Torvalds no es el creador de ningún sistema operativo, él creo el Kernel del sistema GNU/Linux (el que ha sido utilizado en otros SO), lo que no deja de ser meritorio, pero es importante darle los creditos necesarios a Richard Stallman por la creación de la mayor parte del SO.

    Muchas gracias por el aporte y espero que consideres mi observación.

  31.   Julian Reyes Escrigas dijo

    LLevo rato trasteando con el tema, me intereso tan pronto como leí el encabezado. pero sigue saliendo el mensaje

    error: no multiboot header found.
    error you need to load the kernel first

    he subido lo que llevo a un repo en github https://github.com/rkmax/GenyOS

    1.    Martin Villalba dijo

      A mi me sucede lo mismo ¿Encontraste la solucion?

  32.   Carlos dijo

    una pregunta empece a introducir la sintaxis y la linea de menuentry me dice commandnot found aguien podria decirme por que
    esto es lo que hago

    BLACK@BLACK-pc:~/blackroot$ menuentry «NextDivel» {
    menuentry: command not found

    1.    AdrianArroyoCalle dijo

      El contenido de ese contenido no es para instroducirlo en la línea de comandos, sino en el fichero que creas llamado grub.cfg

  33.   Nodetino dijo

    Excelente artículo, ¡Gracias!

  34.   David dijo

    Espectacular…!! simplemente es como el eslabón perdido.

  35.   r.garciag dijo

    Me encanta tus tutoriales de Emulando a LInus Torvalds, pero hay un paso que no entiendo, el siguiente:
    Ahora copiamos START.ELF al /next dentro de nuestra carpeta que simula el root de nuestro sistema operativo. Nos dirigimos a la carpeta root de nuestro sistema operativo nuevo con la consola y verificamos que hay dos archivos: uno /boot/grub/grub.cfg y otro /next/START.ELF.

    Vamos al directorio superior y llamamos a una utilidad de creación ISOs con GRUB llamada grub-mkrescue

    POdría alguien explicármelo :p

    1.    AdrianArroyoCalle dijo

      Simplemente para generar una ISO mínima que GRUB pueda cargar copiamos el kernel a (el / de la ISO, cualquier carpeta)/next/START.ELF y el fichero de configuración de GRUB a (el / de la ISO, cualquier carpeta)/boot/grub/grub.cfg . Una vez hecho eso no hemos instalado GRUB todavía en la ISO y es que hay una utilidad que genera la ISO desde una carpeta e instala GRUB llamada grub-mkrescue. Entonces finalmente acabaríamos con una ISO booteable que tiene instalado GRUB, que puede leer la configuración para posteriormente ejecutar START.ELF correctamente. No se si me he explicado, pero lo que hacemos es una especie de sistema de archivos falso con el que generamos una ISO.

  36.   miguel jose guevara atencio dijo

    Buenísimo

  37.   Michael Moreno dijo

    pues mira realmente un nuevo sistema no tanto pero si mejorar el linux por ejemplo crear un exonucleo linux con un componente servidor que haga de micronúcleo si así se desease es decir una estructura exo con comportamiento micronúcleo eso seria súper y linux.

    lo otro es que no soy experto en programación solo unos cursi-tos de c++ y algo de java me bastaría con darle al kernel linux programar modulo destripándolo modificarlo etc

  38.   WinterSoldier53 dijo

    Sin duda ya tengo que hacer en vacaciones.

  39.   Fermin dijo

    sta bueno y en que programa lo diseña y lo codifica
    por favor me brindar ese respuesta

  40.   DarkMind dijo

    Al compilar desde tu git me sale:

    [jmponce@tarro build]$ cmake ..
    — Creating NextRoot directory
    — Generating ISO script
    make DESTDIR=next install
    ./iso.sh
    — Found Doxygen: /usr/bin/doxygen (found version «1.8.9»)
    — Configuring done
    — Generating done
    — Build files have been written to: /home/jmponce/next-divel/build
    [jmponce@tarro build]$ make
    Scanning dependencies of target START.ELF
    [ 7%] Building ASM-ATT object src/CMakeFiles/START.ELF.dir/start/boot.asm.o
    [ 14%] Building CXX object src/CMakeFiles/START.ELF.dir/start/NextShellLite.cpp.o
    [ 21%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_Screen.cpp.o
    [ 28%] Building CXX object src/CMakeFiles/START.ELF.dir/start/NextKernel_Main.cpp.o
    [ 35%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_Panic.cpp.o
    [ 42%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_Timer.cpp.o
    [ 50%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_Memory.cpp.o
    [ 57%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_Ports.cpp.o
    [ 64%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_GDT.cpp.o
    [ 71%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_ISR.cpp.o
    [ 78%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_String.cpp.o
    [ 85%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_IRQ.cpp.o
    [ 92%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_IDT.cpp.o
    [100%] Building CXX object src/CMakeFiles/START.ELF.dir/start/ND_Keyboard.cpp.o
    Linking CXX executable START.ELF
    /usr/bin/ld: se salta el /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/libgcc.a incompatible mientras se busca -lgcc
    /usr/bin/ld: no se puede encontrar -lgcc
    collect2: error: ld devolvió el estado de salida 1
    src/CMakeFiles/START.ELF.dir/build.make:402: fallo en las instrucciones para el objetivo ‘src/START.ELF’
    make[2]: *** [src/START.ELF] Error 1
    CMakeFiles/Makefile2:106: fallo en las instrucciones para el objetivo ‘src/CMakeFiles/START.ELF.dir/all’
    make[1]: *** [src/CMakeFiles/START.ELF.dir/all] Error 2
    Makefile:117: fallo en las instrucciones para el objetivo ‘all’
    make: *** [all] Error 2

    1.    AdrianArroyoCalle dijo

      El error parece ser que no encuentra llibgcc ya que tienes la versión de 64 bits y actualmente el sistema de compilación está forzado a usar 32 bits. Deberías intalar un paquete de compatibilidad en tu distro o mejor, usa un sistema de 32 bits.

      1.    Ronaldo Rodriguez dijo

        Yo tengo de 32 bits y sale ese mismo error, ¿te refieres al sistema operativo o a la arquitectura? la mía es 64 Bits, pero estoy usando Ubuntu de 32 bit, no pregunten, problemas económicos, con eso lo digo todo.

  41.   Jorge dijo

    Excelente tema, a la espera de mayores alcances. saludos

  42.   Jhon dijo

    Genial espero por mas

  43.   Soid Pérez dijo

    Hola soy un joven ambisio que deso crear un sistema operativo que acmita todos los programas y plataformas para que los desarrolladores no tengan que tener makinas potentes ni ifinidades de aplicaciones o programas en una pc.
    por eso estoy interesado en este post pero cuando descargo tu git o intento crearlo yo todo va vien hasta que ejecuto el comando ./iso.sh ó grub-mkrescue -o nextdivel.iso nextroot me sales este error

    «grub-mkrescue: aviso: Su xorriso no soporta «–grub2-boot-info». Algunas características se han desactivado. Use xorriso 1.2.9 o posterior..
    grub-mkrescue: aviso: Su xorriso no soporta «–grub2-boot-info». Su imagen del núcleo es demasiado grande. El arranque como disco se ha desactivado. Use xorriso 1.2.9 o posterior..»
    u de verdad no tendo ni idea ya que se mucho de aplicaciones y de webs pero no ce nada de grub

    1.    AdrianArroyoCalle dijo

      Quizá debas actualizar el programa xorriso en tu distro. ¿Qué distro y versión usas?

      1.    Soid Perez dijo

        uso xubuntu 14.04lts e intente ejecutar xorriso pero la shell me dice que no lo encuentra y me sale apt-get install xorriso aunque sinceramente esperaba alguna respuesta porque e tenido mala experiencia instalando cosas que no conosco en linux jeje. lo actualizare ahora mismo y te digo que paso

      2.    AdrianArroyoCalle dijo

        Entonces instala xorriso desde el centro de software o simplemente desde la terminal haz «sudo apt-get install xorriso»

      3.    Soid Perez dijo

        ya hice todo lo que me dijistes y tanto con el git y con el mio me sale esto xorriso 1.3.2 : RockRidge filesystem manipulator, libburnia project.

        Drive current: -outdev ‘stdio:nextdivel.iso’
        Media current: stdio file, overwriteable
        Media status : is blank
        Media summary: 0 sessions, 0 data blocks, 0 data, 1901m free
        Added to ISO image: directory ‘/’=’/tmp/grub.OEqSzV’
        xorriso : UPDATE : 546 files added in 1 seconds
        xorriso : FAILURE : Cannot determine attributes of source file ‘/media/gaia/Jupiter1/ShellSystem/nextroot/nextroot’ : No such file or directory
        xorriso : UPDATE : 546 files added in 1 seconds
        xorriso : aborting : -abort_on ‘FAILURE’ encountered ‘FAILURE’
        y de pana no entiendo mie estructura es /nextroot/boot/grub/grub.cfg y nextroot/next/START.ELF

      4.    Soid Perez dijo

        Gracias ya estoy listo para avanzar un amigo me ayudo y me dijo lo que hice mal era la organización del directorio así que lo acomode y listo

      5.    erik dijo

        disculpa me podes indicar que procedimiento realizaste ya que me aparece el error nothing to boot: no such file or directory

        no bootable device.

  44.   jose dijo

    Saludos! te iba a pedir el favor si me podías mandar un correo con lo que explicas aquí, me he liado un poco y necesito comparar lo que llevo con lo que explicas, tal vez lo que no me queda claro es si la creación del fichero grub.cfg se hace en el gcc de la terminal o donde exactamente? muchas gracias amigo!

    1.    AdrianArroyoCalle dijo

      El fichero grub.cfg lo creas con un editor de texto cualquiera y lo debes guardar en CARPETA_DEL_PROYECTO/boot/grub/grub.cfg

  45.   Jhuazano dijo

    Hola Adrian primero que nada felicitarte y agradecer tu aporte.

    Sabes estoy realizando esto para una practica y me dispuse a armarla siguiendo tu tuto sin embargo tras empezar me halle el primer error

    $ as -o kernel.o -c kernel.asm
    bash: as: no se encontró la orden…
    Las órdenes similares son::
    ‘sa’
    ‘ac’

    estoy trabajando sobre fedora 20, y no hallo solucion al respecto agradeceria tu orientacion sobre si debo cambiar algo de gcc o gas

    de antemano gracias

    1.    AdrianArroyoCalle dijo

      Debes instalar GAS por lo que puedo ver el código de error. No tengo Fedora a mano pero en teoría si haces yum install gcc-c++ instalarás toda la suite de GCC y en ella suele venir GNU As.

  46.   Gastón Ramirez dijo

    Yo estoy contigo, se algo de C++, C# (a pesar que este utlimo no sirve de mucho en este tema) lo malo es que todavia me falta experiencia, nunca maneje lenguaje C, esta genial tu publicación, em no tengo mucho para decir, si tengo tiempo veo. Gracias.

  47.   Teresita del jesus nah sanchez dijo

    muchas gracias de gran ayuda ….

  48.   jky dijo

    me encanta linux es el mejor distrito que hay la verdad para mi windows es basura a un que yo se que el creador de linux es el creador de windows

  49.   Rode dijo

    Hola Me Sale un Error en grub dice
    error : file /next/START.ELF Not found
    error: you need to load the kernel first

    Me podrian Ayudar e googleado pero no encuentro

  50.   Enrique Avila dijo

    Por favor como puedo hacer para que muestre el mensaje de HOLA MUNDO soy principiante y desconozco todavía bastante

  51.   CARLOS GUERRERO ALVAREZ dijo

    A mi me ocurre lo siguiente:
    gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding -lgcc
    /usr/bin/ld: kernel.o: relocation R_X86_64_32 against symbol `stack’ can not be used when making a PIE object; recompile with -fPIE
    /usr/bin/ld: final link failed: nonrepresentable section on output
    collect2: error: ld returned 1 exit status