- Debian Linux se inició en una placa real que usa como único CPU el Intel 4004 de 4 bits de 1971, mostrando el límite extremo de los microprocesadores antiguos y de la estratificación del software
- Linux no se ejecuta directamente en el 4004, sino que arranca sobre un emulador de MIPS R3000/DECstation 2100 hecho en ensamblador para 4004, y parte del disco y de la consola se simplifican con hipercalls y controladores paravirtualizados
- Debido al límite de 4 KB de ROM, las operaciones de 4 bits, la ausencia de operaciones lógicas, la poca profundidad de la pila de llamadas y el direccionamiento particular de la RAM 4002, fueron necesarias soluciones alternas como banca de ROM,
lookup table,status nibbley RAM virtual basada en PSRAM - Tras la optimización, el tiempo estimado para iniciar Linux en un 4004 real a 740 KHz es de 4.76 días, y la placa construida fue overclockeada a 790 KHz, con el MIPS virtual funcionando a unos 74.73 Hz
- El resultado fue diseñado como una placa de arte retro para colgar en la pared, e incluye VFD de 40x2, 32 LED de PC, tarjeta SD, SPI PSRAM y UART; el código fuente y las imágenes de disco se publican con condición de uso no comercial
Iniciar Debian Linux en un 4004 real
- Linux/4004 es un proyecto que inició Debian Linux en una placa real que usa al Intel 4004 de 1971 como único CPU
- El 4004 es presentado como el primer microprocesador producido comercialmente en el mundo, y en el proyecto se usaron chips Intel 4004 reales de la década de 1970
- El video de demostración fue reproducido con velocidad variable por secciones para reducir el aburrimiento, y el reloj y calendario en pantalla son correctos
- También se ofrece por separado un video de carácter original reproducido a velocidad constante
Por qué el 4004
- En 2012 se ejecutó Linux en un microcontrolador AVR de 8 bits, logrando el récord de “ejecutar Linux en las especificaciones más bajas”, y después también se desarrolló el proyecto más práctico LinuxCard
- En 2023 aparecieron intentos de superar ese récord basado en AVR y un proyecto para iniciar Linux en un MOS 6510, por lo que el objetivo pasó a ser un CPU de nivel todavía más bajo
- Para ir más atrás que los candidatos Intel 8080 y 8008, se eligió el Intel 4004 de 1971
- Como el 4004 es un chip de 4 bits, permite establecer con claridad un estándar más bajo que el de un CPU de 8 bits
Restricciones del Intel 4004
- El 4004 opera en unidades de 4 bits y la mayoría de las instrucciones son de 1 byte y se ejecutan en 8 ciclos de reloj
- Algunas instrucciones de 2 bytes requieren 16 ciclos
- FIN es una excepción: aunque es una instrucción de 1 byte, tarda 16 ciclos
- El conjunto de instrucciones no incluye operaciones lógicas como AND, OR, XOR y se basa principalmente en ADD y SUB
- El
carry flagfunciona de forma peculiar: en la entrada de SUB actúa como borrow, y después de SUB como not borrow; esto fue verificado en hardware real - Los registros internos son 16 de 4 bits, el PC es de 12 bits y la pila de retorno por hardware tiene 4 niveles
- Como la entrada superior actual de la pila se usa como PC, en la práctica el anidamiento máximo de funciones es de 3 niveles
- No hay interrupciones, y lo más cercano al manejo de eventos externos es sondear el pin TEST mediante saltos condicionales
Estructura de memoria y E/S
- El 4004 no maneja directamente las instrucciones de memoria; chips conectados al bus como 4001/4002/4289/4265/4308 decodifican y ejecutan esas instrucciones
- El 4001 es un chip ROM con 256 bytes de mask ROM y un puerto de E/S de 4 bits; el contenido de la ROM y la configuración del puerto quedan fijos en fabricación
- El 4002 es un chip RAM con 320 bits de DRAM, circuito de refresh y un puerto de salida de 4 bits
- Un banco de RAM puede estar compuesto por 4 chips 4002
- Cada banco de RAM tiene 256 nibbles direccionables directamente y, aparte, 64 status nibble de acceso separado
- El 4289 es un controlador ROM que combina las funciones del 4008 y el 4009, permitiendo conectar el 4004 con EEPROM/EPROM de 5 V con relativa facilidad
- El acceso a memoria requiere un procedimiento de varias etapas: seleccionar banco, cargar la dirección en un par de registros, enviar la dirección al bus con SRC y ejecutar RDM/WRM
- El
status nibblefue útil para acceder rápidamente a datos frecuentes y ayudó a aumentar en alrededor de 30% la velocidad del emulador MIPS
- El
Preparación de la placa de desarrollo y del emulador
- La placa de desarrollo inicial para validación estaba compuesta por un generador de reloj 4201, CPU 4004, RAM 4002-1, controlador ROM 4289 y un ATMEGA48 que hacía el papel de ROM
- La alimentación comienza en 5 V, y al conectar a tierra el polo positivo de un convertidor elevador aislado de 5 V a 10 V se generó una fuente de -10 V para alimentar los chips MCS-04
- El primer programa para 4004 fue código para hacer parpadear un LED conectado al pin de salida 0 del 4002, y funcionó tras aumentar el límite de corriente
- Antes de fabricar la placa real, se escribió un emulador del 4004 llamado u4004
- Emula no solo el núcleo del 4004, sino también una tarjeta SD virtual, SPI UART, VFD, disposición de 4002 y LED de PC
- Se usó para validar primero el estado de los pines SPI y el comportamiento de los periféricos, cosas difíciles de depurar en hardware real
En vez de ejecutar Linux directamente, se emula MIPS
- Linux no puede ejecutarse directamente en el 4004
- No existe un compilador de C para el 4004 y, por las restricciones de la arquitectura, se consideró difícil cargar directamente el kernel de Linux
- El anidamiento de llamadas, el espacio de direcciones de ROM/RAM y los límites de las operaciones de 4 bits impiden la ejecución directa
- En su lugar, se escribió sobre el 4004 un emulador de MIPS R3000, y sobre él se inició Linux para DECstation 2100
- Se eligió MIPS porque era más fácil de emular dentro del espacio de código del 4004 que otros candidatos
- ARM tiene muchos operandos de desplazamiento arbitrario
- Se consideró que RISC-V sería lento por su modo de direccionamiento
- En x86, solo la decodificación de instrucciones podría superar los 4 KB
- PPC es demasiado complejo
- El objetivo inicial era meter el emulador completo dentro de los 4 KB de ROM direccionables por defecto del 4004
Soluciones alternativas en la implementación del emulador MIPS
- Solo la decodificación de instrucciones MIPS ya consumía bastante espacio de ROM
- La tabla de despacho de 64 opcodes de nivel superior requiere 128 bytes
- Incluyendo subtablas adicionales, la decodificación principal necesitó 359 bytes
- Los 32 registros de 32 bits de MIPS suman 1024 bits, es decir, 256 nibbles desde la perspectiva del 4004, ocupando un banco completo de RAM
- El TLB de MIPS tiene originalmente 64 entradas, pero como Linux no exige exactamente 64, se redujo a 16 entradas
- La cantidad de entradas del TLB también se diseñó para permitir configuraciones de 4, 8, 12 y 16 entradas
- Como el 4004 no tiene operaciones lógicas, AND/OR/XOR/NOR se implementaron con sumas,
carry, desplazamientos y bucles- Más adelante, cuando hubo más espacio de ROM, se optimizaron con
lookup tablede 256 entradas
- Más adelante, cuando hubo más espacio de ROM, se optimizaron con
- Los desplazamientos también tuvieron que implementarse solo con instrucciones de rotación de 1 bit a través del
carrydel 4004, y luego se mejoraron con copias por nibble y hasta 3 desplazamientos de bit - El manejo del registro
$zerode MIPS aprovecha la característica de pila de retorno circular del 4004 para ahorrar espacio de ROM- Cuando el destino es
$zero, no se hacereturn, sino que se pasa al procesamiento de la siguiente instrucción, ahorrando 3 bytes y 3 ciclos por sitio de llamada
- Cuando el destino es
Banca de ROM y mejoras de rendimiento
- Con solo 4 KB de ROM no cabía el código para manejar SD, PSRAM, VFD y UART, así que se usó una ROM de 8 KB dividida en dos bancos
- El cambio de banco ROM se controla con el pin de salida del 4002, y se colocaron veneers para permitir
call/returnentre bancos - Una vez ampliado el espacio de ROM, fue posible optimizar el rendimiento
- AND/OR/XOR se implementaron cada uno con
lookup tablede 256 entradas - Usando una
lookup tablede multiplicación por nibble, la multiplicación se volvió 8 veces más rápida que la implementación anterior a nivel de bit
- AND/OR/XOR se implementaron cada uno con
- La
lookup tablede operaciones lógicas aprovecha la característica de que JIN en el 4004, cuando está al final de una página ROM, salta tomando como referencia la página siguiente - La tabla de multiplicación se implementó combinando la lectura de datos byte de la ROM mediante FIN con una técnica para evitar el manejo de la entrada 0
Configuración final del hardware
- La placa final fue diseñada como una placa artística centrada en through-hole con estética de los años 70
- Incluye traces gruesos en ángulo recto, sin vias, orificios para colgar en la pared y un display VFD
- Los componentes principales son los siguientes
- CPU 4004 o 4040
- Generador de reloj 4201
- Chips RAM 4002
- Controlador ROM 4289
- EEPROM
- 1 o 2 SPI PSRAM
- Ranura para tarjeta SD
- SPI UART SC16IS741A
- VFD 40x2
- 32 LED indicadores de PC
- La SPI PSRAM se usa como RAM MIPS virtual
- La primera PSRAM requiere al menos 4 MB porque debe cargar el kernel de forma continua
- La segunda PSRAM puede dejarse vacía o instalarse con cualquier tamaño arbitrario de 128 KB o más
- Se usó una Futaba M402SD10FJ como VFD, y se indicó que la Noritake CU40025-UW6J es compatible
- El UART se eligió como un componente de montaje superficial SC16IS741A debido a las limitaciones de control de flujo del MAX3100, que era un candidato SPI UART through-hole
Energía y level shifting
- Los componentes MCS-04 usan voltajes peculiares de la familia -15V y lógica invertida
- A nivel de sistema, es más simple pensar en ello como una alimentación de -10V y +5V
- La placa recibe +5V mediante un conector de borde USB-C y también genera +3.3V y -10V
- El regulador step-down de +3.3V está basado en LM2574
- La alimentación de -10V se cambió a una configuración con MAX774, FET externo, diodo grande e inductor grande porque el MAX764 de la primera revisión no podía suministrar suficiente corriente
- Al final entrega más de 700 mA a -10V y el ripple es menor de 200 mV
- El level shifting para convertir la salida del 4002 al dominio de 3.3V fue difícil, y se resolvió con una combinación de pulldown de 10K, resistencia de 2.7K, clamp TVS y divisor resistivo
Herramientas de depuración y fallas reales
- Como el 4004 no tiene funciones de depuración integradas, se capturó el bus MCS-04 durante largos periodos con Saleae Logic
- Se escribió un decoder del bus MCS-04 para analizar el estado del bus, la dirección ROM, el valor leído de ROM, el desensamblado y los valores de lectura/escritura de RAM/I/O
- Después se aportó a Saleae y quedó incluido en el software general de Saleae
- En la placa revision 1.1 había un problema raro donde los caracteres de salida ocasionalmente se corrompían
- Por ejemplo,
ise veía comohyCcomoB, como si desapareciera el bit menos significativo
- Por ejemplo,
- El análisis confirmó una falla en la que, durante el
memcpy()del kernel, el bit inferior de cierto nibble en el chip 4002 donde se guardaba el$t1emulado a veces caía de 1 a 0 - Tras reemplazar ese 4002, la salida de texto volvió a la normalidad
Ruta de arranque
- El firmware primero sondea cuántos chips de memoria hay en el tercer banco de RAM para determinar la cantidad de entradas TLB
- Luego inicializa el VFD, el UART y la tarjeta SD
- Si falla la inicialización de la tarjeta SD, muestra
"Failed to init SD card. Halting here and now!" - Esa cadena es la única cadena en todo el firmware
- Si falla la inicialización de la tarjeta SD, muestra
- El firmware no usa una ROM virtual; en su lugar, carga el primer sector de la tarjeta SD en
0x80000000de la RAM y luego salta allí - El loader de 446 bytes del primer sector busca una partición de tipo
0xBBen la tabla de particiones, la lee en0x80001000y salta a ella - El segundo loader mide alrededor de 14 KB y está escrito en C
- Monta la partición activa como FAT12/16/32
- Parsea
vmlinuxcomo ELF, lo carga en RAM y salta al entrypoint - Pasa el tipo de máquina, un valor mágico, el mapeo de RAM y una tabla de callbacks para impresión por consola temprana
Disco y acceso a la tarjeta SD
- El acceso a disco usa un driver de disco paravirtualizado PVD como el del proyecto LinuxCard
- En vez de emular en assembly de 4004 un chip SII SCSI y un disco SCSI, las hypercalls de lectura/escritura de sectores actúan como DMA desde la perspectiva del MIPS virtual
- Toda la RAM de la placa Linux/4004 es de 440 bytes incluyendo el status nibble, o 352 bytes excluyéndolo
- El estado de los registros MIPS y la TLB ocupan una gran parte cada uno, así que no hay espacio para un buffer de sector SD de 512 bytes
- Los datos del sector SD no se guardan en la RAM del 4004; se leen directamente a la PSRAM o se escriben desde la PSRAM a la SD usando buses SPI separados para la tarjeta SD y la PSRAM
- Leer o escribir un sector SD tarda algo más de 1 segundo
- Los requisitos de timing de inicialización ACMD41 de la especificación SD no podían cumplirse con SPI bit-banging, pero las tarjetas SD probadas sí se inicializaron incluso a 5 KHz y con intervalos de más de 200 ms
Velocidad de ejecución y resultados de optimización
- Tras emular la tarjeta SD real y la SPI PSRAM, el tiempo de arranque inicialmente estimado era de 8.9 días con un 4004 a 740 KHz
- Los principales resultados de optimización fueron los siguientes
- Operaciones lógicas y lookup table de multiplicación: 8.4 días
- Unrolling del bucle de envío/recepción de nibbles de la PSRAM: 7.25 días
- Copia de memoria especializada y unrolling de bucles: 6.63 días
- Eliminación del área de almacenamiento de instrucciones actuales y seguimiento de liveness: 6.50 días
- Mejora de shift: 6.19 días
- Unrolling del bucle de envío de direcciones de la PSRAM: 6.01 días
- Reducción de la config del kernel Linux, ajuste de consola dummy 1x1 y uso de tiny init: 5.33 días
- Eliminación del soporte para block devices de más de 2 TB y desactivación de la feature
huge_filesde ext4: 4.81 días - Fast path dedicado al instruction fetch: 4.76 días
- Un arranque de 4.76 días equivale a una máquina MIPS de unos 70 Hz con un 4004 a 740 KHz
- La placa fabricada usa el 4201 en modo divide-by-7 y un crystal de 5.5296 MHz, por lo que está overclockeada a 790 KHz
- La mezcla de instrucciones del 4004 en la placa Linux/4004 es 8.8% de instrucciones de 16 ciclos y 91.2% de instrucciones de 8 ciclos, con una velocidad efectiva de 90,640 instrucciones/s
- La interrupción virtual de timer es de 16 Hz y entrega una IRQ cada 65,536 instrucciones virtuales, por lo que la CPU virtual se percibe como de 1.05 MHz
- El guest MIPS realmente emulado corre a unos 70 Hz a 740 KHz y a unos 74.73 Hz a 790 KHz
- El tiempo se expande 14,030 veces, y 1 segundo virtual equivale a unas 3 horas 54 minutos reales
Configuración de Linux y experiencia de uso
- El kernel Linux se redujo a unos 2.5 MB eliminando subsystems, filesystems y configuraciones innecesarias como TCP/IP
- Si se usa solo
init=/bin/sh, la sesión queda sin session,$PATH,/proc,/sys, etc., por lo que se escribió un tiny init llamado/sbin/uMIPSinit- Monta
/procy/sys - Configura el hostname y
$PATH - Vuelve a ejecutar
shcada vez que termina
- Monta
- Incluso con solo 4.5 MB de RAM, por ejemplo un chip de 4 MB más uno de 512 KB, puede arrancar hasta el prompt de shell sin swap
- Si se activa swap, es posible compilar el código fuente del kernel en el propio dispositivo
- Se estima que compilar el código fuente del kernel tomaría varios años
- Gracias al journal de ext4, el plan es recuperar el filesystem tras un corte de energía y reanudar la compilación después de reiniciar
Objetivo como placa artística
- Este proyecto tuvo desde el principio un objetivo artístico parcial
- La placa fue diseñada para colgarse en la pared y cuenta con VFD, layout de PCB de estilo retro y LED de PC
- Incluye un programa que dibuja el conjunto de Mandelbrot en modo texto en el VFD y en el puerto serial
- La versión de punto flotante
/root/mandelbrottarda unos 30 días en dibujar una imagen de 13 filas por 40 columnas porque Linux debe emular las operaciones de punto flotante - La versión solo de enteros
/root/mandelbrot_nofptermina en menos de 9 horas
- La versión de punto flotante
Costo de los componentes y reproducibilidad
- Como uno de los objetivos importantes era que otras personas pudieran reproducirlo, se evitó el 4265, que es difícil de conseguir
- Se eligió el 4201 porque es más simple que un circuito de reloj alternativo, y el 4289 porque es más fácil de conseguir que la combinación 4008+4009
- La placa fue diseñada para poder montar también un 4040 en lugar de un 4004, y como no se usan las funciones adicionales del 4040, se mantiene la compatibilidad con el 4004
- Los chips 4002 para la TLB pueden instalarse en cantidades de 1, 2, 3 o 4 para usarse respectivamente como una TLB de 4, 8, 12 o 16 entradas
- Si la cantidad de entradas de la TLB es pequeña, el rendimiento baja
- Ese banco también se encarga de los 16 bits altos de los LED de visualización del PC, por lo que si solo se instala una parte, algunos LED no funcionarán
- Los componentes de los años 70 son caros
- El 4004 cuesta alrededor de $250
- El 4040 cuesta alrededor de $60
- El 4201 cuesta alrededor de $50
- El 4002-1 cuesta alrededor de $7
- El 4002-2 cuesta alrededor de $25
- El 4289 cuesta alrededor de $70
- Los componentes modernos son relativamente baratos, y aunque el SPI VFD puede ser difícil de conseguir, hubo un caso en que se obtuvo en eBay por $15
- También se admite una configuración para interactuar solo mediante el puerto serial, sin instalar el VFD
Proceso de producción del video
- La escena de arranque real se convirtió en video tomando fotografías durante unos 9 días
- Si se toman fotos de 1920x1080 cada 2 segundos, se generan alrededor de 1.76 GB por hora, y una grabación de 9 días da alrededor de 379 GB y unas 388 mil archivos
- Los dispositivos Android tuvieron problemas de cuelgues o sobrecalentamiento durante grabaciones largas, y el iPhone SE3 fue estable para capturar, pero presentó problemas de espacio de almacenamiento y de offload de fotos
- Al final se usó un iPhone 12 Pro Max de 512 GB para grabar todo de forma continua, luego se montó con ifuse en Linux y se copiaron cerca de 400 mil archivos durante más de 10 horas con
cp -Rvf - El video final se produjo con comandos de ffmpeg, y las partes aburridas se procesaron con velocidad variable
- La velocidad de reproducción varía desde 5 FPS, es decir, 10x en tiempo real, hasta 960 FPS, es decir, 1920x en tiempo real
- Una versión aparte sin edición usa captura a 0.5 FPS y reproducción a 60 FPS, para una velocidad de 120x en tiempo real
Materiales publicados y licencia
- La imagen de disco para la tarjeta SD se ofrece como descarga separada
- La descarga principal incluye lo siguiente
- Analizador de bus MCS-04 para el software de Saleae
- Código fuente del emulador i4004 DECstation 2100
- Código fuente del MBR de MIPS y del bootloader de segunda etapa
- Configuración del kernel e información de versión
- Código fuente del emulador u4004 para la placa Linux/4004
- La licencia es gratis para uso no comercial, y para uso comercial se requiere una licencia aparte
- En cualquier tipo de uso, se debe dar crédito al creador original tanto en forma de código fuente como binaria
2 comentarios
Así que el autor original es justamente ese tipo al que esta vez sacaron del escenario en DEF CON por el tema de la badge. No voy a ponerme del lado de nadie, pero aun así de verdad tiene un nivel impresionante.
Opiniones en Hacker News
Vaya, yo pensaba que NetBSD moderno era lento en un m68030 a 15 MHz, bus de memoria de 16 bits y 10 MB de RAM, pero esto sí que es una locura
Muestra muy bien que, a finales de los 80 y principios de los 90, cuando las computadoras empezaron a tener almacenamiento permanente, espacios de direcciones abiertos y MMU, básicamente llegamos a la computación moderna
Una Amiga 3000 o una computadora i80486 también pueden ejecutar lo mismo que una computadora moderna; hoy lo hacen muchísimo más rápido o tienen cosas como GPU que entonces no existían, pero funcionalmente no hay una gran diferencia
Me gusta cómo Dmitry demuestra lo flexible que puede ser la definición de funcional
Las jugadas se enviaban por correo físico, y una partida podía durar meses o años
Para cuando llegaba la respuesta, uno podía olvidarse de la estrategia original, lo que añadía otro nivel de dificultad al ajedrez; este proyecto es básicamente Linux por correspondencia
Para cuando salga la salida del comando, uno puede olvidarse de por qué lo ejecutó
En realidad, no fue a finales de los 80 o principios de los 90: para finales de los 60 ya era posible
Creo que también sería posible portar Linux a la IBM Model 67 [1], y quizá hasta sería fácil, ya que GCC ya puede apuntar a ese conjunto de instrucciones
La MMU también es suficiente, y aunque la restricción de un máximo de 2 MB de memoria de núcleo rápida sería dura, probablemente estaría más o menos en la misma categoría que esa máquina 68030, solo un poco más lenta
La virtualización completa y los límites de memoria y E/S impuestos por hardware también se inventaron temprano, pero esas funciones tardaron en bajar a las minicomputadoras y microcomputadoras, y tardaron mucho más en ser aprovechadas por el software masivo
[1] https://en.wikipedia.org/wiki/IBM_System/360_Model_67
Cualquier sistema Turing-completo puede ejecutar cualquier cosa; puede ser extremadamente lento, pero la ejecuta
Con suficiente tiempo, también podrías correr ChatGPT en un 4004
Es algo parecido a pegarle un auto a una rueda: terminas con tres ruedas más
La credencial de participante de Hackaday Supercon 2002 (https://hackaday.com/2022/10/12/the-2022-supercon-badge-is-a...) implementaba una CPU virtual de 4 bits y un panel de control donde podías introducir instrucciones directamente, ejecutarlas y hacer ejecución paso a paso
El panel de control tenía una pantalla donde se podía ver una página de memoria bit por bit, y fue realmente divertido implementar encima un juego de disparos espaciales
También fue interesante comparar la arquitectura Voya4 con la 4004; había compromisos similares, aunque Voya4 cuenta con la ventaja de 50 años de experiencia en conjuntos de instrucciones de CPU
Sin embargo, el enfoque de dimitygr no funcionaría en esa credencial, porque tanto la memoria como la RAM están integradas dentro del PIC24 que implementa el emulador de CPU
Como referencia, las CPU de 4 bits todavía se fabrican y se usan. Muchos controles remotos infrarrojos producidos en masa se programan con MCU de 4 bits. La hoja de datos está en https://www.emmicroelectronic.com/sites/default/files/produc...
Cuando me preguntaban si se podía correr algo en una máquina sin suficiente rendimiento, solía mencionar el ejemplo de AVR, pero ahora tengo un nuevo ejemplo para enlazar
Viendo la frecuencia y el consumo de energía, me pregunto cuánto RF emite y si se podría detectar y decodificar en la cascada de un SDR
Todavía lo estoy leyendo, pero hasta este punto veo la palabra “soubroutine”, que parece ser un typo
Vaya, este proyecto no debe haber salido barato. Gracias a los coleccionistas de eBay
Y probablemente sea la única situación en la que habría elegido un LCD en vez de un VFD
Si vas a correr una compilación de varios años, para cuando termine el VFD probablemente estaría destruido por burn-in
Lamentablemente, parece que el personal universitario no lee mucho HN
Vaya, impresionante
Mirando los bits altos del PC se ve qué se está ejecutando en ese momento
P. D.: aun así, es más rápido que cargar un kernel desde una ISO virtual en el pésimo IPMI de un servidor al otro lado de Internet ;D
nmsobrevmlinux, puedes mapearlo fácilmente a funciones del kernelDespués de entrar al espacio de usuario, también puedes distinguir el binario principal (muy por debajo de 0x01000000) y las bibliotecas compartidas (cargadas en direcciones altas, cerca de 0x77000000)
Tanto el arranque como la ejecución eran dolorosamente lentos
Fue un artículo realmente interesante
Había leído un poco sobre el 4004 y sabía que era un chip extraño, pero el nivel de esoterismo supera lo que imaginaba
Ahora me dieron ganas de ver qué tan buena CPU se podría hacer hoy con la misma cantidad de transistores
No son tantos menos que en un 6502, y si fuera de 8 bits sería mucho más fácil de programar
Filmar el video tomó 9 días, y costó 4 horas por cada segundo de emulación
Y también me pregunto por qué usa Windows 95
Para el video necesitaba una laptop con puerto serial real, no USB
Esta laptop cumplía con eso y costaba 20 dólares en eBay
Personalmente, Windows 2000 me parece el Windows más bonito, así que lo instalé para el video de demostración
Realmente genial
Me gustaría tener suficientes conocimientos como para entender la mayor parte de este proyecto, pero por ahora fue demasiado difícil para mis limitadas habilidades en ciencias de la computación.
Aun así, lo más destacado que sí pude entender por completo fue “Section 14.b & 14.c - Getting the data...”.
Bastaron apenas 400.000 archivos, unas 275 fotos por día durante 4 años.
Es muy raro vivir en una época en la que, pese a tener tanta capacidad de procesamiento, almacenamiento y red de sobra, las apps de sincronización de medios que parecen ser las más usadas se cuelgan o sincronizan lento, AirDrop falla y ni siquiera existe una función de UI de “seleccionar todo” :)
Para cosas como esta debería existir algo como un Premio Nobel.
También podrían agregar una categoría de reconocimiento para aplicaciones extrañas e inusuales de la informática.
En la sección “Why MIPS?” se dice que “algunos inevitablemente son lentos por sus pésimos modos de direccionamiento (RISCV)”; ¿qué problema hay con el modo de direccionamiento de RISC-V?
En algunas instrucciones de RISC-V, los bits de los valores inmediatos no se almacenan de forma contigua.
En las instrucciones MIPS, los bits de valores para suma inmediata, carga de constantes, saltos condicionales, etc., siempre se almacenan en orden.
En RISC-V, a veces los bits están mezclados.
Por ejemplo, en un salto incondicional, los bits del desplazamiento de destino se almacenan en el orden bit 19, bits 9-0, bit 10, bits 18-11.
En hardware, basta con conectar correctamente el cableado, así que el costo de reordenamiento es prácticamente nulo; pero en software hacen falta muchas manipulaciones de bits para corregirlo.
La razón por la que RISC-V hace esto es simplificar el diseño de hardware.