Rozmiar pamięci dla operacji mmapa jądra

9

Interesuje mnie sposób, w jaki Linux mapuje pliki do pamięci głównej (w moim kontekście do wykonywania, ale wydaje mi się, że proces mmap jest taki sam do zapisu i odczytu), a także jaki rozmiar używa.

Wiem, że Linux używa stronicowania o rozmiarze strony zwykle 4 kB (gdzie w jądrze mogę znaleźć ten rozmiar?). Ale co to dokładnie oznacza dla przydzielonej pamięci: Załóżmy, że masz plik binarny o wielkości kilku tysięcy bajtów, powiedzmy 5812B i uruchom go. Co dzieje się w jądrze: Czy przydziela 2 * 4kB, a następnie kopiuje 5812B do tego miejsca, marnując> 3KB pamięci głównej na drugiej stronie?

Byłoby wspaniale, gdyby ktokolwiek znał plik w źródle jądra, w którym zdefiniowano rozmiar strony.

Moje drugie pytanie jest również bardzo proste: założyłem 5812B jako rozmiar pliku. Czy to prawda, że ​​ten rozmiar jest po prostu pobierany z i-węzła?

Rui F. Ribeiro
źródło

Odpowiedzi:

6

Nie ma bezpośredniego związku między rozmiarem pliku wykonywalnego a rozmiarem w pamięci. Oto bardzo szybki przegląd tego, co dzieje się po uruchomieniu pliku binarnego:

  1. Jądro analizuje plik i dzieli go na sekcje. Niektóre sekcje są ładowane bezpośrednio do pamięci, na osobnych stronach. Niektóre sekcje wcale nie są ładowane (np. Symbole debugowania).
  2. Jeśli plik wykonywalny jest dynamicznie połączony, jądro wywołuje dynamiczny moduł ładujący, ładuje wymagane biblioteki współdzielone i wykonuje edycję łącza zgodnie z wymaganiami.
  3. Program zaczyna wykonywać swój kod i zwykle zażąda więcej pamięci do przechowywania danych.

Aby uzyskać więcej informacji o formatach wykonywalnych, łączeniu i ładowaniu plików wykonywalnych, możesz przeczytać Linkery i programy ładujące autorstwa Johna R. Levine'a .

W pliku wykonywalnym 5kB jest prawdopodobne, że wszystko to kod lub dane, które należy załadować do pamięci, z wyjątkiem nagłówka. Kod wykonywalny będzie miał co najmniej jedną stronę, być może dwie, a następnie będzie co najmniej jedna strona dla stosu, prawdopodobnie jednej strony lub sterty (inne dane), plus pamięć używana przez biblioteki współdzielone.

Pod Linuksem możesz sprawdzić mapowania pamięci dla pliku wykonywalnego z cat /proc/$pid/maps. Format jest udokumentowany na proc(5)stronie podręcznika ; zobacz także Zrozumienie Linux / proc / id / maps .

Gilles „SO- przestań być zły”
źródło
0

Tak: w końcu dostajesz dwie strony 4k. Dane są ładowane na żądanie, więc jeśli nic nie odnosi się do drugiej strony, nigdy nie zostanie załadowane do pamięci.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Nie zmieniaj tych wartości i oczekuj, że coś zadziała.

Tak, rozmiar pliku jest przechowywany w i-węźle w ext2 / 3.

pjc50
źródło
0

W części dotyczącej definicji w jądrze ish 2.6.38 ~ dla architektury Intel:

arch / x86 / include / asm / page_types.h:

/ * PAGE_SHIFT określa rozmiar strony * /

# zdefiniować PAGE_SHIFT 12

# zdefiniuj ROZMIAR_STRONY (_AC (1, UL) << PAGE_SHIFT)

Frederik Deweerdt
źródło