<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?action=history&amp;feed=atom&amp;title=Driver_xv6</id>
		<title>Driver xv6 - Historial de revisiones</title>
		<link rel="self" type="application/atom+xml" href="https://1984.lsi.us.es/wiki-ssoo/index.php?action=history&amp;feed=atom&amp;title=Driver_xv6"/>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Driver_xv6&amp;action=history"/>
		<updated>2026-05-17T10:29:15Z</updated>
		<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Driver_xv6&amp;diff=3297&amp;oldid=prev</id>
		<title>Danhidsan en 09:37 22 ene 2016</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Driver_xv6&amp;diff=3297&amp;oldid=prev"/>
				<updated>2016-01-22T09:37:17Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='es'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revisión del 09:37 22 ene 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Línea 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&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;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&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;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&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;del class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&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;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;while, del que no se sale mientras el bus IDE no reclama la atención del sistema.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;''''&lt;/ins&gt;while&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;''''&lt;/ins&gt;, del que no se sale mientras el bus IDE no reclama la atención del sistema&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&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;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&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&amp;oldid=prev</id>
		<title>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...»</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Driver_xv6&amp;diff=3295&amp;oldid=prev"/>
				<updated>2016-01-21T21:42:00Z</updated>
		
		<summary type="html">&lt;p&gt;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;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&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>

	</feed>