Rumah  >  Artikel  >  Tutorial sistem  >  Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

WBOY
WBOYke hadapan
2024-02-10 23:48:03604semak imbas

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.

Alamat Maya

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.

Faedah Alamat Maya

  • Halang pengguna daripada terus mengakses alamat memori fizikal, menghalang operasi yang merosakkan dan melindungi sistem pengendalian.
  • Setiap proses diperuntukkan 4GB memori maya, membolehkan program pengguna menggunakan ruang alamat yang lebih besar daripada memori fizikal sebenar.

Ruang alamat maya proses 4GB dibahagikan kepada dua bahagian: "ruang pengguna" dan "ruang kernel".

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

Ruang isirong ruang pengguna

Alamat fizikal

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.

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

Penukaran alamat pengurusan memori halaman segmen

Linux Inti akan membahagikan memori fizikal kepada 3 kawasan pengurusan, iaitu:

ZONE_DMA

DMA内存区域。包含0MB~16MB之间的内存页框,可以由老式基于ISA的设备通过DMADigunakan, dipetakan terus ke ruang alamat kernel.

ZON_BIASA

Kawasan ingatan biasa. Mengandungi bingkai halaman memori antara 16MB~896MB, bingkai halaman biasa, dipetakan terus ke ruang alamat kernel.

ZON_TINGGI

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.

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

Pembahagian kawasan ingatan fizikal

Ruang Pengguna

Apa yang boleh diakses oleh proses pengguna ialah "ruang pengguna". Setiap proses mempunyai ruang pengguna tersendiri, dan julat alamat maya adalah dari 0x000000000xBFFFFFFF 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.

Proses dan Ingatan

Ruang pengguna yang diduduki oleh proses (program yang dilaksanakan) dibahagikan kepada 5kawasan 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).

  • Timbunan

    stack

    Timbunan ialah pembolehubah tempatan yang dibuat sementara oleh pengguna untuk menyimpan atur cara, iaitu pembolehubah yang ditakrifkan dalam fungsi (tetapi tidak termasuk pembolehubah yang diisytiharkan oleh

    , 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 kawasan memori yang disebutkan di atas, segmen data dan

dalam seni bina, tindanan mengembang ke bawah dan timbunan mengembang ke atas, yang relatif antara satu sama lain. BSS 段、堆通常是被连续存储在内存中,在位置上是连续的,而代码段和栈往往会被独立存放。堆和栈两个区域在 i386Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

Anda juga boleh menggunakan arahan

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

Ruang kernel

Kapasiti

termasuk imej kernel, jadual halaman fizikal, pemacu, dsb. yang berjalan dalam ruang kernel. x86 32 位系统里,Linux 内核地址空间是指虚拟地址从 0xC0000000 开始到 0xFFFFFFFF 为止的高端内存地址空间,总计 1G

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!Kawasan pembahagian ruang kernel.

Kawasan pemetaan terus

Kawasan pemetaan terus Julat alamat ruang kernel

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.

Ruang alamat linear memori mewah

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.

Kawasan pemetaan memori dinamik

vmalloc Region 该区域由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理地址空间不一定连续。vmalloc Halaman fizikal yang sepadan dengan alamat linear yang diperuntukkan mungkin dalam memori rendah atau memori mewah.

Kawasan pemetaan ingatan kekal
Fungsi

Persistent Kernel Mapping Region 该区域可访问高端内存。访问方法是使用 alloc_page (_GFP_HIGHMEM) 分配高端内存页或者使用kmap memetakan memori mewah yang diperuntukkan ke kawasan ini.

Kawasan pemetaan tetap

Fixing kernel Mapping Region 该区域和 4G 的顶端只有 4k 的隔离带,其每个地址项都服务于特定的用途,如 ACPI_BASEdsb.

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

Pemetaan memori fizikal ruang kernel

Semakan

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.

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

Gambar penuh ruang kernel dan ruang pengguna

Struktur data memori

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.

Struktur data memori ruang pengguna

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_structobjek 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:

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!

wm_arem_struct

Ruang kernel memperuntukkan struktur data memori secara dinamik

Dalam bab ruang kernel, kami menyebut "kawasan pemetaan memori dinamik". vmalloc来分配,特点是:线性空间连续,但是对应的物理地址空间不一定连续。vmalloc

sekatan kawasan bebas bersaiz anti-silang. vmalloc 分配的地址则限于vmalloc_startvmalloc_end之间。每一块vmalloc分配的内核虚拟内存都对应一个vm_struct结构体,不同的内核空间虚拟地址之间有4k

Sama seperti ciri-ciri alamat maya dalam ruang pengguna, alamat maya ini tidak mempunyai hubungan pemetaan yang mudah dengan memori fizikal Ia mesti ditukar kepada alamat fizikal atau halaman fizikal melalui jadual halaman kernel Ia mungkin belum dipetakan, dan mereka tidak akan dipetakan sehingga kesalahan halaman berlaku.

Berhenti mengatakan anda tidak memahami pengurusan memori Linux, 10 gambar akan menjelaskannya untuk anda!Pemetaan memori dinamik

Untuk meringkaskan

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

Artikel ini boleh digunakan sebagai panduan belajar seperti indeks Apabila anda ingin mengkaji titik tertentu secara mendalam, anda boleh mencari titik masuk dalam bab ini dan kedudukan titik pengetahuan ini dalam pandangan makroskopik pengurusan memori.

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!

Kenyataan:
Artikel ini dikembalikan pada:lxlinux.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam