Skip to content

losciuto/MetalAsmDiskCopy

Repository files navigation

MetalAsmDiskCopy

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


Indice


Descrizione

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.


Caratteristiche

  • 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 fsync ad 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

Requisiti di Sistema

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)

Installazione Dipendenze

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-config

Compilazione (Principio Didattico)

Il progetto è strutturato per essere compilato in modo trasparente e modulare, permettendo di comprendere come i tre componenti interagiscono.

1. Compilazione Automatica (Makefile)

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 clean

2. Compilazione Manuale (Scopo Didattico)

Per 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_copy

Motore GNU AS (Sintassi AT&T):

as disk_copy_as.s -o disk_copy_as.o
ld disk_copy_as.o -o disk_copy_as

Interfaccia GTK3 (C):

gcc gui.c -o gui `pkg-config --cflags --libs gtk+-3.0`

Utilizzo

Attenzione: La copia su dispositivi raw (/dev/sdX) richiede privilegi di root. L'interfaccia grafica usa pkexec per richiederli automaticamente. Da riga di comando, anteponi sudo.

Interfaccia Grafica

./gui

Riga di Comando — NASM

./disk_copy <sorgente> <destinazione> [buffer_size_byte]

Riga di Comando — GNU AS

./disk_copy_as <sorgente> <destinazione> [buffer_size_byte]

Struttura del Progetto

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

Protocollo Pipe

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

Benchmark Comparativo

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.


CI/CD e Release Automatizzate

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.

Licenza

Questo progetto è distribuito sotto licenza GNU General Public License v3.0. Vedi il file LICENSE per il testo completo.

About

disk image copy with asm code

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors