Во-первых, есть несколько моделей памяти, например FMM , SMP и NUMA . Знания о виртуальной памяти, страницах и таблицах страниц, структуре ядра и памяти пользовательского пространства могут не записываться здесь, потому что это намного больше, чем ограничение длины ответа, и я думаю, вы можете узнать это из любых книг.
Давайте возьмем для примера NUMA. В NUMA каждый ЦП будет иметь узел: struct pglist_data *node_data
, и эта структура имеет много Зон, таких как ZONE_DMA, ZONE_DMA32, ZONE_NORMAL, ZONE_HIGHMEM, ZONE_MOVALBE
, каждая Зона имеет много struct free_area
, и эта структура включает список struct page
.
Почему нам нужно использовать page
? Это потому, что наша физическая память ограничена, поэтому мы создаем виртуальную память. Затем нам понадобится механизм для загрузки виртуальной памяти в физическую для выполнения задачи (процесса или потока). Поэтому мы используем page как мета-запись и используем некоторые модели, такие как NUMA, для управления этими страницами и таблицами страниц.
Когда нам нужно выделить некоторую память, мы будем использовать систему друзей и распределитель slab / slub для выделения памяти страниц и добавьте их в зону, которую можно использовать. Когда физическая память загружает слишком много страниц, она будет использовать get_page_from_freelist()
или kswapd
для их замены.
На самом деле память и адресное пространство являются важной частью ядра Linux. Я предлагаю вам прочитать несколько книг, таких как CSAPP, чтобы получить относительно глубокое понимание ОС, а затем прочитать Linux исходные коды ядра, чтобы погрузиться в них.