Rumah >Operasi dan penyelenggaraan >Nginx >Pengurusan memori dalam mod dilindungi Linux
Kita tahu bahawa memori boleh dianggap sebagai tatasusunan yang sangat besar Jika kita ingin mencari elemen dalam memori, ia akan ditentukan oleh subskrip tatasusunan Perkara yang sama berlaku untuk ingatan, tetapi terdapat premis bahawa tatasusunan terdiri daripada kumpulan Ia terdiri daripada bait tertib Dalam tatasusunan bait tertib ini, setiap bait mempunyai alamat yang unik.
Terdapat banyak objek yang disimpan dalam memori Setiap objek terdiri daripada bait yang berbeza, seperti objek char, objek bait, objek int, dll. Semuanya dibahagikan kepada pelbagai lokasi dalam memori operasi mencari alamat objek ini dipanggil pengalamatan memori. Lebar bas memori menentukan bilangan bit alamat memori boleh ditangani, bermula dari alamat 0. Oleh kerana 80X86 ialah 32 bit, lebar bas juga ialah 32 bit, jadi terdapat 2^32 alamat memori secara keseluruhan, jadi sejumlah 4GB alamat memori boleh disimpan. Jenis data berbilang bait, seperti int, panjang dan berganda, boleh diekstrak melalui alamat memori berturut-turut.
Walaupun objek boleh dialamatkan, susunan bait di mana objek ini disimpan Terdapat dua kaedah penyimpanan iaitu big endian dan little endian.
Sebagai contoh, terdapat objek jenis int yang terletak di alamat 0x100, dan nilai perenambelasannya ialah 0x01234567. Saya akan melukis gambar kepada anda dan anda akan memahami perbezaan antara dua pesanan storan.
Ini sebenarnya mudah difahami Jenis data int 0x01234567 boleh dibahagikan kepada 01 23 45 67 bait, dan 01 ialah bit tinggi dan 67 ialah bit rendah, jadi susunan storan endian kecil dan kaedah big endian boleh dijelaskan : Iaitu kaedah little-endian menggunakan bit tertib rendah dahulu, manakala kaedah big-endian menggunakan bit tertib tinggi dahulu. Perbezaan antara kaedah big-endian dan little-endian hanyalah susunan penyimpanan, dan tiada kaitan dengan bilangan digit dan nilai objek. Kebanyakan mesin Intel menggunakan mod little-endian, jadi 80X86 juga merupakan storan little-endian, manakala kebanyakan mesin IBM dan Oracle menggunakan storan big-endian.
Memandangkan komputer tidak dapat menangani semua data dalam memori secara langsung kerana ia agak terlalu besar, memori secara amnya dibahagikan Ini melibatkan soalan: mengapa memori dibahagikan? Saya hanya memberi pengenalan umum di atas.
Kenapa ingatan perlu dibahagikan? . mengimbangi. Bahagian alamat asas segmen ditentukan oleh pemilih segmen 16-bit, yang mana 14 bit boleh memilih kuasa ke-2^14, iaitu, 16384 segmen Bahagian alamat offset dalam segmen ditentukan menggunakan nilai 32-bit, jadi alamat dalam segmen boleh 0 - 4G, panjang maksimum segmen ialah 4 GB, yang sepadan dengan alamat memori 4 GB yang dinyatakan di atas. Alamat 48-bit atau penunjuk panjang yang terdiri daripada segmen 16-bit dan offset dalam segmen 32-bit dipanggil alamat logik, dan alamat logik ialah alamat maya.
Terdapat enam daftar khas dalam seni bina X86 untuk menyimpan alamat asas segmen, iaitu CS, DS, ES, SS, FS dan GS. CS digunakan untuk menangani segmen kod, SS digunakan untuk menangani segmen tindanan, dan daftar lain digunakan untuk menangani segmen data. Segmen yang ditangani oleh CS pada bila-bila masa dipanggil segmen kod semasa. Alamat offset bagi arahan seterusnya yang akan dilaksanakan dalam segmen kod semasa sudah wujud dalam daftar EIP. Pada masa ini, alamat asas segmen:alamat offset boleh dinyatakan sebagai CS:EIP. Segmen yang dialamatkan oleh daftar segmen SS dipanggil segmen tindanan semasa Bahagian atas tindanan diberikan oleh daftar ESP Pada bila-bila masa, SS:ESP menghala ke bahagian atas tindanan, dan tiada pengecualian empat lagi adalah daftar segmen data umum Apabila tiada segmen data dalam arahan secara lalai, ia diberikan oleh DS.
Penterjemahan Alamat
Biasanya, sistem pengurusan memori yang lengkap terdiri daripada dua komponen: perlindungan akses dan terjemahan alamat. Perlindungan capaian adalah untuk menghalang satu aplikasi daripada mengakses alamat memori yang digunakan oleh program lain terjemahan alamat adalah untuk menyediakan kaedah peruntukan alamat dinamik untuk aplikasi yang berbeza. Perlindungan akses dan terjemahan alamat saling melengkapi.
Penterjemahan alamat biasanya menggunakan blok memori sebagai unit asas Berikut adalah penjelasan tentang apa itu blok Seperti yang kita semua tahu, dalam Linux, semuanya adalah fail, dan fail terdiri daripada blok. Unit komponen sistem juga merupakan unit asas pemprosesan data. Blok biasa mempunyai saiz yang berbeza, seperti 512B, 1KB, 4KB, dll. Walaupun blok ialah unit asas, ia pada asasnya terdiri daripada sektor.
Pertama sekali, gambar ini mengandungi tiga alamat dan proses penukaran tiga alamat ini Secara umumnya, alamat logik akan menjadi alamat linear selepas penukaran alamat asas tersegmen Alamat linear ialah alamat asas segmen dalam mod perlindungan + Intra-. mengimbangi segmen, jadi gambar ini ialah gambar rajah terjemahan alamat dalam mod dilindungi. Alamat linear akan ditukar kepada alamat fizikal selepas mekanisme paging, dengan syarat mekanisme paging perlu didayakan jika mekanisme paging tidak didayakan, alamat linear = alamat fizikal.
Saya perlu bercakap tentang alamat logik sekali lagi Alamat logik mengandungi pemilih segmen dan mengimbangi intra-segmen difahami sebagai asas segmen dalam mod yang dilindungi, kita semua tahu bahawa alamat asas segmen ialah 16 bit, dan offset dalam segmen ialah 32 bit.
Banyak buku atau artikel telah menyebut pemilih segmen Sebenarnya, pemilih segmen adalah pemilih segmen Ini sepenuhnya dalam bahasa Inggeris, semuanya adalah pemilih.
Deskriptor segmen akan disebut kemudian. Deskriptor segmen dan pemilih segmen bukanlah perkara yang sama, tetapi pemilih segmen ialah deskriptor segmen 16-bit.
Biar saya beritahu anda sesuatu yang tidak ditulis dalam gambar ini Sekarang semua orang tahu bahawa alamat logik boleh ditukar kepada alamat linear, dan alamat linear boleh ditukar kepada alamat fizikal Jadi bagaimana puncanya ditukar? Sebenarnya, kaedah yang digunakan di sini ialah MMU (unit pengurusan memori) untuk penukaran dan penukaran alamat linear kepada alamat fizikal menggunakan litar perkakasan unit paging. Fokus artikel ini bukan untuk membincangkan proses penukaran khusus, tetapi untuk memberi tumpuan kepada dua mekanisme segmentasi dan halaman.
Mari kita bincangkan tentang dua mekanisme segmentasi dan halaman secara terperinci.
Saya syorkan anda membaca terlebih dahulu penerangan yang saya tulis mengenai "Mengapa ingatan perlu dibahagikan".
https: //www.php.cn/link/d005ce7aeef46bd18515f783fb8e8e87fa
multiple dijalankan di ruang ingatan yang sama dan tidak akan mengganggu satu sama lain . Jika terdapat berbilang program atau tugas yang dijalankan dalam CPU, setiap program boleh diperuntukkan set segmennya sendiri (termasuk kod program, data dan timbunan CPU menghalang aplikasi daripada mengganggu antara satu sama lain dengan mengukuhkan sempadan antara Tujuan).
Semua segmen yang digunakan dalam sistem terkandung dalam ruang alamat linear CPU. Untuk mencari bait dalam segmen tertentu, program mesti menyediakan alamat logik untuk terjemahan berlaku. Alamat logik mengandungi pemilih segmen dan offset dalam segmen Setiap segmen mempunyai deskriptor segmen digunakan untuk menunjukkan saiz segmen, hak akses dan tahap keistimewaan segmen, jenis segmen dan bait pertama. daripada segmen adalah dalam talian lokasi dalam ruang alamat seksual (alamat asas segmen). Bahagian mengimbangi alamat logik ditambah pada alamat asas segmen untuk mencari kedudukan bait tertentu dalam segmen, jadi alamat pangkalan segmen + mengimbangi membentuk alamat dalam ruang alamat linear CPU.
Ruang alamat linear mempunyai struktur yang sama seperti ruang alamat fizikal, tetapi segmen yang boleh mereka tampung adalah sangat berbeza, iaitu, ruang alamat logik, boleh mengandungi sehingga 16 K segmen, dan setiap segmen boleh menampung saiz. 4 GB, jadi alamat maya boleh menemui sejumlah 64TB (2^46) segmen dan alamat linear dan ruang alamat fizikal ialah 4GB (2^32). Jadi, jika paging dilumpuhkan, ruang alamat linear ialah ruang alamat fizikal.
Gambar ini ialah gambarajah pemetaan alamat logik-> hingga 4 G, sama ada untuk membuat pertanyaan daripada jadual GDT atau jadual LDT, jadual yang ingin ditanya bergantung pada atribut TI bagi pemilih segmen Struktur pemilih segmen adalah seperti berikut
Pemilih segmen dibahagikan kepada. tiga bahagian kesemuanya:
Tiada penjelasan terperinci tentang deskriptor segmen di sini, kerana artikel ini masih mengutamakan pengurusan memori dan tidak terlalu taksub dengan butiran tertentu.
Dalam GDTR, alamat logik yang terdiri daripada pemilih segmen dan mengimbangi boleh disintesis menjadi deskriptor segmen dan disimpan terus. Pemilih segmen dan offset intra-segmen boleh ditukar kepada alamat linear selepas melalui MMU.
Seperti yang kami nyatakan di atas, alamat linear ditukar daripada alamat logik Jika mekanisme paging dilumpuhkan, alamat linear ialah alamat fizikal Jika mekanisme paging didayakan, bilangan alamat linear dan logik ruang alamat masih berbeza. Secara amnya, program adalah multitasking, dan ruang alamat linear yang biasanya ditakrifkan oleh multitasking adalah lebih besar daripada kapasiti memori fizikal. Peta terjemahan alamat menunjukkan bahawa kedua-dua alamat linear dan alamat fizikal adalah bersaiz 4G. Itu kerana alamat linear dimayakan oleh teknologi storan maya.
Storan maya ialah teknologi pengurusan memori Menggunakan teknologi ini boleh memberi kita ilusi bahawa ruang memori adalah jauh lebih besar daripada kapasiti memori fizikal sebenar. Tetapi anda fikir memori mempunyai 64 G, jadi itulah sebabnya saya boleh membuka begitu banyak aplikasi.
Mekanisme paging sebenarnya adalah pelaksanaan virtualisasi Dalam persekitaran maya, sejumlah besar ruang alamat linear dipetakan kepada sekeping kecil memori fizikal (RAM atau ROM). Apabila paging berlaku, setiap segmen dibahagikan kepada halaman (biasanya 4K), dan halaman ini disimpan dalam memori fizikal atau pada cakera. Sistem pengendalian mengekalkan halaman ini dengan menggunakan direktori halaman dan jadual halaman. Apabila program cuba mengakses lokasi alamat dalam ruang alamat linear, CPU akan menggunakan direktori halaman dan jadual halaman untuk menukar alamat linear kepada alamat fizikal dan kemudian menyimpannya dalam memori fizikal.
Jika halaman yang diakses pada masa ini tiada dalam memori fizikal, CPU akan melaksanakan gangguan Ralat umum adalah pengecualian halaman Kemudian sistem pengendalian akan membaca halaman dari cakera keras ke dalam memori fizikal, dan kemudian meneruskan atur cara dari titik gangguan. Sistem pengendalian sering menukar halaman masuk dan keluar dengan kerap, yang juga menjadi kesesakan prestasi.
Dalam segmentasi, panjang setiap segmen tidak tetap, dan panjang maksimum ialah 4G manakala dalam paging, saiz setiap halaman adalah tetap. Sama ada dalam memori fizikal atau pada cakera, menggunakan halaman bersaiz tetap adalah lebih sesuai untuk menguruskan memori fizikal manakala mekanisme pembahagian menggunakan blok bersaiz berubah-ubah lebih sesuai untuk memproses partition logik sistem kompleks.
Walaupun segmentasi dan paging adalah dua mekanisme terjemahan alamat yang berbeza, ia dikendalikan secara bebas semasa keseluruhan proses terjemahan alamat dan setiap proses adalah bebas. Kedua-dua mekanisme menggunakan jadual perantaraan untuk menyimpan pemetaan entri, tetapi struktur jadual perantaraan ini berbeza. Jadual segmen wujud dalam ruang alamat linear, dan jadual halaman disimpan dalam ruang alamat fizikal.
80x86 mempunyai dua mekanisme perlindungan, satu daripadanya mencapai pengasingan lengkap antara tugas dengan memperuntukkan ruang alamat maya yang berbeza untuk setiap tugas. Ini dicapai dengan memberikan setiap tugasan perubahan yang berbeza daripada alamat logik kepada alamat fizikal Setiap aplikasi hanya boleh mengakses data dan arahan dalam ruang mayanya sendiri, dan hanya boleh mendapatkan alamat fizikal melalui pemetaannya sendiri; melindungi segmen memori sistem pengendalian dan beberapa daftar khas daripada diakses oleh aplikasi. Mari kita bincangkan kedua-dua tugas ini secara terperinci di bawah.
Setiap tugas akan diletakkan dalam ruang alamat maya sendiri secara berasingan, dan kemudian dipetakan ke alamat fizikal melalui perkakasan alamat maya yang berbeza akan ditukar kepada alamat fizikal yang berbeza, dan tidak akan ada alamat maya A . Alamat akan dipetakan kepada julat alamat fizikal di mana B berada, supaya semua tugasan akan diasingkan dan tugasan yang berbeza tidak akan mengganggu satu sama lain.
Setiap tugasan mempunyai jadual pemetaan sendiri, jadual segmen dan jadual halaman Apabila CPU bertukar antara aplikasi atau tugas yang berbeza, jadual ini juga akan bertukar.
Alamat maya ialah abstraksi sistem pengendalian, yang bermaksud bahawa alamat maya diabstrak sepenuhnya oleh sistem pengendalian sebagai pembawa yang boleh mengurus aplikasi dan tugas dengan lebih baik Setiap tugas boleh memetakan alamat logik ke alamat maya, yang juga menunjukkan bahawa Setiap tugas mempunyai akses kepada sistem pengendalian, yang dikongsi oleh semua tugas. Bahagian ruang alamat maya ini di mana semua tugas mempunyai ruang alamat maya yang sama dipanggil ruang alamat global, dan Linux menggunakan ruang alamat global.
Setiap tugasan dalam ruang alamat global mempunyai ruang alamat mayanya yang tersendiri. Ruang alamat maya ini dipanggil ruang alamat tempatan.
Jika perlindungan sistem pengendalian antara tugas yang berbeza diumpamakan dengan perlindungan mendatar, maka perlindungan segmen memori dan daftar boleh dianggap sebagai perlindungan menegak. Untuk menyekat akses kepada pelbagai segmen dalam tugas, sistem pengendalian menetapkan empat tahap keistimewaan untuk melindungi setiap tugas.
Keutamaan terbahagi kepada 4 peringkat, 0 adalah tertinggi dan 3 adalah terendah. Secara amnya, data yang paling sensitif akan diberi keutamaan tertinggi, dan mereka hanya boleh diakses oleh bahagian tugas yang paling dipercayai akan diberi keutamaan yang lebih rendah akses sistem pengendalian kernel adalah pada umumnya tahap 0, dan data aplikasi adalah secara amnya Tahap 3. Setiap segmen memori dikaitkan dengan tahap keistimewaan.
Kami tahu bahawa CPU mendapatkan arahan dan data daripada segmen melalui CS untuk pelaksanaan Arahan dan data yang diperolehi daripada segmen tersebut secara umumnya diakses dengan tahap keistimewaan semasa (CPL Privilege Level). tahap kod aktif semasa. Apabila aplikasi cuba mengakses segmen, ia dibandingkan dengan tahap keistimewaan ini, dan hanya tahap keistimewaan yang lebih rendah daripada segmen ini boleh diakses.
Atas ialah kandungan terperinci Pengurusan memori dalam mod dilindungi Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!