Я работаю над приложением видео HAL & Там я получаю раму камеры CallBack от HAL Layer. Во время программирования я обнаружил, что memcpy копирование данных с физического адреса разбивается, когда это нормально, копируя данные с виртуального адреса . Я искал такую информацию о memcpy, но не нашел там, где & даже не на своей странице руководства. так, мой вопрос is memcpy требуется физический адрес или виртуальный адрес? Где-нибудь упоминается этот тип информации о memcpy?memcpy принимает виртуальный адрес или физический адрес?
ответ
memcpy
выполнен на C или оптимизирован в ассемблере. Таким образом, он не заботится о том, какой тип адреса он получает. Он просто загружает адреса в регистры процессора и выполняет инструкции mov
.
Это аппаратная архитектура операционной системы и памяти, которая отвечает за сопоставление любого логического (виртуального) адреса с физическим адресом.
Обратите внимание, что при использовании современных архитектур OS/памяти каждый процесс получает свое адресное пространство. Передача адресов между адресными пространствами не будет работать.
В этих случаях ОС, вероятно, будет обеспечивать функциональность для обмена объектами памяти (совместно или иначе) между процессами.
Как правильно объяснил Павел Огилви, memcpy
имеет дело с адресами пространства пользователя. Таким образом, это виртуальные адреса, а не физические адреса.
Тем не менее, существует возможность для очень больших областей с очень специфическими характеристиками выравнивания для оптимизации memcpy
, попросив ОС переназначить некоторые из целевых виртуальных адресов как дубликаты физической памяти, сопоставленной с исходными адресами. Эти страницы получат атрибут COPY_ON_WRITE, чтобы гарантировать, что программа только изменяет страницы в соответствующем массиве, если и когда она записывается в одну из них. общий реализация memcpy
в GlibC делает это (см. glibc-2.3.5/sysdeps/generic/memcpy.c
). Но это прозрачно для программиста, который по-прежнему предоставляет адреса в пользовательском пространстве.
Архитектура зависимая. –
'memcpy' является частью библиотеки C для пользовательских программ, и им не нужны виртуальные или физические адреса. Вы должны проверить документацию ядра ОС для правильных функций в адресном пространстве ядра. –
@MartinJames, что означает, что мне нужно пойти с моей документацией на ядро, верно? –