Size: a a a

WebAssembly — русскоговорящее сообщество

2020 May 11

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
но в версии dlmalloc в wasi есть mstate и теоретически он может работать, как ты сказал
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
а там поменять аллокатор нельзя?
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
можно, но это же аллокатор внутри васма будет, и он сможет только memory.grow вызывать
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
но в версии dlmalloc в wasi есть mstate и теоретически он может работать, как ты сказал
но нужна поддержка вызова mmap со стороны вм
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
можно, но это же аллокатор внутри васма будет, и он сможет только memory.grow вызывать
не понял, я про то же
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
в васме же можно смотреть привызове malloc - ага , еще конец страницы не закончился значит работаем с ним. Потом когда кончился - не проверять что там есть ли свободные страницы, а безусловно аллоцировать новую тем же memory.grow
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
все на уровне буккипинга
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
lil pep
в васме же можно смотреть привызове malloc - ага , еще конец страницы не закончился значит работаем с ним. Потом когда кончился - не проверять что там есть ли свободные страницы, а безусловно аллоцировать новую тем же memory.grow
ага, мне кажется, мы немного о разном. Смотри, я изначально имел в виду, что мы всю область кучи васма (т.е. всё, что после стека и данных) разобъём на несколько частей и у каждого модуля будет своя независимая часть, начало которой регулируется значением __heap_base. Но тут есть проблема в том, что dlmalloc и прочие аллокаторы могут только линейно расти из-за того, что есть в васме есть только одна инструкция для управления памятью. И эта область одного модуля растёт по дефолту до тех пор, пока grow не вернёт -1. Таким образом, она может зайти на соседние области, лежащие справа от неё, т.к. -1 возвращается, когда вм упирается в max mem size, заданный в васм файле (ну или указываемый при создании памяти).
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
возможно немного о разном но противоречие не там где ты указал.  Я понимаю ограничения которые дает memory.grow, однако я говорю о решение которое не упирается в них (+-)

Давай пример разберем

У тебя есть один модуль. У этого модуля есть стек, дата сегмент мб .bss, и все это умещается в половину одной страницы в сумме. __heap_base соответственно в районе 32k. У каждого модуля свой аллоктор скажем. Все это PIC.

Теперь представим что мы инстанциируем этот модуль два раза. Один попадает в первую страницу, второй попадает во вторую.

Безусловно, если впелить туда обычный аллокатор то вроде текущих версий тех же dlmalloc, wee_alloc, то все закончиться плачевно, а именно тем что первый инстанс наедет на область второго.

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

lp

lil pep in WebAssembly — русскоговорящее сообщество
lil pep
в васме же можно смотреть привызове malloc - ага , еще конец страницы не закончился значит работаем с ним. Потом когда кончился - не проверять что там есть ли свободные страницы, а безусловно аллоцировать новую тем же memory.grow
а именно ↑
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
тоесть первый модуль будет выделять аллокации до конца страницы. Если места не хватает на новую аллокацию, то аллокатор выделит новую страницу
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
новая страница окажется уже за пространством второго инстанса
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
lil pep
тоесть первый модуль будет выделять аллокации до конца страницы. Если места не хватает на новую аллокацию, то аллокатор выделит новую страницу
я так понимаю, что это нужно не аллокатор патчить, а вм?
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
нет, именно аллокатор
источник

AS

Aleksey Sidorov in WebAssembly — русскоговорящее сообщество
lil pep
возможно немного о разном но противоречие не там где ты указал.  Я понимаю ограничения которые дает memory.grow, однако я говорю о решение которое не упирается в них (+-)

Давай пример разберем

У тебя есть один модуль. У этого модуля есть стек, дата сегмент мб .bss, и все это умещается в половину одной страницы в сумме. __heap_base соответственно в районе 32k. У каждого модуля свой аллоктор скажем. Все это PIC.

Теперь представим что мы инстанциируем этот модуль два раза. Один попадает в первую страницу, второй попадает во вторую.

Безусловно, если впелить туда обычный аллокатор то вроде текущих версий тех же dlmalloc, wee_alloc, то все закончиться плачевно, а именно тем что первый инстанс наедет на область второго.

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

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
lil pep
нет, именно аллокатор
я не понимаю, как именно аллокатор будет выделять новую страницу, он же вкомпилирован в васм и у него есть только memory.grow/memory.size
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
что делает функция malloc? Она обычно берет большие блоки памяти и выделает из них маленькие блоки памяти, правильно? Роль больших блоков играют обычно страницы, но не обязательно.
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
Блоки в этом пуле могут закончиться, в таком случае их нужно заполнить
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
в больших системах это приводит к mmap обычно
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
раньше кк brk/sbrk
источник