Algo de Linux

sábado, 20 de abril de 2019

MIPS: Imprimir un caracter en pantalla

Vamos a seguir con otro ejemplo sencillo para ir aprendiendo MIPS. En este caso, vamos a escribir un código que imprima un caracter en pantalla y lo vamos a hacer utilizando nuevas instrucciones que no hemos visto aún.

Como podemos ver en el siguiente código, en la sección de datos, estamos declarando una variable letra que reserva un byte de espacio en memoria:
.data   # sección de datos 
   letra: .space 1 
   
.text   # sección de código
.globl main 

main:
   li $t0,'Z'      # cargamos el caracter 'Z' en el registro temporal $t0
   sb $t0,letra    # cargamos el caracter que hemos almacenado en $t0 en el espacio de 1 byte 
                   # reservado para una letra
  
   lb $a0,letra    # cargamos el caracter almacenado en el espacio letra en el registro $a0 
   li $v0,11       # cargamos la llamada al sistema (11) que permite imprimir un caracter
   syscall         # realizamos la llamada al sistema
El código es muy sencillo:
  • Utilizando la instrucción li (load inmediate)  cargamos en el registro temporal $t0 el caracter Z.
  • Utilizando la instrucción sb (store byte) cargamos el caracter que almacenamos en el registro $t0 en el espacio de 1 byte reservado en memoria para almacenar una letra.
  • Utilizando la instrucción lb (load byte) cargamos en el registro $a0 el caracter almacenado en el espacio reservado en memoria para almacenar una letra.
  • Cargamos el código de la llamada al sistema que permite imprimir un caracter.
  • Hacemos la llamada al sistema.
Si pegamos el código anterior en MARS y lo ejecutamos, veremos que se mostrará el caracter Z en pantalla. 
Publicado por primera vez en http://enavas.blogspot.com.es

MIPS: Imprimir un mensaje en pantalla

Una de las operaciones más básicas que realizamos en cualquier lenguaje es mostrar mensajes en pantalla para informar al usuario de que debe introducir algún dato o mostrar resultados.

Como podemos ver en el siguiente código, en la sección de datos, estamos declarando una variable str de tipo string que contiene la cadena Hola mundo y el caracter de nueva línea.
.data   # sección de datos 
   str: .asciiz "Hola mundo\n" 
   
.text   # sección de código
.globl main 

main:
   la $a0, str  # Cargamos en el registro $a0 la dirección de la cadena a imprimir
   li $v0, 4    # Colocamos en $v0 el número de llamada al sistema que permite  imprimir un string
   syscall      # Ejecutamos la llamada al sistema indicada en el registro $v0

El código es muy sencillo:
  • Cargamos en el registro $a0 la dirección de la cadena a mostrar. Recordemos que los registros $a0, $a1, $a2 y $a3 guardan los argumentos para las subrutinas. Estos registros pueden ser modificados dentro de las subrutinas.
  • Cargamos en el registro $v0 el código de la llamada al sistema que permite imprimir un string en pantalla.
  • Hacemos la llamada al sistema.
No importa el orden en que carguemos la dirección de la cadena y el valor de la llamada al sistema.

En el código anterior estamos definiendo una etiqueta main y la estamos declarando como global (.globl main). Declarar una etiqueta como global, nos permite poder referenciarla desde otros ficheros. No influye en la ejecución del código.

Si pegamos el código anterior en MARS y lo ejecutamos, veremos que se mostrará la cadena Hola mundo y se realizará un salto de línea.
Publicado por primera vez en http://enavas.blogspot.com.es

Estructura general de un programa en ensamblador MIPS

Un programa creado en ensamblador MIPS se compone de dos partes:
  • La sección .data
  • La sección .text
La sección .data es la parte del programa en la que se crean y definen todas las variables que se utilizarán en él. Es importante destacar que no es necesario crear una sección .data si no la vamos a usar.

Las variables en la sección .data se declaran de la siguiente forma:
 nombre:   .tipo    valor(es)
Por ejemplo, si queremos crear una variable entera llamada num1 con un valor inicial de 3, lo haríamos así:
.data
   num1:   .word    3
En cuanto a la sección .text, es la parte del programa en la que escribimos las instrucciones que debe ejecutar el programa.
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 17 de abril de 2019

MIPS Reference Card

Cuando empezamos a trabajar en algo, es recomendable tener a mano una cheatsheet. Para empezar en MIPS, podemos echar  mano de la siguiente chuleta:

Publicado por primera vez en http://enavas.blogspot.com.es

Utilizar MARS para programar en ensamblador MIPS

El lenguaje ensamblador depende directamente de la arquitectura del computador, lo que significa que cada arquitectura tiene su propio lenguaje ensamblador.

MARS (MIPS Assembler and Runtime Simulator) es un IDE (editor, ensamblador, simulador y depurador de lenguaje ensamblador)  creado por la Universidad Estatal de Missouri para programar en ensamblador MIPS.

Es de código abierto y está escrito en Java. Por tanto, vamos a poder utilizarlo en cualquier sistema que tenga un intérprete de java instalado.

Como nosotros trabajamos con Ubuntu (a día de hoy concretamente con la versión 18.04), vamos a ver cómo podemos iniciarlo.

Lo primero que tendremos que hacer es instalar al menos un runtime de java, si no lo tenemos instalado ya:
# apt update && apt -y install default-jre
Como podéis ver, hemos instalado el runtime de java por defecto.

Una vez instalado, descargamos MARS:
# wget http://courses.missouristate.edu/KenVollmar/mars/MARS_4_5_Aug2014/Mars4_5.jar
Una vez descargado, ya podemos iniciarlo desde un terminal:
# java -jar Mars4_5.jar
Y listo:

Para iniciarlo con mayor comodidad, podemos crear un fichero .desktop en /usr/share/applications/ 
Publicado por primera vez en http://enavas.blogspot.com.es

lunes, 8 de abril de 2019

Debloquear usuarios en Openmediavault

Si introducimos incorrectamente nuestra password, Openmediavault marcará nuestra cuenta como candidata a bloquear y si seguimos introduciendo mal la password,terminará por bloquearla. Para evitar problemas, el administrador cuenta con la herramienta de primeros auxilios omv-firstaid con la que podremos resetear el contador de intentos de login fallidos.

Podemos abrir esta herramienta conectándonos, por ejemplo, vía ssh a Openmediavault y ejecutando el siguiente comando en un terminal:


A continuación seleccionamos la opción que nos permite resetear el contador de intentos de login fallidos:


La herramienta nos mostrará todas aquellas cuentas bloqueadas o candidatas a bloquear. Lo único que tenemos que hacer para desbloquear cada cuenta, será seleccionarla y pulsar el botón "Aceptar".


Publicado por primera vez en http://enavas.blogspot.com.es

Preparación de tablets Librarium para uso compartido

El curso pasado recibimos unas tablets para su uso con Librarium en las bibliotecas de los centros y este curso hemos recibido otras diferentes, concretamente unas L108MR de TECHcomputer. Como el uso de estos dispositivos va a ser compartido por varios usuarios, no nos ha quedado más remedio que realizar una configuración común en todas ellas.

Por lo que he visto, algunos compañeros han optado por diferentes estrategias para instalar una serie de APPS y establecer ajustes y restricciones. En mi caso, como en nuestro centro disponemos de un dominio propio y G Suite para educación, para automatizar lo máximo posible el procedimiento, he optado por crear una OU a la que aplicar una serie de políticas de seguridad:



De momento, he aplicado las siguientes:
  • Crear una lista blanca de aplicaciones.
  • Limitar la instalación de aplicaciones a la lista blanca.
  • Configurar las aplicaciones de la lista blanca para que se instalen automáticamente y no se puedan desinstalar.
  • Deshabilitar la cámara.
  • Deshabilitar la grabadora de sonidos.
  • Bloquear el acceso a los ajustes del dispositivo mediante AppLock.
De este modo, para configurar una tablet automáticamente, tan sólo tengo que iniciar sesión con una cuenta que pertenezca a la OU en la que he definido las políticas de seguridad. Una vez iniciada, podemos comprobar cómo las aplicaciones se van a ir instalando automáticamente:


En principio éstas son las aplicaciones que se instalan:


Si en algún momento fuera necesario instalar alguna más, tan sólo tendría que añadirla a la lista blanca y se instalaría automáticamente al aplicar las políticas de seguridad.

Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 3 de abril de 2019

Iniciar Windows 10 en modo seguro desde la pantalla de inicio de sesión

Para iniciar Windows 10 en modo seguro desde la pantalla de inicio de sesión, pulsamos la tecla Mayús y, sin soltarla hacemos clic con el ratón en el botón de apagado que hay en la parte inferior derecha de la pantalla. 

Nos aparecerá el menú de Apagar, reiniciar o suspender. Sin soltar la tecla Mayús, hacemos clic en "reiniciar" y el equipo se reiniciará y entrará en modo seguro:


Publicado por primera vez en http://enavas.blogspot.com.es

Insufficient Memory al intentar flashear la BIOS mediante Award Flasher

Cuando los viejos equipos NEC Powermate quedaron obsoletos, comenzamos a usarlos como terminales ligeros mediante LTSP, pero llegó un día en que las pilas comenzaron a gastarse y, como consecuencia, los ajustes de la CMOS se reseteaban a los valores de fábrica. 

Solución: Cambiar las pilas... Pero claro, cambiar más de 300 pilas, teniendo que desconectar equipos, sacarlos de los cajones, abrirlos y volver a montar y cerrar no era una tarea muy atractiva. Así que decidí ir un paso más allá y preparar una versión modificada de la BIOS con ajustes preestablecidos para equipos de aula y equipos de departamentos.

Básicamente, lo que hice fue preparar un floppy ms-dos con tres imágenes BIOS:
  • Una imagen para flashear equipos de departamentos.
  • Otra para flashear equipos de aula. 
  • Y una última para poder restaurar la bios al estado original, sin ajustes particularizados.
Una vez preparada la imagen de floppy, la subí al servidor tftp y agregué una opción al servidor LTSP para poder restaurar la BIOS de los equipos cuando fuera necesario.

Ayer, cuando tratamos de usar la imagen de floppy subiéndola al servidor FOG, nos daba un error "Insufficient Memory" al tratar de realizar el flasheo.

Hoy, dando una vuelta al tema, he tenido que desempolvar mis conocimientos de ms-dos para resolver el problema.

Lo primero que he hecho ha sido montar la imagen en un directorio:
# mkdir floppy
# mount -t vfat -o loop fbiosnec.img floppy/
Y he abierto los ficheros autoexec.bat y config.sys. Al abrir el config.sys, he visto que no cargaba el controlador de memoria extendida himem.sys, así que he copiado el fichero himem.sys:
# cp himem.sys floppy/
Y he añadido al config.sys la opción que lo carga:
device=himem.sys
FILES=20
BUFFERS=20
SHELL=\COMMAND.COM /E:256 /P
Una vez modificado, he desmontado la imagen del floppy:
# umount floppy/
Y listo. 
Publicado por primera vez en http://enavas.blogspot.com.es

viernes, 29 de marzo de 2019

pfSense: Definir un pool dhcp para máquinas con un patrón específico en la dirección MAC

Es posible definir un pool dhcp para máquinas con un patrón de dirección MAC en pfSense. Como los tres primeros octetos de la dirección identifican al fabricante de la interfaz de red, podemos hacer que se asigne un bloque de direcciones IP a las máquinas cuya tarjeta de red pertenezca a un determinado fabricante.





Una vez definido el pool, en la sección MAC address control, tan sólo tenemos que especificar los tres primeros octetos de cada fabricante que queramos asignar al pool.


Los diferentes identificadores deben ir separados por comas, tal y como se muestra en la imagen anterior. De este modo, a la vista del ejemplo anterior, las tarjetas de red cuyos identificadores comiencen por 00:e0:4c y 00:08:22, compartirán el pool 192.168.0.89-99.
Publicado por primera vez en http://enavas.blogspot.com.es