2016-03-12 3 views
0

Я работаю над приложением видео HAL & Там я получаю раму камеры CallBack от HAL Layer. Во время программирования я обнаружил, что memcpy копирование данных с физического адреса разбивается, когда это нормально, копируя данные с виртуального адреса . Я искал такую ​​информацию о memcpy, но не нашел там, где & даже не на своей странице руководства. так, мой вопрос is memcpy требуется физический адрес или виртуальный адрес? Где-нибудь упоминается этот тип информации о memcpy?memcpy принимает виртуальный адрес или физический адрес?

+2

Архитектура зависимая. –

+0

'memcpy' является частью библиотеки C для пользовательских программ, и им не нужны виртуальные или физические адреса. Вы должны проверить документацию ядра ОС для правильных функций в адресном пространстве ядра. –

+0

@MartinJames, что означает, что мне нужно пойти с моей документацией на ядро, верно? –

ответ

2

memcpy выполнен на C или оптимизирован в ассемблере. Таким образом, он не заботится о том, какой тип адреса он получает. Он просто загружает адреса в регистры процессора и выполняет инструкции mov.

Это аппаратная архитектура операционной системы и памяти, которая отвечает за сопоставление любого логического (виртуального) адреса с физическим адресом.

Обратите внимание, что при использовании современных архитектур OS/памяти каждый процесс получает свое адресное пространство. Передача адресов между адресными пространствами не будет работать.

В этих случаях ОС, вероятно, будет обеспечивать функциональность для обмена объектами памяти (совместно или иначе) между процессами.

0

Как правильно объяснил Павел Огилви, memcpy имеет дело с адресами пространства пользователя. Таким образом, это виртуальные адреса, а не физические адреса.

Тем не менее, существует возможность для очень больших областей с очень специфическими характеристиками выравнивания для оптимизации memcpy, попросив ОС переназначить некоторые из целевых виртуальных адресов как дубликаты физической памяти, сопоставленной с исходными адресами. Эти страницы получат атрибут COPY_ON_WRITE, чтобы гарантировать, что программа только изменяет страницы в соответствующем массиве, если и когда она записывается в одну из них. общий реализация memcpy в GlibC делает это (см. glibc-2.3.5/sysdeps/generic/memcpy.c). Но это прозрачно для программиста, который по-прежнему предоставляет адреса в пользовательском пространстве.