Hari ini kita akan mengkaji pengurusan ingatan Linux
.
Bagi pelajar bisnes yang mahir dalam CURD
, pengurusan ingatan nampak jauh dari kita. Tetapi walaupun titik pengetahuan ini tidak popular (dianggarkan ramai orang tidak akan menggunakannya sama sekali selepas mempelajarinya), ia pastinya asas asas.
Ini seperti latihan kekuatan dalaman dalam novel seni mempertahankan diri Anda tidak akan melihat hasil serta-merta selepas mempelajarinya, tetapi ia akan memberi manfaat besar kepada kerja pembangunan masa depan anda kerana anda akan berdiri lebih tinggi.
Semua contoh gambar dalam artikel adalah saya lukis. Melukis gambar mengambil lebih banyak masa daripada pengekodan, tetapi semua orang memahami dengan lebih intuitif dengan melihat gambar daripada teks, jadi saya masih melukisnya. Bagi pelajar yang memerlukan gambar sampel definisi tinggi, terdapat cara untuk mendapatkannya di akhir artikel.
Secara lebih utilitarian, jika anda secara tidak sengaja mendedahkan bahawa anda memahami ilmu ini semasa temuduga dan boleh menceritakannya secara terperinci, ia mungkin membuatkan penemuduga lebih berminat dengan anda, dan anda mungkin boleh mendapat kenaikan pangkat, kenaikan gaji, dan mulakan hidup anda Puncaknya adalah satu langkah lebih dekat.
Perjanjian premis: Premis kandungan teknikal yang dibincangkan dalam artikel ini ialah persekitaran sistem pengendalian ialah x86
sistem 32-bit x86
架构的 32 位 Linux
.
Walaupun dalam sistem pengendalian moden, memori masih merupakan sumber yang sangat berharga dalam komputer anda. Lihat sahaja saiz pemacu keadaan pepejal komputer anda, dan kemudian lihat saiz memori.
Untuk menggunakan dan mengurus sumber memori sistem sepenuhnya, Linux menggunakan teknologi pengurusan memori maya. Menggunakan teknologi memori maya, setiap proses mempunyai ruang alamat maya 4GB yang tidak mengganggu antara satu sama lain.
Peruntukan dan operasi permulaan proses adalah berdasarkan "alamat maya" ini. Hanya apabila proses perlu benar-benar mengakses sumber memori, pemetaan antara alamat maya dan alamat fizikal akan ditubuhkan dan halaman memori fizikal dipindahkan.
Untuk memberikan analogi yang tidak sesuai, prinsip ini sebenarnya sama dengan cakera rangkaian XX semasa. Jika ruang cakera rangkaian anda ialah 1TB, adakah anda benar-benar berfikir bahawa anda akan diberikan ruang yang begitu besar sekali gus? Itu masih terlalu muda. Ruang diperuntukkan kepada anda hanya apabila anda meletakkan sesuatu di dalamnya. Anda akan diperuntukkan sebanyak ruang sebenar seperti yang anda letakkan. Tetapi nampaknya anda dan rakan anda mempunyai 1TB ruang.
Ruang alamat maya proses 4GB dibahagikan kepada dua bahagian: "ruang pengguna" dan "ruang kernel".
Ruang isirong ruang pengguna
Dalam bab di atas, kita sudah tahu bahawa sama ada ruang pengguna atau ruang kernel, alamat yang digunakan adalah alamat maya Apabila proses perlu benar-benar mengakses memori, "pengecualian kesalahan halaman" akan dihasilkan oleh "permintaan kernel. mekanisme paging" dan dipindahkan ke alamat fizikal. halaman memori.
Tukar alamat maya ke alamat fizikal memori, yang melibatkan penggunaan MMU
Unit Pengurusan Memori untuk membahagikan dan halaman alamat maya (jenis halaman segmen) penukaran alamat Mengenai proses pembahagian dan halaman khusus, kami tidak akan membincangkannya di sini. Untuk butiran lanjut, anda boleh merujuk kepada mana-mana buku teks prinsip komposisi komputer untuk penerangan.
Penukaran alamat pengurusan memori halaman segmen
Linux
Inti akan membahagikan memori fizikal kepada 3 kawasan pengurusan, iaitu:
DMA
内存区域。包含0MB~16MB之间的内存页框,可以由老式基于ISA
的设备通过DMA
Digunakan, dipetakan terus ke ruang alamat kernel.
Kawasan ingatan biasa. Mengandungi bingkai halaman memori antara 16MB~896MB, bingkai halaman biasa, dipetakan terus ke ruang alamat kernel.
Kawasan memori mewah. Mengandungi bingkai halaman memori melebihi 896MB, yang tidak dipetakan secara langsung Bahagian bingkai halaman memori ini boleh diakses melalui pemetaan kekal dan pemetaan sementara.
Pembahagian kawasan ingatan fizikal
Apa yang boleh diakses oleh proses pengguna ialah "ruang pengguna". Setiap proses mempunyai ruang pengguna tersendiri, dan julat alamat maya adalah dari 0x00000000
至 0xBFFFFFFF
Jumlah kapasiti ialah 3G.
Proses pengguna biasanya hanya boleh mengakses alamat maya dalam ruang pengguna, dan hanya boleh mengakses ruang kernel apabila melaksanakan operasi dalam talian atau panggilan sistem.
Ruang pengguna yang diduduki oleh proses (program yang dilaksanakan) dibahagikan kepada 5
kawasan memori yang berbeza mengikut prinsip "ruang alamat dengan atribut akses yang konsisten disimpan bersama". Sifat capaian merujuk kepada “boleh dibaca, boleh ditulis, boleh laku, dsb.
Coretan kod
Segmen kod digunakan untuk menyimpan arahan operasi fail boleh laku dan imej program boleh laku dalam ingatan. Segmen kod perlu dilindungi daripada pengubahsuaian haram pada masa jalan, jadi hanya operasi baca dibenarkan, ia tidak boleh ditulis.
Segmen data
Segmen data digunakan untuk menyimpan pembolehubah global yang dimulakan dalam fail boleh laku Dalam erti kata lain, ia menyimpan pembolehubah dan pembolehubah global yang diperuntukkan secara statik oleh program.
Bahagian BSS
BSS
段包含了程序中未初始化的全局变量,在内存中 bss
Tetapkan semua segmen kepada sifar.
Timbunan heap
Timbunan digunakan untuk menyimpan segmen memori yang diperuntukkan secara dinamik semasa proses berjalan Saiznya tidak tetap dan boleh dikembangkan atau dikurangkan secara dinamik. Apabila proses memanggil fungsi seperti malloc untuk memperuntukkan memori, memori yang baru diperuntukkan ditambah secara dinamik pada timbunan (timbunan dikembangkan); (timbunan berkurangan).
stack
, bermakna statik menyimpan pembolehubah dalam segmen data). Di samping itu, apabila fungsi dipanggil, parameternya juga akan ditolak ke tindanan proses yang memulakan panggilan, dan selepas panggilan selesai, nilai pulangan fungsi itu juga akan disimpan semula pada tindanan. Disebabkan oleh ciri pertama-masuk-akhir-keluar bagi timbunan, timbunan amat sesuai untuk menyimpan/memulihkan adegan panggilan. Dalam pengertian ini, kita boleh menganggap timbunan sebagai kawasan memori yang menyimpan dan menukar data sementara. static
dalam seni bina, tindanan mengembang ke bawah dan timbunan mengembang ke atas, yang relatif antara satu sama lain. BSS
段、堆通常是被连续存储在内存中,在位置上是连续的,而代码段和栈往往会被独立存放。堆和栈两个区域在 i386
di bawah Linux untuk menyemak saiz setiap kawasan memori program yang disusun: size
[lemon ~]# size /usr/local/sbin/sshd text data bss dec hexfilename 1924532 12412 4268962363840 2411c0/usr/local/sbin/sshd
termasuk imej kernel, jadual halaman fizikal, pemacu, dsb. yang berjalan dalam ruang kernel. x86 32
位系统里,Linux 内核地址空间是指虚拟地址从 0xC0000000
开始到 0xFFFFFFFF
为止的高端内存地址空间,总计 1G
ialah kawasan pemetaan memori langsung. Direct Memory Region
:从内核空间起始地址开始,最大896M
"Alamat linear" 896MB dalam kawasan pemetaan langsung disambungkan terus ke hadapan "alamat fizikal" 896MB
进行映射,也就是说线性地址和分配的物理地址都是连续的。内核地址空间的线性地址0xC0000001
所对应的物理地址为0x00000001
,它们之间相差一个偏移量PAGE_OFFSET = 0xC0000000
Terdapat hubungan penukaran linear antara alamat linear dan alamat fizikal di kawasan ini "Alamat linear = PAGE_OFFSET
+ 物理地址」也可以用 virt_to_phys()
Fungsi menukar alamat linear dalam ruang maya kernel kepada alamat fizikal.
Julat alamat linear ruang kernel adalah dari 896M hingga 1G, dan julat alamat dengan kapasiti 128MB ialah ruang alamat linear memori mewah Mengapa ia dipanggil ruang alamat linear memori mewah? Biar saya terangkan kepada anda di bawah:
Seperti yang dinyatakan sebelum ini, jumlah saiz ruang kernel ialah 1GB, dan alamat linear 896MB bermula dari alamat permulaan ruang kernel boleh dipetakan terus ke julat alamat dengan saiz alamat fizikal 896MB.
Undur selangkah, walaupun alamat linear 1GB dalam ruang kernel dipetakan ke alamat fizikal, ia hanya boleh menangani maksimum 1GB julat alamat memori fizikal.
Berapa besar kayu memori yang anda miliki sekarang? Sedarlah, sudah hampir 2023, dan kebanyakan PC mempunyai lebih daripada 1GB memori!
Jadi, ruang kernel mengeluarkan julat alamat 128M terakhir dan membahagikannya kepada tiga kawasan pemetaan memori mewah berikut untuk menangani keseluruhan julat alamat fizikal. Masalah ini tidak wujud pada sistem 64-bit, kerana ruang alamat linear yang tersedia jauh lebih besar daripada memori yang boleh dipasang.
vmalloc Region
该区域由内核函数vmalloc
来分配,特点是:线性空间连续,但是对应的物理地址空间不一定连续。vmalloc
Halaman fizikal yang sepadan dengan alamat linear yang diperuntukkan mungkin dalam memori rendah atau memori mewah.
Persistent Kernel Mapping Region
该区域可访问高端内存。访问方法是使用 alloc_page (_GFP_HIGHMEM)
分配高端内存页或者使用kmap
memetakan memori mewah yang diperuntukkan ke kawasan ini.
Fixing kernel Mapping Region
该区域和 4G 的顶端只有 4k 的隔离带,其每个地址项都服务于特定的用途,如 ACPI_BASE
dsb.
Pemetaan memori fizikal ruang kernel
Terdapat banyak perkara yang perlu dibincangkan di atas, jadi jangan tergesa-gesa ke bahagian seterusnya Sebelum itu, mari semak semula apa yang kami katakan di atas. Jika anda membaca bab di atas dengan teliti, saya telah melukis satu lagi gambar di sini, dan kini anda sepatutnya mempunyai gambaran global pengurusan ingatan dalam fikiran anda.
Gambar penuh ruang kernel dan ruang pengguna
Untuk kernel mengurus memori maya dalam sistem, struktur data pengurusan memori mesti diabstrakkan daripadanya operasi pengurusan memori seperti "peruntukan, keluaran, dll adalah berdasarkan operasi struktur data ini struktur yang menguruskan kawasan ingatan maya.
Dalam bab "Proses dan Memori" sebelum ini, kami menyebut bahawa proses Linux boleh dibahagikan kepada 5 kawasan memori yang berbeza, iaitu: segmen kod, segmen data, BSS
、堆、栈,内核管理这些区域的方式是,将这些内存区域抽象成vm_area_struct
objek pengurusan memori.
vm_area_struct
是描述进程地址空间的基本管理单元,一个进程往往需要多个vm_area_struct
来描述它的用户空间虚拟地址,需要使用「链表」和「红黑树」来组织各个vm_area_struct
.
Senarai terpaut digunakan apabila semua nod perlu dilalui, manakala pokok merah-hitam sesuai untuk mengesan kawasan ingatan tertentu dalam ruang alamat. Kernel menggunakan kedua-dua struktur data untuk mencapai prestasi tinggi untuk pelbagai operasi pada kawasan memori.
Model pengurusan alamat proses ruang pengguna:
wm_arem_struct
Dalam bab ruang kernel, kami menyebut "kawasan pemetaan memori dinamik". vmalloc
来分配,特点是:线性空间连续,但是对应的物理地址空间不一定连续。vmalloc
sekatan kawasan bebas bersaiz anti-silang. vmalloc
分配的地址则限于vmalloc_start
与vmalloc_end
之间。每一块vmalloc
分配的内核虚拟内存都对应一个vm_struct
结构体,不同的内核空间虚拟地址之间有4k
Pemetaan memori dinamik
Pengurusan memori ialah sistem yang sangat kompleks Apa yang diterangkan dalam artikel ini hanyalah puncak gunung es Ia menunjukkan kepada anda gambaran keseluruhan pengurusan memori dari perspektif makro, tetapi secara amnya, pengetahuan ini masih mencukupi apabila anda bersembang. bersama penemuduga juga saya berharap agar semua orang dapat memahami prinsip yang lebih mendalam melalui pembacaan. Linux
Saya juga melukis banyak contoh rajah semasa penciptaan artikel ini, yang boleh digunakan sebagai indeks pengetahuan Secara peribadi, saya rasa melihat gambar lebih jelas daripada membaca teks Pengurusan" di latar belakang akaun rasmi saya "Sekolah Teknologi Backend" Resolusi tinggi asal gambar-gambar ini.
Peraturan lama, terima kasih kerana membaca Tujuan artikel adalah untuk berkongsi pemahaman tentang pengetahuan, saya akan mengesahkannya berulang kali untuk memastikan ketepatannya dialu-alukan untuk menunjukkan kepada mereka. Mari belajar daripada perbincangan bersama. Itu sahaja untuk perkongsian teknologi hari ini. Jumpa anda dalam keluaran seterusnya.Atas ialah kandungan terperinci Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!