<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://1984.lsi.us.es/wiki-ssoo/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Danhidsan</id>
		<title>Wiki de Sistemas Operativos - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://1984.lsi.us.es/wiki-ssoo/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Danhidsan"/>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php/Especial:Contribuciones/Danhidsan"/>
		<updated>2026-04-19T14:14:10Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3299</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3299"/>
				<updated>2016-01-22T09:43:11Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Analizando XV6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas: &lt;br /&gt;
&lt;br /&gt;
-Por terminal&lt;br /&gt;
&lt;br /&gt;
-Por un gestor de paquetes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Instalacion de QEMU por terminal:'''&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Captura_instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Por paquetes:'''&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, hacer doble click y posteriormente pulsar en &amp;quot;aplicar&amp;quot; que se encuentra en el menú de la parte superior. Una vez termine la instalación ya tendrás QEMU instalado.  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público. Ejecuntando el siguiente comando en terminal, descargaremos los archivos necesarios para la instalación de xv6: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://michaelee@bitbucket.ort/michaelee/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_clonacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
&lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_compilacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Una vez dentro escribimos '''''make''''', con este comando compilaremos el codigo clonado anteriormente. Una vez que haya terminado la compilación ejecutaremos el comando '''''make qemu-nox'''''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_inicializacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
A continuación veremos la sección del código de xv6 de cada una de las partes básicas de un sistema operativo vistas en teoría.&lt;br /&gt;
&lt;br /&gt;
1- [[scheduler_xv6|Planificador de procesos]]&lt;br /&gt;
&lt;br /&gt;
2- [[memoria_virtual|Administracion de memoria]]&lt;br /&gt;
&lt;br /&gt;
3- [[driver_xv6|Gestor de E/S]]&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;br /&gt;
* '''Video Explicativo de la Instalación'''&lt;br /&gt;
https://vimeo.com/69135539&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3298</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3298"/>
				<updated>2016-01-22T09:41:37Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Analizando XV6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas: &lt;br /&gt;
&lt;br /&gt;
-Por terminal&lt;br /&gt;
&lt;br /&gt;
-Por un gestor de paquetes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Instalacion de QEMU por terminal:'''&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Captura_instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Por paquetes:'''&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, hacer doble click y posteriormente pulsar en &amp;quot;aplicar&amp;quot; que se encuentra en el menú de la parte superior. Una vez termine la instalación ya tendrás QEMU instalado.  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público. Ejecuntando el siguiente comando en terminal, descargaremos los archivos necesarios para la instalación de xv6: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://michaelee@bitbucket.ort/michaelee/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_clonacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
&lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_compilacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Una vez dentro escribimos '''''make''''', con este comando compilaremos el codigo clonado anteriormente. Una vez que haya terminado la compilación ejecutaremos el comando '''''make qemu-nox'''''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_inicializacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
A continuación veremos la sección del código de xv6 de cada una de las partes básicas de un sistema operativo vistas en teoría.&lt;br /&gt;
&lt;br /&gt;
1- [[scheduler_xv6|Planificador de procesos]]&lt;br /&gt;
&lt;br /&gt;
2- [[memoria_virtual|Administracion de memoria]]&lt;br /&gt;
&lt;br /&gt;
3- [[Xv6_E/S|Gestor de E/S]]&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;br /&gt;
* '''Video Explicativo de la Instalación'''&lt;br /&gt;
https://vimeo.com/69135539&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Driver_xv6&amp;diff=3297</id>
		<title>Driver xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Driver_xv6&amp;diff=3297"/>
				<updated>2016-01-22T09:37:17Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A continuación se muestra el condigo que hacer referencia al gestor de entrada/salida, en concreto el código que gestiona el bus IDE, al que se encuentra conectado el disco duro del ordenador sobre el que se esté ejecutando xv6.&lt;br /&gt;
Como se puede observar, xv6 gestiona L/E por muestreo. Esto se puede comprobar en la primera función que se implementa, en la que existe un bucle &lt;br /&gt;
''''while'''', del que no se sale mientras el bus IDE no reclama la atención del sistema.&lt;br /&gt;
En clase hemos visto el concepto de DMA. Se trataba de un dispositivo, bien implementado en el propio dispositivo de entrada salida o implementado en el sistema, que ayudaba con la comunicación entre la memoria principal y el dispositivo de E/S. Como podemos ver en este trozo de código del xv6, este es un IDE driver sin DMA, se puede contemplar en el primer comentario del código.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// Simple PIO-based (non-DMA) IDE driver code.&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;types.h&amp;quot;&lt;br /&gt;
#include &amp;quot;defs.h&amp;quot;&lt;br /&gt;
#include &amp;quot;param.h&amp;quot;&lt;br /&gt;
#include &amp;quot;memlayout.h&amp;quot;&lt;br /&gt;
#include &amp;quot;mmu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;proc.h&amp;quot;&lt;br /&gt;
#include &amp;quot;x86.h&amp;quot;&lt;br /&gt;
#include &amp;quot;traps.h&amp;quot;&lt;br /&gt;
#include &amp;quot;spinlock.h&amp;quot;&lt;br /&gt;
#include &amp;quot;fs.h&amp;quot;&lt;br /&gt;
#include &amp;quot;buf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define SECTOR_SIZE   512&lt;br /&gt;
#define IDE_BSY       0x80&lt;br /&gt;
#define IDE_DRDY      0x40&lt;br /&gt;
#define IDE_DF        0x20&lt;br /&gt;
#define IDE_ERR       0x01&lt;br /&gt;
&lt;br /&gt;
#define IDE_CMD_READ  0x20&lt;br /&gt;
#define IDE_CMD_WRITE 0x30&lt;br /&gt;
&lt;br /&gt;
// idequeue points to the buf now being read/written to the disk.&lt;br /&gt;
// idequeue-&amp;gt;qnext points to the next buf to be processed.&lt;br /&gt;
// You must hold idelock while manipulating queue.&lt;br /&gt;
&lt;br /&gt;
static struct spinlock idelock;&lt;br /&gt;
static struct buf *idequeue;&lt;br /&gt;
&lt;br /&gt;
static int havedisk1;&lt;br /&gt;
static void idestart(struct buf*);&lt;br /&gt;
&lt;br /&gt;
// Wait for IDE disk to become ready.&lt;br /&gt;
static int&lt;br /&gt;
idewait(int checkerr)&lt;br /&gt;
{&lt;br /&gt;
  int r;&lt;br /&gt;
&lt;br /&gt;
  while(((r = inb(0x1f7)) &amp;amp; (IDE_BSY|IDE_DRDY)) != IDE_DRDY) &lt;br /&gt;
    ;&lt;br /&gt;
  if(checkerr &amp;amp;&amp;amp; (r &amp;amp; (IDE_DF|IDE_ERR)) != 0)&lt;br /&gt;
    return -1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
ideinit(void)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  initlock(&amp;amp;idelock, &amp;quot;ide&amp;quot;);&lt;br /&gt;
  picenable(IRQ_IDE);&lt;br /&gt;
  ioapicenable(IRQ_IDE, ncpu - 1);&lt;br /&gt;
  idewait(0);&lt;br /&gt;
  &lt;br /&gt;
  // Check if disk 1 is present&lt;br /&gt;
  outb(0x1f6, 0xe0 | (1&amp;lt;&amp;lt;4));&lt;br /&gt;
  for(i=0; i&amp;lt;1000; i++){&lt;br /&gt;
    if(inb(0x1f7) != 0){&lt;br /&gt;
      havedisk1 = 1;&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Switch back to disk 0.&lt;br /&gt;
  outb(0x1f6, 0xe0 | (0&amp;lt;&amp;lt;4));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Start the request for b.  Caller must hold idelock.&lt;br /&gt;
static void&lt;br /&gt;
idestart(struct buf *b)&lt;br /&gt;
{&lt;br /&gt;
  if(b == 0)&lt;br /&gt;
    panic(&amp;quot;idestart&amp;quot;);&lt;br /&gt;
  if(b-&amp;gt;blockno &amp;gt;= FSSIZE)&lt;br /&gt;
    panic(&amp;quot;incorrect blockno&amp;quot;);&lt;br /&gt;
  int sector_per_block =  BSIZE/SECTOR_SIZE;&lt;br /&gt;
  int sector = b-&amp;gt;blockno * sector_per_block;&lt;br /&gt;
&lt;br /&gt;
  if (sector_per_block &amp;gt; 7) panic(&amp;quot;idestart&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  idewait(0);&lt;br /&gt;
  outb(0x3f6, 0);  // generate interrupt&lt;br /&gt;
  outb(0x1f2, sector_per_block);  // number of sectors&lt;br /&gt;
  outb(0x1f3, sector &amp;amp; 0xff);&lt;br /&gt;
  outb(0x1f4, (sector &amp;gt;&amp;gt; 8) &amp;amp; 0xff);&lt;br /&gt;
  outb(0x1f5, (sector &amp;gt;&amp;gt; 16) &amp;amp; 0xff);&lt;br /&gt;
  outb(0x1f6, 0xe0 | ((b-&amp;gt;dev&amp;amp;1)&amp;lt;&amp;lt;4) | ((sector&amp;gt;&amp;gt;24)&amp;amp;0x0f));&lt;br /&gt;
  if(b-&amp;gt;flags &amp;amp; B_DIRTY){&lt;br /&gt;
    outb(0x1f7, IDE_CMD_WRITE);&lt;br /&gt;
    outsl(0x1f0, b-&amp;gt;data, BSIZE/4);&lt;br /&gt;
  } else {&lt;br /&gt;
    outb(0x1f7, IDE_CMD_READ);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Interrupt handler.&lt;br /&gt;
void&lt;br /&gt;
ideintr(void)&lt;br /&gt;
{&lt;br /&gt;
  struct buf *b;&lt;br /&gt;
&lt;br /&gt;
  // First queued buffer is the active request.&lt;br /&gt;
  acquire(&amp;amp;idelock);&lt;br /&gt;
  if((b = idequeue) == 0){&lt;br /&gt;
    release(&amp;amp;idelock);&lt;br /&gt;
    // cprintf(&amp;quot;spurious IDE interrupt\n&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  idequeue = b-&amp;gt;qnext;&lt;br /&gt;
&lt;br /&gt;
  // Read data if needed.&lt;br /&gt;
  if(!(b-&amp;gt;flags &amp;amp; B_DIRTY) &amp;amp;&amp;amp; idewait(1) &amp;gt;= 0)&lt;br /&gt;
    insl(0x1f0, b-&amp;gt;data, BSIZE/4);&lt;br /&gt;
  &lt;br /&gt;
  // Wake process waiting for this buf.&lt;br /&gt;
  b-&amp;gt;flags |= B_VALID;&lt;br /&gt;
  b-&amp;gt;flags &amp;amp;= ~B_DIRTY;&lt;br /&gt;
  wakeup(b);&lt;br /&gt;
  &lt;br /&gt;
  // Start disk on next buf in queue.&lt;br /&gt;
  if(idequeue != 0)&lt;br /&gt;
    idestart(idequeue);&lt;br /&gt;
&lt;br /&gt;
  release(&amp;amp;idelock);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//PAGEBREAK!&lt;br /&gt;
// Sync buf with disk. &lt;br /&gt;
// If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID.&lt;br /&gt;
// Else if B_VALID is not set, read buf from disk, set B_VALID.&lt;br /&gt;
void&lt;br /&gt;
iderw(struct buf *b)&lt;br /&gt;
{&lt;br /&gt;
  struct buf **pp;&lt;br /&gt;
&lt;br /&gt;
  if(!(b-&amp;gt;flags &amp;amp; B_BUSY))&lt;br /&gt;
    panic(&amp;quot;iderw: buf not busy&amp;quot;);&lt;br /&gt;
  if((b-&amp;gt;flags &amp;amp; (B_VALID|B_DIRTY)) == B_VALID)&lt;br /&gt;
    panic(&amp;quot;iderw: nothing to do&amp;quot;);&lt;br /&gt;
  if(b-&amp;gt;dev != 0 &amp;amp;&amp;amp; !havedisk1)&lt;br /&gt;
    panic(&amp;quot;iderw: ide disk 1 not present&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  acquire(&amp;amp;idelock);  //DOC:acquire-lock&lt;br /&gt;
&lt;br /&gt;
  // Append b to idequeue.&lt;br /&gt;
  b-&amp;gt;qnext = 0;&lt;br /&gt;
  for(pp=&amp;amp;idequeue; *pp; pp=&amp;amp;(*pp)-&amp;gt;qnext)  //DOC:insert-queue&lt;br /&gt;
    ;&lt;br /&gt;
  *pp = b;&lt;br /&gt;
  &lt;br /&gt;
  // Start disk if necessary.&lt;br /&gt;
  if(idequeue == b)&lt;br /&gt;
    idestart(b);&lt;br /&gt;
  &lt;br /&gt;
  // Wait for request to finish.&lt;br /&gt;
  while((b-&amp;gt;flags &amp;amp; (B_VALID|B_DIRTY)) != B_VALID){&lt;br /&gt;
    sleep(b, &amp;amp;idelock);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  release(&amp;amp;idelock);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Driver_xv6&amp;diff=3295</id>
		<title>Driver xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Driver_xv6&amp;diff=3295"/>
				<updated>2016-01-21T21:42:00Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: Página creada con «A continuación se muestra el condigo que hacer referencia al gestor de entrada/salida, en concreto el código que gestiona el bus IDE, al que se encuentra conectado el dis...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A continuación se muestra el condigo que hacer referencia al gestor de entrada/salida, en concreto el código que gestiona el bus IDE, al que se encuentra conectado el disco duro del ordenador sobre el que se esté ejecutando xv6.&lt;br /&gt;
Como se puede observar, xv6 gestiona L/E por muestreo. Esto se puede comprobar en la primera función que se implementa, en la que existe un bucle &amp;lt;&lt;br /&gt;
while, del que no se sale mientras el bus IDE no reclama la atención del sistema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// Simple PIO-based (non-DMA) IDE driver code.&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;types.h&amp;quot;&lt;br /&gt;
#include &amp;quot;defs.h&amp;quot;&lt;br /&gt;
#include &amp;quot;param.h&amp;quot;&lt;br /&gt;
#include &amp;quot;memlayout.h&amp;quot;&lt;br /&gt;
#include &amp;quot;mmu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;proc.h&amp;quot;&lt;br /&gt;
#include &amp;quot;x86.h&amp;quot;&lt;br /&gt;
#include &amp;quot;traps.h&amp;quot;&lt;br /&gt;
#include &amp;quot;spinlock.h&amp;quot;&lt;br /&gt;
#include &amp;quot;fs.h&amp;quot;&lt;br /&gt;
#include &amp;quot;buf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define SECTOR_SIZE   512&lt;br /&gt;
#define IDE_BSY       0x80&lt;br /&gt;
#define IDE_DRDY      0x40&lt;br /&gt;
#define IDE_DF        0x20&lt;br /&gt;
#define IDE_ERR       0x01&lt;br /&gt;
&lt;br /&gt;
#define IDE_CMD_READ  0x20&lt;br /&gt;
#define IDE_CMD_WRITE 0x30&lt;br /&gt;
&lt;br /&gt;
// idequeue points to the buf now being read/written to the disk.&lt;br /&gt;
// idequeue-&amp;gt;qnext points to the next buf to be processed.&lt;br /&gt;
// You must hold idelock while manipulating queue.&lt;br /&gt;
&lt;br /&gt;
static struct spinlock idelock;&lt;br /&gt;
static struct buf *idequeue;&lt;br /&gt;
&lt;br /&gt;
static int havedisk1;&lt;br /&gt;
static void idestart(struct buf*);&lt;br /&gt;
&lt;br /&gt;
// Wait for IDE disk to become ready.&lt;br /&gt;
static int&lt;br /&gt;
idewait(int checkerr)&lt;br /&gt;
{&lt;br /&gt;
  int r;&lt;br /&gt;
&lt;br /&gt;
  while(((r = inb(0x1f7)) &amp;amp; (IDE_BSY|IDE_DRDY)) != IDE_DRDY) &lt;br /&gt;
    ;&lt;br /&gt;
  if(checkerr &amp;amp;&amp;amp; (r &amp;amp; (IDE_DF|IDE_ERR)) != 0)&lt;br /&gt;
    return -1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
ideinit(void)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  initlock(&amp;amp;idelock, &amp;quot;ide&amp;quot;);&lt;br /&gt;
  picenable(IRQ_IDE);&lt;br /&gt;
  ioapicenable(IRQ_IDE, ncpu - 1);&lt;br /&gt;
  idewait(0);&lt;br /&gt;
  &lt;br /&gt;
  // Check if disk 1 is present&lt;br /&gt;
  outb(0x1f6, 0xe0 | (1&amp;lt;&amp;lt;4));&lt;br /&gt;
  for(i=0; i&amp;lt;1000; i++){&lt;br /&gt;
    if(inb(0x1f7) != 0){&lt;br /&gt;
      havedisk1 = 1;&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Switch back to disk 0.&lt;br /&gt;
  outb(0x1f6, 0xe0 | (0&amp;lt;&amp;lt;4));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Start the request for b.  Caller must hold idelock.&lt;br /&gt;
static void&lt;br /&gt;
idestart(struct buf *b)&lt;br /&gt;
{&lt;br /&gt;
  if(b == 0)&lt;br /&gt;
    panic(&amp;quot;idestart&amp;quot;);&lt;br /&gt;
  if(b-&amp;gt;blockno &amp;gt;= FSSIZE)&lt;br /&gt;
    panic(&amp;quot;incorrect blockno&amp;quot;);&lt;br /&gt;
  int sector_per_block =  BSIZE/SECTOR_SIZE;&lt;br /&gt;
  int sector = b-&amp;gt;blockno * sector_per_block;&lt;br /&gt;
&lt;br /&gt;
  if (sector_per_block &amp;gt; 7) panic(&amp;quot;idestart&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  idewait(0);&lt;br /&gt;
  outb(0x3f6, 0);  // generate interrupt&lt;br /&gt;
  outb(0x1f2, sector_per_block);  // number of sectors&lt;br /&gt;
  outb(0x1f3, sector &amp;amp; 0xff);&lt;br /&gt;
  outb(0x1f4, (sector &amp;gt;&amp;gt; 8) &amp;amp; 0xff);&lt;br /&gt;
  outb(0x1f5, (sector &amp;gt;&amp;gt; 16) &amp;amp; 0xff);&lt;br /&gt;
  outb(0x1f6, 0xe0 | ((b-&amp;gt;dev&amp;amp;1)&amp;lt;&amp;lt;4) | ((sector&amp;gt;&amp;gt;24)&amp;amp;0x0f));&lt;br /&gt;
  if(b-&amp;gt;flags &amp;amp; B_DIRTY){&lt;br /&gt;
    outb(0x1f7, IDE_CMD_WRITE);&lt;br /&gt;
    outsl(0x1f0, b-&amp;gt;data, BSIZE/4);&lt;br /&gt;
  } else {&lt;br /&gt;
    outb(0x1f7, IDE_CMD_READ);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Interrupt handler.&lt;br /&gt;
void&lt;br /&gt;
ideintr(void)&lt;br /&gt;
{&lt;br /&gt;
  struct buf *b;&lt;br /&gt;
&lt;br /&gt;
  // First queued buffer is the active request.&lt;br /&gt;
  acquire(&amp;amp;idelock);&lt;br /&gt;
  if((b = idequeue) == 0){&lt;br /&gt;
    release(&amp;amp;idelock);&lt;br /&gt;
    // cprintf(&amp;quot;spurious IDE interrupt\n&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  idequeue = b-&amp;gt;qnext;&lt;br /&gt;
&lt;br /&gt;
  // Read data if needed.&lt;br /&gt;
  if(!(b-&amp;gt;flags &amp;amp; B_DIRTY) &amp;amp;&amp;amp; idewait(1) &amp;gt;= 0)&lt;br /&gt;
    insl(0x1f0, b-&amp;gt;data, BSIZE/4);&lt;br /&gt;
  &lt;br /&gt;
  // Wake process waiting for this buf.&lt;br /&gt;
  b-&amp;gt;flags |= B_VALID;&lt;br /&gt;
  b-&amp;gt;flags &amp;amp;= ~B_DIRTY;&lt;br /&gt;
  wakeup(b);&lt;br /&gt;
  &lt;br /&gt;
  // Start disk on next buf in queue.&lt;br /&gt;
  if(idequeue != 0)&lt;br /&gt;
    idestart(idequeue);&lt;br /&gt;
&lt;br /&gt;
  release(&amp;amp;idelock);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//PAGEBREAK!&lt;br /&gt;
// Sync buf with disk. &lt;br /&gt;
// If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID.&lt;br /&gt;
// Else if B_VALID is not set, read buf from disk, set B_VALID.&lt;br /&gt;
void&lt;br /&gt;
iderw(struct buf *b)&lt;br /&gt;
{&lt;br /&gt;
  struct buf **pp;&lt;br /&gt;
&lt;br /&gt;
  if(!(b-&amp;gt;flags &amp;amp; B_BUSY))&lt;br /&gt;
    panic(&amp;quot;iderw: buf not busy&amp;quot;);&lt;br /&gt;
  if((b-&amp;gt;flags &amp;amp; (B_VALID|B_DIRTY)) == B_VALID)&lt;br /&gt;
    panic(&amp;quot;iderw: nothing to do&amp;quot;);&lt;br /&gt;
  if(b-&amp;gt;dev != 0 &amp;amp;&amp;amp; !havedisk1)&lt;br /&gt;
    panic(&amp;quot;iderw: ide disk 1 not present&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  acquire(&amp;amp;idelock);  //DOC:acquire-lock&lt;br /&gt;
&lt;br /&gt;
  // Append b to idequeue.&lt;br /&gt;
  b-&amp;gt;qnext = 0;&lt;br /&gt;
  for(pp=&amp;amp;idequeue; *pp; pp=&amp;amp;(*pp)-&amp;gt;qnext)  //DOC:insert-queue&lt;br /&gt;
    ;&lt;br /&gt;
  *pp = b;&lt;br /&gt;
  &lt;br /&gt;
  // Start disk if necessary.&lt;br /&gt;
  if(idequeue == b)&lt;br /&gt;
    idestart(b);&lt;br /&gt;
  &lt;br /&gt;
  // Wait for request to finish.&lt;br /&gt;
  while((b-&amp;gt;flags &amp;amp; (B_VALID|B_DIRTY)) != B_VALID){&lt;br /&gt;
    sleep(b, &amp;amp;idelock);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  release(&amp;amp;idelock);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Scheduler_xv6&amp;diff=3292</id>
		<title>Scheduler xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Scheduler_xv6&amp;diff=3292"/>
				<updated>2016-01-19T11:49:24Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción =&lt;br /&gt;
&lt;br /&gt;
El planificador de procesos se encuentra en los archivos '''''proc.h''''', '''''proc.c'''''. Como se puede observar, se hace un '''''include''''' de otros archivos, como '''''types.h''''' o '''''defs.h'''''. En estos archivos se declaran variables y constantes necesarias para la ejecución del planificador.&lt;br /&gt;
&lt;br /&gt;
Este trozo de código, es el archivo proc.h, dónde podemos encontrar por ejemplo la declaración del struct que va a formar el proceso y toda la información que lo compone. Podemos observar algunas propiedades del struct que hemos visto en clase, por ejemplo, el tamaño del proceso, el numero de pagina, el estado en que se encuentra el proceso, el PID del proceso, si tiene proceso padre, de que proceso padre es hijo, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// Segments in proc-&amp;gt;gdt.&lt;br /&gt;
#define NSEGS     7&lt;br /&gt;
&lt;br /&gt;
// Per-CPU state&lt;br /&gt;
struct cpu {&lt;br /&gt;
  uchar id;                    // Local APIC ID; index into cpus[] below&lt;br /&gt;
  struct context *scheduler;   // swtch() here to enter scheduler&lt;br /&gt;
  struct taskstate ts;         // Used by x86 to find stack for interrupt&lt;br /&gt;
  struct segdesc gdt[NSEGS];   // x86 global descriptor table&lt;br /&gt;
  volatile uint started;       // Has the CPU started?&lt;br /&gt;
  int ncli;                    // Depth of pushcli nesting.&lt;br /&gt;
  int intena;                  // Were interrupts enabled before pushcli?&lt;br /&gt;
  &lt;br /&gt;
  // Cpu-local storage variables; see below&lt;br /&gt;
  struct cpu *cpu;&lt;br /&gt;
  struct proc *proc;           // The currently-running process.&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
extern struct cpu cpus[NCPU];&lt;br /&gt;
extern int ncpu;&lt;br /&gt;
&lt;br /&gt;
// Per-CPU variables, holding pointers to the&lt;br /&gt;
// current cpu and to the current process.&lt;br /&gt;
// The asm suffix tells gcc to use &amp;quot;%gs:0&amp;quot; to refer to cpu&lt;br /&gt;
// and &amp;quot;%gs:4&amp;quot; to refer to proc.  seginit sets up the&lt;br /&gt;
// %gs segment register so that %gs refers to the memory&lt;br /&gt;
// holding those two variables in the local cpu's struct cpu.&lt;br /&gt;
// This is similar to how thread-local variables are implemented&lt;br /&gt;
// in thread libraries such as Linux pthreads.&lt;br /&gt;
extern struct cpu *cpu asm(&amp;quot;%gs:0&amp;quot;);       // &amp;amp;cpus[cpunum()]&lt;br /&gt;
extern struct proc *proc asm(&amp;quot;%gs:4&amp;quot;);     // cpus[cpunum()].proc&lt;br /&gt;
&lt;br /&gt;
//PAGEBREAK: 17&lt;br /&gt;
// Saved registers for kernel context switches.&lt;br /&gt;
// Don't need to save all the segment registers (%cs, etc),&lt;br /&gt;
// because they are constant across kernel contexts.&lt;br /&gt;
// Don't need to save %eax, %ecx, %edx, because the&lt;br /&gt;
// x86 convention is that the caller has saved them.&lt;br /&gt;
// Contexts are stored at the bottom of the stack they&lt;br /&gt;
// describe; the stack pointer is the address of the context.&lt;br /&gt;
// The layout of the context matches the layout of the stack in swtch.S&lt;br /&gt;
// at the &amp;quot;Switch stacks&amp;quot; comment. Switch doesn't save eip explicitly,&lt;br /&gt;
// but it is on the stack and allocproc() manipulates it.&lt;br /&gt;
struct context {&lt;br /&gt;
  uint edi;&lt;br /&gt;
  uint esi;&lt;br /&gt;
  uint ebx;&lt;br /&gt;
  uint ebp;&lt;br /&gt;
  uint eip;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum procstate { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };&lt;br /&gt;
&lt;br /&gt;
// Per-process state&lt;br /&gt;
struct proc {&lt;br /&gt;
  uint sz;                     // Size of process memory (bytes)&lt;br /&gt;
  pde_t* pgdir;                // Page table&lt;br /&gt;
  char *kstack;                // Bottom of kernel stack for this process&lt;br /&gt;
  enum procstate state;        // Process state&lt;br /&gt;
  int pid;                     // Process ID&lt;br /&gt;
  struct proc *parent;         // Parent process&lt;br /&gt;
  struct trapframe *tf;        // Trap frame for current syscall&lt;br /&gt;
  struct context *context;     // swtch() here to run process&lt;br /&gt;
  void *chan;                  // If non-zero, sleeping on chan&lt;br /&gt;
  int killed;                  // If non-zero, have been killed&lt;br /&gt;
  struct file *ofile[NOFILE];  // Open files&lt;br /&gt;
  struct inode *cwd;           // Current directory&lt;br /&gt;
  char name[16];               // Process name (debugging)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Process memory is laid out contiguously, low addresses first:&lt;br /&gt;
//   text&lt;br /&gt;
//   original data and bss&lt;br /&gt;
//   fixed-size stack&lt;br /&gt;
//   expandable heap&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación se puede ver el archivo ''''proc.c'''', en el que se observa como funciona el planificador de procesos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;types.h&amp;quot;&lt;br /&gt;
#include &amp;quot;defs.h&amp;quot;&lt;br /&gt;
#include &amp;quot;param.h&amp;quot;&lt;br /&gt;
#include &amp;quot;memlayout.h&amp;quot;&lt;br /&gt;
#include &amp;quot;mmu.h&amp;quot;&lt;br /&gt;
#include &amp;quot;x86.h&amp;quot;&lt;br /&gt;
#include &amp;quot;proc.h&amp;quot;&lt;br /&gt;
#include &amp;quot;spinlock.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
struct {&lt;br /&gt;
  struct spinlock lock;&lt;br /&gt;
  struct proc proc[NPROC];&lt;br /&gt;
} ptable;&lt;br /&gt;
&lt;br /&gt;
static struct proc *initproc;&lt;br /&gt;
&lt;br /&gt;
int nextpid = 1;&lt;br /&gt;
extern void forkret(void);&lt;br /&gt;
extern void trapret(void);&lt;br /&gt;
&lt;br /&gt;
static void wakeup1(void *chan);&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
pinit(void)&lt;br /&gt;
{&lt;br /&gt;
  initlock(&amp;amp;ptable.lock, &amp;quot;ptable&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//PAGEBREAK: 32&lt;br /&gt;
// Look in the process table for an UNUSED proc.&lt;br /&gt;
// If found, change state to EMBRYO and initialize&lt;br /&gt;
// state required to run in the kernel.&lt;br /&gt;
// Otherwise return 0.&lt;br /&gt;
static struct proc*&lt;br /&gt;
allocproc(void)&lt;br /&gt;
{&lt;br /&gt;
  struct proc *p;&lt;br /&gt;
  char *sp;&lt;br /&gt;
&lt;br /&gt;
  acquire(&amp;amp;ptable.lock);&lt;br /&gt;
  for(p = ptable.proc; p &amp;lt; &amp;amp;ptable.proc[NPROC]; p++)&lt;br /&gt;
    if(p-&amp;gt;state == UNUSED)&lt;br /&gt;
      goto found;&lt;br /&gt;
  release(&amp;amp;ptable.lock);&lt;br /&gt;
  return 0;&lt;br /&gt;
&lt;br /&gt;
found:&lt;br /&gt;
  p-&amp;gt;state = EMBRYO;&lt;br /&gt;
  p-&amp;gt;pid = nextpid++;&lt;br /&gt;
  release(&amp;amp;ptable.lock);&lt;br /&gt;
&lt;br /&gt;
  // Allocate kernel stack.&lt;br /&gt;
  if((p-&amp;gt;kstack = kalloc()) == 0){&lt;br /&gt;
    p-&amp;gt;state = UNUSED;&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  sp = p-&amp;gt;kstack + KSTACKSIZE;&lt;br /&gt;
  &lt;br /&gt;
  // Leave room for trap frame.&lt;br /&gt;
  sp -= sizeof *p-&amp;gt;tf;&lt;br /&gt;
  p-&amp;gt;tf = (struct trapframe*)sp;&lt;br /&gt;
  &lt;br /&gt;
  // Set up new context to start executing at forkret,&lt;br /&gt;
  // which returns to trapret.&lt;br /&gt;
  sp -= 4;&lt;br /&gt;
  *(uint*)sp = (uint)trapret;&lt;br /&gt;
&lt;br /&gt;
  sp -= sizeof *p-&amp;gt;context;&lt;br /&gt;
  p-&amp;gt;context = (struct context*)sp;&lt;br /&gt;
  memset(p-&amp;gt;context, 0, sizeof *p-&amp;gt;context);&lt;br /&gt;
  p-&amp;gt;context-&amp;gt;eip = (uint)forkret;&lt;br /&gt;
&lt;br /&gt;
  return p;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//PAGEBREAK: 32&lt;br /&gt;
// Set up first user process.&lt;br /&gt;
void&lt;br /&gt;
userinit(void)&lt;br /&gt;
{&lt;br /&gt;
  struct proc *p;&lt;br /&gt;
  extern char _binary_initcode_start[], _binary_initcode_size[];&lt;br /&gt;
  &lt;br /&gt;
  p = allocproc();&lt;br /&gt;
  initproc = p;&lt;br /&gt;
  if((p-&amp;gt;pgdir = setupkvm()) == 0)&lt;br /&gt;
    panic(&amp;quot;userinit: out of memory?&amp;quot;);&lt;br /&gt;
  inituvm(p-&amp;gt;pgdir, _binary_initcode_start, (int)_binary_initcode_size);&lt;br /&gt;
  p-&amp;gt;sz = PGSIZE;&lt;br /&gt;
  memset(p-&amp;gt;tf, 0, sizeof(*p-&amp;gt;tf));&lt;br /&gt;
  p-&amp;gt;tf-&amp;gt;cs = (SEG_UCODE &amp;lt;&amp;lt; 3) | DPL_USER;&lt;br /&gt;
  p-&amp;gt;tf-&amp;gt;ds = (SEG_UDATA &amp;lt;&amp;lt; 3) | DPL_USER;&lt;br /&gt;
  p-&amp;gt;tf-&amp;gt;es = p-&amp;gt;tf-&amp;gt;ds;&lt;br /&gt;
  p-&amp;gt;tf-&amp;gt;ss = p-&amp;gt;tf-&amp;gt;ds;&lt;br /&gt;
  p-&amp;gt;tf-&amp;gt;eflags = FL_IF;&lt;br /&gt;
  p-&amp;gt;tf-&amp;gt;esp = PGSIZE;&lt;br /&gt;
  p-&amp;gt;tf-&amp;gt;eip = 0;  // beginning of initcode.S&lt;br /&gt;
&lt;br /&gt;
  safestrcpy(p-&amp;gt;name, &amp;quot;initcode&amp;quot;, sizeof(p-&amp;gt;name));&lt;br /&gt;
  p-&amp;gt;cwd = namei(&amp;quot;/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  p-&amp;gt;state = RUNNABLE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Grow current process's memory by n bytes.&lt;br /&gt;
// Return 0 on success, -1 on failure.&lt;br /&gt;
int&lt;br /&gt;
growproc(int n)&lt;br /&gt;
{&lt;br /&gt;
  uint sz;&lt;br /&gt;
  &lt;br /&gt;
  sz = proc-&amp;gt;sz;&lt;br /&gt;
  if(n &amp;gt; 0){&lt;br /&gt;
    if((sz = allocuvm(proc-&amp;gt;pgdir, sz, sz + n)) == 0)&lt;br /&gt;
      return -1;&lt;br /&gt;
  } else if(n &amp;lt; 0){&lt;br /&gt;
    if((sz = deallocuvm(proc-&amp;gt;pgdir, sz, sz + n)) == 0)&lt;br /&gt;
      return -1;&lt;br /&gt;
  }&lt;br /&gt;
  proc-&amp;gt;sz = sz;&lt;br /&gt;
  switchuvm(proc);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create a new process copying p as the parent.&lt;br /&gt;
// Sets up stack to return as if from system call.&lt;br /&gt;
// Caller must set state of returned proc to RUNNABLE.&lt;br /&gt;
int&lt;br /&gt;
fork(void)&lt;br /&gt;
{&lt;br /&gt;
  int i, pid;&lt;br /&gt;
  struct proc *np;&lt;br /&gt;
&lt;br /&gt;
  // Allocate process.&lt;br /&gt;
  if((np = allocproc()) == 0)&lt;br /&gt;
    return -1;&lt;br /&gt;
&lt;br /&gt;
  // Copy process state from p.&lt;br /&gt;
  if((np-&amp;gt;pgdir = copyuvm(proc-&amp;gt;pgdir, proc-&amp;gt;sz)) == 0){&lt;br /&gt;
    kfree(np-&amp;gt;kstack);&lt;br /&gt;
    np-&amp;gt;kstack = 0;&lt;br /&gt;
    np-&amp;gt;state = UNUSED;&lt;br /&gt;
    return -1;&lt;br /&gt;
  }&lt;br /&gt;
  np-&amp;gt;sz = proc-&amp;gt;sz;&lt;br /&gt;
  np-&amp;gt;parent = proc;&lt;br /&gt;
  *np-&amp;gt;tf = *proc-&amp;gt;tf;&lt;br /&gt;
&lt;br /&gt;
  // Clear %eax so that fork returns 0 in the child.&lt;br /&gt;
  np-&amp;gt;tf-&amp;gt;eax = 0;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; NOFILE; i++)&lt;br /&gt;
    if(proc-&amp;gt;ofile[i])&lt;br /&gt;
      np-&amp;gt;ofile[i] = filedup(proc-&amp;gt;ofile[i]);&lt;br /&gt;
  np-&amp;gt;cwd = idup(proc-&amp;gt;cwd);&lt;br /&gt;
&lt;br /&gt;
  safestrcpy(np-&amp;gt;name, proc-&amp;gt;name, sizeof(proc-&amp;gt;name));&lt;br /&gt;
 &lt;br /&gt;
  pid = np-&amp;gt;pid;&lt;br /&gt;
&lt;br /&gt;
  // lock to force the compiler to emit the np-&amp;gt;state write last.&lt;br /&gt;
  acquire(&amp;amp;ptable.lock);&lt;br /&gt;
  np-&amp;gt;state = RUNNABLE;&lt;br /&gt;
  release(&amp;amp;ptable.lock);&lt;br /&gt;
  &lt;br /&gt;
  return pid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Exit the current process.  Does not return.&lt;br /&gt;
// An exited process remains in the zombie state&lt;br /&gt;
// until its parent calls wait() to find out it exited.&lt;br /&gt;
void&lt;br /&gt;
exit(void)&lt;br /&gt;
{&lt;br /&gt;
  struct proc *p;&lt;br /&gt;
  int fd;&lt;br /&gt;
&lt;br /&gt;
  if(proc == initproc)&lt;br /&gt;
    panic(&amp;quot;init exiting&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Close all open files.&lt;br /&gt;
  for(fd = 0; fd &amp;lt; NOFILE; fd++){&lt;br /&gt;
    if(proc-&amp;gt;ofile[fd]){&lt;br /&gt;
      fileclose(proc-&amp;gt;ofile[fd]);&lt;br /&gt;
      proc-&amp;gt;ofile[fd] = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  begin_op();&lt;br /&gt;
  iput(proc-&amp;gt;cwd);&lt;br /&gt;
  end_op();&lt;br /&gt;
  proc-&amp;gt;cwd = 0;&lt;br /&gt;
&lt;br /&gt;
  acquire(&amp;amp;ptable.lock);&lt;br /&gt;
&lt;br /&gt;
  // Parent might be sleeping in wait().&lt;br /&gt;
  wakeup1(proc-&amp;gt;parent);&lt;br /&gt;
&lt;br /&gt;
  // Pass abandoned children to init.&lt;br /&gt;
  for(p = ptable.proc; p &amp;lt; &amp;amp;ptable.proc[NPROC]; p++){&lt;br /&gt;
    if(p-&amp;gt;parent == proc){&lt;br /&gt;
      p-&amp;gt;parent = initproc;&lt;br /&gt;
      if(p-&amp;gt;state == ZOMBIE)&lt;br /&gt;
        wakeup1(initproc);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Jump into the scheduler, never to return.&lt;br /&gt;
  proc-&amp;gt;state = ZOMBIE;&lt;br /&gt;
  sched();&lt;br /&gt;
  panic(&amp;quot;zombie exit&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Wait for a child process to exit and return its pid.&lt;br /&gt;
// Return -1 if this process has no children.&lt;br /&gt;
int&lt;br /&gt;
wait(void)&lt;br /&gt;
{&lt;br /&gt;
  struct proc *p;&lt;br /&gt;
  int havekids, pid;&lt;br /&gt;
&lt;br /&gt;
  acquire(&amp;amp;ptable.lock);&lt;br /&gt;
  for(;;){&lt;br /&gt;
    // Scan through table looking for zombie children.&lt;br /&gt;
    havekids = 0;&lt;br /&gt;
    for(p = ptable.proc; p &amp;lt; &amp;amp;ptable.proc[NPROC]; p++){&lt;br /&gt;
      if(p-&amp;gt;parent != proc)&lt;br /&gt;
        continue;&lt;br /&gt;
      havekids = 1;&lt;br /&gt;
      if(p-&amp;gt;state == ZOMBIE){&lt;br /&gt;
        // Found one.&lt;br /&gt;
        pid = p-&amp;gt;pid;&lt;br /&gt;
        kfree(p-&amp;gt;kstack);&lt;br /&gt;
        p-&amp;gt;kstack = 0;&lt;br /&gt;
        freevm(p-&amp;gt;pgdir);&lt;br /&gt;
        p-&amp;gt;state = UNUSED;&lt;br /&gt;
        p-&amp;gt;pid = 0;&lt;br /&gt;
        p-&amp;gt;parent = 0;&lt;br /&gt;
        p-&amp;gt;name[0] = 0;&lt;br /&gt;
        p-&amp;gt;killed = 0;&lt;br /&gt;
        release(&amp;amp;ptable.lock);&lt;br /&gt;
        return pid;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // No point waiting if we don't have any children.&lt;br /&gt;
    if(!havekids || proc-&amp;gt;killed){&lt;br /&gt;
      release(&amp;amp;ptable.lock);&lt;br /&gt;
      return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Wait for children to exit.  (See wakeup1 call in proc_exit.)&lt;br /&gt;
    sleep(proc, &amp;amp;ptable.lock);  //DOC: wait-sleep&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//PAGEBREAK: 42&lt;br /&gt;
// Per-CPU process scheduler.&lt;br /&gt;
// Each CPU calls scheduler() after setting itself up.&lt;br /&gt;
// Scheduler never returns.  It loops, doing:&lt;br /&gt;
//  - choose a process to run&lt;br /&gt;
//  - swtch to start running that process&lt;br /&gt;
//  - eventually that process transfers control&lt;br /&gt;
//      via swtch back to the scheduler.&lt;br /&gt;
void&lt;br /&gt;
scheduler(void)&lt;br /&gt;
{&lt;br /&gt;
  struct proc *p;&lt;br /&gt;
&lt;br /&gt;
  for(;;){&lt;br /&gt;
    // Enable interrupts on this processor.&lt;br /&gt;
    sti();&lt;br /&gt;
&lt;br /&gt;
    // Loop over process table looking for process to run.&lt;br /&gt;
    acquire(&amp;amp;ptable.lock);&lt;br /&gt;
    for(p = ptable.proc; p &amp;lt; &amp;amp;ptable.proc[NPROC]; p++){&lt;br /&gt;
      if(p-&amp;gt;state != RUNNABLE)&lt;br /&gt;
        continue;&lt;br /&gt;
&lt;br /&gt;
      // Switch to chosen process.  It is the process's job&lt;br /&gt;
      // to release ptable.lock and then reacquire it&lt;br /&gt;
      // before jumping back to us.&lt;br /&gt;
      proc = p;&lt;br /&gt;
      switchuvm(p);&lt;br /&gt;
      p-&amp;gt;state = RUNNING;&lt;br /&gt;
      swtch(&amp;amp;cpu-&amp;gt;scheduler, proc-&amp;gt;context);&lt;br /&gt;
      switchkvm();&lt;br /&gt;
&lt;br /&gt;
      // Process is done running for now.&lt;br /&gt;
      // It should have changed its p-&amp;gt;state before coming back.&lt;br /&gt;
      proc = 0;&lt;br /&gt;
    }&lt;br /&gt;
    release(&amp;amp;ptable.lock);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Enter scheduler.  Must hold only ptable.lock&lt;br /&gt;
// and have changed proc-&amp;gt;state.&lt;br /&gt;
void&lt;br /&gt;
sched(void)&lt;br /&gt;
{&lt;br /&gt;
  int intena;&lt;br /&gt;
&lt;br /&gt;
  if(!holding(&amp;amp;ptable.lock))&lt;br /&gt;
    panic(&amp;quot;sched ptable.lock&amp;quot;);&lt;br /&gt;
  if(cpu-&amp;gt;ncli != 1)&lt;br /&gt;
    panic(&amp;quot;sched locks&amp;quot;);&lt;br /&gt;
  if(proc-&amp;gt;state == RUNNING)&lt;br /&gt;
    panic(&amp;quot;sched running&amp;quot;);&lt;br /&gt;
  if(readeflags()&amp;amp;FL_IF)&lt;br /&gt;
    panic(&amp;quot;sched interruptible&amp;quot;);&lt;br /&gt;
  intena = cpu-&amp;gt;intena;&lt;br /&gt;
  swtch(&amp;amp;proc-&amp;gt;context, cpu-&amp;gt;scheduler);&lt;br /&gt;
  cpu-&amp;gt;intena = intena;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Give up the CPU for one scheduling round.&lt;br /&gt;
void&lt;br /&gt;
yield(void)&lt;br /&gt;
{&lt;br /&gt;
  acquire(&amp;amp;ptable.lock);  //DOC: yieldlock&lt;br /&gt;
  proc-&amp;gt;state = RUNNABLE;&lt;br /&gt;
  sched();&lt;br /&gt;
  release(&amp;amp;ptable.lock);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A fork child's very first scheduling by scheduler()&lt;br /&gt;
// will swtch here.  &amp;quot;Return&amp;quot; to user space.&lt;br /&gt;
void&lt;br /&gt;
forkret(void)&lt;br /&gt;
{&lt;br /&gt;
  static int first = 1;&lt;br /&gt;
  // Still holding ptable.lock from scheduler.&lt;br /&gt;
  release(&amp;amp;ptable.lock);&lt;br /&gt;
&lt;br /&gt;
  if (first) {&lt;br /&gt;
    // Some initialization functions must be run in the context&lt;br /&gt;
    // of a regular process (e.g., they call sleep), and thus cannot &lt;br /&gt;
    // be run from main().&lt;br /&gt;
    first = 0;&lt;br /&gt;
    iinit(ROOTDEV);&lt;br /&gt;
    initlog(ROOTDEV);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Return to &amp;quot;caller&amp;quot;, actually trapret (see allocproc).&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Atomically release lock and sleep on chan.&lt;br /&gt;
// Reacquires lock when awakened.&lt;br /&gt;
void&lt;br /&gt;
sleep(void *chan, struct spinlock *lk)&lt;br /&gt;
{&lt;br /&gt;
  if(proc == 0)&lt;br /&gt;
    panic(&amp;quot;sleep&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if(lk == 0)&lt;br /&gt;
    panic(&amp;quot;sleep without lk&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Must acquire ptable.lock in order to&lt;br /&gt;
  // change p-&amp;gt;state and then call sched.&lt;br /&gt;
  // Once we hold ptable.lock, we can be&lt;br /&gt;
  // guaranteed that we won't miss any wakeup&lt;br /&gt;
  // (wakeup runs with ptable.lock locked),&lt;br /&gt;
  // so it's okay to release lk.&lt;br /&gt;
  if(lk != &amp;amp;ptable.lock){  //DOC: sleeplock0&lt;br /&gt;
    acquire(&amp;amp;ptable.lock);  //DOC: sleeplock1&lt;br /&gt;
    release(lk);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Go to sleep.&lt;br /&gt;
  proc-&amp;gt;chan = chan;&lt;br /&gt;
  proc-&amp;gt;state = SLEEPING;&lt;br /&gt;
  sched();&lt;br /&gt;
&lt;br /&gt;
  // Tidy up.&lt;br /&gt;
  proc-&amp;gt;chan = 0;&lt;br /&gt;
&lt;br /&gt;
  // Reacquire original lock.&lt;br /&gt;
  if(lk != &amp;amp;ptable.lock){  //DOC: sleeplock2&lt;br /&gt;
    release(&amp;amp;ptable.lock);&lt;br /&gt;
    acquire(lk);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//PAGEBREAK!&lt;br /&gt;
// Wake up all processes sleeping on chan.&lt;br /&gt;
// The ptable lock must be held.&lt;br /&gt;
static void&lt;br /&gt;
wakeup1(void *chan)&lt;br /&gt;
{&lt;br /&gt;
  struct proc *p;&lt;br /&gt;
&lt;br /&gt;
  for(p = ptable.proc; p &amp;lt; &amp;amp;ptable.proc[NPROC]; p++)&lt;br /&gt;
    if(p-&amp;gt;state == SLEEPING &amp;amp;&amp;amp; p-&amp;gt;chan == chan)&lt;br /&gt;
      p-&amp;gt;state = RUNNABLE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Wake up all processes sleeping on chan.&lt;br /&gt;
void&lt;br /&gt;
wakeup(void *chan)&lt;br /&gt;
{&lt;br /&gt;
  acquire(&amp;amp;ptable.lock);&lt;br /&gt;
  wakeup1(chan);&lt;br /&gt;
  release(&amp;amp;ptable.lock);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Kill the process with the given pid.&lt;br /&gt;
// Process won't exit until it returns&lt;br /&gt;
// to user space (see trap in trap.c).&lt;br /&gt;
int&lt;br /&gt;
kill(int pid)&lt;br /&gt;
{&lt;br /&gt;
  struct proc *p;&lt;br /&gt;
&lt;br /&gt;
  acquire(&amp;amp;ptable.lock);&lt;br /&gt;
  for(p = ptable.proc; p &amp;lt; &amp;amp;ptable.proc[NPROC]; p++){&lt;br /&gt;
    if(p-&amp;gt;pid == pid){&lt;br /&gt;
      p-&amp;gt;killed = 1;&lt;br /&gt;
      // Wake process from sleep if necessary.&lt;br /&gt;
      if(p-&amp;gt;state == SLEEPING)&lt;br /&gt;
        p-&amp;gt;state = RUNNABLE;&lt;br /&gt;
      release(&amp;amp;ptable.lock);&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  release(&amp;amp;ptable.lock);&lt;br /&gt;
  return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//PAGEBREAK: 36&lt;br /&gt;
// Print a process listing to console.  For debugging.&lt;br /&gt;
// Runs when user types ^P on console.&lt;br /&gt;
// No lock to avoid wedging a stuck machine further.&lt;br /&gt;
void&lt;br /&gt;
procdump(void)&lt;br /&gt;
{&lt;br /&gt;
  static char *states[] = {&lt;br /&gt;
  [UNUSED]    &amp;quot;unused&amp;quot;,&lt;br /&gt;
  [EMBRYO]    &amp;quot;embryo&amp;quot;,&lt;br /&gt;
  [SLEEPING]  &amp;quot;sleep &amp;quot;,&lt;br /&gt;
  [RUNNABLE]  &amp;quot;runble&amp;quot;,&lt;br /&gt;
  [RUNNING]   &amp;quot;run   &amp;quot;,&lt;br /&gt;
  [ZOMBIE]    &amp;quot;zombie&amp;quot;&lt;br /&gt;
  };&lt;br /&gt;
  int i;&lt;br /&gt;
  struct proc *p;&lt;br /&gt;
  char *state;&lt;br /&gt;
  uint pc[10];&lt;br /&gt;
  &lt;br /&gt;
  for(p = ptable.proc; p &amp;lt; &amp;amp;ptable.proc[NPROC]; p++){&lt;br /&gt;
    if(p-&amp;gt;state == UNUSED)&lt;br /&gt;
      continue;&lt;br /&gt;
    if(p-&amp;gt;state &amp;gt;= 0 &amp;amp;&amp;amp; p-&amp;gt;state &amp;lt; NELEM(states) &amp;amp;&amp;amp; states[p-&amp;gt;state])&lt;br /&gt;
      state = states[p-&amp;gt;state];&lt;br /&gt;
    else&lt;br /&gt;
      state = &amp;quot;???&amp;quot;;&lt;br /&gt;
    cprintf(&amp;quot;%d %s %s&amp;quot;, p-&amp;gt;pid, state, p-&amp;gt;name);&lt;br /&gt;
    if(p-&amp;gt;state == SLEEPING){&lt;br /&gt;
      getcallerpcs((uint*)p-&amp;gt;context-&amp;gt;ebp+2, pc);&lt;br /&gt;
      for(i=0; i&amp;lt;10 &amp;amp;&amp;amp; pc[i] != 0; i++)&lt;br /&gt;
        cprintf(&amp;quot; %p&amp;quot;, pc[i]);&lt;br /&gt;
    }&lt;br /&gt;
    cprintf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Análisis =&lt;br /&gt;
&lt;br /&gt;
Aunque hay mucho código en '''''proc.c''''' el método que implementa el planificador es '''''sched''''' (Lineas 300 - 316). Para averiguar, por ejemplo, cuantos procesos se pueden ejecutar a la vez en xv6, debemos ir al archivo llamado '''''param.h'''''. Una vez dentro vemos que 64 en el máximo numero de procesos que se pueden ejecutar simultaneamente (definido por ''NPROC''). En este mismo archivo se pueden encontrar otras constantes necesarias para la ejecución del planificador.&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=P%C3%A1gina_Principal&amp;diff=3288</id>
		<title>Página Principal</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=P%C3%A1gina_Principal&amp;diff=3288"/>
				<updated>2016-01-16T13:58:10Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Anexo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bienvenido al wiki de la asignatura de Sistemas Operativos del departamento de Lenguajes y Sistemas Informáticos de la Universidad de Sevilla. ¡Contribuye!&lt;br /&gt;
&lt;br /&gt;
= Novedades y noticias =&lt;br /&gt;
&lt;br /&gt;
* [http://1984.lsi.us.es/~pablo/notas-ssoo-2015-2016.pdf Notas del primer, segundo, tercer y cuarto control de evaluación continua, incluida media] --[[Usuario:Pneira|Pneira]] ([[Usuario discusión:Pneira|discusión]]) 15:22 14 ene 2016 (CET)&lt;br /&gt;
* [http://1984.lsi.us.es/~pablo/ssoo-c3.pdf Notas del primer, segundo y tercer control de evaluación continua] --[[Usuario:Pneira|Pneira]] ([[Usuario discusión:Pneira|discusión]]) 08:42 7 ene 2016 (CET)&lt;br /&gt;
* [http://1984.lsi.us.es/~pablo/ssoo-c2.pdf Notas del primer y segundo control de evaluación continua] --[[Usuario:Pneira|Pneira]] ([[Usuario discusión:Pneira|discusión]]) 00:26 17 dic 2015 (CET)&lt;br /&gt;
&lt;br /&gt;
= Unidades didácticas =&lt;br /&gt;
&lt;br /&gt;
A continuación encontrarás las unidades didácticas que forman parte de la asignatura.&lt;br /&gt;
&lt;br /&gt;
== Introducción a los Sistemas Operativos ==&lt;br /&gt;
&lt;br /&gt;
* 1.1. [[Qué es un  Sistema operativo|Qué es un Sistema Operativo]]&lt;br /&gt;
* 1.2. [[Introducción histórica|Breve introducción histórica a los Sistemas Operativos]]&lt;br /&gt;
* 1.3. [[Tipos de Sistemas Operativos|Tipos de Sistemas Operativos]]&lt;br /&gt;
&lt;br /&gt;
== Fundamentos de Sistemas Operativos ==&lt;br /&gt;
&lt;br /&gt;
* 2.1. [[Organización básica de un ordenador]]&lt;br /&gt;
* 2.2. [[Modos de operación de la CPU|Modos de operación de la CPU]]&lt;br /&gt;
* 2.3. [[Interrupciones y excepciones|Interrupciones y excepciones]]&lt;br /&gt;
* 2.4. [[Arranque del sistema|Arranque del sistema]]&lt;br /&gt;
* 2.5. [[Componentes básicos de un sistema operativo|Componentes básicos de un sistema operativo]]&lt;br /&gt;
* 2.6. [[Conceptos básicos|Conceptos básicos]]&lt;br /&gt;
* 2.7. [[Llamadas al sistema|Llamadas al sistema]]&lt;br /&gt;
* 2.8. [[Ejercicios fundamentos Sistemas Operativos|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Modelos de diseño de Sistemas Operativos ==&lt;br /&gt;
&lt;br /&gt;
* 3.1. [[Modelos de Diseño de Sistemas Operativos|Modelos de diseño de sistemas operativos]]&lt;br /&gt;
* 3.2. [[Virtualización]]&lt;br /&gt;
* 3.3. [[Ejercicios 3|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Procesos ==&lt;br /&gt;
* 4.1. [[Multiprogramación|La multiprogramación]]&lt;br /&gt;
* 4.2. [[Estados de los procesos|Estados de los procesos]]&lt;br /&gt;
* 4.3. [[Planificador de procesos|El planificador de procesos]]&lt;br /&gt;
* 4.4. [[Comportamiento de los procesos|El comportamiento de los procesos según el planificador]]&lt;br /&gt;
* 4.5. [[Bloque de control de procesos|El bloque de control del proceso]]&lt;br /&gt;
* 4.6. [[Conmutación de procesos|La conmutación de procesos]]&lt;br /&gt;
* 4.7. [[Hilos|Hilos]]&lt;br /&gt;
* 4.8. [[Ejercicios Procesos|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Planificación de Procesos ==&lt;br /&gt;
* 5.1 [[Planificación de procesos|La planificación de procesos]]&lt;br /&gt;
* 5.2 [[Índices de evaluación|Índices de evaluación de la planificación de procesos]]&lt;br /&gt;
* 5.3 [[Criterios de planificación|Criterios de planificación]]&lt;br /&gt;
* 5.4 [[Planificadores de sistemas operativos existentes|Planificadores de sistemas operativos existentes]]&lt;br /&gt;
* 5.5 [[Planificación de procesos de tiempo real|La planificación de procesos de tiempo real]]&lt;br /&gt;
* 5.6 [[Planificación en sistemas multiprocesadores|La planificación de procesos en sistemas multiprocesadores]]&lt;br /&gt;
* 5.7 [[Ejercicios otros aspectos de la planificación|Ejercicios]]&lt;br /&gt;
* 5.8 [[Ejercicios planificación de procesos|Ejercicios]]&lt;br /&gt;
* 5.9 [[Ejercicios_simples_de_planificación_de_procesos|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Concurrencia de procesos ==&lt;br /&gt;
&lt;br /&gt;
* 6.1 [[Concurrencia de procesos|Concurrencia de procesos]]&lt;br /&gt;
* 6.2 [[Mecanismos de sincronización|Control optimista y pesimista de la concurrencia]]&lt;br /&gt;
* 6.3 [[Cerrojos|Cerrojos]]&lt;br /&gt;
* 6.4 [[Ejercicio de concurrencia de procesos|Ejercicios]]&lt;br /&gt;
* 6.5 [[Semáforos|Semáforos]]&lt;br /&gt;
* 6.6 [[Monitores|Monitores]]&lt;br /&gt;
* 6.7 [[Mensajería|Mensajería]]&lt;br /&gt;
* 6.8 [[Ejercicios sincronización y comunicación|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Interbloqueo ==&lt;br /&gt;
&lt;br /&gt;
* 7.1 [[Definición de interbloqueo|Definición]]&lt;br /&gt;
* 7.2 [[Condiciones para el interbloqueo y estrategias de resolución|Modelado y Estrategias]]&lt;br /&gt;
* 7.3 [[Algoritmo para averiguar interbloqueo|Algoritmo del banquero]]&lt;br /&gt;
* 7.4 [[Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Administración de memoria ==&lt;br /&gt;
&lt;br /&gt;
* 8.1 [[Introducción|Introducción]]&lt;br /&gt;
* 8.2 [[SO multiprogramables con particiones variables|SO multiprogramables con particiones variables]]&lt;br /&gt;
* 8.3 [[Segmentación|Segmentación]]&lt;br /&gt;
* 8.4 [[Paginación|Paginación]]&lt;br /&gt;
* 8.5 [[Sistema combinado|Sistema combinado]]&lt;br /&gt;
* 8.6 [[Ejercicios administración de memoria contigua|Ejercicios (Administración de memoria contigua)]]&lt;br /&gt;
* 8.7 [[Ejemplo de segmentación, paginación y combinado|Ejercicios (Segmentación, paginación y sistemas combinados)]]&lt;br /&gt;
&lt;br /&gt;
== Memoria virtual ==&lt;br /&gt;
&lt;br /&gt;
* 9.1 [[Memoria Virtual|Introducción]]&lt;br /&gt;
* 9.2 [[Criterios de reemplazo|Criterios de reemplazo]]&lt;br /&gt;
* 9.3 [[Memoria virtual con multiprogramacion|Otros aspectos relacionados con la memoria virtual]]&lt;br /&gt;
* 9.4 [[Ejercicios memoria virtual|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Entrada/Salida ==&lt;br /&gt;
&lt;br /&gt;
* 10.1 [[EstructuraES|Estructura dispositivo E/S]]&lt;br /&gt;
* 10.2 [[GestionES|Modos de gestionar dispositivos E/S]]&lt;br /&gt;
* 10.3 [[Diseño modular E/S|Diseño modular E/S]]&lt;br /&gt;
* 10.4 [[Ejercicios de Entrada/Salida|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Gestión L/E ==&lt;br /&gt;
&lt;br /&gt;
* 11.1 [[Discos Magnéticos|Discos Magnéticos]]&lt;br /&gt;
* 11.2 [[Mejoras de tiempos de desplazamiento|Mejoras de tiempos de desplazamiento]]&lt;br /&gt;
* 11.3 [[Mejoras en la demora de rotación|Mejoras en la demora de rotación]]&lt;br /&gt;
* 11.4 [[Tipos de errores en discos magnéticos|Tipos de errores en discos magnéticos]]&lt;br /&gt;
* 11.5 [[Ejercicios Gestión L/E|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Administración de archivos ==&lt;br /&gt;
&lt;br /&gt;
* 12.1 [[Introducción en la administración de archivos|Introducción en la administración de archivos]]&lt;br /&gt;
* 12.2 [[FAT|FAT]]&lt;br /&gt;
* 12.3 [[EXT2 |EXT2]]&lt;br /&gt;
* 12.4 [[Ejercicios Administración Ficheros|Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
== Anexo ==&lt;br /&gt;
&lt;br /&gt;
Esta sección contiene información interesante pero que no pertenece al temario de la asignatura.&lt;br /&gt;
&lt;br /&gt;
* Todo lo que siempre has querido saber sobre el protocolo SSH está [[SSH|aquí]].&lt;br /&gt;
* Instrucciones para emular BATHOS usando QEMU [[bathos_QEMU|aquí]].&lt;br /&gt;
* Instrucciones para emular XV6 usando QEMU [[xv6|aquí]].&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3287</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3287"/>
				<updated>2016-01-16T13:55:53Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Enlaces de interés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas: &lt;br /&gt;
&lt;br /&gt;
-Por terminal&lt;br /&gt;
&lt;br /&gt;
-Por un gestor de paquetes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Instalacion de QEMU por terminal:'''&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Captura_instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Por paquetes:'''&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, hacer doble click y posteriormente pulsar en &amp;quot;aplicar&amp;quot; que se encuentra en el menú de la parte superior. Una vez termine la instalación ya tendrás QEMU instalado.  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público. Ejecuntando el siguiente comando en terminal, descargaremos los archivos necesarios para la instalación de xv6: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://michaelee@bitbucket.ort/michaelee/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_clonacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
&lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_compilacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Una vez dentro escribimos '''''make''''', con este comando compilaremos el codigo clonado anteriormente. Una vez que haya terminado la compilación ejecutaremos el comando '''''make qemu-nox'''''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_inicializacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
Proximamente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;br /&gt;
* '''Video Explicativo de la Instalación'''&lt;br /&gt;
https://vimeo.com/69135539&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3286</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3286"/>
				<updated>2016-01-16T13:54:26Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Descarga e instalacion de XV6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas: &lt;br /&gt;
&lt;br /&gt;
-Por terminal&lt;br /&gt;
&lt;br /&gt;
-Por un gestor de paquetes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Instalacion de QEMU por terminal:'''&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Captura_instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Por paquetes:'''&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, hacer doble click y posteriormente pulsar en &amp;quot;aplicar&amp;quot; que se encuentra en el menú de la parte superior. Una vez termine la instalación ya tendrás QEMU instalado.  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público. Ejecuntando el siguiente comando en terminal, descargaremos los archivos necesarios para la instalación de xv6: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://michaelee@bitbucket.ort/michaelee/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_clonacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
&lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_compilacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Una vez dentro escribimos '''''make''''', con este comando compilaremos el codigo clonado anteriormente. Una vez que haya terminado la compilación ejecutaremos el comando '''''make qemu-nox'''''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_inicializacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
Proximamente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3285</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3285"/>
				<updated>2016-01-16T13:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Descarga e instalacion de XV6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas: &lt;br /&gt;
&lt;br /&gt;
-Por terminal&lt;br /&gt;
&lt;br /&gt;
-Por un gestor de paquetes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Instalacion de QEMU por terminal:'''&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Captura_instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Por paquetes:'''&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, hacer doble click y posteriormente pulsar en &amp;quot;aplicar&amp;quot; que se encuentra en el menú de la parte superior. Una vez termine la instalación ya tendrás QEMU instalado.  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público. Ejecuntando el siguiente comando en terminal, descargaremos los archivos necesarios para la instalación de xv6: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://github.com/guilleiguaran/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_clonacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
&lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_compilacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Una vez dentro escribimos '''''make''''', con este comando compilaremos el codigo clonado anteriormente. Una vez que haya terminado la compilación ejecutaremos el comando '''''make qemu-nox'''''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_inicializacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
Proximamente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Captura_inicializacion_xv6.png&amp;diff=3284</id>
		<title>Archivo:Captura inicializacion xv6.png</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Captura_inicializacion_xv6.png&amp;diff=3284"/>
				<updated>2016-01-16T13:49:46Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3283</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3283"/>
				<updated>2016-01-16T13:31:47Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Descarga e instalacion de XV6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas: &lt;br /&gt;
&lt;br /&gt;
-Por terminal&lt;br /&gt;
&lt;br /&gt;
-Por un gestor de paquetes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Instalacion de QEMU por terminal:'''&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Captura_instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Por paquetes:'''&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, hacer doble click y posteriormente pulsar en &amp;quot;aplicar&amp;quot; que se encuentra en el menú de la parte superior. Una vez termine la instalación ya tendrás QEMU instalado.  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público. Ejecuntando el siguiente comando en terminal, descargaremos los archivos necesarios para la instalación de xv6: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://github.com/guilleiguaran/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_clonacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
&lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:captura_compilacion_xv6.png]]&lt;br /&gt;
&lt;br /&gt;
Una vez dentro escribimos '''''make''''', con este comando compilaremos el codigo clonado anteriormente. Una vez que haya terminado la compilación ejecutaremos el comando '''''make qemu'''''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
Si no consigues con estas instrucciones que te funcione hay una gran cantidad de videos en YouTube y Vimeo que te enseñan a hacerlo.&lt;br /&gt;
&lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
Proximamente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Captura_compilacion_xv6.png&amp;diff=3282</id>
		<title>Archivo:Captura compilacion xv6.png</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Captura_compilacion_xv6.png&amp;diff=3282"/>
				<updated>2016-01-16T12:37:29Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Captura_clonacion_xv6.png&amp;diff=3281</id>
		<title>Archivo:Captura clonacion xv6.png</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Captura_clonacion_xv6.png&amp;diff=3281"/>
				<updated>2016-01-16T12:31:13Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3280</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3280"/>
				<updated>2016-01-16T12:21:26Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Instalación de QEMU en Linux Ubuntu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas: &lt;br /&gt;
&lt;br /&gt;
-Por terminal&lt;br /&gt;
&lt;br /&gt;
-Por un gestor de paquetes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Instalacion de QEMU por terminal:'''&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Captura_instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Por paquetes:'''&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, hacer doble click y posteriormente pulsar en &amp;quot;aplicar&amp;quot; que se encuentra en el menú de la parte superior. Una vez termine la instalación ya tendrás QEMU instalado.  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público, para ello hay que escribir esto en el terminal: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://github.com/guilleiguaran/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
Una vez dentro escribimos ''make'' y cuando termine de ejecutarse escribimos ''make qemu''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
Si no consigues con estas instrucciones que te funcione hay una gran cantidad de videos en YouTube y Vimeo que te enseñan a hacerlo.&lt;br /&gt;
 &lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
Proximamente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Captura_instalacion_qemu.png&amp;diff=3279</id>
		<title>Archivo:Captura instalacion qemu.png</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Archivo:Captura_instalacion_qemu.png&amp;diff=3279"/>
				<updated>2016-01-16T12:16:24Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3278</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3278"/>
				<updated>2016-01-16T11:59:26Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Instalación de QEMU en Linux Ubuntu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas: &lt;br /&gt;
&lt;br /&gt;
-Por terminal&lt;br /&gt;
-Por un gestor de paquetes. &lt;br /&gt;
&lt;br /&gt;
Instalacion de QEMU por terminal:&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por paquetes:&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, darle doble click y clickar en &amp;quot;aplicar&amp;quot; en el menú de arriba. Una vez termine la instalación ya tendrás QEMU en tu ordenador  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público, para ello hay que escribir esto en el terminal: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://github.com/guilleiguaran/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
Una vez dentro escribimos ''make'' y cuando termine de ejecutarse escribimos ''make qemu''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
Si no consigues con estas instrucciones que te funcione hay una gran cantidad de videos en YouTube y Vimeo que te enseñan a hacerlo.&lt;br /&gt;
 &lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
Proximamente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3277</id>
		<title>Xv6</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Xv6&amp;diff=3277"/>
				<updated>2016-01-16T11:52:26Z</updated>
		
		<summary type="html">&lt;p&gt;Danhidsan: /* Introducción a XV6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción a XV6 =&lt;br /&gt;
&lt;br /&gt;
XV6 es un sistema operativo creado por el [http://web.mit.edu/ MIT] (Massachusetts Institute of Technology) con motivos educacionales y desarrollado en el 2006.  &lt;br /&gt;
Este sistema operativo está basado en la versión 6 de UNIX y es una reimplementación de éste para la arquitectura de procesadores intel x86. Se trata de un sistema operativo monolítico escrito en el lenguaje de programación C. Además su interfaz de usuario por defecto es una interfaz de lineas de comando. &lt;br /&gt;
&lt;br /&gt;
En los siguientes pasos aprenderemos a descargarlo e instalarlo y diferenciaremos las partes mas básicas de un SO estudiadas en teoría en el código de xv6.&lt;br /&gt;
&lt;br /&gt;
= Instalación de QEMU en Linux Ubuntu =&lt;br /&gt;
&lt;br /&gt;
Para instalar xv6 primero necesitaremos instalar [http://wiki.qemu.org/Main_Page QEMU], un emulador de código abierto capaz de emular nuestro sistema operativo. Podemos instalar QEMU de diferentes formas pero las mas sencillas son por terminal o por algun gestor de paquetes.&lt;br /&gt;
&lt;br /&gt;
Por terminal:&lt;br /&gt;
&lt;br /&gt;
En primer lugar abre un terminal y ejecuta el comando:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install qemu qemu-kvm libvirt-bin'''''&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Instalacion_qemu.png]]&lt;br /&gt;
&lt;br /&gt;
Introduce tu contraseña y el terminal te preguntará si deseas continuar con la&lt;br /&gt;
instalación, podrás ver los paquetes que se instalarán y el espacio necesario para la&lt;br /&gt;
instalación. Tras estos pasos ya habrás instalado QEMU en tu equipo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por paquetes:&lt;br /&gt;
&lt;br /&gt;
Para empezar tienes que tener el gestor de paquetes Synaptic instalado (también sirven otros, pero este es muy bueno)&lt;br /&gt;
Una vez instalado Synaptic ábrelo y el buscar introduce &amp;quot;QEMU&amp;quot;. Cuando el programa termine de buscar tienes que encontrar el paquete que se llama qemu-kvm, darle doble click y clickar en &amp;quot;aplicar&amp;quot; en el menú de arriba. Una vez termine la instalación ya tendrás QEMU en tu ordenador  &lt;br /&gt;
&lt;br /&gt;
[[Archivo:Qemu_synaptic.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Descarga e instalacion de XV6 =&lt;br /&gt;
Ahora que ya tenemos QEMU instalado podemos empezar a descargar xv6. &lt;br /&gt;
&lt;br /&gt;
Para descargarlo es necesario tener '''''git''''' instalado.&lt;br /&gt;
Para ello introduce esto en el terminal:&lt;br /&gt;
&lt;br /&gt;
'''''sudo apt-get install git'''''&lt;br /&gt;
&lt;br /&gt;
Una vez instalado GIT descargaremos el sistema operativo del repositorio público, para ello hay que escribir esto en el terminal: &lt;br /&gt;
&lt;br /&gt;
'''''git clone https://github.com/guilleiguaran/xv6.git'''''&lt;br /&gt;
&lt;br /&gt;
Aparecerá en tu carpeta personal una nueva carpeta con el código de xv6.&lt;br /&gt;
Ya tenemos el código de xv6, ahora toca emularlo. &lt;br /&gt;
Navegamos con el terminal hasta la carpeta recientemente creada.&lt;br /&gt;
Una vez dentro escribimos ''make'' y cuando termine de ejecutarse escribimos ''make qemu''. Se abrirá una nueva pantalla, lo que significa que ya tenemos xv6 emulado.&lt;br /&gt;
&lt;br /&gt;
Si no consigues con estas instrucciones que te funcione hay una gran cantidad de videos en YouTube y Vimeo que te enseñan a hacerlo.&lt;br /&gt;
 &lt;br /&gt;
= Analizando XV6 =&lt;br /&gt;
&lt;br /&gt;
Proximamente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enlaces de interés =&lt;br /&gt;
* '''Página oficial de QEMU'''&lt;br /&gt;
http://wiki.qemu.org/Main_Page&lt;br /&gt;
* '''Wiki de QEMU'''&lt;br /&gt;
https://en.wikibooks.org/wiki/QEMU&lt;/div&gt;</summary>
		<author><name>Danhidsan</name></author>	</entry>

	</feed>