Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1.1 Introducción.
Cuando se describe un computador, frecuentemente se distingue entre arquitectura y organización.
Aunque es difícil dar una definición precisa para estos términos, existe un consenso sobre las áreas
generales cubiertas por cada uno de ellos.
Para poner un ejemplo, una cuestión de diseño arquitectónico es si el computador tendrá la instrucción
de multiplicar. Una cuestión de organización es si esa instrucción será implementada por una unidad
especializada en multiplicar o por un mecanismo que haga un uso iterativo de la unidad de suma del
sistema. La decisión de organización puede estar basada en la frecuencia prevista del uso de la
instrucción de multiplicar la velocidad relativa de las dos aproximaciones, y el coste y el tamaño físico
de una unidad especializada en multiplicar.
Históricamente, y aún hoy día, la distinción entre arquitectura y organización ha sido importante.
Muchos fabricantes de computadores ofrecen una familia de modelos, todos con la misma
arquitectura, pero con diferencias en la organización. Consecuentemente los diferentes modelos de la
familia tienen precios y prestaciones distintas. Más aún, una arquitectura puede sobrevivir muchos
años, pero su organización cambia con la evolución de tecnología. Un ejemplo destacado de ambos
fenómenos es la arquitectura IBM Sistema/370. Esta arquitectura apareció por primera vez en 1970 e
incluía varios modelos. Un cliente con necesidades modestas podía comprar un modelo más barato y
lento, y, si la demanda se incrementaba, cambiarse más tarde a un modelo más caro y rápido sin tener
que abandonar el software que ya había sido desarrollado. A través de los años IBM ha introducido
muchos modelos nuevos con tecnología mejorada para reemplazar a modelos más viejos, ofreciendo
al consumidor mayor velocidad, precios más bajos o ambos a la vez. Estos modelos más nuevos
conservaban la misma arquitectura para proteger así la inversión en software del consumidor. Podemos
destacar que la arquitectura del Sistema/370 con unas pocas mejoras ha sobrevivido hasta hoy día
como la arquitectura de la línea de grandes productos de computación IBM.
BUS
Un bus es un camino de comunicación entre dos o más dispositivos. Una característica clave de un bus
es que se trata de un medio de transmisión compartido. Al bus se conectan varios dispositivos, y
cualquier señal transmitida por uno de esos dispositivos está disponible para que los otros dispositivos
conectados al bus puedan acceder a ella. Si dos dispositivos transmiten durante el mismo periodo de
tiempo, sus señales pueden solaparse y distorsionarse. Consiguientemente, solo un dispositivo puede
transmitir con éxito en un momento dado.
Usualmente, un bus está constituido por varios caminos de comunicación, o líneas. Cada línea es capaz
de transmitir señales binarias representadas por 1 y por 0. En un intervalo de tiempo, se puede
transmitir una secuencia de dígitos binarios a través de una única línea. Se pueden utilizar varias líneas
del bus para transmitir dígitos binarios simultáneamente (en paralelo). Por ejemplo, un dato de 8 bits
puede transmitirse mediante ocho líneas del bus.
Los computadores poseen diferentes tipos de buses que proporcionan comunicación entre sus
componentes a distintos niveles dentro de la jerarquía del sistema. El bus que conecta los componentes
principales del computador (procesador, memoria, E/S) se denomina bus del sistema (system bus).
Las estructuras de interconexión más comunes dentro de un computador están basadas en el uso de
uno o más buses del sistema.
Las líneas de datos proporcionan un camino para transmitir datos entre los módulos del sistema. El
conjunto constituido por estas líneas se denomina bus de datos. El bus de datos puede incluir entre 32
y cientos de líneas, cuyo número se conoce como anchura del bus de datos. Puesto que cada línea solo
puede transportar un bit cada vez, el número de líneas determina cuántos bits se pueden transferir al
mismo tiempo. La anchura del bus es un factor clave a la hora de determinar las prestaciones del
conjunto del sistema. Por ejemplo, si el bus de datos tiene una anchura de ocho bits, y las instrucciones
son de 16 bits, entonces el procesador debe acceder al módulo de memoria dos veces por cada ciclo de
instrucción.
Las líneas de dirección se utilizan para designar la fuente o el destino del dato situado en el bus de datos.
Por ejemplo, si el procesador desea leer una palabra (8, 16 o 32 bits) de datos de la memoria, sitúa la
dirección de la palabra deseada en las líneas de direcciones. Claramente, la anchura del bus de
direcciones determina la máxima capacidad de memoria posible en el sistema. Además, las líneas de
direcciones generalmente se utilizan también para direccionar los puertos de E/S. Usualmente, los bits
de orden más alto se utilizan para seleccionar una posición de memoria o un puerto de E/S dentro de
un módulo. Por ejemplo, en un bus de 8 bits, la dirección 01111111 e inferiores harían referencia a
posiciones dentro de un módulo de memoria (el módulo 0) con 128 palabras de memoria, y las
direcciones 10000000 y superiores designarían dispositivos conectados a un módulo de E/S (módulo 1).
Las líneas de control se utilizan para controlar el acceso y el uso de las líneas de datos y de direcciones.
Puesto que las líneas de datos y de direcciones son compartidas por todos los componentes, debe
existir una forma de controlar su uso. Las señales de control transmiten tanto órdenes como
información de temporización entre los módulos del sistema. Las señales de temporización indican la
validez de los datos y las direcciones. Las señales de órdenes especifican las operaciones a realizar.
• Escritura en memoria (Memory write): hace que el dato del bus se escriba en la posición direccionada.
• Lectura de memoria (Memory read): hace que el dato de la posición direccionada se sitúe en el bus.
• Escritura de E/S (I/O write): hace que el dato del bus se transfiera a través del puerto de E/S
direccionado.
• Lectura de E/S (E/S read): hace que el dato del puerto de E/S direccionado se sitúe en el bus.
• Transferencia reconocida (Transfer ACK): indica que el dato se ha aceptado o se ha situado en el bus.
• Petición de bus (Bus request): indica que un módulo necesita disponer del control del bus.
• Cesión de bus (Bus grant): indica que se cede el control del bus a un módulo que lo había solicitado.
• Petición de interrupción (Interrupt request): indica si hay una interrupción pendiente.
• Interrupción reconocida (Interrupt ACK): Señala que la interrupción pendiente se ha aceptado.
• Reloj (clock): se utiliza para sincronizar las operaciones.
• Inicio (reset): pone los módulos conectados en su estado inicial.
El funcionamiento del bus se describe a continuación. Si un módulo desea enviar un dato a otro debe
hacer dos cosas: (1) obtener el uso del bus y (2) transferir el dato a través del bus. Si un módulo desea
pedir un dato a otro módulo, debe (1) obtener el uso del bus y (2) transferir la petición al otro módulo
mediante las líneas de control y dirección apropiadas. Después debe esperar a que el segundo módulo
envíe el dato.
Físicamente, el bus de sistema es de hecho un conjunto de conductores eléctricos paralelos. Estos
conductores son líneas de metal grabadas en una tarjeta (tarjeta de circuito impreso). El bus se extiende
a través de todos los componentes del sistema, cada uno de los cuales se conecta a algunas o a todas
las líneas del bus. Una disposición física muy común es el de dos columnas en este el bus consta de dos
columnas verticales de conductores. A lo largo de esas columnas, a intervalos regulares, hay puntos de
conexión en forma de ranuras (slots) dispuestas en sentido horizontal para sostener las tarjetas de
circuito impreso. Cada uno de los componentes principales del sistema ocupa una o varias tarjetas y se
conecta al bus a través de esas ranuras. El sistema completo se introduce dentro de un chasis. Esta
organización puede encontrarse todavía en alguno de los buses del computador. No obstante, los
sistemas actuales tienden a tener sus componentes principales en la misma tarjeta y los circuitos
integrados incluyen más elementos. Así, el bus que conecta el procesador y la memoria caché se integra
en el microprocesador junto con el procesador y la caché (on-chip), y el bus que conecta el procesador
con la memoria y otros componentes se incluye en la tarjeta (on-board).
Esta es la disposición más conveniente. Así se puede adquirir un computador pequeño y expandirlo
(ampliar memoria, módulos de E/S) más adelante añadiendo más tarjetas. Si un componente de
una tarjeta falla, la tarjeta puede quitarse y sustituirse fácilmente.
El bus es simplemente un canal de comunicación entre todas las unidades del sistema, donde cada una
está conectada. Un bus se compone en varias líneas o hilos (uno por bit) por el que circula un cierto
tipo de información. El bus a su vez se divide en tres tipos, según la información que circula por el
mismo:
Bus de datos: Se utiliza para transmitir datos entre los componentes de la computadora.
Bus de direcciones: Se utiliza para transmitir las direcciones de las posiciones de memoria y de los
dispositivos conectados.
Bus de control: Serie de líneas que sirven básicamente para indicar el tipo de información que viaja por
el bus de datos.
Arquitectura Interna
Desde la perspectiva de un programa en ejecución, la arquitectura interna de un procesador x86-64 se
puede dividir lógicamente en varias unidades distintas. Estos incluyen los registros de uso general, las
banderas de estado y control (registro RFLAGS), el puntero de instrucción (registro RIP), los registros
XMM y el control y estado de punto flotante (MXCSR). Por definición, un programa en ejecución utiliza
los registros de propósito general, el registro RFLAGS y el registro RIP. La utilización del programa de
los registros XMM, YMM, ZMM o MXCSR es opcional. La Figura ilustra la arquitectura interna de un
procesador x86-64.
Todos los procesadores compatibles con x86-64 admiten SSE2 e incluyen 16 registros XMM de 128 bits
que los programadores pueden usar para realizar cálculos escalares de coma flotante. Estos registros
también se pueden emplear para realizar operaciones SIMD utilizando enteros empaquetados o valores
de coma flotante empaquetados (tanto de precisión simple como de precisión doble). Aprenderá a
utilizar los registros XMM, el registro MXCSR y el conjunto de instrucciones AVX para realizar cálculos
de punto flotante.
Registros
El procesador utiliza el registro RSP para admitir operaciones relacionadas con la pila, como llamadas y
devoluciones de funciones. La pila en sí es simplemente un bloque contiguo de memoria que el sistema
operativo asigna a un proceso o subproceso. Los programas de aplicación también pueden usar la pila
para pasar argumentos de funciones y almacenar datos temporales. El registro RSP siempre apunta al
elemento superior de la pila. Las operaciones de inserción y extracción de pila se realizan utilizando
operandos de 64 bits de ancho. Esto significa que la ubicación de la pila en la memoria generalmente
se alinea con un límite de 8 bytes. Algunos entornos de tiempo de ejecución (p. ej., programas Visual
C++ de 64 bits que se ejecutan en Windows) alinean la memoria de la pila y el RSP en un límite de 16
bytes para evitar transferencias de memoria mal alineadas entre los registros XMM y los operandos de
128 bits de ancho almacenados en la pila.
Si bien es técnicamente posible utilizar el registro RSP como un registro de propósito general, dicho uso
no es práctico y se desaconseja enfáticamente. El registro RBP generalmente se usa como un puntero
base para acceder a los elementos de datos que se almacenan en la pila. RSP también se puede usar
como un puntero base para acceder a elementos de datos en la pila. Cuando no se emplea como
puntero base, los programas pueden usar RBP como un registro de propósito general.
Registros bandera
El registro RFLAGS contiene una serie de bits de estado (o banderas) que el procesador usa para indicar
los resultados de una operación aritmética, lógica o de comparación. También contiene una serie de
bits de control que utilizan principalmente los sistemas operativos. La tabla muestra la organización de
los bits en el registro RFLAGS.
Para los programas de aplicación, los bits más importantes en el registro RFLAGS son las siguientes
banderas de estado: bandera de acarreo (CF), bandera de desbordamiento (OF), bandera de paridad
(PF), bandera de signo (SF) y bandera cero (ZF). El procesador establece la bandera de acarreo para
indicar una condición de desbordamiento al realizar aritmética de enteros sin signo. También lo utilizan
algunas instrucciones de rotación y desplazamiento de registros. El indicador de desbordamiento indica
que el resultado de una operación de entero con signo es demasiado pequeño o grande. El procesador
establece el indicador de paridad para indicar si el byte menos significativo de una operación aritmética,
de comparación o lógica contiene un número par de 1 bits (algunos protocolos de comunicación utilizan
bits de paridad para detectar errores de transmisión). Los indicadores de signo y cero se establecen
mediante instrucciones aritméticas y lógicas para indicar un resultado negativo, cero o positivo.
El registro RFLAGS contiene un bit de control llamado bandera de dirección (DF). Un programa de
aplicación puede establecer o restablecer el indicador de dirección, que define la dirección de
incremento automático (0 = direcciones de menor a mayor, 1 = direcciones de mayor a menor) de los
registros RDI y RSI durante la ejecución de instrucciones de cadena. Los bits restantes en el registro
RFLAGS son utilizados exclusivamente por el sistema operativo para administrar interrupciones,
restringir operaciones de E/S, respaldar la depuración de programas y manejar operaciones virtuales.
Nunca deben ser modificados por un programa de aplicación. Los bits reservados tampoco deben
modificarse nunca, y nunca se deben hacer suposiciones con respecto al estado de cualquier bit
reservado.
Las instrucciones jmp (salto) y jcc (Saltar si se cumple la condición) también transfieren el control del
programa modificando el contenido del registro RIP. A diferencia de las instrucciones call y ret, todas
las instrucciones de salto x86-64 se ejecutan independientemente de la pila. El registro RIP también se
utiliza para el direccionamiento de memoria de operandos basados en desplazamiento. No es posible
que una tarea en ejecución acceda directamente al contenido del registro RIP.
Memoria principal
En la memoria principal se almacenan los programas que se deben ejecutar y sus datos, es la memoria
visible para el programador mediante su espacio de direcciones.
La memoria principal se implementa utilizando diferentes chips conectados a la placa principal del
computador y tiene una capacidad mucho más elevada que la memoria caché (del orden de Gbytes o
de Tbytes en supercomputadores).
Utiliza tecnología DRAM (Dynamic RAM), que es más lenta que la SRAM, pero con una capacidad de
integración mucho más elevada, hecho que permite obtener más capacidad en menos espacio.
La Figura describe el funcionamiento de una celda de memoria. Lo más común es que la celda tenga
tres terminales para transportar señales eléctricas. El terminal de selección, como su nombre indica,
selecciona la celda para que pueda realizarse una operación de escritura o de lectura. El terminal de
control indica si se trata de una lectura o de una escritura. Para la escritura, el tercer terminal
proporciona la señal que fija el estado de la celda a uno o a cero. En una lectura, el tercer terminal se
utiliza como salida del estado de la celda. Los detalles sobre estructura interna, funcionamiento y
temporización de la celda de memoria, dependen de la tecnología específica de circuito integrado. Para
nuestros propósitos, daremos por sentado que las celdas individuales pueden seleccionarse para
operaciones de lectura y de escritura.
1.4 Entrada/salida.
La E/S se constituye en la interfaz mediante el cual el computador interactúa con el exterior; permite
efectuar las operaciones de E/S a través de los periféricos y la memoria o los registros del procesador.
Con la finalidad de efectuar la gestión de las operaciones de E/S es necesario el hardware y el software.
La gestión del sistema de E/S de un computador se efectúa mediante el sistema operativo (SO);
“administrador de los recursos del sistema”. Las técnicas para controlar la E/S las utiliza el SO y el
programador cuando quieren acceder al periférico, pero en las máquinas actuales, a causa de la
complejidad de controlar y gestionar los periféricos, el acceso se lleva a cabo generalmente mediante
llamadas al SO, que es quien gestiona la transferencia. El conjunto de rutinas que permiten controlar
un determinar periférico es lo que denominamos habitualmente programas controladores o drivers y
cuando el SO quiere hacer una operación de E/S con un periférico llama a una de estas rutinas.
Los elementos principales que forman el sistema de E/S son los siguientes:
✓ Los periféricos.
✓ Los módulos de E/S.
✓ Los sistemas de interconexión externos.
✓ El mapa de memoria e instrucciones de E/S.
Los periféricos.
Los periféricos pueden ser:
– Dispositivos de entrada de datos: el teclado, el ratón, el escáner, los sensores de magnitudes
mecánicas o eléctricas, etc.
– Dispositivos de salida de datos: el monitor, la impresora, etc.
– Dispositivos de entrada y salida de datos (almacenamiento, comunicación): como los discos.
Para elegir un periférico y comunicarse con él se emplean los puertos de entrada-salida que en su
versión más simple se corresponden con un registro.
Para comunicarse con un periférico la CPU debe:
- Especificar la dirección: identificar el puerto de entrada-salida entre todos los que tenga
(normalmente tienen varios puertos de entrada salida)
- Indicar el sentido de la comunicación: especificar si se trata de una lectura o de una escritura.
- Enviar el dato: si se trata de una escritura
Debido a que un sistema operativo es grande y complejo, debe crearse pieza por pieza. Cada una de
estas piezas debe ser una parte bien delineada del sistema, con entradas, salidas y funciones
cuidadosamente definidas.
También podemos ver un sistema informático como compuesto por hardware, software y datos. El
sistema operativo proporciona los medios para el uso adecuado de estos recursos en el funcionamiento
del sistema informático. Un sistema operativo es similar a un gobierno. Como un gobierno, no realiza
ninguna función útil por sí mismo. Simplemente proporciona un entorno en el que otros programas
pueden realizar un trabajo útil.
Para que una computadora comience a funcionar, por ejemplo, cuando se enciende o se reinicia, debe
tener un programa inicial para ejecutarse. Este programa inicial, o programa de arranque, tiende a ser
simple. Por lo general, se almacena dentro del hardware de la computadora en la memoria de solo
lectura (ROM) o en la memoria de solo lectura programable y borrable eléctricamente (EEPROM),
conocida por el término general firmware. Inicializa todos los aspectos del sistema, desde los registros
de la CPU hasta los controladores de dispositivos y el contenido de la memoria. El programa de arranque
debe saber cómo cargar el sistema operativo y cómo comenzar a ejecutar ese sistema. Para lograr este
objetivo, el programa de arranque debe ubicar el núcleo del sistema operativo y cargarlo en la memoria.
Para que un programa se ejecute, debe asignarse a direcciones absolutas y cargarse en la memoria. A
medida que se ejecuta el programa, accede a las instrucciones del programa y a los datos de la memoria
generando estas direcciones absolutas. Eventualmente, el programa termina, su espacio de memoria
se declara disponible y el siguiente programa puede cargarse y ejecutarse.
Para mejorar tanto la utilización de la CPU como la velocidad de respuesta de la computadora a sus
usuarios, las computadoras de uso general deben mantener varios programas en la memoria, lo que
genera la necesidad de administrar la memoria. Se utilizan muchos esquemas de gestión de memoria
diferentes. Estos esquemas reflejan varios enfoques, y la efectividad de cualquier algoritmo dado
depende de la situación. Al seleccionar un esquema de administración de memoria para un sistema
específico, debemos tener en cuenta muchos factores, especialmente el diseño del hardware del
sistema. Cada algoritmo requiere su propio soporte de hardware.
Intercambio (Swapping)
Un proceso debe estar en memoria para ser ejecutado. Sin embargo, un proceso puede intercambiarse
temporalmente fuera de la memoria a un almacén de respaldo y luego traerse de vuelta a la memoria
para su ejecución continua. El intercambio hace posible que el espacio total de direcciones físicas de
todos los procesos exceda la memoria física real del sistema, aumentando así el grado de
multiprogramación en un sistema.
La memoria generalmente se divide en dos particiones: una para el sistema operativo residente y otra
para los procesos del usuario. Podemos colocar el sistema operativo en memoria baja o memoria alta.
El principal factor que afecta esta decisión es la ubicación del vector de interrupción. Dado que el vector
de interrupción a menudo tiene poca memoria, los programadores también suelen colocar el sistema
operativo en poca memoria. Por lo tanto, en este texto, solo analizamos la situación en la que el sistema
operativo reside con poca memoria. El desarrollo de la otra situación es similar.
Uno de los métodos más simples para asignar memoria es dividir la memoria en varias particiones de
tamaño fijo. Cada partición puede contener exactamente un proceso. Por lo tanto, el grado de
multiprogramación está limitado por el número de particiones. En este método de múltiples
particiones, cuando una partición está libre, se selecciona un proceso de la cola de entrada y se carga
en la partición libre. Cuando finaliza el proceso, la partición queda disponible para otro proceso. El
método que se describe a continuación es una generalización del esquema de partición fija (llamado
MVT); se utiliza principalmente en entornos por lotes. Muchas de las ideas presentadas aquí también
son aplicables a un entorno de tiempo compartido en el que se utiliza la segmentación pura para la
gestión de la memoria.
En el esquema de partición variable, el sistema operativo mantiene una tabla que indica qué partes de
la memoria están disponibles y cuáles están ocupadas. Inicialmente, toda la memoria está disponible
para los procesos del usuario y se considera un gran bloque de memoria disponible, un agujero.
Eventualmente, como verá, la memoria contiene un conjunto de agujeros de varios tamaños.
A medida que los procesos ingresan al sistema, se colocan en una cola de entrada. El sistema operativo
tiene en cuenta los requisitos de memoria de cada proceso y la cantidad de espacio de memoria
disponible para determinar a qué procesos se les asigna memoria. Cuando se asigna espacio a un
proceso, se carga en la memoria y luego puede competir por el tiempo de CPU. Cuando un proceso
finaliza, libera su memoria, que el sistema operativo puede llenar con otro proceso de la cola de
entrada.
Entonces, en cualquier momento tenemos una lista de tamaños de bloque disponibles y una cola de
entrada. El sistema operativo puede ordenar la cola de entrada de acuerdo con un algoritmo de
programación. La memoria se asigna a los procesos hasta que, finalmente, los requisitos de memoria
del siguiente proceso no se pueden satisfacer, es decir, ningún bloque de memoria disponible (o
agujero) es lo suficientemente grande para contener ese proceso. El sistema operativo puede esperar
hasta que haya un bloque lo suficientemente grande disponible, o puede saltarse la cola de entrada
para ver si se pueden cumplir los requisitos de memoria más pequeños de algún otro proceso.
Fragmentación
Tanto las estrategias de primer ajuste como las de mejor ajuste para la asignación de memoria sufren
de fragmentación externa. A medida que los procesos se cargan y eliminan de la memoria, el espacio
de memoria libre se divide en pequeños fragmentos. La fragmentación externa existe cuando hay
suficiente espacio de memoria total para satisfacer una solicitud, pero los espacios disponibles no son
contiguos: el almacenamiento se fragmenta en una gran cantidad de pequeños agujeros. Este problema
de fragmentación puede ser grave. En el peor de los casos, podríamos tener un bloque de memoria
libre (o desperdiciado) entre cada dos procesos. Si todas estas pequeñas piezas de memoria estuvieran
en un gran bloque libre, podríamos ejecutar varios procesos más.
Segmentación
La segmentación es un esquema de gestión de la memoria que admite esta visión de la memoria del
programador. Un espacio de direcciones lógicas es una colección de segmentos. Cada segmento tiene
un nombre y una longitud. Las direcciones especifican tanto el nombre del segmento como el
desplazamiento dentro del segmento. Por lo tanto, el programador especifica cada dirección por dos
cantidades: un nombre de segmento y un desplazamiento.
Paginación
La paginación es otro esquema de administración de memoria que ofrece esta ventaja. Sin embargo, la
paginación evita la fragmentación externa y la necesidad de compactación, mientras que la
segmentación no lo hace. También resuelve el problema considerable de colocar fragmentos de
memoria de diferentes tamaños en el almacén de respaldo. La mayoría de los esquemas de
administración de memoria utilizados antes de la introducción de la paginación tenían este problema.
El problema surge porque, cuando es necesario intercambiar fragmentos de código o datos que residen
en la memoria principal, se debe encontrar espacio en el almacén de respaldo. El almacén de respaldo
tiene los mismos problemas de fragmentación discutidos en relación con la memoria principal, pero el
acceso es mucho más lento, por lo que la compactación es imposible. Debido a sus ventajas sobre los
métodos anteriores, la paginación en sus diversas formas se utiliza en la mayoría de los sistemas
operativos, desde los de mainframe hasta los de teléfonos inteligentes. La paginación se implementa a
través de la cooperación entre el sistema operativo y el hardware de la computadora.
Paginación jerárquica
La mayoría de los sistemas informáticos modernos admiten un gran espacio de direcciones lógicas (232
a 264). En tal entorno, la propia tabla de páginas se vuelve excesivamente grande. Por ejemplo,
considere un sistema con un espacio de direcciones lógicas de 32 bits. Si el tamaño de página en dicho
sistema es de 4 KB (212), entonces una tabla de páginas puede constar de hasta 1 millón de entradas
(232/212). Suponiendo que cada entrada consta de 4 bytes, cada proceso puede necesitar hasta 4 MB de
espacio de direcciones físicas solo para la tabla de páginas. Claramente, no querríamos asignar la tabla
de páginas de forma contigua en la memoria principal. Una solución simple a este problema es dividir
la tabla de páginas en partes más pequeñas. Podemos lograr esta división de varias maneras.
Segmentación IA-32
La arquitectura IA-32 permite que un segmento tenga un tamaño de hasta 4 GB y la cantidad máxima
de segmentos por proceso es de 16 K. El espacio de direcciones lógicas de un proceso se divide en dos
particiones. La primera partición consta de hasta 8 K segmentos que son privados para ese proceso. La
segunda partición consta de hasta 8 K segmentos que se comparten entre todos los procesos. La
información sobre la primera partición se mantiene en la tabla de descriptores locales (LDT); la
información sobre la segunda partición se mantiene en la tabla de descriptores globales (GDT). Cada
entrada en LDT y GDT consiste en un descriptor de segmento de 8 bytes con información detallada
sobre un segmento en particular, incluida la ubicación base y el límite de ese segmento.
Paginación IA-32
La arquitectura IA-32 permite un tamaño de página de 4 KB o 4 MB. Para páginas de 4 KB, IA-32 utiliza
un esquema de paginación de dos niveles.
x86-64
Intel ha tenido una historia interesante en el desarrollo de arquitecturas de 64 bits. Su entrada inicial
fue la arquitectura IA-64 (más tarde llamada Itanium), pero esa arquitectura no fue ampliamente
adoptada. Mientras tanto, otro fabricante de chips, AMD, comenzó a desarrollar una arquitectura de
64 bits conocida como x86-64 que se basaba en ampliar el conjunto de instrucciones IA-32 existente. El
x86-64 admitía espacios de direcciones físicas y lógicas mucho más grandes, así como varios otros
avances arquitectónicos. Históricamente, AMD a menudo había desarrollado chips basados en la
arquitectura de Intel, pero ahora los roles se invirtieron cuando Intel adoptó la arquitectura x86-64 de
AMD. Al analizar esta arquitectura, en lugar de utilizar los nombres comerciales AMD64 e Intel 64,
utilizaremos el término más general x86-64.
Arquitectura ARM
Aunque los chips de Intel han dominado el mercado de las computadoras personales durante más de
30 años, los chips para dispositivos móviles, como teléfonos inteligentes y tabletas, a menudo se
ejecutan en procesadores ARM de 32 bits. Curiosamente, mientras que Intel diseña y fabrica chips, ARM
solo los diseña. Luego otorga licencias de sus diseños a los fabricantes de chips. Apple obtuvo la licencia
del diseño ARM para sus dispositivos móviles iPhone y iPad, y varios teléfonos inteligentes basados en
Android también usan procesadores ARM.
1. páginas de 4 KB y 16 KB
2. Páginas de 1 MB y 16 MB (secciones denominadas)
Suma y resta
REGLA DE DESBORDAMIENTO: al sumar dos números, y ambos son o bien positivos o negativos, se
produce desbordamiento si y solo si el resultado tiene signo opuesto.
REGLA DE LA RESTA: para substraer un número (el substraendo) de otro (minuendo), se obtiene el
complemento a dos del substraendo y se le suma al minuendo.
Substracción de números en la notación de complemento a dos (M – S)
Multiplicación
División
Primero se examinan los bits del dividendo de izquierda a derecha hasta que el conjunto de bits
examinados represente un número mayor o igual que el divisor; o, en otras palabras, hasta que el
divisor sea capaz de dividir al número. Hasta que eso ocurre, se van colocando ceros en el cociente de
izquierda a derecha. Cuando dicho evento ocurre, se coloca un 1 en el cociente, y se substrae el divisor
del dividendo parcial. Al resultado se le denomina resto parcial. En cada ciclo, se añaden bits adicionales
del dividendo al resto parcial hasta que el resultado sea mayor o igual que el divisor. Como antes, de
este número se resta el divisor para producir un nuevo resto parcial. El proceso continúa hasta que se
acaban los bits del dividendo.
La UCP (unidad central de proceso), también llamada microprocesador (μP) o simplemente procesador.
Es aquella sección de un PC en la que se procesan y operan los datos. Igualmente, en este chip se traen
las instrucciones de la memoria que se decodifican y se ejecutan. Básicamente la CPU está formada por
tres partes: la ALU, la unidad de control y los registros, perteneciendo algunos de estos también a la
ALU y a la unidad de control.