Перейти к содержанию
    

Адресация в Linux Kernel

Приветствую.

Функцией kmalloc выделяю блок памяти.

Фкнкция virt_to_phys возвращает физический адрес блока памяти.

В системе 16 ГБ памяти - адресное пространство 0x00000000_00000000 - 0x00000003_FFFFFFFF.

Иногда функция virt_to_phys возвращает значение 0х00000004_0c012000 (0x00000004_09911000 и др).

Как такое получилось?

 

Из "Linux Device Drivers":

Physical addresses

The addresses used between the processor and the system’s memory. Physical

addresses are 32- or 64-bit quantities; even 32-bit systems can use larger physical addresses in some situations.

Из "Understanding the Linux Kernel":

Physical address

Used to address memory cells in memory chips. They correspond to the electrical signals sent along the address pins of the microprocessor to the memory bus. Physical addresses are represented as 32-bit or 36-bit unsigned integers.

Как получается, что физический адрес блока памяти вышел за пределы диапазона памяти системы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую.

Функцией kmalloc выделяю блок памяти.

Фкнкция virt_to_phys возвращает физический адрес блока памяти.

В системе 16 ГБ памяти - адресное пространство 0x00000000_00000000 - 0x00000003_FFFFFFFF.

Иногда функция virt_to_phys возвращает значение 0х00000004_0c012000 (0x00000004_09911000 и др).

Как такое получилось?

 

Из "Linux Device Drivers":

 

Из "Understanding the Linux Kernel":

 

Как получается, что физический адрес блока памяти вышел за пределы диапазона памяти системы?

 

У меня часто такое бывает. Все законы нарушаются, а потом нахожу в чем ошибку сделал. В первой, цитируемой вами книге, есть информация об аллокации памяти для DMA:

void *
dma_alloc_coherent(struct device *dev, size_t size,
                 dma_addr_t *dma_handle, gfp_t flag)

 

В документации кернела:

https://www.kernel.org/doc/Documentation/DMA-API.txt

 

Этот способ дает сразу физический и логический адреса. Что возвращает этот вызов?

Изменено пользователем Tarbal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовать функцию:

void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)

пробовал.

Но нашёл, что её основное отличие от kmalloc - это получение сразу и виртуального и физического адресов. Что касается физических адресов, то в результате тщательного тестирования неоднократно была получена ситуация описанная в посте выше. Физический адрес, возвращаемый dma_alloc_coherent, был за пределами адресов системной памяти. Поэтому и возник вопрос, как физический адрес получается за пределами физических адресов установленной RAM?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но нашёл, что её основное отличие от kmalloc - это получение сразу и виртуального и физического адресов. Что касается физических адресов, то в результате тщательного тестирования неоднократно была получена ситуация описанная в посте выше. Физический адрес, возвращаемый dma_alloc_coherent, был за пределами адресов системной памяти. Поэтому и возник вопрос, как физический адрес получается за пределами физических адресов установленной RAM?

Процессор какой? У некоторых ядер, если не склероз MIPS, используются разные маппинги для кешируемого/некешируемого обращения. Т.е. адрес 0x1234 дает обращение к ячейке памяти через кеш, а адрес 0x80001234 дает ту же самую ячейку, но мимо кеша.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Процессор какой? У некоторых ядер, если не склероз MIPS, используются разные маппинги для кешируемого/некешируемого обращения. Т.е. адрес 0x1234 дает обращение к ячейке памяти через кеш, а адрес 0x80001234 дает ту же самую ячейку, но мимо кеша.

i7-3770K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...