Akses memori RAM per byte

3

Saya punya pertanyaan sederhana. Saat ini chip DDR memori memiliki lebar 64 bit, dan bus data CPU juga lebar 64 bit. Tetapi memori masih diatur dalam byte tunggal. Jadi, yang ingin saya tanyakan adalah, ketika CPU memilih beberapa alamat memori, itu harus satu byte, kan? Karena porsi memori terendah yang dapat Anda akses adalah 1 byte. Tetapi, jika Anda mendapatkan alamat 1 byte per 1, mengapa memory bus selebar 8 byte?

pengguna32569
sumber

Jawaban:

3

Kami menyebut arsitektur komputer kami sebagai byte-addressable- artinya, memori dialamatkan sebagai byte. Itu membantu kita menarik 8-bit data sekaligus. Tapi, itu tidak selalu norma, dan lebar lainnya digunakan.

Bahkan ketika Anda menggunakan komputer byte-address berbasis Intel, memori yang Anda gunakan biasanya diakses dengan lebar yang berbeda (64 bit seperti pada contoh Anda).

Ini membantu dalam menangani jumlah data yang lebih besar dengan ruang alamat yang lebih sedikit.

Jawaban saya benar-benar selesai di sini, bagaimanapun, saya mengoceh lebih lanjut untuk berbicara tentang bagaimana akses memori dilakukan yang dapat membantu berpikir tentang abstraksi yang diterapkan (dan mungkin juga memotivasi Anda untuk membaca lebih banyak tentang kenangan).


Jika Anda telah melihat stik DDR-RAM, Anda akan ingat melihat beberapa chip pada PCB hijau. Ini bergaris bersama untuk akses paralel. Itu membuat RAM Anda diakses lebih cepat.

Di depan modul RAM adalah Memory Controller. Ini dirancang untuk mengakses data dalam lebar bit yang lebih luas (32, 64, 128 bit - tergantung pada desain).

Saat Anda mengakses byte dari ruang memori ini, pengontrol memori sebenarnya mendapatkan "kata memori" lengkap; di sini, sebuah kata sebenarnya adalah lebar dari akses ini dari pengontrol memori.

Yang berarti jika lebarnya 128 bit, Anda selalu mengambil 16 byte dari alamat yang merupakan kelipatan dari 16.

Jadi, sekarang apa yang terjadi ketika Anda menginginkan byte di alamat 18 (= 16 + 2)?
Nah, Anda mendapatkan 16 byte dari alamat 16 dan membuang 15 byte!

Lebih menarik, apa yang terjadi ketika Anda ingin menulis byte di alamat 19?
Anda mengambil 16 byte dari alamat 16, mengubah byte ke-3 (alamat 19), dan kemudian menulis kembali semua 16 byte ini (menyenangkan ya?).

Semua ini merupakan upaya. Pengontrol memori dirancang untuk mengelola ini dan ternyata berfungsi pada beberapa permintaan secara paralel.

Kami bahkan belum membicarakan 'dual-channel' :-)


Berikut ini adalah referensi dari Wikipedia tentang organisasi DDR SDRAM

PC3200 adalah DDR SDRAM yang dirancang untuk beroperasi pada 200 MHz menggunakan chip DDR-400
dengan bandwidth 3.200 MB / s. Karena memori dipompa ganda,
ini berarti bahwa laju clock efektif memori PC3200 adalah 400 MHz.

1 GB PC3200 modul non-ECC biasanya dibuat dengan enam belas 512 Mbit chip,
8 di setiap sisi (512 Mbits × 16 chip) / (8 bit (per byte)) = 1.024 MB.
Chip individual yang membentuk modul memori 1 GB biasanya
diatur dengan 64 Mbits dan lebar data 8 bit untuk setiap chip,
umumnya dinyatakan sebagai 64M × 8.

Memori yang diproduksi dengan cara ini adalah RAM dengan kerapatan rendah dan biasanya akan
kompatibel dengan motherboard yang menetapkan memori PC3200 DDR-400.

Dari Memory Controller halaman

Lebar bus adalah jumlah garis paralel yang tersedia untuk berkomunikasi dengan sel memori.
Lebar bus pengontrol memori berkisar dari 8-bit pada sistem sebelumnya, hingga 512-bit pada sistem dan kartu video yang lebih rumit (biasanya diimplementasikan sebagai empat pengontrol memori simultan 64-bit yang beroperasi secara paralel, meskipun beberapa dirancang untuk beroperasi dalam "mode gang" "Di mana dua pengontrol memori 64-bit dapat digunakan untuk mengakses perangkat memori 128-bit).

nik
sumber
Jawaban bagus. Tetapi, jika satu alamat = 8Bytes, mengapa 32 bus alamat masih dapat mengatasi 4GB memori puncak? Bukankah seharusnya 4G * 64?
user32569
Dan ada satu hal lagi. Ketika saya melihat output dari kompiler C, itu alamat misalnya bidang char oleh byte. Jadi, saya kira ada beberapa chip dalam CPU yang memeriksa instruksi selanjutnya dan jika ada Byte lain dari lokasi memorry berikutnya, ia memuat seluruh blok memori ke dalam cache?
user32569
@ b-gen, Ketika kita mengatakan byte-addressable, satu alamat selalu 8-bit (yaitu satu byte). Namun, pengontrol memori yang bekerja mengatakan 64-bit lebar akan mengambil 8 byte (lebih dari 8 alamat) bersama-sama. Namun, untuk dapat mengatasi (katakanlah) byte kedua dalam 8 byte tersebut, pengalamatannya masih berbasis byte. 8 byte berikutnya misalnya akan diakses dengan menambahkan 8 ke alamat.
nik
1
Yang sangat mengerikan adalah jika Anda memiliki data yang tidak selaras secara alami. Katakanlah Anda memiliki integer 64-bit yang dimulai pada alamat fisik 0x44. Ini menempati byte 0x44 hingga 0x4B. Tetapi 0x44 hingga 0x47 ada dalam satu "kata" memori dan 0x48 hingga 0x4B ada di memori berikutnya. Membaca atau menulis yang panjang tunggal akan membutuhkan mengakses dua kata memori delapan byte yang berbeda. Tak perlu dikatakan ini bisa menjadi hit kinerja.
Jamie Hanrahan
1
@Dudeson ya, memang.
Jamie Hanrahan
2

Lebih cepat untuk mentransfer sejumlah besar data 8 byte sekaligus daripada 1. Selain itu, tidak ada cara untuk benar-benar mengatasi byte tunggal di luar cache CPU karena beberapa bit alamat terakhir tidak memiliki koneksi fisik lagi (karena mereka tidak dibutuhkan).

Ignacio Vazquez-Abrams
sumber
Ok, jadi jika saya mengerti, Anda mengatakan bahwa sekarang, lebar data minimum acess RAM adalah 8 byte per alamat, dan kompatibilitasnya dipertahankan melalui cache CPU? Tapi, bagaimana dengan skenario ini ?: Saya ingin menyimpan 1 byte ke dalam RAM, jadi saya benar-benar menyimpannya ke dalam cache CPU. Tapi, daripada cache harus menuliskannya ke dalam memori. (misalnya jika saya ingin beralih ke multitask). Jadi, masih harus menulis 1 byte. Bagaimana jika tidak hanya alamat 8 byte pada saat itu?
user32569
BTW: Apakah Anda 100% yakin tentang apa yang Anda tulis? Karena, mereka tidak akan menambahkan ekstensi alamat fisik jika beberapa bit alamat terputus karena sel data 8 byte.
user32569
Untuk menulis satu byte, perlu membaca set 8 byte yang ada, memodifikasi byte tunggal, kemudian menuliskan semua 8 byte sekaligus. PAE bekerja dengan menambahkan bit alamat di ujung yang lain .
Ignacio Vazquez-Abrams
PAE hanya menambahkan beberapa bit orde tinggi ke alamat fisik yang mungkin. Tiga bit pesanan rendah tetap tidak terhubung ke bus RAM. Bahkan, jika Anda melihat pinout pada CPU modern yang memiliki pin alamat dan data terpisah, Anda akan menemukan pin alamat mulai dari A3 - tidak ada pin untuk A0, A1, atau A2. RAM hanya dapat dialamatkan dalam apa yang dilihat CPU sebagai potongan delapan byte (dan ini selalu selaras pada batas 8 byte).
Jamie Hanrahan
1

Saya berbicara tanpa keahlian luar biasa tapi secara kasar ...

Prosesor mengambil satu kata setiap kali (yaitu prosesor 64 bit mengambil 8 byte sekaligus). Namun ketika mengambil satu byte mereka secara efektif membuang 7 byte lainnya. Skema pengalamatan memori biasanya masih dianggap sebagai byte, tetapi jika Anda menarik data secepat mungkin Anda menggunakan alamat yang disejajarkan, yaitu alamat yang dapat dibagi dengan panjang kata dalam byte. Dalam sistem 64 bit Anda akan menggunakan alamat 0, 8, 16, 24, dll.

Jika Anda menarik kata dari alamat yang tidak selaras dengan kata, katakan 5, prosesor harus melakukan dua pengambilan, satu untuk byte 5, 6, 7 dan yang kedua 8, 9, 10, 11, 12, sehingga akan membutuhkan dua kali lebih panjang.

Mengatasi byte secara individual berguna untuk semua alasan, tetapi orang dapat dengan mudah membayangkan desain prosesor yang membahas pengalamatan kata. Jika Anda menginginkan byte, Anda akan mendapatkan sebuah kata, kosongkan byte yang tidak Anda inginkan, dan kocok byte tersebut ke bagian bawah kata tersebut. Dengan cara itulah yang terjadi, mendapatkan byte berarti mendapatkan kata, dan kemudian memilih byte darinya, hanya lebih mudah untuk menganggapnya sebagai byte pada alamat 10 daripada kata 1, byte 3.

Di luar CPU, RAM tidak pernah dapat melihat bit alamat yang lebih rendah, RAM diatur sebagai kata-kata, itu model CPU / Programmer yang memberikan ilusi pengalamatan byte.

Christopher Edwards
sumber
Itu tidak sepenuhnya akurat. Prosesor 32 bit kami telah menggunakan bus memori selebar 64-bit untuk beberapa saat. "ukuran kata memori" tidak harus sama dengan lebar register integer CPU (yang merupakan apa yang dimaksud dengan "prosesor 32 bi"). Tapi sebagian besar dari mereka baik-baik saja.
Jamie Hanrahan
0

Dalam contoh Anda, menulis satu byte, dari sudut pandang kata memori, kata tersebut telah berubah. Anda dan saya sama-sama tahu bahwa hanya beberapa bit saja yang berbeda, tetapi terlepas dari itu, memori sekarang perlu di-refresh. Jadi kata itu akan ditulis kembali ke memori - semua 64 bit. Ini akan menjadi kenyataan, tidak peduli berapa ukuran memori minimum yang dapat dialamatkan. Ketika memori selebar 8-bit, semua 8 bit akan ditulis walaupun mungkin hanya 1 bit yang berubah.

JRobert
sumber
0

Dari apa yang saya ingat dari masa Assembler dan pekerjaan perangkat keras tingkat rendah, memori sebenarnya diakses di halaman. Anda tidak pernah benar-benar mengakses satu byte, atau bahkan bus-lebar RAM, tetapi dalam blok (saya tidak bisa memberikan angka yang pasti - terutama karena bervariasi - tetapi angka 4KB terdengar sangat akrab [mungkin saya memikirkan segmen, meskipun itu 64KB]).

Intinya adalah bahwa itu sangat tidak efisien untuk mengatasi satu byte, terutama karena alamat memori berikutnya yang akan diakses kemungkinan berada tepat di sebelahnya. Dengan demikian, ketika Anda mengakses byte, sistem melakukan cache satu blok RAM (menurut Anda untuk apa berbagai cache CPU?) Setiap perubahan yang Anda lakukan dilakukan pada RAM yang di-cache, sehingga jika Anda menulis kembali, itu bisa tulis blok bagus dan cepat. Byte diakses sendiri, tetapi dari blok cache; artinya, CPU tidak mengambil satu byte, tetapi hanya mengembalikan satu byte.

Dengan sistem saat ini yang jauh lebih besar, saya membayangkan bahwa mereka perlu melakukan cache lebih banyak lagi untuk mengoptimalkan hal-hal (karenanya cache CPU lebih besar).

Synetech
sumber
Mengingat spesifik dalam pertanyaan, saya cenderung tidak setuju dengan penggunaan kata blockdalam konteks ukuran 4KB dan 64KB dalam jawaban Anda. Cache-lines dan cache-memory berada pada level yang berbeda dari hirarki perangkat keras. (rujuk en.wikipedia.org/wiki/CPU_cache terhadap tautan dalam jawaban saya)
nik
Saya menggunakan blok sebagai istilah umum ("chunk" terdengar agak aneh). Apa yang saya pikirkan adalah halaman memori. Meskipun seperti yang saya katakan, ini sudah lama, jadi saya tidak terlalu ingat detail pastinya. Saya akan mengeluarkan buku Assembler oranye tua itu untuk melihat apakah saya bisa mendapatkan penyegaran.
Synetech
Halaman 4K adalah aspek dari terjemahan alamat, bukan akses memori. Dan segmen bisa lebih besar dari 64KB. Sebagian besar OS modern tidak banyak menggunakan segmen; pada kenyataannya mereka semua ditinggalkan arsitektur x64.
Jamie Hanrahan