1 điểm bởi GN⁺ 2024-09-21 | 2 bình luận | Chia sẻ qua WhatsApp
  • Debian Linux đã khởi động trên một bo mạch thật chỉ dùng Intel 4004 4-bit năm 1971 làm CPU, cho thấy giới hạn của các vi xử lý cổ và mức cực đoan của việc phân tầng phần mềm
  • Linux không chạy trực tiếp trên 4004, mà khởi động trên trình giả lập MIPS R3000/DECstation 2100 viết bằng assembly 4004; một phần đĩa và console được đơn giản hóa bằng hypercall và driver bán ảo hóa
  • Do các hạn chế như ROM 4KB, phép toán 4-bit, không có phép toán logic, call stack nông và cách định địa chỉ đặc thù của RAM 4002, dự án phải dùng các cách vòng như ROM banking, lookup table, status nibble và RAM ảo dựa trên PSRAM
  • Sau tối ưu hóa, thời gian dự kiến để khởi động Linux trên 4004 thật ở 740KHz là 4,76 ngày; bo mạch được chế tạo được ép xung lên 790KHz, khiến MIPS ảo chạy ở khoảng 74,73Hz
  • Thành quả được thiết kế như một bo mạch nghệ thuật retro có thể treo tường, trang bị VFD 40x2, 32 LED PC, thẻ SD, SPI PSRAM và UART; mã nguồn cùng image đĩa được phát hành với điều kiện sử dụng phi thương mại

Khởi động Debian Linux trên 4004 thật

  • Linux/4004 là dự án khởi động Debian Linux trên một bo mạch thật dùng Intel 4004 năm 1971 làm CPU duy nhất
  • 4004 được giới thiệu là vi xử lý sản xuất thương mại đầu tiên trên thế giới, và dự án dùng chip Intel 4004 thật từ thập niên 1970
  • Video trình diễn được tăng tốc thay đổi theo từng đoạn để bớt nhàm chán; đồng hồ và lịch hiển thị trong video là chính xác
  • Một video có tính chất bản gốc, phát ở tốc độ tăng cố định, cũng được cung cấp riêng

Vì sao là 4004

  • Năm 2012, việc chạy Linux trên vi điều khiển AVR 8-bit đã lập kỷ lục “chạy Linux trên cấu hình thấp nhất”, sau đó dự án LinuxCard thực dụng hơn cũng được thực hiện
  • Năm 2023, khi xuất hiện nỗ lực phá kỷ lục dựa trên AVR và dự án khởi động Linux trên MOS 6510, mục tiêu chuyển sang một CPU cấp thấp hơn nữa
  • Để đi xa hơn về quá khứ so với các ứng viên Intel 8080 và 8008, Intel 4004 năm 1971 đã được chọn
  • Vì 4004 là chip 4-bit, nó có thể đặt ra một chuẩn thấp hơn CPU 8-bit một cách rõ ràng

Các hạn chế của Intel 4004

  • 4004 hoạt động theo đơn vị 4-bit; hầu hết lệnh dài 1 byte và thực thi trong 8 chu kỳ clock
    • Một số lệnh 2 byte cần 16 chu kỳ
    • FIN là ngoại lệ: lệnh 1 byte nhưng mất 16 chu kỳ
  • Tập lệnh không có các phép toán logic như AND, OR, XOR, về cơ bản xoay quanh ADD và SUB
  • Cờ carry hoạt động theo cách đặc biệt: với đầu vào của SUB thì giống borrow, còn sau SUB thì giống not borrow; điều này đã được xác nhận trên phần cứng thật
  • Các thanh ghi bên trong gồm 16 thanh ghi 4-bit, PC là 12-bit, và hardware return stack có 4 mức
    • Vì entry trên đỉnh stack hiện tại được dùng làm PC, mức lồng hàm thực tế tối đa là 3
  • Không có ngắt; cách gần nhất để xử lý sự kiện bên ngoài là polling chân TEST trong nhánh có điều kiện

Cấu trúc bộ nhớ và I/O

  • 4004 không trực tiếp xử lý bản thân các lệnh bộ nhớ; các chip gắn trên bus như 4001/4002/4289/4265/4308 sẽ giải mã và thực thi lệnh
  • 4001 là chip ROM có mask ROM 256 byte và cổng I/O 4-bit; nội dung ROM và cấu hình cổng I/O được cố định khi sản xuất
  • 4002 là chip RAM có DRAM 320 bit, mạch refresh và cổng chỉ xuất 4-bit
    • Một RAM bank có thể gồm 4 chip 4002
    • Mỗi RAM bank có 256 nibble có thể định địa chỉ trực tiếp, cùng 64 status nibble được truy cập riêng
  • 4289 là bộ điều khiển ROM kết hợp chức năng của 4008 và 4009, giúp kết nối 4004 với EEPROM/EPROM 5V tương đối dễ dàng
  • Truy cập bộ nhớ cần quy trình nhiều bước như chọn bank, nạp địa chỉ vào cặp thanh ghi, gửi địa chỉ lên bus bằng SRC, rồi thực thi RDM/WRM
    • Status nibble hữu ích để truy cập nhanh dữ liệu dùng thường xuyên, góp phần tăng tốc trình giả lập MIPS khoảng 30%

Chuẩn bị bo mạch phát triển và trình giả lập

  • Bo mạch phát triển dùng để kiểm chứng ban đầu gồm clock generator 4201, CPU 4004, RAM 4002-1, bộ điều khiển ROM 4289 và ATMEGA48 đóng vai trò ROM
  • Nguồn bắt đầu từ 5V; cực dương của bộ boost converter cách ly 5V-sang-10V được nối đất để tạo nguồn -10V cấp cho chip MCS-04
  • Chương trình 4004 đầu tiên là đoạn mã nhấp nháy LED nối với output pin 0 của 4002, và đã hoạt động sau khi tăng giới hạn dòng
  • Trước khi làm bo mạch thật, tác giả viết một trình giả lập 4004 tên u4004
    • Nó giả lập không chỉ lõi 4004 mà còn cả thẻ SD ảo, SPI UART, VFD, bố trí 4002 và LED PC
    • Mục đích là kiểm chứng trước trạng thái chân SPI và hoạt động ngoại vi, vốn khó debug trên phần cứng thật

Không chạy Linux trực tiếp mà giả lập MIPS

  • Linux không thể chạy trực tiếp trên 4004
    • Không có trình biên dịch C nhắm tới 4004, và xét các ràng buộc kiến trúc, việc đưa trực tiếp nhân Linux lên được cho là khó
    • Lồng lời gọi, không gian địa chỉ ROM/RAM và giới hạn phép toán 4-bit ngăn cản việc chạy trực tiếp
  • Thay vào đó, tác giả viết trình giả lập MIPS R3000 chạy trên 4004, rồi khởi động Linux dành cho DECstation 2100 trên đó
  • MIPS được chọn vì dễ giả lập trong không gian mã 4004 hơn các ứng viên khác
    • ARM có nhiều toán hạng shift tùy ý
    • RISC-V được cho là sẽ chậm do cách định địa chỉ
    • x86 có thể vượt quá 4KB chỉ riêng phần giải mã lệnh
    • PPC quá phức tạp
  • Mục tiêu ban đầu là đưa toàn bộ trình giả lập vào ROM 4KB mà 4004 có thể định địa chỉ cơ bản

Các cách vòng trong triển khai trình giả lập MIPS

  • Chỉ riêng giải mã lệnh MIPS đã tiêu tốn đáng kể không gian ROM
    • Dispatch table 64 opcode cấp cao nhất cần 128 byte
    • Tính cả các sub-table bổ sung, phần giải mã chính cần 359 byte
  • 32 thanh ghi 32-bit của MIPS là 1024 bit, tức 256 nibble theo góc nhìn 4004, chiếm trọn một RAM bank
  • MIPS TLB vốn có 64 entry, nhưng vì Linux không yêu cầu chính xác 64 entry nên được giảm xuống 16 entry
    • Số entry TLB được thiết kế để cũng có thể cấu hình thành 4, 8, 12 hoặc 16
  • Vì 4004 không có phép toán logic, AND/OR/XOR/NOR được triển khai bằng phép cộng và carry, shift, vòng lặp
    • Về sau, khi không gian ROM tăng lên, chúng được tối ưu bằng lookup table 256 entry
  • Shift cũng phải được triển khai chỉ bằng lệnh xoay qua carry 1-bit của 4004, rồi sau đó được cải thiện bằng sao chép theo nibble và tối đa 3 lần bit shift
  • Việc xử lý thanh ghi $zero của MIPS tận dụng đặc tính circular return stack của 4004 để tiết kiệm không gian ROM
    • Khi đích là $zero, thay vì return, mã chuyển sang xử lý lệnh tiếp theo, giảm 3 byte và 3 chu kỳ cho mỗi callsite

ROM banking và cải thiện hiệu năng

  • Chỉ với ROM 4KB thì không thể chứa cả mã xử lý thẻ SD, PSRAM, VFD, UART, nên dự án dùng ROM 8KB chia thành hai bank
  • Chuyển ROM bank được điều khiển bằng output pin của 4002, và các veneer được bố trí để call/return giữa các bank
  • Sau khi không gian ROM tăng lên, việc tối ưu hiệu năng trở nên khả thi
    • AND/OR/XOR lần lượt được triển khai bằng lookup table 256 entry
    • Dùng lookup table nhân theo nibble giúp phép multiplication nhanh hơn 8 lần so với triển khai theo bit trước đó
  • Lookup table cho phép toán logic tận dụng đặc tính JIN của 4004: khi JIN nằm ở cuối ROM page, nó sẽ jump theo page kế tiếp
  • Bảng multiplication được triển khai bằng cách kết hợp đọc dữ liệu byte trong ROM bằng FIN và tránh xử lý entry 0

Cấu hình phần cứng cuối cùng

  • Bo mạch cuối cùng được thiết kế như một bo mạch nghệ thuật thiên về linh kiện xuyên lỗ mang cảm giác thập niên 1970
    • Bao gồm các đường trace vuông góc dày, không có via, lỗ để treo tường và màn hình VFD
  • Các thành phần chính gồm
    • CPU 4004 hoặc 4040
    • clock generator 4201
    • các chip RAM 4002
    • ROM controller 4289
    • EEPROM
    • 1~2 SPI PSRAM
    • khe thẻ SD
    • SC16IS741A SPI UART
    • VFD 40x2
    • 32 đèn LED hiển thị PC
  • SPI PSRAM được dùng làm RAM MIPS ảo
    • PSRAM đầu tiên cần tối thiểu 4MB vì phải nạp kernel một cách liên tục
    • PSRAM thứ hai có thể để trống hoặc lắp dung lượng bất kỳ từ 128KB trở lên
  • VFD sử dụng Futaba M402SD10FJ, và tác giả được cho biết Noritake CU40025-UW6J tương thích
  • UART được chọn là linh kiện dán bề mặt SC16IS741A do hạn chế điều khiển luồng của MAX3100, một ứng viên SPI UART dạng xuyên lỗ

Nguồn điện và level shifting

  • Các linh kiện MCS-04 dùng mức điện áp đặc biệt thuộc hệ -15V và inverted logic
    • Ở cấp hệ thống, sẽ đơn giản hơn nếu xem là cấp nguồn -10V và +5V
  • Bo mạch nhận +5V qua USB-C edge connector, đồng thời tạo ra +3.3V và -10V
  • Bộ step-down regulator +3.3V được cấu hình dựa trên LM2574
  • Nguồn -10V đã được đổi từ MAX764 ở revision đầu tiên, vốn không cấp đủ dòng, sang cấu hình MAX774 cùng FET ngoài, diode lớn và inductor lớn
    • Cuối cùng cấp được hơn 700mA ở -10V và ripple dưới 200mV
  • Level shifting để chuyển output 4002 sang domain 3.3V khá khó, và được giải quyết bằng cách kết hợp pulldown 10K, resistor 2.7K, TVS clamp và chia áp bằng điện trở

Công cụ debug và lỗi thực tế

  • Vì 4004 không có chức năng debug tích hợp, MCS-04 bus được capture trong thời gian dài bằng Saleae Logic
  • Tác giả viết MCS-04 bus decoder để phân tích bus state, ROM address, ROM read value, disassembly, và các giá trị RAM/I/O read/write
    • Sau đó decoder này được đóng góp cho Saleae và được đưa vào phần mềm Saleae thông thường
  • Trên bo revision 1.1 từng có vấn đề ký tự xuất ra thỉnh thoảng bị hỏng
    • Ví dụ i trông như h, C trông như B, tức là bit thấp bị mất
  • Phân tích cho thấy trong lúc kernel memcpy(), ở chip 4002 lưu emulated $t1, bottom bit của một nibble cụ thể đôi lúc tụt từ 1 xuống 0
  • Sau khi thay chip 4002 đó, output văn bản trở lại bình thường

Đường dẫn khởi động

  • firmware trước tiên probe số chip nhớ ở RAM bank thứ ba để xác định số lượng TLB entry
  • Sau đó khởi tạo VFD, UART và thẻ SD
    • Nếu khởi tạo thẻ SD thất bại, nó hiển thị "Failed to init SD card. Halting here and now!"
    • Chuỗi này là chuỗi duy nhất trong toàn bộ firmware
  • firmware không có ROM ảo; nó tải sector đầu tiên của thẻ SD vào 0x80000000 của RAM rồi nhảy tới đó
  • loader 446 byte ở sector đầu tiên tìm partition type 0xBB trong partition table, đọc vào 0x80001000 rồi nhảy tới đó
  • loader thứ hai có kích thước khoảng 14KB và được viết bằng C
    • mount active partition dưới dạng FAT12/16/32
    • phân tích vmlinux như ELF, tải vào RAM và nhảy tới entrypoint
    • truyền machine type, magic value, RAM mapping và callback table cho early console printing

Truy cập đĩa và thẻ SD

  • Truy cập đĩa dùng driver đĩa bán ảo hóa PVD giống dự án LinuxCard
  • Thay vì emulation SII SCSI chip và SCSI disk bằng assembly 4004, hypercall sector read/write hoạt động như DMA từ góc nhìn của MIPS ảo
  • Tổng RAM của bo Linux/4004 là 440 byte nếu tính cả status nibble, hoặc 352 byte nếu loại trừ
    • MIPS register state và TLB đã chiếm phần lớn, nên không còn chỗ cho sector buffer 512 byte của thẻ SD
  • Dữ liệu sector SD không được chứa trong RAM 4004; thay vào đó được đọc trực tiếp vào PSRAM, hoặc ghi từ PSRAM sang SD, bằng bus SPI riêng của thẻ SD và PSRAM
  • Đọc hoặc ghi một sector SD mất hơn 1 giây một chút
  • Yêu cầu timing khởi tạo ACMD41 của SD spec không thể đáp ứng bằng SPI bit-banging, nhưng các thẻ SD được thử nghiệm vẫn khởi tạo được ở 5KHz và khoảng cách từ 200ms trở lên

Tốc độ thực thi và kết quả tối ưu hóa

  • Sau khi emulation thẻ SD thật và SPI PSRAM, thời gian khởi động ước tính ban đầu là 8,9 ngày trên 4004 ở 740KHz
  • Các kết quả tối ưu hóa chính như sau
    • Còn 8,4 ngày nhờ toán tử logic và multiplication lookup table
    • Còn 7,25 ngày nhờ unroll vòng lặp gửi/nhận nibble PSRAM
    • Còn 6,63 ngày nhờ specialized memory copy và unroll vòng lặp
    • Còn 6,50 ngày nhờ loại bỏ vùng lưu lệnh hiện tại và theo dõi liveness
    • Còn 6,19 ngày nhờ cải thiện shift
    • Còn 6,01 ngày nhờ unroll vòng lặp gửi PSRAM address
    • Còn 5,33 ngày nhờ thu gọn Linux kernel config, thiết lập dummy console 1x1 và dùng tiny init
    • Còn 4,81 ngày nhờ loại bỏ hỗ trợ block device từ 2TB trở lên và vô hiệu hóa feature ext4 huge_files
    • Còn 4,76 ngày nhờ fast path riêng cho instruction fetch
  • Thời gian boot 4,76 ngày tương ứng với máy MIPS khoảng 70Hz trên 4004 ở 740KHz
  • Bo mạch được chế tạo dùng 4201 ở chế độ divide-by-7 và crystal 5.5296MHz, nên được overclock lên 790KHz
  • instruction mix của 4004 trên bo Linux/4004 gồm 8,8% lệnh 16-cycle và 91,2% lệnh 8-cycle; tốc độ hiệu dụng là 90.640 instructions/s
  • virtual timer interrupt là 16Hz, và IRQ được gửi mỗi 65.536 virtual instruction, khiến CPU ảo nhận diện là 1,05MHz
    • MIPS guest được emulation thực tế đạt khoảng 70Hz ở 740KHz và khoảng 74,73Hz ở 790KHz
    • Thời gian bị kéo dài 14.030 lần, tức 1 giây ảo tương đương khoảng 3 giờ 54 phút ngoài đời

Cấu hình Linux và trải nghiệm sử dụng

  • Linux kernel được giảm xuống còn khoảng 2,5MB bằng cách loại bỏ các subsystem, filesystem, TCP/IP và những cấu hình không cần thiết khác
  • Nếu chỉ dùng init=/bin/sh, sẽ không có session, $PATH, /proc, /sys, v.v., nên tác giả viết tiny init /sbin/uMIPSinit
    • mount /proc/sys
    • thiết lập hostname và $PATH
    • chạy lại sh mỗi khi nó kết thúc
  • Chỉ với RAM 4,5MB, ví dụ chip 4MB + chip 512KB, cũng có thể boot tới shell prompt mà không cần swap
  • Nếu bật swap, có thể build kernel source ngay trên chính thiết bị
    • Dự kiến build kernel source sẽ mất nhiều năm
    • Nhờ ext4 journal, kế hoạch là khi mất điện vẫn có thể khởi động lại, khôi phục filesystem và tiếp tục compilation

Mục tiêu như một bo mạch nghệ thuật

  • Dự án này ngay từ đầu đã có một phần mục tiêu nghệ thuật
  • Bo mạch được thiết kế để có thể treo tường, có VFD, retro-style PCB layout và LED PC
  • Có kèm chương trình vẽ Mandelbrot set ở text mode trên VFD và serial port
    • Phiên bản floating point /root/mandelbrot cần Linux emulation phép toán dấu phẩy động, nên mất khoảng 30 ngày để vẽ ảnh 13 hàng x 40 cột
    • Phiên bản chỉ dùng số nguyên /root/mandelbrot_nofp hoàn tất trong vòng dưới 9 giờ

Chi phí linh kiện và khả năng tái tạo

  • Vì mục tiêu quan trọng là để người khác có thể tái tạo, nên tác giả tránh dùng 4265, vốn khó kiếm
  • 4201 được chọn vì đơn giản hơn mạch clock thay thế, còn 4289 được chọn vì dễ kiếm hơn tổ hợp 4008+4009
  • Bo mạch được thiết kế để có thể gắn cả 4040 thay cho 4004, và không sử dụng các chức năng bổ sung của 4040 nhằm duy trì khả năng tương thích với 4004
  • Các chip 4002 cho TLB có thể chỉ gắn 1, 2, 3 hoặc 4 chip, tương ứng dùng làm TLB 4, 8, 12 hoặc 16 entry
    • Số lượng TLB entry ít hơn sẽ làm giảm hiệu năng
    • Bank tương ứng cũng phụ trách 16 bit cao của LED hiển thị PC, nên nếu chỉ gắn một phần thì một số LED sẽ không hoạt động
  • Linh kiện thập niên 1970 khá đắt
    • 4004 khoảng $250
    • 4040 khoảng $60
    • 4201 khoảng $50
    • 4002-1 khoảng $7
    • 4002-2 khoảng $25
    • 4289 khoảng $70
  • Linh kiện hiện đại tương đối rẻ; SPI VFD có thể khó kiếm, nhưng đã có trường hợp mua được trên eBay với giá $15
  • Cũng hỗ trợ cấu hình không gắn VFD và chỉ tương tác qua serial port

Quá trình làm video

  • Cảnh khởi động thực tế được tạo thành video bằng cách chụp ảnh trong khoảng 9 ngày
  • Nếu chụp ảnh 1920x1080 mỗi 2 giây, dữ liệu tạo ra khoảng 1,76GB mỗi giờ; 9 ngày chụp tương đương khoảng 379GB và khoảng 388.000 file
  • Các thiết bị Android gặp vấn đề treo hoặc quá nhiệt khi chụp trong thời gian dài; iPhone SE3 thì bản thân việc chụp ổn định, nhưng gặp vấn đề về dung lượng lưu trữ và offload ảnh
  • Cuối cùng, tác giả dùng iPhone 12 Pro Max 512GB để chụp liên tục toàn bộ quá trình, sau đó mount trên Linux bằng ifuse rồi dùng cp -Rvf để sao chép khoảng 400.000 file trong hơn 10 giờ
  • Video cuối cùng được dựng bằng các lệnh ffmpeg, và các đoạn nhàm chán được xử lý với tốc độ phát thay đổi
    • Tốc độ phát thay đổi từ 5FPS, tức 10x realtime, đến 960FPS, tức 1920x realtime
    • Phiên bản riêng không biên tập là capture 0,5FPS, playback 60FPS, tương đương tốc độ 120x realtime

Tài liệu công khai và giấy phép

  • Disk image cho thẻ SD được cung cấp dưới dạng tải xuống riêng
  • Gói main download bao gồm các mục sau
    • MCS-04 bus analyzer cho Saleae software
    • Mã nguồn i4004 DECstation 2100 emulator
    • Mã nguồn MIPS MBR và second-stage bootloader
    • Kernel config và version info
    • Mã nguồn u4004 emulator cho bo mạch Linux/4004
  • Giấy phép là miễn phí cho sử dụng phi thương mại; sử dụng thương mại cần giấy phép riêng
  • Với mọi hình thức sử dụng, phải ghi credit cho tác giả gốc trong cả source và binary form

2 bình luận

 
y15un 2024-09-21

Tác giả bài gốc chính là người vừa bị kéo xuống khỏi sân khấu ở DEF CON vì vụ liên quan đến badge lần này. Tôi sẽ không đứng về phía nào, nhưng dù sao thì năng lực của ông ấy thực sự rất đáng nể.

 
GN⁺ 2024-09-21
Các ý kiến trên Hacker News
  • Chà, tôi từng nghĩ NetBSD hiện đại chạy trên m68030 15MHz, bus bộ nhớ 16-bit, RAM 10MB đã chậm rồi, nhưng cái này đúng là điên rồ
    Nó cho thấy rất rõ rằng vào cuối thập niên 80 đến đầu thập niên 90, khi máy tính bắt đầu có bộ nhớ lưu trữ lâu dài, không gian địa chỉ mở và MMU, về cơ bản chúng ta đã đạt tới điện toán hiện đại
    Amiga 3000 hay máy tính i80486 cũng có thể chạy những thứ giống máy tính hiện đại; ngày nay chúng chạy nhanh hơn nhiều hoặc có thêm những thứ khi đó chưa có như GPU, nhưng về mặt chức năng thì không khác biệt lớn
    Thật hay khi Dmitry cho thấy có thể định nghĩa từ chức năng được một cách rộng rãi đến mức nào

    • Không biết ở Mỹ có vậy không, nhưng ở Liên Xô thập niên 70–80, cờ vua qua thư rất phổ biến
      Người ta gửi nước đi qua thư thật, và một ván có thể kéo dài vài tháng hoặc vài năm
      Đến lúc nhận được thư trả lời thì có khi đã quên chiến lược ban đầu, khiến cờ vua có thêm một tầng độ khó nữa; dự án này về cơ bản là Linux qua thư
      Đến khi có kết quả lệnh, có thể bạn đã quên vì sao mình chạy lệnh đó
    • m68030 15MHz, bus bộ nhớ 16-bit, RAM 10MB thì có phải Mac LC II không? :)
      Thực ra không phải cuối thập niên 80 đến đầu thập niên 90, mà khoảng cuối thập niên 1960 đã có thể làm được rồi
      Có lẽ cũng có thể port Linux sang IBM Model 67 [1], và vì GCC đã có thể nhắm tới tập lệnh đó nên có khi còn dễ
      MMU cũng đủ dùng; giới hạn tối đa 2MB bộ nhớ lõi nhanh đúng là khá căng, nhưng có lẽ cũng cùng hạng với cỗ máy 68030 kia, chỉ chậm hơn một chút
      Ảo hóa toàn phần và các ranh giới bộ nhớ/I/O do phần cứng cưỡng chế cũng đã được phát minh từ sớm, nhưng phải mất thời gian các tính năng này mới đi xuống minicomputer và microcomputer, và còn lâu hơn nhiều nữa phần mềm đại chúng mới tận dụng được
      [1] https://en.wikipedia.org/wiki/IBM_System/360_Model_67
    • Về cơ bản đây là khái niệm Turing-complete
      Bất kỳ hệ thống Turing-complete nào cũng có thể chạy bất cứ thứ gì; có thể cực kỳ chậm, nhưng vẫn chạy được
      Nếu có đủ thời gian thì ChatGPT cũng có thể chạy trên 4004
    • Đa lõi là một khác biệt chức năng khá lớn
      Nó giống như gắn một chiếc ô tô vào một bánh xe, rồi bánh xe đó có thêm ba bánh nữa
  • Huy hiệu người tham dự Hackaday Supercon 2002 (https://hackaday.com/2022/10/12/the-2022-supercon-badge-is-a...) đã triển khai một CPU 4-bit giả lập và một bảng điều khiển cho phép nhập lệnh trực tiếp rồi chạy/chạy từng bước
    Trên bảng điều khiển có màn hình cho phép xem một trang bộ nhớ theo từng bit, nên việc hiện thực một game bắn phi thuyền trên đó thật sự rất vui
    Việc so sánh kiến trúc Voya4 với 4004 cũng thú vị; có những thỏa hiệp tương tự, nhưng Voya4 có lợi thế từ 50 năm kinh nghiệm về tập lệnh CPU
    Tuy nhiên cách của dimitygr không dùng được với huy hiệu đó, vì cả bộ nhớ chương trình và RAM đều nằm sẵn bên trong PIC24 thực thi trình giả lập CPU
    Nhân tiện, CPU 4-bit vẫn còn được sản xuất và sử dụng. Nhiều điều khiển hồng ngoại sản xuất đại trà được lập trình bằng MCU 4-bit. Có thể xem datasheet tại https://www.emmicroelectronic.com/sites/default/files/produc...

    • Là năm 2022
  • Khi được hỏi liệu có thể chạy thứ gì đó trên một cỗ máy thiếu hiệu năng không, tôi thường lấy ví dụ AVR ra nói, giờ thì có thêm một ví dụ mới để dẫn link
    Nhìn vào tần số và mức tiêu thụ điện, tôi cũng tò mò nó phát RF nhiều đến đâu, và liệu có thể phát hiện rồi giải mã bằng waterfall của SDR không
    Tôi vẫn đang đọc, nhưng tới đoạn hiện tại thì thấy từ “soubroutine”, có vẻ là lỗi chính tả

  • Chà, dự án này chắc không hề rẻ. Nhờ các nhà sưu tầm trên eBay cả đấy
    Và có lẽ đây là tình huống duy nhất mà tôi sẽ chọn LCD thay vì VFD
    Nếu chạy một bản compile kéo dài vài năm, đến lúc xong thì VFD chắc đã bị burn-in nát bét

    • Cá nhân tôi thấy đây là một dự án xứng đáng nhận tiến sĩ danh dự
      Tiếc là có vẻ nhân viên các trường đại học không đọc HN nhiều lắm
  • Chà, ấn tượng thật
    Nhìn các bit PC cao là biết hiện đang chạy gì
    Tái bút: Dù vậy vẫn nhanh hơn tải kernel bằng ISO ảo qua IPMI tệ hại của một server ở bên kia Internet ;D

    • Nếu vừa nhìn LED lúc boot vừa chạy nm trên vmlinux thì có thể dễ dàng ánh xạ sang hàm kernel
      Sau khi vào user space, cũng có thể phân biệt binary chính (thấp hơn nhiều so với 0x01000000) và các thư viện chia sẻ (được nạp ở địa chỉ cao gần 0x77000000)
    • Câu chuyện tải kernel bằng ISO ảo qua IPMI tệ hại của một server bên kia Internet làm tôi nhớ lại lần cố boot một blade server Dell M1000e bằng ISO host qua NFS chạy trên Raspberry Pi
      Cả boot lẫn chạy đều chậm đến đau khổ
  • Bài viết thật sự thú vị
    Tôi từng đọc đôi chút về 4004 nên biết nó là một con chip kỳ lạ, nhưng mức độ khó hiểu thì vượt xa tưởng tượng
    Giờ tôi muốn xem nếu làm CPU với cùng số transistor thì có thể làm tốt đến mức nào
    Nó không ít hơn 6502 quá nhiều, và nếu là 8-bit thì lập trình có vẻ sẽ dễ hơn nhiều

    • Nếu làm bằng transistor thì tôi sẽ port trình giả lập MIPS của mình lên đó :)
  • Quay video mất 9 ngày, và tốn 4 giờ cho mỗi 1 giây giả lập
    Và tôi cũng tò mò vì sao lại dùng Windows 95

    • Đó là Windows 2000
      Tôi cần một laptop có cổng serial thật, không phải USB, để quay video
      Chiếc laptop này đáp ứng điều kiện và giá 20 đô trên eBay
      Cá nhân tôi thấy Windows 2000 là bản Windows đẹp nhất, nên đã cài nó cho video demo
    • Xin lỗi vì bắt bẻ chuyện nhỏ, nhưng laptop trong video trông giống Windows 2000
  • Thật sự rất ấn tượng
    Mình ước kiến thức của mình đủ để hiểu được phần lớn dự án này, nhưng hiện tại thì với trình độ khoa học máy tính hạn chế của mình, nó quá khó
    Dù vậy, điểm nổi bật mà mình có thể hiểu hoàn toàn là “Section 14.b & 14.c - Getting the data...”
    Chỉ cần vỏn vẹn 400.000 tệp, khoảng 275 bức ảnh mỗi ngày trong 4 năm là đủ
    Thật là một thời đại kỳ lạ: hiệu năng xử lý, lưu trữ và mạng thì dư dả đến vậy, nhưng các ứng dụng đồng bộ media có vẻ được dùng nhiều nhất lại bị treo hoặc đồng bộ chậm, AirDrop thì thất bại, còn chức năng UI “chọn tất cả” cũng không có :)

    • Không biết Dmitry có cân nhắc các công cụ đồng bộ như MobiusSync hay Syncthing để liên tục sao chép ảnh sang PC ngay khi chụp không
  • Những việc như thế này cần một thứ kiểu như giải Nobel

    • Gần nhất có lẽ là Ig Nobel Prize: https://en.wikipedia.org/wiki/Ig_Nobel_Prize
    • Trong lĩnh vực điện toán có Turing Award tương ứng
      Cũng có thể thêm một hạng mục ghi nhận các ứng dụng kỳ quặc và khác thường của khoa học máy tính
  • Trong phần “Why MIPS?”, có câu “một số chắc chắn sẽ chậm vì cơ chế định địa chỉ tệ hại (RISCV)”; vậy cơ chế định địa chỉ RISC-V có vấn đề gì?

    • Thực ra vấn đề gần với định dạng lệnh hơn là cơ chế định địa chỉ
      Trong một số lệnh của RISC-V, các bit giá trị tức thời không được lưu liên tiếp
      Trong lệnh MIPS, các bit giá trị cho cộng tức thời, nạp hằng, rẽ nhánh, v.v. luôn được lưu theo thứ tự
      Còn trong RISC-V, đôi khi các bit bị xáo trộn
      Ví dụ, trong nhánh vô điều kiện, các bit offset đích được lưu theo thứ tự bit 19, bits 9-0, bit 10, bits 18-11
      Với phần cứng thì chỉ cần nối dây đúng là được, nên chi phí sắp xếp lại gần như bằng không; nhưng trong phần mềm thì cần rất nhiều thao tác bit để chỉnh lại
      Lý do RISC-V làm như vậy là để đơn giản hóa thiết kế phần cứng
    • Nếu không định mô phỏng trên phần cứng có hiệu năng cực thấp thì có lẽ không phải vấn đề lớn