2016-11-30 3 views
1

Я думаю, 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)) 

Почему ядро ​​нужно вычислить физический адрес? Он должен использовать виртуальный адрес для доступа к памяти в любом случае, не так ли? Я не могу понять, зачем нужен физический адрес.

ответ

2

Ваши запросы: -

  • почему Kmalloc более эффективен, чем vmalloc()?

kmalloc выделяет область физически смежной (также практически непрерывной) памяти. Физическая к виртуальной карте является взаимно однозначной.

Для vmalloc() для каждой страницы выделяется значение MMU/PTE; физическое к виртуальному отображению не является непрерывным.

vmalloc часто медленнее, чем kmalloc, так как он может перенаправить буферное пространство в практически непрерывный диапазон. kmalloc никогда не переделывает.

  • Почему Linux непосредственно отображает виртуальное пространство ядра в физическую память?

Существует одна концепция в ядре linux, известная как DMA (Direct Memory Access), которая требует непрерывной физической памяти. поэтому при запуске ядра DMA мы должны указать физически смежную память. поэтому нам нужно прямое отображение памяти.

  • Почему ядру необходимо рассчитать физический адрес? Он должен использовать виртуальный адрес для доступа к памяти в любом случае, не так ли?

для ответа на этот вопрос вам нужно прочитать разницу между виртуальной памятью и физической памятью. но, короче говоря, каждая операция загрузки и хранения выполняется в физической памяти (ОЗУ на ПК)

точка физической памяти в оперативной памяти.

виртуальная память указывает на область подкачки вашего жесткого диска.

+0

спасибо. Для последнего я думал, что виртуальная память означает адреса виртуальной памяти, предоставленные MMU, в то время как физическая память означает адреса физической памяти, рассчитанные MMU. Кажется, я неправильно понял эти условия. – hebothu

+0

Но из кода в «include/asm-x86/page_32.h» кажется, что виртуальная память действительно является адресами виртуальной памяти, указанными в MMU, а физическая память действительно является адресами физической памяти, вычисленными MMU?Поскольку инструкции загрузки и хранения используют виртуальные адреса в качестве операндов, почему ядру необходимо вычислить физические адреса? MMU все равно это сделает. – hebothu

+1

@hebothu видит одно или два предложения, которые не могут помочь вам понять управление памятью в Linux. Вы должны пройти через концепцию mmu. Но простыми словами, виртуальная память - только иллюзия. Память Actaul, которая используется для получения и размещения данных, - это ваш барабан, который относится к физической памяти. –

Смежные вопросы