http://en.wikipedia.org/wiki/Modelica
http://www.modelica.org/
http://www.ida.liu.se/labs/pelab/modelica/OpenModelica.html
Monday, September 22, 2008
Monday, July 14, 2008
Dynamic Programming
Bien, hoy lei un poco de Dynamic Programming, es bacancito, de una pense en un decorator en Python, no es complicado, ahi esta el ejemplo:
1) Fibonacci normal:
Este codigo tiene un comportamiento como lo muestra la grafica (N vs segundos)

2) Ahora con un decorator implementando Dynamic Programming.
Como pueden ver el codigo de la funcion fib no se cambio, solo se le agrego un decorator, el cual busca primero si el argumento esta en un diccionario, para no recalcularlo. (kwargs es un dict, y no puedo usarlo como un key en otro dict, toco sacarlo del key :))
No pondre grafica de este solo esto:
$ time ./fib2.py 499
86168291600238450732788312165664788095941068326060883324529903470149056115823592713458328176574447204501
real 0m0.029s
user 0m0.024s
sys 0m0.004s
1) Fibonacci normal:
#!/usr/bin/python
import sys
def fib(x):
if x==0:
return 0
if x==1:
return 1
return fib(x-1)+fib(x-2)
print fib(int(sys.argv[1]))
Este codigo tiene un comportamiento como lo muestra la grafica (N vs segundos)

2) Ahora con un decorator implementando Dynamic Programming.
#!/usr/bin/python
import sys
map={}
def dynamic_programming(func):
def decorator(*args, **kwargs):
if (func,args) in map:
return map[(func,args)]
else:
r = func(*args, **kwargs)
map[(func,args)] = r
return r
return decorator
@dynamic_programming
def fib(x):
if x==0:
return 0
if x==1:
return 1
return fib(x-1)+fib(x-2)
print fib(int(sys.argv[1]))
Como pueden ver el codigo de la funcion fib no se cambio, solo se le agrego un decorator, el cual busca primero si el argumento esta en un diccionario, para no recalcularlo. (kwargs es un dict, y no puedo usarlo como un key en otro dict, toco sacarlo del key :))
No pondre grafica de este solo esto:
$ time ./fib2.py 499
86168291600238450732788312165664788095941068326060883324529903470149056115823592713458328176574447204501
real 0m0.029s
user 0m0.024s
sys 0m0.004s
Sunday, June 15, 2008
OS hello world.
Je, hace rato que no escribía nada, vamos a ver si sale un hello world de un """sistema operativo""", en VirtualBox.
Primero organizamos el dispositivo de arranque, que seria una imagen de un disco. Bueno tenemos que entender bien lo de MBR, eso de cilindros, sectores y cabezas.
Sector: Agrupación lógica de 512 Bytes en el disco. La medida que muestran programas como fdisk es Sector/Track, o sea cantidad de sectores en una pista del disco.
Track: Es una "circunferencia de datos", en cada superficie magnetica. Podemos calcular la cantidad de bytes en un track con sector/track*512.
Head: Representa la cantidad de dispositivos lectores magnéticos, seria como la cantidad de superficies magnéticas disponibles en el disco, aunque la medida que entregan programas como fdisk no representa esto, puede tomarse como una especie de medida para poder ubicar un byte en el disco.
Cylinder: Estas es la cantidad total de tracks que existen en una sola superficie magnética.
Entonces podemos decir que la unidad de almacenamiento es 1 Bit, un byte lo componen 8 Bits, un sector lo componen 512 Bytes, una pista(track) la componen (sector/track) tracks o (sector/track)*512 Bytes, una superficie magnetica esta compuesta por (cylinders) tracks, o (cylinders)*(sector/track)*512 Bytes, y el disco completo esta compuesto por (heads) superficies magneticas o (heads)*(cylinders)*(sectors/track)*512 Bytes. (http://www.storagereview.com/guide2000/ref/hdd/index.html)
MBR: Master Boot Record, la misma esta ubicada en el primer sector del disco (primeros 512 Bytes).
Ahora necesitamos generar una imagen con mbr, si queremos un disco con 16 heads, 63 sectors/track y 160 cylinders:
Ahora con losetup montamos este archivo como un dispositivo de bloques:
Creamos el MBR con:
Con -C decimos los cilindros, con -S los sectores por pista, con -H las cabezas, y con -u decimos que nos muestre los tamaños en sectores y no en cilindros. Ahora creamos una particion primaria de todo el disco con el flag de boot activo, la tabla de particiones debe quedar:
En este punto tenemos una imagen de un disco solo con MBR, en http://en.wikipedia.org/wiki/Mbr podemos ver una descripcion de las cabeceras del MBR, y podemos verificar en nuestra imagen con:
Esto corresponde al primer sector de nuestro disco, podemos ver la entrada para la particion primaria que hicimos, la cual es:
Aun falta darle formato a la particion que creamos. La anterior cabecera nos dice que esta particion comienza en el sector 0x3F000000, (little-endian -> 63), y tiene una extension de 0xC1750200 (161217) sectores.
A esta particion le damos formato asi:
Sabemos que podemos comenzar a hacer uso de nuestra particion desde el sector 63, que equivale al byte 63*512=32256, y tiene una extension de 161217*512 bytes, y como manejamos bloques de 1024 en ext2, tendriamos un total de 80608.5 bloques que redondeamos a 80608.
Ahora tenemos que instalar el grub en nuestra imagen, esta es la parte mas confusa, es buena una cuanta documentacion (http://www.gnu.org/software/grub/ , http://www.gnu.org/software/grub/manual/multiboot/ )
Debemos instalar todo lo necesario en nuestro sistema de archivos en la carpeta /boot/grub.
Aqui bajamos el paquete de debian de grub, del cual copiamos todo lo necesario para que grub funcione en una arquitectura i386 que es la que pensamos virtualizar. Encontramos un eror en grub, pero si tiramos el comando con strace vemos lo siguiente(http://osdir.com/ml/boot-loaders.grub.bugs/2005-01/msg00035.html) :
Grub cree que la particion 1 de nuestra imagen se encuentra en loop01, entonces ahi se la daremos:
Volvemos a tirar grub:
Ya podemos verificar la instalacion del stage1 en el mbr:
Comencemos con el codigo, primero necesitamos la porcion de codigo que nos salta al codigo en C que queremos ejecutar, esta primera parte viene en assembly, aqui hay uno que nos puede servir (tomado de http://javiervalcarce.es/wiki/Kernel_multiboot_m%C3%ADnimo):
call cmain /* C main function... */
loop: hlt
jmp loop
.comm stack, STACK_SIZE /* Our stack area */
lo guardamos en un archivo llamado startup.S, ahora el codigo en C:
Guardamos esto en un kernel1.c, y compilamos :
Ahora terminamos de configurar el grub para que funcione con nuestro kernel1:
Creamos el archivo menu.lst con:
Y lo copiamos a boot/grub/menu.lst:
Ya deberiamos tener nuestro ambiente listo, falta convertir esta imagen en un disco que virtualbox pueda leer:
Prendemos nuestro VirtualBox, organizamos una maquina virtual cuyo disco sea el que acabamos de crear, mmmm, bueno, grub arranco, sale la lista con kernel1, intenta correrlo, pero sale un error "Error 13: Invalid or unsupported executable format" , aaaa, buen detalle:
De seguro si tienen una maquina i386 les funciona de una.
Listo, entonces compilo en chroot de i386:
Otra vez abrimos virtualbox, borramos la configuracion con el disco anterior, ponemos el nuevo y corremos la maquina.

Listo eso es todo, de ahí a hacer un kernelcito decente hay un paso, jaja.
Primero organizamos el dispositivo de arranque, que seria una imagen de un disco. Bueno tenemos que entender bien lo de MBR, eso de cilindros, sectores y cabezas.
Sector: Agrupación lógica de 512 Bytes en el disco. La medida que muestran programas como fdisk es Sector/Track, o sea cantidad de sectores en una pista del disco.
Track: Es una "circunferencia de datos", en cada superficie magnetica. Podemos calcular la cantidad de bytes en un track con sector/track*512.
Head: Representa la cantidad de dispositivos lectores magnéticos, seria como la cantidad de superficies magnéticas disponibles en el disco, aunque la medida que entregan programas como fdisk no representa esto, puede tomarse como una especie de medida para poder ubicar un byte en el disco.
Cylinder: Estas es la cantidad total de tracks que existen en una sola superficie magnética.
Entonces podemos decir que la unidad de almacenamiento es 1 Bit, un byte lo componen 8 Bits, un sector lo componen 512 Bytes, una pista(track) la componen (sector/track) tracks o (sector/track)*512 Bytes, una superficie magnetica esta compuesta por (cylinders) tracks, o (cylinders)*(sector/track)*512 Bytes, y el disco completo esta compuesto por (heads) superficies magneticas o (heads)*(cylinders)*(sectors/track)*512 Bytes. (http://www.storagereview.com/guide2000/ref/hdd/index.html)
MBR: Master Boot Record, la misma esta ubicada en el primer sector del disco (primeros 512 Bytes).
Ahora necesitamos generar una imagen con mbr, si queremos un disco con 16 heads, 63 sectors/track y 160 cylinders:
$ dd if=/dev/zero of=disk.image bs=512 count 161280
Ahora con losetup montamos este archivo como un dispositivo de bloques:
$ sudo losetup /dev/loop0 disk.image
Creamos el MBR con:
$ sudo fdisk -u -C160 -S63 -H16 /dev/loop0
Con -C decimos los cilindros, con -S los sectores por pista, con -H las cabezas, y con -u decimos que nos muestre los tamaños en sectores y no en cilindros. Ahora creamos una particion primaria de todo el disco con el flag de boot activo, la tabla de particiones debe quedar:
Command (m for help): p
Disk /dev/loop0: 82 MB, 82575360 bytes
16 heads, 63 sectors/track, 160 cylinders, total 161280 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x19c7acc5
Device Boot Start End Blocks Id System
/dev/loop0p1 * 63 161279 80608+ 83 Linux
En este punto tenemos una imagen de un disco solo con MBR, en http://en.wikipedia.org/wiki/Mbr podemos ver una descripcion de las cabeceras del MBR, y podemos verificar en nuestra imagen con:
$ hd -v -n512 disk.image
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 c5 ac c7 19 00 00 00 01 |................|
000001c0 01 00 83 0f 3f 9f 3f 00 00 00 c1 75 02 00 00 00 |....?.?....u....|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
Esto corresponde al primer sector de nuestro disco, podemos ver la entrada para la particion primaria que hicimos, la cual es:
$ hd -v -s446 -n16 disk.image
000001be 00 01 01 00 83 0f 3f 9f 3f 00 00 00 c1 75 02 00 |......?.?....u..|
000001ce
Aun falta darle formato a la particion que creamos. La anterior cabecera nos dice que esta particion comienza en el sector 0x3F000000, (little-endian -> 63), y tiene una extension de 0xC1750200 (161217) sectores.
A esta particion le damos formato asi:
$ sudo losetup -o32256 /dev/loop1 disk.image
$ sudo mkfs.ext2 -b1024 /dev/loop1 80608
Sabemos que podemos comenzar a hacer uso de nuestra particion desde el sector 63, que equivale al byte 63*512=32256, y tiene una extension de 161217*512 bytes, y como manejamos bloques de 1024 en ext2, tendriamos un total de 80608.5 bloques que redondeamos a 80608.
Ahora tenemos que instalar el grub en nuestra imagen, esta es la parte mas confusa, es buena una cuanta documentacion (http://www.gnu.org/software/grub/ , http://www.gnu.org/software/grub/manual/multiboot/ )
Debemos instalar todo lo necesario en nuestro sistema de archivos en la carpeta /boot/grub.
$ mkdir mnt
$ sudo mount -text2 /dev/loop1 mnt/
$ wget http://ftp.br.debian.org/debian/pool/main/g/grub/grub_0.97-27_i386.deb
$ dpkg-deb -X grub_0.97-27_i386.deb grub_debian
$ sudo mkdir -p mnt/boot/grub
$ sudo cp grub_debian/usr/lib/grub/i386-pc/* mnt/boot/grub/
$ sudo grub
grub> device (hd0) /dev/loop0
grub> geometry (hd0) 160 16 63
drive 0x80: C/H/S = 160/16/63, The number of sectors = 161280, /dev/loop0
Partition num: 0, Filesystem type is ext2fs, partition type 0x83
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... failed
Error 22: No such partition
grub> quit
Aqui bajamos el paquete de debian de grub, del cual copiamos todo lo necesario para que grub funcione en una arquitectura i386 que es la que pensamos virtualizar. Encontramos un eror en grub, pero si tiramos el comando con strace vemos lo siguiente(http://osdir.com/ml/boot-loaders.grub.bugs/2005-01/msg00035.html) :
$ sudo strace -o trace.log grub
...
$ cat trace.log | grep loop
open("/dev/loop0", O_RDONLY|O_LARGEFILE) = 4
open("/dev/loop0", O_RDWR|O_LARGEFILE) = 3
open("/dev/loop01", O_RDWR|O_LARGEFILE) = -1 ENOENT (No such file or directory)
Grub cree que la particion 1 de nuestra imagen se encuentra en loop01, entonces ahi se la daremos:
$ sudo ln -s /dev/loop1 /dev/loop01
Volvemos a tirar grub:
$ sudo grub
grub> device (hd0) /dev/loop0
grub> geometry (hd0) 160 16 63
drive 0x80: C/H/S = 160/16/63, The number of sectors = 161280, /dev/loop0
Partition num: 0, Filesystem type is ext2fs, partition type 0x83
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded. succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub> quit
Ya podemos verificar la instalacion del stage1 en el mbr:
$ hd -v -n512 disk.image
00000000 eb 48 90 00 00 00 00 00 00 00 00 00 00 00 00 00 |.H..............|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 02 |................|
00000040 ff 00 00 20 01 00 00 00 00 02 fa 90 90 f6 c2 80 |... ............|
00000050 75 02 b2 80 ea 59 7c 00 00 31 c0 8e d8 8e d0 bc |u....Y|..1......|
00000060 00 20 fb a0 40 7c 3c ff 74 02 88 c2 52 be 7f 7d |. ..@|<.t...R..}|
00000070 e8 34 01 f6 c2 80 74 54 b4 41 bb aa 55 cd 13 5a |.4....tT.A..U..Z|
00000080 52 72 49 81 fb 55 aa 75 43 a0 41 7c 84 c0 75 05 |RrI..U.uC.A|..u.|
00000090 83 e1 01 74 37 66 8b 4c 10 be 05 7c c6 44 ff 01 |...t7f.L...|.D..|
000000a0 66 8b 1e 44 7c c7 04 10 00 c7 44 02 01 00 66 89 |f..D|.....D...f.|
000000b0 5c 08 c7 44 06 00 70 66 31 c0 89 44 04 66 89 44 |\..D..pf1..D.f.D|
000000c0 0c b4 42 cd 13 72 05 bb 00 70 eb 7d b4 08 cd 13 |..B..r...p.}....|
000000d0 73 0a f6 c2 80 0f 84 ea 00 e9 8d 00 be 05 7c c6 |s.............|.|
000000e0 44 ff 00 66 31 c0 88 f0 40 66 89 44 04 31 d2 88 |D..f1...@f.D.1..|
000000f0 ca c1 e2 02 88 e8 88 f4 40 89 44 08 31 c0 88 d0 |........@.D.1...|
00000100 c0 e8 02 66 89 04 66 a1 44 7c 66 31 d2 66 f7 34 |...f..f.D|f1.f.4|
00000110 88 54 0a 66 31 d2 66 f7 74 04 88 54 0b 89 44 0c |.T.f1.f.t..T..D.|
00000120 3b 44 08 7d 3c 8a 54 0d c0 e2 06 8a 4c 0a fe c1 |;D.}<.T.....L...|
00000130 08 d1 8a 6c 0c 5a 8a 74 0b bb 00 70 8e c3 31 db |...l.Z.t...p..1.|
00000140 b8 01 02 cd 13 72 2a 8c c3 8e 06 48 7c 60 1e b9 |.....r*....H|`..|
00000150 00 01 8e db 31 f6 31 ff fc f3 a5 1f 61 ff 26 42 |....1.1.....a.&B|
00000160 7c be 85 7d e8 40 00 eb 0e be 8a 7d e8 38 00 eb ||..}.@.....}.8..|
00000170 06 be 94 7d e8 30 00 be 99 7d e8 2a 00 eb fe 47 |...}.0...}.*...G|
00000180 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64 20 44 |RUB .Geom.Hard D|
00000190 69 73 6b 00 52 65 61 64 00 20 45 72 72 6f 72 00 |isk.Read. Error.|
000001a0 bb 01 00 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 |........<.u.....|
000001b0 00 00 00 00 00 00 00 00 cc 69 95 5f 00 00 80 01 |.........i._....|
000001c0 01 00 83 0f 3f 9f 3f 00 00 00 c1 75 02 00 00 00 |....?.?....u....|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
Comencemos con el codigo, primero necesitamos la porcion de codigo que nos salta al codigo en C que queremos ejecutar, esta primera parte viene en assembly, aqui hay uno que nos puede servir (tomado de http://javiervalcarce.es/wiki/Kernel_multiboot_m%C3%ADnimo):
/* Start-up */
#define STACK_SIZE 0x4000 /* The size of our stack (16KB) */
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002 /* The magic number for the Multiboot header */
.text
.globl _start
.align 4 /* Align 32 bits boundary */
/* Multiboot-compliant header */
.long +MULTIBOOT_HEADER_MAGIC /* magic */
.long 0 /* flags=0 */
.long -MULTIBOOT_HEADER_MAGIC /* checksum */
_start:
movl $(stack + STACK_SIZE), %esp /* Initialize the stack pointer */
push $0 /* Reset EFLAGS */
popf
call cmain /* C main function... */
loop: hlt
jmp loop
.comm stack, STACK_SIZE /* Our stack area */
lo guardamos en un archivo llamado startup.S, ahora el codigo en C:
/* kernel.c - the C part of the kernel */
/* Some screen stuff. */
#define COLUMNS 80 /* The number of columns */
#define LINES 24 /* The number of lines */
#define ATTRIBUTE 7 /* The attribute of an character */
#define VIDEO 0xB8000 /* The video memory address */
/* Variables */
static int xpos; /* Save the X position */
static int ypos; /* Save the Y position */
static volatile
unsigned char *video; /* Point to the video memory */
/* Forward declarations */
void cmain (unsigned long magic, unsigned long addr);
static void cls();
static void putchar (int c);
////////////////////////////////////////////////////////////////////////////////
void cmain (unsigned long magic, unsigned long addr)
{
char msg[] = "Hello World";
char* p;
cls();
/* printf */
p = msg;
for (p = msg; *p != 0; p++)
{
putchar(*p);
}
}
////////////////////////////////////////////////////////////////////////////////
/* Clear the screen and initialize VIDEO, XPOS and YPOS */
static void cls (void)
{
int i;
video = (unsigned char *) VIDEO;
for (i = 0; i < xpos =" 0;" ypos =" 0;" c ="=" c ="=" xpos =" 0;">= LINES)
ypos = 0;
return;
}
*(video + (xpos + ypos * COLUMNS) * 2) = c & 0xFF;
*(video + (xpos + ypos * COLUMNS) * 2 + 1) = ATTRIBUTE;
xpos++;
if (xpos >= COLUMNS)
goto newline;
}
Guardamos esto en un kernel1.c, y compilamos :
$ gcc -c kernel1.c
$ gcc -c startup.S
$ ld -o kernel1 kernel1.o startup.o -Ttext 0x100000
Ahora terminamos de configurar el grub para que funcione con nuestro kernel1:
$ sudo cp kernel1 mnt/boot/
Creamos el archivo menu.lst con:
default 0
timeout 2
color cyan/blue white/blue
title kernel1
root (hd0,0)
kernel /boot/kernel1
Y lo copiamos a boot/grub/menu.lst:
$ sudo cp menu.lst mnt/boot/grub/
Ya deberiamos tener nuestro ambiente listo, falta convertir esta imagen en un disco que virtualbox pueda leer:
$ sudo umount mnt
$ sudo losetup -d /dev/loop1
$ sudo losetup -d /dev/loop0
$ sudo rm /dev/loop01
$ vditool DD PruebaOS.vdi disk.image
Prendemos nuestro VirtualBox, organizamos una maquina virtual cuyo disco sea el que acabamos de crear, mmmm, bueno, grub arranco, sale la lista con kernel1, intenta correrlo, pero sale un error "Error 13: Invalid or unsupported executable format" , aaaa, buen detalle:
$ uname -m
x86_64
De seguro si tienen una maquina i386 les funciona de una.
Listo, entonces compilo en chroot de i386:
$ cp kernel1.c startup.S /var/etch-i386-20080604/tmp/
$ sudo chroot /var/etch-i386-20080604/ /bin/bash
# cd /tmp
# gcc -c kernel1.c
# gcc -c startup.S
# ld -o kernel1 kernel1.o startup.o -Ttext 0x100000
# exit
$ sudo losetup -o32256 /dev/loop1 disk.image
$ sudo mount -text2 /dev/loop1 mnt/
$ sudo cp /var/etch-i386-20080604/tmp/kernel1 mnt/boot/kernel1
$ sudo umount mnt
$ sudo losetup -d /dev/loop1
$ rm PruebaOS.vdi
$ vditool DD PruebaOS.vdi disk.image
Otra vez abrimos virtualbox, borramos la configuracion con el disco anterior, ponemos el nuevo y corremos la maquina.

Listo eso es todo, de ahí a hacer un kernelcito decente hay un paso, jaja.
Monday, June 09, 2008
Ayuda a la comunidad
Luego de 6 meses sin entradas: La pagina web de la empresa de unos amigos SIA Ingenieros, Soluciones en Ingeniería Aplicada
Etiquetas:
colombia,
diseño web,
medellin,
Sia ingenieros,
Soluciones en ingenieria
Monday, December 10, 2007
Tuesday, October 02, 2007
Monday, September 10, 2007
Tuesday, September 04, 2007
Monday, September 03, 2007
Sin embargo los ojos incerrables del che miran como si no pudieran no mirar.
Che
Mario Benedetti
Lo han cubierto de afiches / de pancartas
de voces en los muros
de agravios retroactivos
de honores a destiempo
lo han transformado en pieza de consumo
en memoria trivial
en ayer sin retorno
en rabia enmbalsamada
han decidido usarlo como epilogo
como ultima thule de la inocencia vana
como anejo arquetipo de santo o satanas
y quizas han resuelto que la unica forma
de desprenderse de El
o dejarlo al garete
es vaciarlo de lumbre
convertirlo en un heroe
de marmol o de yeso
y por lo tanto inmovil
o mejor como mito
o silueta o fantasma
del pasado pisado
sin embargo los ojos incerrables del che
miran como si no pudieran no mirar
asombrados tal vez de que el mundo no entienda
que treinta anos despues siga bregando
dulce y tenaz por la dicha del hombre.
Mario Benedetti
Lo han cubierto de afiches / de pancartas
de voces en los muros
de agravios retroactivos
de honores a destiempo
lo han transformado en pieza de consumo
en memoria trivial
en ayer sin retorno
en rabia enmbalsamada
han decidido usarlo como epilogo
como ultima thule de la inocencia vana
como anejo arquetipo de santo o satanas
y quizas han resuelto que la unica forma
de desprenderse de El
o dejarlo al garete
es vaciarlo de lumbre
convertirlo en un heroe
de marmol o de yeso
y por lo tanto inmovil
o mejor como mito
o silueta o fantasma
del pasado pisado
sin embargo los ojos incerrables del che
miran como si no pudieran no mirar
asombrados tal vez de que el mundo no entienda
que treinta anos despues siga bregando
dulce y tenaz por la dicha del hombre.
Monday, August 06, 2007
Por que software libre?
If I have seen further [than others] it is by standing on the
shoulders of giants... Issac Newton
shoulders of giants... Issac Newton
Wednesday, May 02, 2007
Tiempo para Tesis.
Bueno, tal parece que le voy a poder sacar tiempo a la tesis el próximo semestre.
TODO:
- Comenzar anteproyecto.
- Conseguir director.
- Terminar anteproyecto.
- Revisar anteproyecto.
- Entregar anteproyecto.
Tesis TODO:
- Estudiar UML.
- Estudiar B-Method.
- Estudiar los problemas que se presentan en control.
- Model de control en UML.
- Estudiar la possibilidad y el como se haria el control distribuido.
- Modelo del framework de control en UML.
- Paso de UML a B-method.
- Verificacion.
- Implementacion de Framework de control (Sobre Pistachio y Gumstix)
- Buscar un sistema cuyo control necesite tiempo real, y controlarlo con el Framework sobre el Gumstix)
Tengo como maximo 12 meses para la tesis, toca repartir bien eso.
TODO:
- Comenzar anteproyecto.
- Conseguir director.
- Terminar anteproyecto.
- Revisar anteproyecto.
- Entregar anteproyecto.
Tesis TODO:
- Estudiar UML.
- Estudiar B-Method.
- Estudiar los problemas que se presentan en control.
- Model de control en UML.
- Estudiar la possibilidad y el como se haria el control distribuido.
- Modelo del framework de control en UML.
- Paso de UML a B-method.
- Verificacion.
- Implementacion de Framework de control (Sobre Pistachio y Gumstix)
- Buscar un sistema cuyo control necesite tiempo real, y controlarlo con el Framework sobre el Gumstix)
Tengo como maximo 12 meses para la tesis, toca repartir bien eso.
Monday, April 16, 2007
Tesis.
Bueno, en el almuerzo se me ocurrio la idea que podria ser mi tesis (ojala algun dia decida bien que hacer). Siguiendo con la idea del anterior post, seria asi:
En gumstix se correria pistachio, en el cual se correria un Framework de Control, el cual estaria previamente diseñado , modelado con UML y verificado con B-Method, y para la configuracion del control se tendria que especificar en UML.
Se tendria algo asi:
* Una aplicacion en la cual se diseñarian los componentes del sistema: Actuadores, Sensores, y el control como tal. La salida de este seria un modelo en UML.
* Este modelo se le pasaria al Framework en Pistachio el cual lo implementaria y se comunicaria con los sensores y los actuadores.
* El Framework se diseña en UML y se verificaria en B-Method, si algo falla ya seria problema de la arquitectura del Gumstix.
* Se pondria a prueba en el control de algun sistema complejo de controlar.
Eso seria todo.
En gumstix se correria pistachio, en el cual se correria un Framework de Control, el cual estaria previamente diseñado , modelado con UML y verificado con B-Method, y para la configuracion del control se tendria que especificar en UML.
Se tendria algo asi:
* Una aplicacion en la cual se diseñarian los componentes del sistema: Actuadores, Sensores, y el control como tal. La salida de este seria un modelo en UML.
* Este modelo se le pasaria al Framework en Pistachio el cual lo implementaria y se comunicaria con los sensores y los actuadores.
* El Framework se diseña en UML y se verificaria en B-Method, si algo falla ya seria problema de la arquitectura del Gumstix.
* Se pondria a prueba en el control de algun sistema complejo de controlar.
Eso seria todo.
Sunday, April 15, 2007
Tesis
Bueno no hay GSoC para mi, entonces vuelvo con mi tesis, pensandolo bien, creo que voy a redirigir mi tesis, tengo puntos en lso cuales quiero trabajar:
* Control digital en Tiempo-Real
* Redes neuronales.
* Pistachio
* Alguna implementacion en Gumstix.
Hasta ahora no se bien que sera. Pero si se unen las partes seria correr pistachio en Gumstix, y encima correr un Framework de Tiempo Real para el control de "Algo" y ojala que con Redes Neuronales.
* Control digital en Tiempo-Real
* Redes neuronales.
* Pistachio
* Alguna implementacion en Gumstix.
Hasta ahora no se bien que sera. Pero si se unen las partes seria correr pistachio en Gumstix, y encima correr un Framework de Tiempo Real para el control de "Algo" y ojala que con Redes Neuronales.
Thursday, April 05, 2007
GSoC
Some important lectures about Plan 9 and Inferno.
http://cm.bell-labs.com/sys/doc/index.html
http://www.vitanuova.com/inferno/papers/bltj.html
http://www.vitanuova.com/inferno/papers/descent.html
http://www.vitanuova.com/inferno/papers/limbo.html
http://plan9.bell-labs.com/wiki/plan9/recommended_readings/index.html
http://cm.bell-labs.com/sys/doc/index.html
http://www.vitanuova.com/inferno/papers/bltj.html
http://www.vitanuova.com/inferno/papers/descent.html
http://www.vitanuova.com/inferno/papers/limbo.html
http://plan9.bell-labs.com/wiki/plan9/recommended_readings/index.html
Tuesday, March 27, 2007
GSoC
Bueno, le tire al GSoC, con lo que fue el principio de la idea de construir un sistema distribuido a partir de sistemas embebidos junto con Torres, hace como 2 años.
Al principio la idea era Inferno ( por el styx) , pero creo que limbo asusta. Seria bueno que se diera lo del GSoC, depronto saldria una implementacion de styx para pistachio. (Cumpliendo las obligaciones con el mes de marzo)
Al principio la idea era Inferno ( por el styx) , pero creo que limbo asusta. Seria bueno que se diera lo del GSoC, depronto saldria una implementacion de styx para pistachio. (Cumpliendo las obligaciones con el mes de marzo)
Friday, February 02, 2007
Sunday, January 28, 2007
Corriendo wombat
Bueno, despues de bajarme y utilizar un poco Fiasco, hice lo mismo con el paquete de Pistachio que estan trabajando en NICTA y UNSW, junto con Iguana y Wombat.
Lo que hice fue bajarme del svn todos los paquetes necesarios. En esta pagina muestran como bajarse los paquetes (http://www.ertos.nicta.com.au/software/baz-howto.pml) y para poder compilarlo toca hacerlo con un cross-compiler, no sirve el gcc normalcito, me baje este de nicta (http://www.ertos.nicta.com.au/downloads/i686-gcc-3.3.4-glibc-2.3.3-2006-06-02.tar.gz)
y posicionado en la carpeta donde estan todos los archivos ejecuto los siguiente:
tools/scons.py machine=pc99 toolprefix="i686-unknown-linux-gnu-" simulate
y listo, empiezan a compilarse todas las partes necesarias, pistachio, iguana, y wombat, y queda una imagen build/c.img que se corre automatica en qemu.
Una muestra:
Lo que hice fue bajarme del svn todos los paquetes necesarios. En esta pagina muestran como bajarse los paquetes (http://www.ertos.nicta.com.au/software/baz-howto.pml) y para poder compilarlo toca hacerlo con un cross-compiler, no sirve el gcc normalcito, me baje este de nicta (http://www.ertos.nicta.com.au/downloads/i686-gcc-3.3.4-glibc-2.3.3-2006-06-02.tar.gz)
y posicionado en la carpeta donde estan todos los archivos ejecuto los siguiente:
tools/scons.py machine=pc99 toolprefix="i686-unknown-linux-gnu-" simulate
y listo, empiezan a compilarse todas las partes necesarias, pistachio, iguana, y wombat, y queda una imagen build/c.img que se corre automatica en qemu.
Una muestra:
Sunday, January 21, 2007
Tuesday, January 09, 2007
Saturday, December 30, 2006
De como compilar Fiasco.
Comence a compilar Fiasco, lo que hice fue seguir las instrucciones en http://os.inf.tu-dresden.de/fiasco/use.html.
1) Me baje los modulos grub l4 dde hello l4env dope preprocess de el cvs.
2) En el directorio l4 ejecuto lo siguiente:
make O=../build_user config
(lo dejo como esta)
make O=../build_user all
(Espero como 20 minutos y sale un error de sed, para arreglarlo toca entrar a l4/tool/gcc-wrap/Makefile y cambiar a:
$(VERBOSE)sed '\
s,@system@,$(SYSTEM),g;\
s,@ar@,$(AR),g;\
s,@nm@,$(NM),g;\
s,@ranlib@,$(RANLIB),g;\
s,@cc@,$(CC_$(DEFAULT_ARCH)),g;\
s,@cxx@,$(CXX_$(DEFAULT_ARCH)),g;\
s,@l4dir@,$(absfilename $(L4DIR)),g;\
s,@dropsdir@,$(DROPS_STDDIR),g;\
s,@compilerincdir@,$(GCCDIR_$(DEFAULT_ARCH))/include,g;\
s,@libgcc@,$(GCCLIB_$(DEFAULT_ARCH)),g;\
s,@libgcc_eh@,$(GCCLIB_EH_$(DEFAULT_ARCH)),g;\
s,@default_system@,$(DEFAULT_SYSTEM),g;\
s,@default_arch@,$(DEFAULT_ARCH),g;\
s,@default_cpu@,$(call PROCESS_SYSTEM, 's/[^-_]*_\([^-]*\).*/\1/p'),g;\
s,@default_l4api@,$(call PROCESS_SYSTEM, 's/.*-\(.*\)/\1/p'),g;\
' $< > $@.new
por:
$(VERBOSE)sed 's,@system@,$(SYSTEM),g;s,@ar@,$(AR),g;s,@nm@,$(NM),g;s,@ranlib@,$(RANLIB),g;s,@cc@,$(CC_$(DEFAULT_ARCH)),g;s,@cxx@,$(CXX_$(DEFAULT_ARCH)),g;s,@l4dir@,$(absfilename $(L4DIR)),g;s,@dropsdir@,$(DROPS_STDDIR),g;s,@compilerincdir@,$(GCCDIR_$(DEFAULT_ARCH))/include,g;s,@libgcc@,$(GCCLIB_$(DEFAULT_ARCH)),g;s,@libgcc_eh@,$(GCCLIB_EH_$(DEFAULT_ARCH)),g;s,@default_system@,$(DEFAULT_SYSTEM),g;s,@default_arch@,$(DEFAULT_ARCH),g;s,@default_cpu@,$(call PROCESS_SYSTEM, 's/[^-_]*_\([^-]*\).*/\1/p'),g;s,@default_l4api@,$(call PROCESS_SYSTEM, 's/.*-\(.*\)/\1/p'),g;' $< > $@.new
No se por que mi sed no puede con las instrucciones separadas en lineas con un \,pero se arregla el problema. Luego lo dejo otra vez compilando, y me da tiempo de salir, comprar dos libros (Calicalabozo de Andrés Caicedo, y La Despedida de Milan Kundera) , comer algo y cuando vuelvo la maquina esta en un error porque no tenia instalado el doxygen, lo instalo y vuelvo a compilar, me da tiempo de organizar los libros que tengo por leer (Calicalabozo, La despedida, Despues del Hombre de Gonzalo Arango, Gato o soledad en la lluvia de Amílcar Osorio, y El libro Negro de Orhan Pamuk), tambien juego un poco en el Wii de mi hermanito, el control es loquisimo, funciona basicamente con acelerometros. por lo que no es necesario jugar parado y moverse como loco, sino tambien sentado, la parte de infrarrojos funciona siempre y cuando no le caiga sol al sensor (pense que eso solo nos pasaba en los carritos que nos ponian a hacer en la universidad) sino se enloquece, pero casi siempre esta en lugar cerrado entonces no es problema, y me imagino que funciona con conceptos de vision esteroscopica; termino de jugar y sigue compilando, me como un postre y espero, luego sale un error porque no encuentra el comando fig2dev y me toca instalar el transfig, y comienzo de nuevo, al ratico (doy gracias que no toca compilar de nuevo lo que ya ha compilado) sale un error: no puede copiar el archivo building.tex en una carpeta, ¿¿bug del Makefile de Fiasco?? el Makefile hace ejecutar el comando, con respuesta:
cp building.tex drops-building.tex
cp: cannot stat `building.tex': No such file or directory
Lo que pasa es que el Makefile entra en el directorio de trabajo, build-user/doc/.... e intenta copiar el archivo desde esa misma carpeta y hay no esta, esta en el directorio l4/doc/building-howto, solo es copiarlo de esta posicion a build_user/doc/building-howto/ y comenzar de nuevo a compilar, y ya si termina, ¡mas largo que la primera instalada de Xfree86 fue esto!.
Ahora entro en la carpeta l4/kernel/fiasco, corro el comando:
make BUILDDIR=../../../build-kernel
cd ../../../build-kernel
make menuconfig
(lo dejo como esta)
make
(Espero mientras veo Carnivale, esta buena la serie)
Sigo los pasos de la pagina para iniciarlo, un poco distinto (pa correrlo en vmware desde una imagen de un floppy) pero en esencia lo mismo.
Y listo, tengo al buen Fiasco corriendo en una maquina virtual.
1) Me baje los modulos grub l4 dde hello l4env dope preprocess de el cvs.
2) En el directorio l4 ejecuto lo siguiente:
make O=../build_user config
(lo dejo como esta)
make O=../build_user all
(Espero como 20 minutos y sale un error de sed, para arreglarlo toca entrar a l4/tool/gcc-wrap/Makefile y cambiar a:
$(VERBOSE)sed '\
s,@system@,$(SYSTEM),g;\
s,@ar@,$(AR),g;\
s,@nm@,$(NM),g;\
s,@ranlib@,$(RANLIB),g;\
s,@cc@,$(CC_$(DEFAULT_ARCH)),g;\
s,@cxx@,$(CXX_$(DEFAULT_ARCH)),g;\
s,@l4dir@,$(absfilename $(L4DIR)),g;\
s,@dropsdir@,$(DROPS_STDDIR),g;\
s,@compilerincdir@,$(GCCDIR_$(DEFAULT_ARCH))/include,g;\
s,@libgcc@,$(GCCLIB_$(DEFAULT_ARCH)),g;\
s,@libgcc_eh@,$(GCCLIB_EH_$(DEFAULT_ARCH)),g;\
s,@default_system@,$(DEFAULT_SYSTEM),g;\
s,@default_arch@,$(DEFAULT_ARCH),g;\
s,@default_cpu@,$(call PROCESS_SYSTEM, 's/[^-_]*_\([^-]*\).*/\1/p'),g;\
s,@default_l4api@,$(call PROCESS_SYSTEM, 's/.*-\(.*\)/\1/p'),g;\
' $< > $@.new
por:
$(VERBOSE)sed 's,@system@,$(SYSTEM),g;s,@ar@,$(AR),g;s,@nm@,$(NM),g;s,@ranlib@,$(RANLIB),g;s,@cc@,$(CC_$(DEFAULT_ARCH)),g;s,@cxx@,$(CXX_$(DEFAULT_ARCH)),g;s,@l4dir@,$(absfilename $(L4DIR)),g;s,@dropsdir@,$(DROPS_STDDIR),g;s,@compilerincdir@,$(GCCDIR_$(DEFAULT_ARCH))/include,g;s,@libgcc@,$(GCCLIB_$(DEFAULT_ARCH)),g;s,@libgcc_eh@,$(GCCLIB_EH_$(DEFAULT_ARCH)),g;s,@default_system@,$(DEFAULT_SYSTEM),g;s,@default_arch@,$(DEFAULT_ARCH),g;s,@default_cpu@,$(call PROCESS_SYSTEM, 's/[^-_]*_\([^-]*\).*/\1/p'),g;s,@default_l4api@,$(call PROCESS_SYSTEM, 's/.*-\(.*\)/\1/p'),g;' $< > $@.new
No se por que mi sed no puede con las instrucciones separadas en lineas con un \,pero se arregla el problema. Luego lo dejo otra vez compilando, y me da tiempo de salir, comprar dos libros (Calicalabozo de Andrés Caicedo, y La Despedida de Milan Kundera) , comer algo y cuando vuelvo la maquina esta en un error porque no tenia instalado el doxygen, lo instalo y vuelvo a compilar, me da tiempo de organizar los libros que tengo por leer (Calicalabozo, La despedida, Despues del Hombre de Gonzalo Arango, Gato o soledad en la lluvia de Amílcar Osorio, y El libro Negro de Orhan Pamuk), tambien juego un poco en el Wii de mi hermanito, el control es loquisimo, funciona basicamente con acelerometros. por lo que no es necesario jugar parado y moverse como loco, sino tambien sentado, la parte de infrarrojos funciona siempre y cuando no le caiga sol al sensor (pense que eso solo nos pasaba en los carritos que nos ponian a hacer en la universidad) sino se enloquece, pero casi siempre esta en lugar cerrado entonces no es problema, y me imagino que funciona con conceptos de vision esteroscopica; termino de jugar y sigue compilando, me como un postre y espero, luego sale un error porque no encuentra el comando fig2dev y me toca instalar el transfig, y comienzo de nuevo, al ratico (doy gracias que no toca compilar de nuevo lo que ya ha compilado) sale un error: no puede copiar el archivo building.tex en una carpeta, ¿¿bug del Makefile de Fiasco?? el Makefile hace ejecutar el comando, con respuesta:
cp building.tex drops-building.tex
cp: cannot stat `building.tex': No such file or directory
Lo que pasa es que el Makefile entra en el directorio de trabajo, build-user/doc/.... e intenta copiar el archivo desde esa misma carpeta y hay no esta, esta en el directorio l4/doc/building-howto, solo es copiarlo de esta posicion a build_user/doc/building-howto/ y comenzar de nuevo a compilar, y ya si termina, ¡mas largo que la primera instalada de Xfree86 fue esto!.
Ahora entro en la carpeta l4/kernel/fiasco, corro el comando:
make BUILDDIR=../../../build-kernel
cd ../../../build-kernel
make menuconfig
(lo dejo como esta)
make
(Espero mientras veo Carnivale, esta buena la serie)
Sigo los pasos de la pagina para iniciarlo, un poco distinto (pa correrlo en vmware desde una imagen de un floppy) pero en esencia lo mismo.
Y listo, tengo al buen Fiasco corriendo en una maquina virtual.
Subscribe to:
Posts (Atom)