Home Homebrew Linux 2.4 arriva sulla prima PlayStation: il progetto che trasforma la PS1...

Linux 2.4 arriva sulla prima PlayStation: il progetto che trasforma la PS1 in un piccolo computer

174
0

La prima PlayStation continua a dimostrare di avere ancora molto da offrire alla scena homebrew. Blackroo Linux è un progetto che permette di eseguire Linux 2.4 direttamente su una console PlayStation originale, senza emulazione e senza la necessità di collegare un PC durante l’utilizzo.

Il sistema è stato adattato per funzionare sul processore MIPS R3000A a 33 MHz, con appena 2 MB di RAM e senza MMU.

Il kernel viene avviato da un CD-R e, una volta completato il caricamento, presenta una shell Linux direttamente sul televisore. L’input può essere fornito attraverso una vera tastiera collegata alla porta controller della console tramite un adattatore BlueRetro.

Il percorso di avvio è relativamente semplice da descrivere: BIOS → kloader dal CD → LINUX.EXE → psxcd individua ROOT.IMG → filesystem ext2 → /bin/sh.

Dietro questa sequenza, però, ci sono anni di lavoro per adattare Linux a un hardware che non è stato progettato per eseguire un sistema operativo.

Blackroo Linux rappresenta la rinascita di Runix, un porting di Linux per PlayStation abbandonato intorno al 2007. Il vecchio progetto aveva lasciato principalmente il codice del kernel, mentre gran parte del resto dell’infrastruttura era andata perduta.

La ricostruzione ha richiesto circa tre anni di ricerca intermittente, durante i quali sono stati studiati documenti, misurato il comportamento dell’hardware reale e verificato direttamente molte delle informazioni disponibili sulla PlayStation.

Il risultato è un sistema basato su Linux 2.4 e uClinux, pensato per l’architettura MIPS senza MMU della PS1.

Linux sulla PS1 funziona davvero

Blackroo Linux è stato testato su una vera PlayStation PAL SCPH-750x. Il sistema è riuscito a mantenere un uptime di oltre due ore, utilizzando circa 1.144 KB dei 1.856 KB di RAM disponibili al kernel, lasciando circa 712 KB liberi.

Il sistema identifica la macchina come una PlayStation equipaggiata con un MIPS R3000A a 33 MHz e utilizza una shell denominata brsh.

Non viene utilizzata una libc tradizionale: la shell effettua direttamente le syscall necessarie. L’output viene invece generato attraverso la GPU della PlayStation e visualizzato sul televisore.

La memoria disponibile al kernel è stata limitata intenzionalmente a 1.856 KB invece dei 2.048 KB fisicamente presenti. Gli ultimi 192 KB vengono infatti riservati al caricamento dei programmi tramite binfmt_fixed.

La PS1 non dispone di una MMU e, di conseguenza, non può assegnare dinamicamente gli indirizzi di memoria ai processi come farebbe un sistema moderno. Ogni programma deve essere caricato in una posizione prestabilita.

Per recuperare quei 192 KB è stato necessario eliminare componenti ritenuti troppo pesanti e inutili in questo ambiente, tra cui /proc, gran parte dello stack di rete, i pseudo-terminali, il pool di entropia e il caricatore dei moduli.

Come si interagisce con Linux

La PlayStation originale non possiede né una porta per tastiera né una connessione di rete. Blackroo Linux utilizza quindi due sistemi differenti per comunicare con la console.

Il primo è la porta seriale SIO1, utilizzata soprattutto durante lo sviluppo. Attraverso una connessione seriale è possibile caricare il kernel, visualizzare il log di avvio e utilizzare il monitor di debug BRMON.

Il secondo metodo permette invece di utilizzare la console senza un PC: una tastiera Bluetooth collegata attraverso BlueRetro.

Le porte controller della PlayStation utilizzano infatti un bus seriale. Un adattatore BlueRetro configurato in modalità tastiera può trasformare una tastiera Bluetooth in una periferica utilizzabile dalla PS1.

Il driver psxkbd.c interpreta i dati provenienti dall’adattatore e li inoltra al terminale virtuale di Linux.

Durante lo sviluppo sono emersi anche alcuni problemi interessanti. BlueRetro deve essere configurato esplicitamente come tastiera: l’adattatore comunica infatti il tipo di periferica collegata e utilizza valori differenti per gamepad e tastiera.

Inoltre, il protocollo trasmette eventi e non lo stato della tastiera. Per questo motivo due pacchetti identici non devono essere eliminati come duplicati, altrimenti le lettere ripetute possono andare perse.

Quando BlueRetro è configurato in modalità tastiera, il menu di kloader continua però ad aspettarsi un controller tradizionale. Per navigare nel menu è quindi necessario utilizzare ancora un gamepad.

Il supporto al mouse è già previsto

Gli sviluppatori stanno inoltre pianificando il supporto al mouse originale PlayStation. La periferica Sony utilizza lo stesso bus dei controller e dispone di un identificativo hardware 0x12, quindi può essere gestita direttamente senza dover emulare un mouse attraverso un protocollo homebrew.

L’idea è integrare il mouse all’interno del sistema di polling già utilizzato da psxkbd, evitando di creare un secondo driver che possa entrare in conflitto con le altre periferiche presenti sul bus, comprese le Memory Card.

Questo supporto è considerato importante anche in vista dello sviluppo di un futuro ambiente desktop per Blackroo Linux.

Compilare Blackroo Linux

La compilazione del progetto è stata volutamente semplificata. Dopo aver scaricato il repository è sufficiente eseguire il comando ./bootstrap.sh.

Lo script controlla l’ambiente di sviluppo, indica gli eventuali pacchetti apt mancanti, scarica la toolchain necessaria e compila automaticamente kernel, userland, bootloader e immagini del disco. Lo script non richiede privilegi root.

Al termine della compilazione, nella cartella output/ vengono generati diversi file.

  1. linux.elf contiene il kernel, mentre blackroo.exe contiene kernel e initrd all’interno di un PS-EXE utilizzabile per il caricamento tramite seriale.
  2. blackroo_noinitrd.exe contiene invece solamente il kernel ed è destinato all’utilizzo con un filesystem root presente su un dispositivo reale.
  3. Viene inoltre generato ROOT.IMG, cioè il filesystem ext2 contenuto nel disco, oltre a blackroo-kloader.bin, l’immagine del disco accompagnata dai relativi file .cue e .toc.

La toolchain non è inclusa direttamente nella repository. Il kernel richiede EGCS 2.91.66, un compilatore risalente al 1999 che rappresenta l’ultima versione con cui questo particolare ramo Linux 2.4 no-MMU viene compilato correttamente.

Lo script bootstrap.sh provvede a recuperarla, mentre la documentazione presente nella cartella sdk/ contiene ulteriori informazioni.

Creare il CD-R

Una volta compilato il progetto è possibile creare il disco utilizzando un CD-R. Il comando indicato dal progetto è:


cdrdao write --device /dev/sr0 --driver generic-mmc-raw -n --eject \
    output/blackroo-kloader.toc

Il CD contiene il bootloader, il kernel e il filesystem necessario all’avvio di Linux. La creazione del disco presenta però una particolarità legata al funzionamento della PlayStation originale.

Il problema della protezione dei dischi PS1

Una PlayStation originale non accetta semplicemente qualsiasi CD-R masterizzato. Il disco deve superare il controllo legato alla cosiddetta wobble groove, una caratteristica fisica dei CD originali che non può essere riprodotta durante una normale masterizzazione.

Per questo motivo è necessario utilizzare una console modificata, ad esempio attraverso un modchip.

Esiste però anche un secondo controllo effettuato dalla console. Alcuni settori del disco devono contenere una license area valida, in particolare i settori 12-15 in Mode 2 Form 2.

Il problema è che mkpsxiso genera quei settori con contenuti vuoti. Il risultato è un disco che può superare il primo controllo ma che viene comunque bloccato dalla console durante l’avvio, mostrando la schermata SCE senza il normale logo.

Per risolvere il problema, iso/build-iso.sh copia i primi 16 settori da un’immagine valida. Il progetto include quindi LICENSEE.DAT per i sistemi PAL e LICENSEA.DAT per le console NTSC-U.

Anche la verifica della masterizzazione deve essere effettuata nel modo corretto. Il progetto consiglia di leggere il disco con il comando dd if=/dev/sr0. bs=2048 e di evitare cdrdao --read-raw, poiché alcune unità ottiche possono restituire zeri e far sembrare difettosa una masterizzazione perfettamente funzionante.

Il supporto alle Memory Card

Prima di poter utilizzare il CD-ROM come dispositivo di archiviazione era necessario avere almeno un altro sistema per conservare i dati.

La soluzione è rappresentata dalle Memory Card PlayStation da 128 KB, collegate allo stesso bus seriale dei controller.

Il driver drivers/block/bu.c permette di gestire fino a otto Memory Card attraverso un multitap, presentandole al sistema come un unico dispositivo a blocchi denominato /dev/bul, con una capacità complessiva di circa 508 KB.

Durante lo sviluppo sono stati individuati diversi problemi. Uno di questi era una condizione di gara nel meccanismo di risveglio del driver.

L’interrupt di conferma della Memory Card poteva arrivare prima che il driver entrasse nello stato di attesa, provocando un blocco permanente. Questo spiegava perché il rilevamento funzionasse negli emulatori ma fallisse sull’hardware reale.

È stato inoltre necessario correggere l’indirizzamento del multitap e il modo in cui venivano riconosciute le Memory Card Sony originali.

Il driver inizialmente accettava infatti soltanto schede il cui blocco 0 contenesse un particolare identificatore. Una Memory Card Sony appena acquistata veniva quindi considerata inesistente fino alla formattazione.

Un altro problema particolarmente curioso riguardava il timing. Il driver funzionava soltanto quando era attivo il codice di debug.

I messaggi stampati sulla seriale introducevano casualmente un ritardo di circa 2 millisecondi, sufficiente a permettere all’hardware di stabilizzarsi dopo l’attivazione della linea di selezione.

È una lezione importante per lo sviluppo di driver hardware: se un dispositivo funziona soltanto quando il debug è attivo, è molto probabile che ci sia un problema di temporizzazione.

Finalmente il CD-ROM della PlayStation

Uno dei risultati più importanti di Blackroo Linux è il supporto al lettore CD-ROM della PS1.

Secondo gli sviluppatori, nessun precedente port Linux o BSD per PlayStation disponeva di un driver CD-ROM funzionante. Blackroo introduce drivers/block/psxcd.c, un driver Linux che espone il lettore come dispositivo a blocchi e permette di leggere settori da 2048 byte.

Il filesystem root viene quindi caricato direttamente dal CD. Il driver non è stato scritto partendo da semplici supposizioni. Gli sviluppatori hanno prima utilizzato BRMON, un monitor seriale integrato direttamente nel kernel, per verificare individualmente ogni operazione sull’hardware.

Sono stati inizialmente implementati i comandi cd init, cd stat e cd rd, che permettevano di inizializzare il lettore, verificarne lo stato e leggere un settore utilizzando un metodo PIO, senza DMA e senza interrupt.

Una volta verificato che il controller rispondesse correttamente, è stato introdotto il DMA.

Il comando cd cmp permette di leggere lo stesso settore attraverso PIO e DMA e di confrontare tutti i 2048 byte restituiti. Quando i due risultati coincidono a indirizzi differenti, il percorso dei dati può essere considerato verificato.

Sono stati inoltre confrontati gli accessi cached e uncached alla stessa area di memoria per verificare il comportamento della cache del R3000A.

I comportamenti particolari del CD-ROM

Il lettore della PlayStation presenta diverse caratteristiche che hanno richiesto un’attenzione particolare.

Gli accessi alle porte del CD-ROM devono essere effettuati a 8 bit. Una lettura a 32 bit restituisce infatti lo stesso byte quattro volte.

Prima di ogni ReadN deve inoltre essere eseguito Setloc. Una lettura effettuata dopo una Pause senza reimpostare la posizione può restituire nuovamente il settore precedente, provocando una corruzione silenziosa dei dati.

Anche il comando Pause deve essere utilizzato con attenzione. Dopo una discontinuità il controller può ignorare i comandi per circa un secondo. Inviare Setloc e ReadN durante questa finestra può produrre risposte apparentemente valide ma riferite al comando precedente.

Un altro problema riguarda gli indirizzi della memoria. Il kernel è collegato nella regione KUSEG, quindi gli indirizzi dei simboli corrispondono già agli indirizzi fisici.

Utilizzare il tradizionale alias uncached con addr | 0x20000000 porta a indirizzi completamente fuori dalla memoria disponibile della PS1 e può bloccare la console senza produrre alcun output.

Il filesystem viene individuato automaticamente

Il kernel non contiene un LBA fisso per ROOT.IMG. Il driver legge il volume descriptor ISO9660, analizza la directory principale e cerca il file ROOT.IMG.

Questo permette di ricostruire il disco senza dover ricompilare il kernel ogni volta. Lo stesso meccanismo può essere verificato sul PC prima di consumare un altro CD-R utilizzando lo script tools/host/iso-find.py.

Collegare la PlayStation al PC tramite seriale

La porta SIO1 presente sul retro della PlayStation rappresenta il principale strumento di sviluppo.

Sono sufficienti tre collegamenti tra la console e un adattatore FTDI compatibile con logica a 3,3 V. È fondamentale evitare adattatori TTL a 5 V, che potrebbero danneggiare la console.

Il collegamento prevede massa comune e l’incrocio delle linee TX e RX:


PS1 SIO1                 Adattatore USB

Pin 2  GND  ───────────  GND
Pin 5  RXD  ───────────  TXD
Pin 8  TXD  ───────────  RXD

Non sono necessari i segnali di handshake. La comunicazione utilizza 115200 baud, 8N1. Per individuare la porta seriale corretta è possibile utilizzare il comando python3 tools/host/blackroo-serial.py /dev/ttyUSB0 diag

Lo script cerca il segnale BK>> trasmesso dal kloader. Se la porta è quella corretta, la console risponderà.

Caricare il kernel senza masterizzare un CD

Una delle funzioni più utili della connessione seriale è la possibilità di caricare un nuovo kernel direttamente nella console. Dal menu di kloader bisogna selezionare Serial Shell (115200) e quindi eseguire sul PC il comando python3 tools/host/blackroo-serial.py /dev/ttyUSB0 upload output/blackroo.exe.

La velocità è di circa 10,4 KB/s, quindi il caricamento di un kernel richiede all’incirca 80 secondi.

È inoltre possibile modificare temporaneamente la command line del kernel tramite --cmdline "root=...". In questo modo è possibile testare un dispositivo root differente senza dover masterizzare ogni volta un nuovo CD.

Lo script scripts/serial-autoupload.sh permette anche di automatizzare il caricamento attraverso un ciclo di tentativi.

BRMON: il monitor per parlare direttamente con l’hardware

BRMON è uno degli strumenti più importanti utilizzati durante lo sviluppo.

Inserendo brmon nella command line del kernel, il sistema entra in un monitor direttamente dal quale è possibile interrogare l’hardware prima del montaggio del filesystem. Lo stesso monitor viene utilizzato quando si verifica un panic.

Tra i comandi disponibili troviamo cpu, per visualizzare lo stato della CPU, della cache e del COP0, mem per la memoria, hw per l’hardware rilevato e peek e poke per leggere e scrivere registri hardware.

Sono presenti anche comandi specifici per le Memory Card, il CD-ROM e la tastiera. Ad esempio:


blackroo> cpu
blackroo> mem
blackroo> hw
blackroo> peek 1f801814
blackroo> poke 1f801814 ...
blackroo> md 80010000 100
blackroo> card
blackroo> cd rd 16
blackroo> cd cmp 16
blackroo> blk d1 0 10 800
blackroo> kbd
blackroo> cont

Il vantaggio di questo sistema è che il monitor non utilizza interrupt, scheduler o altri driver che possano interferire con il bus. Se qualcosa non funziona durante un test BRMON, il problema può quindi essere ricondotto molto più facilmente al collegamento o al protocollo hardware.

Una shell Linux con appena 2 MB di RAM

Una volta completato il boot, Blackroo Linux mette a disposizione una piccola shell denominata brsh.

L’assenza di una MMU comporta però importanti limitazioni. Non sono disponibili il normale fork(), il demand paging, il copy-on-write o l’isolamento completo degli indirizzi tra processi.

I programmi vengono caricati in una posizione fissa attraverso fs/binfmt_fixed.c. La shell include diversi strumenti essenziali, tra cui ls, cat, hexdump, stat, cd, pwd, mkdir, rmdir, rm, cp e mv.

Tutto è stato realizzato in modalità freestanding, utilizzando syscall dirette e senza una libc.

Un solo programma può essere residente contemporaneamente nella memoria dedicata allo spazio utente. Per questo motivo non è possibile avere una situazione paragonabile a una distribuzione Linux tradizionale con numerosi processi indipendenti.

L’output viene mostrato sul televisore tramite la GPU della PlayStation e contemporaneamente replicato sulla porta seriale.

Con una tastiera collegata tramite BlueRetro, la console può quindi essere utilizzata senza alcun PC collegato.

Il futuro del progetto

Blackroo Linux è ancora un progetto sperimentale, ma la base realizzata dagli sviluppatori è già sorprendentemente completa.

La roadmap prevede ulteriori miglioramenti al supporto hardware e, soprattutto, lo sviluppo di un ambiente desktop. Il supporto al mouse originale PlayStation rappresenta uno dei passaggi necessari per arrivare a questo obiettivo.

Il progetto dimostra soprattutto che una PlayStation originale, nonostante i suoi 2 MB di RAM, il processore MIPS R3000A da 33 MHz e l’assenza di una MMU, può essere trasformata in un piccolo computer Linux completamente autonomo.

Download: Blackroo Linux Little Joey v0.5.0 first public alpha

Download: Source code Blackroo Linux Little Joey v0.5.0 first public alpha

Alcune parti di questo articolo sono state generate con l’aiuto dell’intelligenza artificiale.

🔥 Prodotti in promozione e articoli più venduti: PS5

Vedi altri prodotti PS5

Questo articolo contiene link affiliati a Amazon. Se acquisti tramite questi link, potrei guadagnare una commissione senza costi aggiuntivi per te.

Ultimo aggiornamento 2026-09-09 / Link di affiliazione / Immagini da Amazon Product Advertising API

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui
Captcha verification failed!
Punteggio utente captcha non riuscito. Ci contatti per favore!

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.