ASM Programmazione multicore su processore Intel x86_64

Stato
Discussione chiusa ad ulteriori risposte.

Barbossa

Utente Electrum
30 Gennaio 2016
392
16
83
139
Buongiorno
conoscete per caso qualche guida/manuale (anche in inglese) per poter sfruttare tramite il linguaggio assembly i core di un microprocessore Intel con architettura IA-32e, senza utilizzare le librerie del sistema operativo (poiché il programma che devo creare deve essere eseguito direttamente dal microprocessore su un calcolatore senza S.O.)
 
In realtà dipende che cosa intendi esattamente.
Intanto onestamente non riesco a capire per quale motivo con un processore così potente tu abbia bisogno di scrivere in assembly.
Il fatto di non avere un sistema operativo non è di per se una giustificazione per vari motivi.
Prima di tutto per lavorare così dovresti scrivere tu stesso il bootloader, quando invece sarebbe molto più comodo utilizzarne uno lightweight di linux come ad esempio quello di uClinux.
Seconda cosa, anche quando si sviluppa per microcontrollori si è nella tua stessa e identica situazione, eppure si scrive in C.
Terza cosa, è assurdo leggere manualli di oltre mille pagine quando Intel stessa ha rilasciato il TBB che fa esattamente quello che chiedi.
Bisogna considerare seriamente l'effort totale dell'attività e i vantaggi che se ne traggono. La possibilità di usare un linux from scratch e di compilare un kernel minimale con abilitate soltanto le features e le periferiche che si vogliono usare è sicuramente una buona scelta su un processore del genere.
A quel punto avrai la possibilità di usare TBB e di cross-compilare tutto il codice che vuoi su un altra macchina ed eseguirlo sul tuo IA-32 con delle prestazioni praticamente real-time.
Il motivo per cui non si trova molta documentazione a riguardo è fondamentalmente questo: non esiste una reale necessità di fare un lavoro del genere su un processore di quella potenza.
Ma in caso contrario, devi necessariamente usare il manuale di Intel, perchè tutti gli esempi che ci sono chiaramente non saranno scritti in assembly dal momento l'unico kernel open è scritto in C, e sinceramente ci vuole un bel po' di tempo per produrre una documentazione esaustiva partendo dal bytecode.
 
Scusate se vado off topic, ma come mai nella maggior parte dei manuali che trattano l'assembly si utilizza la piattaforma Linux?
 
Scusate se vado off topic, ma come mai nella maggior parte dei manuali che trattano l'assembly si utilizza la piattaforma Linux?
Perchè Linux è praticamente l'unica possibilità che hanno le case costruttrici di qualsiasi cosa per contenere (a volte azzerare) i costi delle licenze.
Parlare di assembly su altre piattaforme può anche avere senso, ad esempio nel reverse engineering, ma sicuramente non è un argomento che ha un nutrito interesse commerciale.
Oltretutto ormai l'assembly è usato pochissimo in quanto la potenza dei calcolatori ne rende pressochè inutile l'utilizzo.
 
  • Mi piace
Reazioni: Yosiri
In realtà dipende che cosa intendi esattamente.
Intanto onestamente non riesco a capire per quale motivo con un processore così potente tu abbia bisogno di scrivere in assembly.
Il fatto di non avere un sistema operativo non è di per se una giustificazione per vari motivi.
Prima di tutto per lavorare così dovresti scrivere tu stesso il bootloader, quando invece sarebbe molto più comodo utilizzarne uno lightweight di linux come ad esempio quello di uClinux.
Seconda cosa, anche quando si sviluppa per microcontrollori si è nella tua stessa e identica situazione, eppure si scrive in C.
Terza cosa, è assurdo leggere manualli di oltre mille pagine quando Intel stessa ha rilasciato il TBB che fa esattamente quello che chiedi.
Bisogna considerare seriamente l'effort totale dell'attività e i vantaggi che se ne traggono. La possibilità di usare un linux from scratch e di compilare un kernel minimale con abilitate soltanto le features e le periferiche che si vogliono usare è sicuramente una buona scelta su un processore del genere.
A quel punto avrai la possibilità di usare TBB e di cross-compilare tutto il codice che vuoi su un altra macchina ed eseguirlo sul tuo IA-32 con delle prestazioni praticamente real-time.
Il motivo per cui non si trova molta documentazione a riguardo è fondamentalmente questo: non esiste una reale necessità di fare un lavoro del genere su un processore di quella potenza.
Ma in caso contrario, devi necessariamente usare il manuale di Intel, perchè tutti gli esempi che ci sono chiaramente non saranno scritti in assembly dal momento l'unico kernel open è scritto in C, e sinceramente ci vuole un bel po' di tempo per produrre una documentazione esaustiva partendo dal bytecode.
E' un progetto sperimentale per il calcolo parallelo massivo: in parole povere sono vari microprocessori (anche multicore) controllati da un calcolatore centrale (con SO Linux) per operare parallelamente con elevata efficienza alla risoluzione di determinati problemi fisico-matematici.

Devo scrivere per questi microprocessori(-slave) un inizializzatore che gli permette di collegarsi al calcolatore(-master) per ricevere i dati, quindi elaborarlo tramite un opportuno algoritmo e quindi fornire una soluzione.

Su questi processori non utilizzo Linux per vari motivi:
1: Totale assenza di multitasking (dato che i microprocessori devono svolgere solo un algoritmo alla volta il mutlitasking peggiorerebbe l'efficienza che, se su un normale personal computer sarebbe trascurabile, ne risentirebbe nel mio caso);
2: La funzione di controllo viene svolta dal calcolatore centrale (devo solo creare un inizializzatore per i microprocessori-slave, in particolare l'assembly mi serve solo per comunicare con l'hardware, per il resto utilizzo il linguaggio C);
3: Un kernel Linux per ciascun microprocessore-slave mi sembra eccessivo, anche se minimale.

A questo progetto ovviamente non lavoro da solo, ma siamo una decina circa. Grazie comunque per le dritte, magari daremo uno sguardo al sorgente di uClinux e del TBB, troveremo sicuramente qualcosa di interessante.
 
2: La funzione di controllo viene svolta dal calcolatore centrale (devo solo creare un inizializzatore per i microprocessori-slave, in particolare l'assembly mi serve solo per comunicare con l'hardware, per il resto utilizzo il linguaggio C);

Eh beh, questa è una cosa non trascurabile. Che in fin dei conti da senso a tutto il resto. Da come era scritto il primo post mi era parso di capire che volessi scrivere delle applicazioni per il microprocessore in assembly.
Ma in realtà tutta la parte di inizializzazione e quello che ci sta attorno potrai scriverla in C, e questo è abbastanza ragionevole (oltretutto di quella parte potrai trovare un mucchio di esempi). Per quanto riguarda i calcoli, è vero che dovrai scriverlo in assembly, ma è anche vero che per quello invece che 1000 pagine di manuale te ne serviranno solo qualche decina, poi stiamo parlando di chip IA-32, che non è un microcontrollore texas instruments del 1995 dimenticato da tutti, quindi di esempi validi su quelle istruzioni ne troverete un buon numero, anche FPU che di solito è la parte meno facile da gestire.
 
No, per l'inizializzatore purtroppo non ci basta il C, almeno se vogliamo sfruttare tutti i core dei microprocessori-slave in quanto dovremo lavorare con l'APIC e gli interrupt hardware, e su questo argomento non ci sono molti esempi sulla rete (se escludiamo i codici sorgente degli ultimi bootloader open-source).

P.S. un po' off topic: Non utilizziamo l'FPU, ma i registri XMM proprio perché sono più facili da gestire e con l'architettura IA-32e hanno aggiunto nuove caratteristiche interessanti.
 
P.S. un po' off topic: Non utilizziamo l'FPU, ma i registri XMM proprio perché sono più facili da gestire e con l'architettura IA-32e hanno aggiunto nuove caratteristiche interessanti.
Ah si va bene, per SSE se ne trova di meno di materiale, ma comunque qualcosa si trova poi detto tra noi le istruzioni non sono tantissime.

Per quanto riguarda i bootloader è sicuramente necessaria qualche linea di assembly, sebbene i bootloaders abbiano una preponderanza di C.
 
Stato
Discussione chiusa ad ulteriori risposte.