LINUX.ORG.RU

А каким образом в ядре на 32-х битных плаформах можно хедлить гигабайтные массивы?

 , , ,


0

2

насколько я понимаю все сорта *malloc() здесь мимо кассы.

вопрос больше теоретический для упорядочивания мозгов.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

если массив==структура, а не linear chunk of memory, сделай несколько чанков и поверх напиши функции для доступа как-у-настоящих-массивов, а внутри чанка уже malloc

stevejobs ★★★★☆
()

Всего 1Г? Не вижу проблемы.

tailgunner ★★★★★
()
Ответ на: комментарий от Aswed

Хм. Можешь предоставить простой пример для массива размером 2^32?

1. выделить память 2. проинициализировать нулями 3. освободить память.

cvv ★★★★★
() автор топика

Тебе виртуальной или физической? С виртуальной man vmalloc(), аналогично юзеровскому malloc(). Непрерывный кусок физической памяти в Гб - ничего не получиться. Был какой-то костыль, связаный с выделением этой памяти ещё при загрузке ядра, но я точно не помню, ищи в гугле.

В ядре есть ещё пдп и логическая памяти. пдп - для пдп контролёров внешних устройств (dma по ихнему); логическая - я так и не понял, в чём там прикол и как с ней работать.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от cvv

Этож юзерспейс - там все понятно.

Зарезервируй сколько надо в ядре и используй. Если нужен аллокатор для этого участка памяти - в ядре есть специальный http://mina86.com/2012/06/10/deep-dive-into-contiguous-memory-allocator-part-i/

в юзерспейс отдать можно через mmap.

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

Тебе виртуальной или физической?

Виртуальной.

С виртуальной man vmalloc(), аналогично юзеровскому malloc().

ну да. вот смотри я делаю vmalloc(0x40000000) и в результате получаю 32-битный указатель. куда будет указывать этот указатель если у нас 3G занимает юзерспейс а из оставшегося гига часть уже занята кодом ядра? (Предполагаем что на машине физически 8G рамы)

Непрерывный кусок физической памяти в Гб - ничего не получиться. Был какой-то костыль, связаный с выделением этой памяти ещё при загрузке ядра, но я точно не помню, ищи в гугле.

с выделением памяти на этапе загрузки я уже разобрался :))) а теперь интересно в процессе работы.

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

Хорошо - обобщим задачу: меня интересует работа с массивами размером равным или больше (3G-VMSPLIT).

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

Это аллокатор физической памяти на этапе загрузки. с этим моментом я уже разобрался. теперь меня интересует аналогичный аллокатор виртуальной памяти в процессе работы

cvv ★★★★★
() автор топика

держать массив кусками, в памяти нескольких отдельных процессов (если PAE включено)

Harald ★★★★★
()
Ответ на: комментарий от cvv

Больше гигабайта, в ядре, замапленного по непрерывному диапазону виртуальных адресов? Выбери любые два пункта.

tailgunner ★★★★★
()
Ответ на: комментарий от Harald

а потом дергать при помощи copy_from_user()? Я думал об этом но неужели нет более прямых решений?

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

а, тебе именно внутри ядра надо? Тогда хз

Harald ★★★★★
()
Ответ на: комментарий от tailgunner

Ну если выбрать только два - то для меня там все понятно. Меня интересует именно все три пункта одновременно.

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

Все три невозможно. Впрочем, ты, как обычно, не сформулировал решаемую задачу.

С другой стороны... можно сделать разделение 3G/1G в пользу ядра, пошаманить с vmalloc, и что-то может получиться.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Впрочем, ты, как обычно, не сформулировал решаемую задачу.

почему же? я же написал что мне это надо для упорядочивания мозгов :)

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

Я думаю, что в ядре подобные задачи не возникают, поэтому механизмов для обшего решения нет. Ну типа, если тебе такое надо в ядре - ты что-то делаешь не так. Делай себе userspace helper, пускай он памяти сколько надо выделяет, а ты с ним как-нибудь комуницируй.

Чесно, я даже не представляю зачем ядру столько виртуальной памяти.

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

Был какой-то костыль, связаный с выделением этой памяти ещё при загрузке ядра, но я точно не помню, ищи в гугле.

Такие большие шматы памяти отрезают при старте платформы и наперед знают вирт. адрес этого шмата. По сути исключают этот кусок из struct mem_info при инициализации. Так делать проще всего.

ncrmnt ★★★★★
()

Для 32 битного окружения придумали еще во времена пентиумпро расширенные 4 бита. Тем самым дали возможность работать с 36 битным пространством. Гугли на тему huge table. Oracle даже эту фичу использует, но там некоторое шаманство требуется с пересборкой некоторых библиотек. Этот колхоз необходим когда тебе нужно получить больше чем 3 гига юзерспейса. Я могу что-то неточно излагать покуда этой темой занимался 10 лет назад.

Deleted
()

вобщем тут надо смотреть на

<io_mapping.h>
и
<mtd/map.h>

cvv ★★★★★
() автор топика
Последнее исправление: cvv (всего исправлений: 4)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.