Utility di copia disco ad alte prestazioni in Assembly x86_64, con interfaccia grafica GTK3.
Autore: losciuto — con il supporto di Antigravity Versione: 1.0.1 Licenza: GPL-3.0 Piattaforma: Linux x86_64
- Descrizione
- Caratteristiche
- Requisiti di Sistema
- Installazione Dipendenze
- Compilazione (Principio Didattico)
- Utilizzo
- Struttura del Progetto
- Protocollo Pipe
- Benchmark Comparativo
- Quando usare questo tool invece di
dd - Test
- CI/CD e Release Automatizzate
- Roadmap
- Licenza
MetalAsmDiskCopy è un insieme di utility di copia disco scritte interamente in Assembly x86_64 che accedono direttamente alle syscall del kernel Linux, senza passare per la libreria C standard (libc).
Il progetto nasce come esercizio didattico avanzato che dimostra come sia possibile implementare un tool affidabile e performante operando al livello più basso del sistema operativo. Le due versioni Assembly (NASM e GNU AS) sono accompagnate da un'interfaccia grafica GTK3 in C che le controlla in tempo reale tramite un protocollo pipe dedicato.
Il punto di eccellenza del progetto è avere il sorgente sotto controllo completo: ogni byte che transita tra la sorgente e la destinazione passa attraverso codice che comprendi, puoi auditare e puoi estendere in qualsiasi direzione.
- Accesso syscall diretto — nessuna dipendenza da libc in runtime
- Architettura Dual-Bar — barre di progresso indipendenti per Lettura (Cache) e Scrittura (Disco)
- Buffer I/O High-Performance — allocato con
mmap, ottimizzato a 64MB per massimizzare il throughput - Sincronizzazione Reale — uso di
fsyncad ogni blocco per un feedback visivo "onesto" sulla velocità del supporto - Lettura fullblock — accumula i byte nel buffer prima di scrivere, evita scritture parziali
- Gestione partial writes — il loop di scrittura garantisce che ogni byte venga inviato
fadvise64(NASM/GAS) — hint al kernel per read-ahead sequenziale ottimizzato- Protocollo pipe esteso — messaggi
R:,W:,S:per il controllo granulare della GUI - Interfaccia grafica GTK3 — selezione dispositivi, scelta motore, benchmark comparativo
- Modalità headless
--test-mode— test automatizzati senza display grafico
| Componente | Versione minima | Note |
|---|---|---|
| Linux | kernel >= 4.14 | qualsiasi distribuzione x86_64 |
| NASM | >= 2.14 | per disk_copy.asm |
GNU Binutils (as, ld) |
>= 2.30 | per disk_copy_as.s e il linking |
| GCC | >= 8.0 | per gui.c |
| GTK+ | >= 3.20 | per l'interfaccia grafica |
Testato su:
- Ubuntu 24.04 LTS (NASM 2.16, GAS 2.42, GCC 13.3, GTK 3.24)
Su sistemi Debian/Ubuntu:
# Strumenti di assemblaggio e linking
sudo apt install nasm binutils
# Compilatore C e librerie GTK3
sudo apt install gcc libgtk-3-dev pkg-configIl progetto è strutturato per essere compilato in modo trasparente e modulare, permettendo di comprendere come i tre componenti interagiscono.
Il modo più semplice per compilare tutto è usare il Makefile incluso:
# Compila tutti i target (disk_copy, disk_copy_as, gui)
make
# Pulizia dei file compilati
make cleanPer comprendere cosa succede "sotto il cofano", puoi eseguire manualmente i comandi di build:
Motore NASM (Sintassi Intel):
nasm -f elf64 disk_copy.asm -o disk_copy.o
ld disk_copy.o -o disk_copyMotore GNU AS (Sintassi AT&T):
as disk_copy_as.s -o disk_copy_as.o
ld disk_copy_as.o -o disk_copy_asInterfaccia GTK3 (C):
gcc gui.c -o gui `pkg-config --cflags --libs gtk+-3.0`Attenzione: La copia su dispositivi raw (
/dev/sdX) richiede privilegi di root. L'interfaccia grafica usapkexecper richiederli automaticamente. Da riga di comando, anteponisudo.
./gui./disk_copy <sorgente> <destinazione> [buffer_size_byte]./disk_copy_as <sorgente> <destinazione> [buffer_size_byte]MetalAsmDiskCopy/
├── .github/workflows/ # Integrazione Continua (CI/CD)
│ └── release.yml # Workflow per build e release automatizzate
├── disk_copy.asm # Assembly x86_64 (NASM, sintassi Intel)
├── disk_copy_as.s # Assembly x86_64 (GNU AS, sintassi AT&T)
├── gui.c # Interfaccia grafica GTK3
├── style.css # Tema visivo dell'interfaccia
├── Makefile # Build system
├── VERSION # Versione corrente
├── CHANGELOG.md # Storico delle modifiche
├── LICENSE # GNU GPL v3.0
└── README.md # Questo file
I programmi Assembly comunicano con la GUI scrivendo su stdout stringhe formattate. La GUI analizza i prefissi per aggiornare gli elementi visivi in tempo reale:
| Prefisso | Messaggio | Descrizione |
|---|---|---|
R:<bytes> |
Progresso Lettura | Aggiorna la Barra Blu (velocità cache/sorgente) |
W:<bytes> |
Progresso Scrittura | Aggiorna la Barra Verde (velocità fisica disco) |
S:SYNC |
Inizio Sync | Notifica l'inizio della fase di fsync finale |
Test effettuato su un file da 500MB (Linux 6.x, x86_64):
| Motore | Tempo Totale | Velocità Media | CPU Usage |
|---|---|---|---|
NASM (disk_copy) |
13.0s | ~38 MB/s | 0% |
GAS (disk_copy_as) |
9.1s | ~55 MB/s | 0% |
| dd (conv=fsync) | 10.1s | ~49 MB/s | < 1% |
Nota: La variazione tra i motori è principalmente dovuta allo stato della Page Cache del sistema durante i test consecutivi.
Questo progetto utilizza GitHub Actions per garantire che il software sia sempre compilabile.
- Ogni push sul repository avvia una build di test.
- Ogni volta che viene creato un tag (es.
git tag v1.0.0), il sistema compila automaticamente i tre binari per Linux x86_64 e crea una Release ufficiale scaricabile.
Questo progetto è distribuito sotto licenza GNU General Public License v3.0. Vedi il file LICENSE per il testo completo.