Я думаю, kmalloc()
выделяет непрерывные физические страницы в ядре, потому что пространство виртуальной памяти непосредственно сопоставляется с физическим пространством памяти, просто добавляя смещение.Почему kmalloc() более эффективен, чем vmalloc()?
Однако я до сих пор не понимаю, почему он более эффективен, чем vmalloc()
. По-прежнему нужно пройти через таблицу страниц (таблица страниц ядра), правильно? Поскольку MMU не отключается, когда процесс переключается на ядро. Итак, почему Linux напрямую сопоставляет виртуальное пространство ядра с физической памятью? Какая польза?
В include/asm-x86/page_32.h
, есть:
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
Почему ядро нужно вычислить физический адрес? Он должен использовать виртуальный адрес для доступа к памяти в любом случае, не так ли? Я не могу понять, зачем нужен физический адрес.
спасибо. Для последнего я думал, что виртуальная память означает адреса виртуальной памяти, предоставленные MMU, в то время как физическая память означает адреса физической памяти, рассчитанные MMU. Кажется, я неправильно понял эти условия. – hebothu
Но из кода в «include/asm-x86/page_32.h» кажется, что виртуальная память действительно является адресами виртуальной памяти, указанными в MMU, а физическая память действительно является адресами физической памяти, вычисленными MMU?Поскольку инструкции загрузки и хранения используют виртуальные адреса в качестве операндов, почему ядру необходимо вычислить физические адреса? MMU все равно это сделает. – hebothu
@hebothu видит одно или два предложения, которые не могут помочь вам понять управление памятью в Linux. Вы должны пройти через концепцию mmu. Но простыми словами, виртуальная память - только иллюзия. Память Actaul, которая используется для получения и размещения данных, - это ваш барабан, который относится к физической памяти. –