Obligatorio 1

download Obligatorio 1

of 8

Transcript of Obligatorio 1

  • 8/17/2019 Obligatorio 1

    1/8

    Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura deComputadores 2

    2008

    Arquitectura deComputadores 2

    aboratorio !

    "ocumentaci#n dea $oluci#n Implementada

    Integrantes C.I.

    "u%rec&ou asca' (rnesto )*+0,*-20.-Almeida Rodrígue/' Alberto (mmanuel )* 2 *20).0Fune/ 1utierre/' uan (rnesto *3-+*),3.)

    Informe Obligatorio 1. Pagina 1 de 8

  • 8/17/2019 Obligatorio 1

    2/8

    Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura deComputadores 2

    2008

    Introducción1.1 Introducción

    El propósito de este documento es brindar una descripción general del Diseño

    de la solución implementada para resolver el problema planteado en el primer

    laboratorio de Arquitectura de Computadores 2.

    1.2 Estructura del documento

    El documento esta dividido en dos partes, la introducción y la descripción de la

    solución. Esta ltima esta subdividida en dos partes, que son las partes A y !

    del obligatorio.

    2 Descripción de la "olución Implementada

    2.1 #arte A$a solución de la parte A del obligatorio %ue resuelta en base a la re%erencia &

    'ttp())***.osdever.net)tutorials)brunmar)tutorial+ &.p'p brindada por los

    pro%esores del curso en la letra del mismo. De todas maneras la solución es

    e-plicada a continuación.

    2.1.1 !ootloader bootloader.asm/El bootloader tiene como %uncion principal cargar desde la imagen de dis0ett los sectores

    correspondientes al 0ernel y pasar a modo protegido para luego ceder el control a la rutina main

    de dic'o 0ernel. Esta parte muestra un pseudocódigo de nuestra solución. $os comentarios

    indican lo que se debe 'acer en el código real.

    Pseudocódigo:

    Informe Obligatorio 1. Pagina 2 de 8

    http://www.osdever.net/tutorials/brunmar/tutorial_03.phphttp://www.osdever.net/tutorials/brunmar/tutorial_03.php

  • 8/17/2019 Obligatorio 1

    3/8

    Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura deComputadores 2

    2008

    Usar instrucciones de 16 bits; // modo real [BITS 16]

    Poner rutina en la dir 0 !"00; // #onde la BI$S comien%a a correr al comen%ar &e'etir

    &eset dis(ette; // Se utili%a la int 0 1) con el reg *+ en 0

    +asta ,ue no -a.a error; // Si reg * 0 -ubo error

    &e'etir

    seteo 'ar2metros; // indico cuantos sectores se 3an a cargar . donde

    cargar sectores; // se utili%a la misma int 0 1) con el reg *+ en 04-

    +asta ,ue no -a.a error; // Si reg * 0 -ubo error

    #es-abilitar interru'ciones; //cli

    "argar gdt; //lgdt

    5odo 'rotegido; // el bit 0 de "&0 en 1 . un m' Usar instrucciones de )4 bits; // modo real [BITS )4]

    #S7SS 710-;

    8SP7 90000-; // to'e del stac(

    Saltar a e ecutar main ; // m' 0

  • 8/17/2019 Obligatorio 1

    4/8

    Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura deComputadores 2

    2008

    en que posición se encuentra el cursor como para posicionarlo, se debe especi%icar primero a

    que registro indicando el :ndice 1; o 13/ se va a modi%icar o leer y luego se lo lee o escribe.

    Esto se 'ace mediante los puertos -&D; y -&D3 respectivamente. El registro :ndice 1; es el

    byte mas signi%icativo de la posición del cursor y el 13 el menos signi%icativo.

  • 8/17/2019 Obligatorio 1

    5/8

    Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura deComputadores 2

    2008

    2.2 #arte !En esta parte se utili ó el bootloader de la parte A con muc'os agregados para soportar las4 5

    interrupciónes, as: como cumplir con el resto de los requerimientos. =ambi@n %ueron utili adas

    las bibliotecas antes mencionadas. En esta sección se comentar> acerca de los agregados del

    bootloader y la %orma en que se solucionó el problema de mane5ar el cronómetro con dos

    interrupciones.

    2.2.1 bootloader.asm

    Estructura(

    =enemos tres ="" s =as0 "tate "egment/ uno para el main, uno para la rutina de atención a la6

    interrupción del timer y otro para la rutina del teclado. El ="" es el lugar donde la C# salva el

    conte-to de la tarea que esta e5ecutando para darle la C# a otraB entre otras cosas guarda el

    I# instrucción pointer/ el D", C", "" y el registro de %lags. Cada ="" es accesible mediante un

    ="" descriptor en la D= eneral Descriptor =able/.7 6

    #ara el main se de%inió un segmento de código que ocupa toda la memoria y uno de datos que

    tambi@n comien a en la posición y se e-tiende 'asta la -

  • 8/17/2019 Obligatorio 1

    6/8

    Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura deComputadores 2

    2008

    #seudocódigo(

    $eer sectores desde dis0etteB ))Como en la parteA

    Des'abilitar interrupcionesB ))cli

    $evantar gdtB )) lgdt

    $evantar idtB ))lidt

    #asar a modo protegidoB ))#arte A

    Iniciali ación de ="" del timerB

    Iniciali ación de ="" del tecladoB

    =F 7 indice en la gdt del ="" del main ))ltr

    #ermitir interrumpir al timer y el tecladoB )) out -21, %c' 5 5

    "altar a e5ecutar main /B ))5mp 4'(1 '

    ))Creación de las tablas y la %irma de que es un disco booteable

    #IC 423 (

    Este #IC es a trav@s del cual se indica qu@ interrupciónes de 'ard*are de las que son

    enmascarables/ pueden interrumpir. $a C# puede comunicarse con este #IC mediante los

    puertos -21 y -2 . El puerto -21 es un registro de 4 bit en donde se indica con un cero si la

    interrupción correspondiente a determinado bit esta 'abilitada. En nuestro caso se manda a este

    puerto el valor -

  • 8/17/2019 Obligatorio 1

    7/8

    Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura deComputadores 2

    2008

    • El timer queda entre la dirección 1 ' y 13 ' porque esta rutina va despu@s del

    main / en memoria y adem>s es lo su%iciente mente corto el código para no pasarse

    mas all> de la dirección 13 '.

    • $as variables globales en la dirección 13 ' son especi%icadas en el lin0er con la

    directiva .data, en ambos casos.

    • $a base del stac0 del teclado y el timer %ueron considerados en sus respectivos =""

    y en el caso del main 'aciendo un mov esp, G '4 5• $a rutina de atención al teclado quedo en la dirección 2 ' por que su segmento

    de código %ue asignado en esa posición en el =""/. H no se pasa de la dirección

    23 1' porque al igual que el timer es un código reducido.

    2.2.2 Futinas de interrupción y mainEl main de la parte ! es igual de simple que el anterior. $a nica di%erencia con el anterior es4 5

    que este 'abilita las interrupciones.

    Decidimos que el timer sea el nico encargado de imprimir en pantalla el cronometro. El teclado

    nicamente de5a en una variable global la tecla presionada su scancode correspondiente a la4 5

    ba5ada de la tecla/ cuando esta es una de las teclas validas. En otro caso no modi%ica la variable

    global de5>ndola sin actuali ar para que el timer no 'aga nada al respecto. En el caso de las

    %lec'as se 'ace una lectura en dos pasos ya que la tecla presionada se lee del puerto -9 con

    lectura de un byte mientras que el código de las %lec'as es de dos bytes. De leerse solo la

    segunda ve que interrumpe el teclado por una de las %lec'as pudiese con%undirse el 4 y el 2 7 6 7 6

    del teclado num@rico con la %lec'a de arriba y aba5o respectivamente. Con esta lectura en dos

    pasos usando la bandera %lec'a / logramos respetar que toda tecla que no sea una de las4 5

    teclas v>lidas no 'aga nada.

    El timer en cada interrupción se %i5a si tiene que actuali ar el cronometro porque se presiono una

    tecla o porque se supero los 14 tics que indican que se tenga que incrementar en uno la

    cantidad de segundos.

    Informe Obligatorio 1. Pagina 7 de 8

  • 8/17/2019 Obligatorio 1

    8/8

    Universidad de la República | Facultad de Ingeniería | Inco | Arquitectura deComputadores 2

    2008

    #seudocódigo del teclado(Char tecla_oprimida = 0;void teclado()

    char aux= in(0x60);inicio:

    Si (aux es una tecla valida) Entoncestecla_oprimida = aux;

    out(0x20,0x20);iretgoto inicio;

    fin_teclado

    #seudocódigo del timer(Char tecla_oprimida = 0;Int tic = 0;Boolean pausa = falsevoid timer()

    inicio:Si (tecla_oprimida0)

    Depende del casoCaso ‘P’

    pausa = true;Caso ‘S’

    pausa = false;Caso Flecha_arriba

    Incrementar cronometro;

    Caso Flecha_abajoDecrementar cronometro;Fin_dependeTecla_oprimida = 0;

    Fin_si

    Si (not pausa) tic++;

    Si (tic = 18)Incrementar cronometro;tic:=0

    Fin_si

    Si (hubo cambios) Borra e imprime nuevo cronometro

    out(0x20,0x20);iretgoto inicio;

    fin_timer

    Informe Obligatorio 1. Pagina 8 de 8