December 8th, 2012

404

PFN & pages

Засел за ядро более капитально. Первое откровение (которое в UTLK тщательно проговаривают) - это разный смысл, скрывающийся за PFN (page frame number) и понятием "страница памяти". Если быть точным, упор на понятие "frame", то есть на смысл его как "хранилища для страницы памяти".

На первый взгляд это кажется ерундой - есть страница памяти, есть её номер (который есть быть кратный размеру страницы её адрес).

Однако, это тщательное разделение в терминологии отражает крайне различные сущности.

Страница - это набор данных. char [4096], утрируя. Её нужно связать с логическим адресом процесса (или даже самого ядра), но в общем случае местоположение страницы в памяти совершенно произвольно (для этого, собственно, трансляция адресов и придумана была).

А вот PFN - это место, куда этот самый char[4096] положить можно.

В тривиальном представлении, PFN - это нумерованная память от нуля до доступного максимума. Но, насколько я понимаю, в современном мире может оказаться так, что физическая память дырявая (даже оставляя в стороне странности в районе диапазона 640к-1М, memory hotplug/unplug может приводить к тому, что у системы есть память 1-4Гб и 8-12Гб. А планка 4-8 просто вынута).

Таким образом, ядро имеет с одной стороны набор мест для размещения страниц (фреймов страниц), а с другой - набор страниц, которые нужно разместить.

(Наверное, я сейчас несу детский лепет и архиочевидные вещи, но для меня выделение PF в контексте "контейнер для страницы" внове).
404

Дело ясно, что дело тёмно

Я надеялся, что в книжке это всё будет хорошо рассказано. Увы, весьма поверхностно бегают.

Вот, вопросы (английский - цитаты, русский, вопросы):

totalram_pages
Total number of usable page frames
Это включает в себя код самого ядра или нет? Чуть раньше говорилось, что в reserved попадает и код ядра, и хапнутые железом диапазоны.

min_low_pfn
Page frame number of the first usable page frame after the kernel image in RAM
max_pfn
Page frame number of the last usable page frame
max_low_pfn
Page frame number of the last page frame directly mapped by the kernel (low memory)
totalhigh_pages
Total number of page frames not directly mapped by the kernel (high memory)
highstart_pfn
Page frame number of the first page frame not directly mapped by the kernel
highend_pfn
Page frame number of the last page frame not directly mapped by the kernel

... И всё-таки, что такое low и high в контексте памяти у линукса? (И не надо мне про himem.sys и HMA) И что значит directly mapped? Бывает "indirectly"? И что значит mapped, если мы говорим про физическую память?