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

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

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

Вот к примеру, для эмуляции, функция std::memcpy как будет работать? C одной стороны хочется взять и скопировать максимально быстро. А для эмуляции, в случае прерывности и разброса по разных блокам, то получается 'эмулятор каждый адрес вычислять что ли? Что уже в 2-100 раз будет дольше.
  • Вопрос задан
  • 234 просмотра
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы