Задать вопрос

Как происходит доступ к эл. массива на уровне ядра? Malloc выделяет непрерывную физическую память?

Например массив Int* arr = new int[1024*1024*1024] он как храниться?
Виртуальная память непрерывна. Я точно знаю что ( arr[0]; arr[len]) непрерывная область.
А физическая, для массива то же? Ведь, так будет доступ намного быстрее?
Или он разброшен по страницам? И там каждый адрес i++ адрес вычисляется?
Или же, там вычисляется только каждый кратный 12 бит адрес страницы?

Хочу понять. К примеру каждый доступ к массиву arr[index], Ядро Операционки, получая такую команду, она начинает вычислять адрес в защитном режиме для каждого нового arr[ index ] ??? Что будет дольше по времени полагаю.
Или же, она может на уровне ядра,(если память непрерывно), зная базу, просто суммирует с Смещением, и сразу в Реальном режиме, обращается, минуя все там Страничные режимы???

Вот к примеру, для эмуляции, функция std::memcpy как будет работать? C одной стороны хочется взять и скопировать максимально быстро. А для эмуляции, в случае прерывности и разброса по разных блокам, то получается 'эмулятор каждый адрес вычислять что ли? Что уже в 2-100 раз будет дольше.
  • Вопрос задан
  • 242 просмотра
Подписаться 5 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как происходит доступ к эл. массива на уровне ядра?

Так же как и на уровне приложения -- через трансляцию виртуального адреса в физический.

Например массив Int* arr = new int[1024*1024*1024] он как храниться?

Если мы для определённости возьмём linux, то у ядра есть несколько разных способов выделения памяти, в зависимости от того, для чего эта память выделяется. Есть наиболее простой и стандартный kmalloc который выделяет память непрерывную как виртуально так и физически. Обычно этим механизмом нельзя выделить большой непрерывный кусок. Есть vmalloc, который выделяет непрерывную виртуально, но возможно прерывную физически память. Есть get_free_pages который выделяет непрерывные страницы физической памяти, возможно, не отображаемые ни в какие виртуальные адреса. Есть Contiguous Memory Allocator который при старте системы резервирует кусок непрерывной физической памяти и может аллоцировать оттуда куски по запросу.
Важный момент состоит в том, что аллокации делаемые ядром linux через упомянутые интерфейсы всегда обеспечиваются физической памятью, у памяти ядра нет пейджинга.

А физическая, для массива то же? Ведь, так будет доступ намного быстрее?

Почему быстрее? С точки зрения процессора всё равно будет трансляция виртуального адреса в физический, если повезёт -- попадание в TLB, если не повезёт -- ходить по каталогам и таблицам страниц в памяти.

получается эмулятор каждый адрес вычислять что ли?

Простой эмулятор -- да, наверно. Умный эмулятор может кешировать эту информацию, например именно это свойство даёт QEMU большую часть его Q.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы