Bagaimana alamat fisik ditampilkan dalam string DRAM dan bank

Dalam artikel sebelumnya, kami membahas bagaimana prosesor Intel Sandy Bridge memetakan alamat fisik dalam cache L3.

Sekarang saya akan memberi tahu Anda bagaimana pengontrol memori prosesor ini memetakan alamat fisik ke lokasi di DRAM - khususnya, nomor baris, bank, dan kolom dalam modul DRAM. Sebut saja pemetaan alamat DRAM . Saya menggunakan satu mesin uji sebagai contoh.

Motivasi: Rowhammer bug


Saya tertarik memetakan alamat DRAM, karena ini terkait dengan bug Rowhammer .

Rowhammer merupakan masalah pada beberapa modul DRAM di mana model akses memori terburuk dapat menyebabkan kerusakan memori. Dalam DRAM ini, aktivasi berulang-ulang dari jalur memori ("penyumbatan garis") menyebabkan gangguan listrik yang mengubah bit pada sel-sel yang rentan dari saluran yang berdekatan.

Aktivasi jalur yang berulang ini dapat disebabkan oleh beberapa akses ke sepasang alamat DRAM yang berada pada jalur berbeda dari bank DRAM yang sama. Mengetahui pemetaan alamat DRAM bermanfaat karena menunjukkan pasangan alamat mana yang memenuhi properti “satu bank, baris berbeda” (bank yang sama, baris yang berbeda; SBDR).

Menebak dan memeriksa pemetaan alamat


Untuk pengujian, saya memiliki mesin dengan modul DRAM yang rentan terhadap bug Rowhammer. Menjalankan rowhammer_test pada mesin ini menunjukkan sedikit perubahan.

Saya ingin tahu skema pemetaan alamat DRAM untuk mesin ini, tetapi tidak didokumentasikan secara publik: di sini adalah prosesor Sandy Bridge, tetapi Intel tidak mendokumentasikan pemetaan alamat yang digunakan oleh pengontrol memori prosesor ini.

Bahkan, tes rowhammer_test tidak perlu tahu pasangan alamat SBDR. Dia hanya mencoba beberapa kali untuk memalu pasangan alamat yang dipilih secara acak. Biasanya 1/8 atau 1/16 dari mereka berubah menjadi pasangan SBDR, karena di mobil kami ada 8 bank di setiap DIMM (dan total 16 bank). Dengan demikian, kita tidak perlu mengetahui pemetaan alamat DRAM untuk menyebabkan sedikit perubahan dalam memori, tetapi pengetahuan seperti itu akan membantu untuk melakukan tes dengan lebih sengaja.

Meskipun pemetaan alamat tidak didokumentasikan, saya menemukan bahwa saya bisa membuat asumsi yang masuk akal berdasarkan geometri DRAM, dan kemudian memeriksa asumsi berdasarkan alamat fisik yang dilaporkan oleh rowhammer_test . Tes melaporkan alamat fisik di mana bit berubah ( "korban" ) dan pasangan alamat fisik yang membuat perubahan ini ( "agresor" ). Karena pasangan ini harus merupakan pasangan SBDR, kami dapat memverifikasi pemetaan alamat secara hipotetis terhadap data empiris ini.

Geometri memori


Langkah pertama: periksa berapa DIMM yang terpasang di mesin dan bagaimana pengaturannya secara internal.

Saya dapat meminta informasi DIMM menggunakan alat decode-dimms di Linux (pada Ubuntu itu ada dalam paket I2C-tools ). Alat ini menerjemahkan metadata SPD (Serial Presence) di DIMM.

Pada mesin uji saya, dua SO-DIMMs empat gigabyte, yang memberikan memori 8 GB.

Alat decode-dimms melaporkan informasi berikut untuk masing-masing modul:

  Ukuran 4096 MB
 Bank x Baris x Kolom x Bit 8 x 15 x 10 x 64
 Peringkat 2 

Ini berarti bahwa kedua DIMM:

  • Setiap bank memiliki 2 ^ 15 baris (32768 baris).
  • Setiap baris berisi 2 ^ 10 * 64 bit = 2 ^ 16 bit = 2 ^ 13 byte = 8 KB.

Setiap DIMM memiliki 2 peringkat dan 8 bank. Pemeriksaan silang kapasitas DIMM memberikan ukuran yang diharapkan:

8 KB per baris * 32768 baris * 2 peringkat * 8 bank = 4096 MB = 4 GB

Memetakan Alamat DRAM


Di komputer pengujian saya, bit alamat fisik digunakan sebagai berikut:

  • Bit 0-5 : ini adalah 6 bit lebih rendah dari indeks byte dalam string (mis. Indeks 6-bit untuk garis cache 64 byte).
  • Bit 6 : Ini adalah nomor saluran 1-bit yang memilih antara dua DIMM.
  • Bits 7-13 : 7 bit teratas dari indeks dalam satu baris (mis., Bit atas dari nomor kolom).
  • Bits 14-16 : XOR dengan 3 bit lebih rendah dari nomor baris, yang memberikan nomor bank 3-bit.
  • Bit 17 : Nomor peringkat 1-bit yang memilih antara dua peringkat DIMM (yang biasanya dua sisi chip DIMM).
  • Bit 18-32 : Nomor baris 15-bit.
  • Bit 33+ : mereka dapat diatur karena memori fisik dimulai dengan alamat fisik lebih besar dari 0.

Mengapa tampilan seperti itu?


Pemetaan ini rowhammer_test dengan hasil rowhammer_test (lihat di bawah), tetapi kami juga dapat menjelaskan bahwa bit alamat dipetakan sedemikian rupa untuk memberikan kinerja yang baik untuk pola akses memori yang khas, seperti akses berurutan dan akses langkah atau langkah ( akses tersendat):

  • Saluran konkurensi . Menempatkan nomor saluran dalam bit 6 berarti bahwa garis cache akan bergantian antara dua saluran (mis., Dua DIMM) yang dapat diakses secara paralel. Ini berarti bahwa jika kita mengakses alamat secara berurutan, beban akan didistribusikan melalui dua saluran.

    Omong-omong, Ivy Bridge (penerus Sandy Bridge) tampaknya menyulitkan tampilan nomor saluran. Presentasi Intel menyebutkan "hashing saluran" dan menyatakan bahwa "memungkinkan Anda untuk memilih saluran berdasarkan beberapa bit alamat. Secara historis, itu adalah "A [6]". Ini memastikan distribusi memori yang lebih merata di seluruh saluran. ”
  • Tergelincirnya bank : secara umum, pengaturan nomor kolom, bank dan jalur harus meminimalkan seringnya perubahan jalur aktif bank (bank meronta-ronta).

    Pengantar kecil: Modul DRAM diorganisasikan ke dalam bank, yang, pada gilirannya, disusun dalam beberapa baris. Setiap bank memiliki "jalur aktif saat ini": isinya disalin ke buffer garis , yang bertindak sebagai cache, yang dapat diakses dengan cepat. Akses ke saluran lain membutuhkan waktu lebih lama karena harus diaktifkan terlebih dahulu. Jadi, saat memetakan alamat DRAM, pasangan SBDR dibawa sejauh mungkin di ruang alamat fisik.

    Chasing lines (row hammering) adalah kasus khusus dari tergelincirnya bank ketika dua jalur tertentu diaktifkan secara bergantian (mungkin sengaja).
  • Paralelisme bank: bank dapat diakses secara paralel (meskipun lebih rendah dari saluran), sehingga nomor bank berubah sebelum nomor baris seiring meningkatnya alamat.
  • Skema XOR : XOR'ing bit paling signifikan dari nomor baris ke nomor bank adalah trik untuk menghindari tergelincirnya bank ketika mengakses array dalam langkah besar. Misalnya, pada tampilan di atas, XOR'ing memaksa alamat X dan X + 256k berada di bank yang berbeda, tanpa membentuk pasangan SBDR.

    Skema XOR'ing untuk bank / jalur dijelaskan dalam berbagai literatur, misalnya:

Rekonsiliasi dengan rowhammer_test


Menjalankan rowhammer_test_ext (versi extended dari rowhammer_test ) pada mesin uji selama 6 jam mengungkapkan perubahan bit yang berulang di 22 tempat. (lihat data sumber dan kode analisis ).

Tes untuk string pencetakan menghasilkan set tiga alamat (A1, A2, V):

  • V adalah alamat korban, di mana kita melihat perubahan bit.
  • A1 dan A2 adalah alamat agresor yang kami mint.
  • Sortir A1 dan A2 sehingga A1 lebih dekat ke V daripada A2. Secara sementara kami berasumsi bahwa alamat yang lebih dekat, A1, sebenarnya menyebabkan sedikit perubahan (walaupun ini tidak selalu benar jika pemetaan alamat DRAM yang lebih kompleks digunakan).

Untuk semua hasil ini, kami berharap tiga properti selesai:

  • Baris : nomor baris A1 dan V harus berbeda dengan 1, yaitu mereka harus berada di garis yang berdekatan. (A2 dapat memiliki nomor baris apa saja).

    Properti ini memudahkan untuk menentukan di mana bit terendah dari nomor baris ada di alamat fisik.

    Tes menunjukkan bahwa properti ini berlaku untuk semua kecuali dua hasil. Dalam dua hasil ini, nomor baris berbeda 3 daripada 1.
  • Bank : V, A1 dan A2 harus memiliki nomor bank yang sama. Memang, properti ini memanifestasikan dirinya dalam 22 hasil. Ini disimpan hanya ketika menerapkan skema XOR'ing baris / bank.
  • Saluran : V, A1 dan A2 harus memiliki nomor saluran yang sama. Ini berlaku untuk semua hasil. Semua hasil memiliki saluran = 0, karena rowhammer_test hanya memilih alamat yang disejajarkan dalam 4k, dan karenanya hanya menguji satu saluran (mungkin ini dapat dianggap sebagai bug).

Kemungkinan tes lebih lanjut


Di masa mendatang, Anda dapat menjalankan dua percobaan lagi untuk memeriksa apakah pemetaan alamat DRAM mengevaluasi properti SBDR dengan benar:

  • Pengukuran waktu : beberapa akses ke pasangan alamat SBDR harus lebih lambat dari beberapa akses ke pasangan tanpa SBDR, karena yang pertama menyebabkan aktivasi jalur, dan yang kedua tidak.
  • Pengujian Rowhammer yang lengkap : segera setelah kami menemukan alamat agresor A1, yang menyebabkan perubahan bit berulang, kami dapat memeriksa ini pada banyak nilai A2. Efek coinage (A1, A2) akan berubah bit hanya jika itu adalah sepasang SBDR.

Selain itu, menghapus satu DIMM dari unit sistem harus menghapus bit saluran dari pemetaan alamat DRAM dan karenanya mengubah alamat agresor dan korban. Ini juga bisa diperiksa.

Source: https://habr.com/ru/post/id431102/


All Articles