LINUX.ORG.RU

Linux kernel module

 , ,


0

1

Добрый день, уважаемые знатоки! Может быть кто то сталкивался с такой задачей, у самого пока не получается найти документацию или пример как реализовать... Смысл задачи: Модуль ядра, нужно выделить физически неразрывный участок в памяти с адресом выше 2гБ. Пробовал ioremap, не проканало. Пробовал выделять постранично с контролем физической памяти через virt_to_phis, выделяет с 700 мегабайта ВНИЗ! ну и, естественно, валит ядро как только занимаю все место. Есть мысль, что нужно увеличить количество области памяти ядра, пока не нарыл как... Если была похожая задача или где то видели ссылки на что то похожее, буду премного благодарен!

Лучше бы подумал зачем тебе в модуле ядра выделять такие объёмы памяти, а не как это сделать. Смысла задачи ты не изложил в вопросе. Ты только сказал, что хочешь сделать.
Ядро 32 бит?

В 32-р архитектуре ядро Linux может напрямую адресовать только первый гигабайт физической памяти.

http://life-in-code.com/о-памяти-в-linux-procmeminfo/

xmikex ★★★★
()

нужно выделить физически неразрывный участок в памяти с адресом выше 2гБ.

самое простое - ограничить размер физической памяти через параметр ядра mem=2G

 These ‘K’, ‘M’, and ‘G’ letters represent the _binary_ multipliers ‘Kilo’, ‘Mega’, and ‘Giga’, equaling 2^10, 2^20, and 2^30 bytes respectively.

и смапить память выше 2G в модуле через ioremap.

Более правильный - использовать reserved memory

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841683/Linux+Reserved+Memory

anonymous
()
Ответ на: комментарий от xmikex

Смысл в том, что есть устройство, оно использует 30-битную маску PCI, но по словам разработчиков вполне может жить с 32-бтной. Устройство подразумевается использовать на ARM, там адресация изначально от 1гБ идет и не работает устройство. На x86 все работает, но адресация в пределах 1гБ. Решили имитировать память выше 1гБ на х86. Большой объем мне не нужен, мне нужно разместить буфер dma за пределами 1гБ физической памяти.

shagalinam
() автор топика
Ответ на: комментарий от anonymous

Да, для ARM это, наверное, вариант, каюсь, не указал что архитектура х86. Из эксперимента смог понять только что ioremap позволяет работать только с памятью начиная от PCI-контроллера, на области физический памяти возвращает nullptr.

shagalinam
() автор топика
Ответ на: комментарий от anonymous

Да, для x86 пробовал mem=… Огранчивает сверху. Мне наоборот нужно выделить сверху, ограничив снизу. Есть memmap=… вообще не понял как работает на x86. Физическая адресация менялась не сильно, уж точно не в пределах 4гБ.

shagalinam
() автор топика
Ответ на: комментарий от shagalinam

пробовал mem=… Огранчивает сверху. Мне наоборот нужно выделить сверху, ограничив снизу

в заглавном сообщение ты гворишь ровно наоборот

нужно выделить физически неразрывный участок в памяти с адресом выше 2гБ

mem= ограничивает ядру верхний предел выше которого он не использует физическую память, эту память можно использовать как тебе угодно, процессор работает с виртуальными адресми, для этого и нужен ioremap чтобы отобразит физическую память в page table, для DMA аппаратных устройств он вообще не нужен - обращайся по физическим адресам.

anonymous
()
Ответ на: комментарий от anonymous

Да, наверное, я уже сам запутал все. Смысл в том что нужно передать адрес участка физической памяти под dma устройству, на х86 выделяется пвмять до 1гб, и устройство работает, на арм после 1 гб и не работает. Хотим определиться это устройство не будет работать на всех арм или на этом конкретно, для этого хочу выделить дма выше 1гб на х86. Вот как ее выделить выше пока не соображу.

shagalinam
() автор топика
Ответ на: комментарий от shagalinam

Смысл в том что нужно передать адрес участка физической памяти под dma устройству, на х86 выделяется пвмять до 1гб, и устройство работает, на арм после 1 гб и не работает

а что за устройство и какая ему разница выше гига или ниже ? для pci устройств помоему критично выше 4 гигов или ниже (32 битный DMA).

anonymous
()
Ответ на: комментарий от anonymous

Устройство - плата коммутатора на pci-e. Изначально в поставляемом драйвере маска dma была 30 бит, что меньше 1гб. Сказали, что можно поменять на 32. После замены не заработала на arm.

shagalinam
() автор топика
Ответ на: комментарий от shagalinam

в поставляемом драйвере маска dma была 30 бит, что меньше 1гб. Сказали, что можно поменять на 32.

а кто сказал и зачем было менять если всё работало ?

spbob
()
Ответ на: комментарий от shagalinam

на ARMе не работало изначально, работает на х86

на армах зависит от реализации

https://linux-sunxi.org/A64/Memory_map

у алвиннера как видно нет внешней памяти по адресам ниже гига, на других реализациях SoC может есть а может нет. На i.mx6 например есть - DDRC отображается начиная с адреса 0x10000000

spbob
()
Ответ на: комментарий от spbob

Все верно… Получается, нужно подбирать кристалл. Спасибо.

shagalinam
() автор топика
Ответ на: комментарий от shagalinam

Ты пишешь драйвер PCI? Расскажи, зачем тебе нужно вообще больше нескольких мегабайт? Есть вероятность что ты пытаешься делать что-то не так

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Это академический труд, как говорил выше цель его выделение памяти для dma выше первого гБ физической памяти. На практике не удалось, похоже, ограничение области памяти ядра.

shagalinam
() автор топика
Ответ на: комментарий от kmeaw

Пробовал, нельзя запретить использовать начиная с 0, пытается запихать туда ядро и успешно мрет. Если хотч бы 100 метров в начале, то упорно выделяет адрес в начале…

shagalinam
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.