El kernel Linux no es Software Libre


Primero dejar en claro que Linux es el solo nombre del kernel usado en el sistema GNU.

Este kernel Linux (en sus inicios llamado Freax, modificado posteriormente por Ari Lemmke colega de Linus Torvalds y con aceptación de este) era privativo cuando se lanzó en 1991 y en el 1992 cambia su licencia a la GNU GPL versión 2, pasando recién a ser Software Libre, pero luego en el año 1996 Linus Torvalds (creador del kernel) comienza a aceptar la inclusión de firmware que solo estuviese en formato binario, lo cual genera que con esto se acepte también firmware no-libre al kernel, esto en la actualidad ha ido creciendo y actualmente existe mas de 2MB de software no libre dentro del kernel Linux.

Logo de linux-libre

Actualemente Alexandre Oliva con la FSFLA (Fundación del Software Libre para Latinoamerica) mantine el proyecto Linux-libre (ver logo arriba) en el cual se han removido todas las partes no libres del kernel, con lo cual seguimos teniendo un kernel libre, pero ojo que el kernel linux a secas no es software libre, ya que no cumple con las cuatro libertades que son:

– La libertad de usar el programa, con cualquier propósito (libertad 0).
– La libertad de estudiar el funcionamiento del programa, y adaptarlo a las necesidades (libertad 1). El acceso al código fuente es una condición previa para esto.
– La libertad de distribuir copias, con lo que puede ayudar a otros (libertad 2).
– La libertad de mejorar el programa y hacer públicas las mejoras, de modo que toda la comunidad se beneficie (libertad 3). De igual forma que la libertad 1 el acceso al código fuente es un requisito previo.

El kernel linux-libre es el kernel que es usado en distribuciones como gNewSense, Trisquel, entre otras.

Más información en : http://www.fsfla.org/svnwiki/anuncio/2010-03-Linux-2.6.33-libre.es

Anuncios

Comenzando con GNU Assembler (GAS)


En estas semanas en la UNIversidad estuve viendo lo que es un poco de assembler, pero sucede que cuando se explica se usa herramientas privativas como NASM, por lo cual decidí buscar herramientas libres y encontré que existía GNU Assembler (GAS) dentro del sistema GNU, el cual usa la sintaxis de AT&T, así que decidí aprender el uso de GAS y ahora procederé a explicar un par de ejemplos.

En este articulo explicare sobre imprimir una cadena, macros y algunas otras cositas que encontré por ahí. Tener en claro que esto lo he aprendido de diferentes códigos, ya que encontré poca información en la red, así que si me equivoco en algún concepto por favor díganmelo.

Cada código para poder tenerlo como ejecutable, deberemos de ensamblarlo (volverlo a código objeto “.o”) y luego Vincularlo (volverlo ejecutable). Para esto haremos los siguientes comandos en la consola con cada ejemplo encontrado debajo.

Primero lo ensamblamos:

as –o programa.o programa.s

Segundo lo vinculamos:

ld –o programa programa.o

Al final los ejecutamos:

./programa

Ejemplo1

#Definimos el segmento de datos
.section .data
	mensaje: .ascii "Hola Urpi\n" #Definimos una variable mensaje
	longitud = . - mensaje #Definimos la longitud de mensaje

#Definimos el segmento de texto
.section .text
	.globl _start #Le damos el punto de entrada _start

_start:
	movl $longitud, %edx #Asignamos longitud a edx
	movl $mensaje,%ecx #Asignamos mensaje a edx
	movl $1,%ebx
	movl $4,%eax
	int $0x80 #Similar a la llamada 21 del MS-DOS

	#Terminamos el programa
	movl $0,%ebx
	movl $1,%eax
	int $0x80 #Llamando al kernel

En el ejemplo1 usamos la sección (similar a segmento) “data” para definir variables, dentro de la sección “text” vamos a poner el código en si, cabe notar también que ahora es movl en lugar de mov y que el orden es inverso y ahora se usa “%” antes de llamar a los registros, los comentarios se pueden hacer con “//”, “#” o “/* … */” (sin las comillas), entre algunas otras diferencias.

Ejemplo2

#Creamos un macro para definir la funcion imprimir
.macro imprimir cadena longitud
	movl \longitud,%edx
	movl \cadena,%ecx
	movl $1,%ebx
	movl $4,%eax
	int $0x80
.endm

.macro terminar
	movl $0,%ebx
	movl $1,%eax
	int $0x80 #Llamando al kernel
.endm

#Definimos el segmento de datos
.section .data
	msg_saludo: .ascii "Hola Urpi\n" #Definimos una variable mensaje
	long_saludo = . - msg_saludo #Definimos la longitud de mensaje
	msg_email: .ascii "To correo es : ovegar (at) uni (dot) pe\n"
	long_email = . - msg_email

#Definimos el segmento de texto
.section .text
	.globl _start #Le damos el punto de entrada _start

_start:
	imprimir $msg_saludo $long_saludo #Mandamos msg_saludo y long_saludo al macro imprimir
	imprimir $msg_email $long_email
	terminar #Terminamos el programa, el codigo ahora esta en el macro terminar

En el ejemplo2 ahora necesitamos imprimir dos cadenas y como usaremos código de manera repetitiva código, entonces crearemos macros que vendría a ser similar a funciones.

Se puede encontrar información para poder iniciar en esta web de IBM.