Προς το περιεχόμενο

Pointers ? ?


CHRIS_MALL

Προτεινόμενες αναρτήσεις

Δημοσ.
Κάτσε βρε' date=' δεν υποτίθεται ότι θα έπρεπε να έχει το ποδαράκι σηκωμένο; :-)

Σ' αυτό περιμένω παράδειγμα, γιατί εμένα μου ακούγεται extreme να μπορώ να δηλώσω έναν pointer που να δείχνει έξω από το address space του Η/Υ... Ο pointer απ' όσο ξέρω εξαρτάται πάντα απ' το μηχάνημα, ο int βέβαια μπορεί να ορίζεται ανάλογα με τον compiler...[/quote']

 

Cpu δεν ειναι μονο οι IAXX.

 

http://focus.ti.com/docs/prod/folders/print/tms320vc5471.html

 

DSP, με 32 bit data bus και 40 bits accummulator.

 

>
The DSP subsystem includes a memory paging scheme to extend the number of addressable program space
locations from 64K to 1M words. The four extended address pins (DSP_A16 to DSP_A19) are used to address
15 pages of program memory. Each page includes 64K addressable locations. The extended program
addresses are supported by eight instructions: FB[D], FBACC[D], FCALA[D], FCALL[D], FRET[D],
FRETE[D], READA, and WRITA.
• FB[D] – Far branch
• FBACC[D] – Far branch to the location specified by the value in accumulator A or accumulator B
• FCALA[D] – Far call to the location specified by the value in accumulator A or accumulator B
• FCALL[D] – Far call
• FRET[D] – Far return
• FRETE[D] – Far return with interrupts enabled
• READA – Read program memory addressed by accumulator A and store in data memory
• WRITA – Write data to program memory addressed by accumulator A

 

Ειναι κάτι που χρησιμοποίεται συχνά. Το address space ειναι ακριβό.

Αν θελεις να εχεις μια γρήγορη μνήμη και μια αργή τι θα κάνεις;

Aν θες μια γρήγορη και 10 αργές;

Σελιδουλες, χρειαζεσαι και η cpu σου να υποστηρίζει διαφορετικά wait states για κάθε κομματι της μνήμης.

 

Το συγκεκριμένο dsp εχει c compiler και μπορεις να γράφεις 32 bit pointers (εγώ που ειχα το 16 bit data bus, μπορουσες πάλι να γράφεις 32 bit pointers).

Δημοσ.

Ναι, τα φιλολογικά που έλεγα.

Απ' ότι βλέπω στα manual τα παλιότερα μοντέλα του ίδιου DSP (’541–’546) είχαν 16 bit address space και η WRITA για παράδειγμα χρησιμοποιούσε κι αυτή το 16 bit address bus. Μετά χρειάστηκαν παραπάνω μνήμη και κατέφυγαν σε κόλπα (στα μοντέλα ’548, ’549) για διατήρηση της συμβατότητας, όπως έγινε και με τα pc (real mode 8086=>protected mode 80286=>extended mode 80386). Το instruction set ΔΕΝ υποστηρίζει ολόκληρο το 23 bit ψευτο-address bus. Τυχαίο παράδειγμα από το instruction manual:

BACC[D] src:

This instruction passes control to the 16-bit address in the low part of src (bits

15–0). If the branch is delayed (specified by the D suffix), the two 1-word

instructions or the one 2-word instruction following the branch instruction is

fetched from program memory and executed.

 

Επομένως εδώ και το address bus και οι καθαροί pointers είναι 16 bit.

 

Για να βολέψουν τους high level προγραμματιστές θα πρέπει να κάνουν (φυσικά) workarounds ώστε να αντιστοιχούν την 23-bit διεύθυνση στο νεοεισαχθέν extended address space. Το να δηλώσουν βέβαια 23 bit pointers δεν είναι δυνατόν, αφού η μνήμη είναι οργανωμένη σε byte. Εξάλλου στο μέλλον μπορεί να βάλουν κι άλλο extended address space. Επομένως κάνουν workarounds και μεταφράζουν τον pointer σε ένα σωρό εντολές για την προσπέλαση διαφορετικών pages. Αν θες απόδειξη γι' αυτό γράψε μια εντολή *a = 5 και κάνε post την αντίστοιχη assembly που βγάζει ο c compiler.

 

Δεν μιλάμε πια για αρχιτεκτονική αλλά για software τεχνάσματα, emulation από την πλευρά του compiler κτλ. Δεν χρειάζεται να ψάχνεις τέτοια extreme παραδείγματα για τέτοιες φιλολογικές συζητήσεις, υπάρχουν και πιο απλά παραδείγματα:

 

Αν π.χ. σου έλεγα ότι φτιάχνω έναν C compiler που να υποστηρίζει 19bit διευθύνσεις σε real-mode DOS κάνοντας memory mapping σε extended-mode memory μέσω paging και χρησιμοποιώντας το EMM386.EXE για το "κατέβασμα" των σελίδων από το extended address space στο 16-bit που υποστηρίζεται από real mode, τι θα έλεγες; Ότι έχω 19bit pointers;

 

Εγώ πάντως μέχρι στιγμής μιλούσα για pointers που αντιστοιχούν σε εντολές μηχανής, όχι σε emulation από τον compiler. Με emulation κάνουμε ότι θέλουμε, π.χ. 123bit pointers που να αντιστοιχούν σε 69 διαφορετικούς υπολογιστές συνδεδεμένους με SDSM (Software Distributed Shared Memory).

 

Γι' αυτό λέω ότι κατάντησε φιλολογικό και δεν έχει νόημα να συζητηθεί περαιτέρω.

 

Αν θελεις να εχεις μια γρήγορη μνήμη και μια αργή τι θα κάνεις;

Αυτό λέγεται NUMA (Non Uniform Memory Architecture) και οι αντίστοιχες αρχιτεκτονικές δεν είναι απαραίτητο να είναι οργανωμένες σε σελίδες. Το paging κυρίως υπάρχει για την υποστήριξη virtual μνήμης (ώστε το swapping να έχει συγκεκριμένο block size, π.χ. 4K).

 

Υ.Γ. αν επιμένεις ότι οι pointers στο παραπάνω DSP είναι "κανονικά" 32bit, τότε κάνε ένα παράδειγμα προγράμματος στο οποίο να ΣΕ ΑΦΗΣΕΙ o compiler να χρησιμοποιήσεις διεύθυνση πάνω από 23bit. Δεν νομίζω ότι θα μπορέσεις, αφού 23bit είναι το extended address bus (δηλαδή πάλι pointer=address bus).

 

Όσο για το data bus που έλεγες, νομίζω ότι είναι πια προφανές ότι δεν έχει σχέση με το μέγεθος του pointer.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...