реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Адресация в Linux Kernel
doom13
сообщение Oct 2 2015, 10:59
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Приветствую.
Функцией 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.

Как получается, что физический адрес блока памяти вышел за пределы диапазона памяти системы?
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 20 2015, 12:18
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(doom13 @ Oct 2 2015, 14:59) *
Приветствую.
Функцией 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 - Oct 20 2015, 12:18
Go to the top of the page
 
+Quote Post
doom13
сообщение Oct 22 2015, 08:13
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Tarbal @ Oct 20 2015, 15:18) *

Использовать функцию:
Код
void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)

пробовал.
Но нашёл, что её основное отличие от kmalloc - это получение сразу и виртуального и физического адресов. Что касается физических адресов, то в результате тщательного тестирования неоднократно была получена ситуация описанная в посте выше. Физический адрес, возвращаемый dma_alloc_coherent, был за пределами адресов системной памяти. Поэтому и возник вопрос, как физический адрес получается за пределами физических адресов установленной RAM?
Go to the top of the page
 
+Quote Post
LightElf
сообщение Oct 22 2015, 09:37
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



QUOTE (doom13 @ Oct 22 2015, 11:13) *
Но нашёл, что её основное отличие от kmalloc - это получение сразу и виртуального и физического адресов. Что касается физических адресов, то в результате тщательного тестирования неоднократно была получена ситуация описанная в посте выше. Физический адрес, возвращаемый dma_alloc_coherent, был за пределами адресов системной памяти. Поэтому и возник вопрос, как физический адрес получается за пределами физических адресов установленной RAM?

Процессор какой? У некоторых ядер, если не склероз MIPS, используются разные маппинги для кешируемого/некешируемого обращения. Т.е. адрес 0x1234 дает обращение к ячейке памяти через кеш, а адрес 0x80001234 дает ту же самую ячейку, но мимо кеша.
Go to the top of the page
 
+Quote Post
doom13
сообщение Oct 22 2015, 18:15
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(LightElf @ Oct 22 2015, 12:37) *
Процессор какой? У некоторых ядер, если не склероз MIPS, используются разные маппинги для кешируемого/некешируемого обращения. Т.е. адрес 0x1234 дает обращение к ячейке памяти через кеш, а адрес 0x80001234 дает ту же самую ячейку, но мимо кеша.

i7-3770K
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Oct 29 2015, 10:25
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



lazy page allocation?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 11:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01447 секунд с 7
ELECTRONIX ©2004-2016