185 похожих чатов

А какие существуют способы обработки ошибок выделения памяти в ядре?

Т.е., допустим, есть функция, которая возвращает адрес свободной страницы в физической памяти и диапазон виртуальных адресов, который должен быть замаплен на свежевыделенную память. Так вот если пойти прямолинейно и в "тупую" и просто пройтись по всем записям таблицы страниц, которые надо замапить и присвоить им результат функции (получается по вызову на каждую запись таблицы). Так вот, что делать если во время этого процесса выяснится, что память закончилась и удовлетворить запрос выделения памяти невозможно? Дело в том, что в результате у нас остаётся частично удовлетворённый запрос, который надо откатить. Напрашивается только 2 основных решения, либо придумать способ, чтобы такой запрос можно было действительно откатить, либо как-то заранее прикинуть сколько запрос потребует памяти, чтобы "тупой" алгоритм никогда не мог сломаться. Первый вариант, кажется не очень хорошим. Второй вариант сложноват для реализации. Есть ли варианты проще?

51 ответов

25 просмотров

Стикер

disba1ancer- Автор вопроса

потому что алгоритм надо посреди работы развернуть в обратном направлении

Знаешь историю про qnx?

откат должен работать если правильно коды возврата использовать и дерево вызовов красиво построить тогда что-то типа intermediate_page = allocated.x; if allocate_subpages.failure { deallocate(intermediate_page); return failure; } commit_pages();

disba1ancer- Автор вопроса
disba1ancer
не знаю ни одной

Ну вот оно делало в какой-то версии то же что и предлагаешь ты и по итогу висло, ядром, намертво

disba1ancer- Автор вопроса
disba1ancer
и почему оно висло?

Потому что ядро не должно так делать

disba1ancer- Автор вопроса
ᛒ ᛖ ᚱ ᚲ ᚢ ᛊ ᛞ ᛖ ᚲ ᛖ ᚱ
откат должен работать если правильно коды возврата...

ну для этого надо кодами пользоваться, а не как очень часто бывает - если не ноль(или другой код удачного завершения), то кидаем в панику

disba1ancer
а как оно должно делать?

Оно должно быть просто интерефейсом

Mixail Frolov
ну для этого надо кодами пользоваться, а не как оч...

у меня Result<T,E> зачем мне коды еще я про общую структуру как это должно работать, реализуйте как удобнее

disba1ancer- Автор вопроса
Boris Vinogradov
Нее, просто надо делать ролбэк

роллбек сделать не так просто, нужно учитывать, что было уже замаплено до нас, обычно это случаи в районе начала и конца аллокации

disba1ancer- Автор вопроса
disba1ancer
стек не резиновый

или страничку под номера строниц выделить

А зачем нужно искать страницу для ядра? Смаппить в уже известное место нельзя?

disba1ancer- Автор вопроса
disba1ancer
вопроса в том куда мапить нет

А, извиняюсь, я чет не сразу понял, при чем здесь странички. В таком случае, у тебя память может только у физического аллокатора закончится, но тогда уже делать нечего, мне кажется:)

disba1ancer- Автор вопроса
Evg Resh
А, извиняюсь, я чет не сразу понял, при чем здесь ...

про этот случай речь и идёт, возможно я не совсем правильно пояснил, прошу прощения если где-то ввёл в заблуждение

Evg Resh
А, извиняюсь, я чет не сразу понял, при чем здесь ...

Ну если маппинг страниц норм сделан то можно утилизировать, по сжимать или же посвоппить на диск

disba1ancer- Автор вопроса
disba1ancer- Автор вопроса
Boris Vinogradov
А почему нет диска?

потому что нет подсистемы взаимодейтсвия с ним, а если бы и была, инициализирована она будет позже инициализации аллокатора

disba1ancer
потому что нет подсистемы взаимодейтсвия с ним, а ...

А ты планируешь oom словить на инициализации?

disba1ancer
потому что нет подсистемы взаимодейтсвия с ним, а ...

если у тебя пиздец на инициализации происходит то иди читай посты Brendan-а на осдев форуме

disba1ancer- Автор вопроса
Evg Resh
А ты планируешь oom словить на инициализации?

если катастрофически мало памяти

disba1ancer
потому что нет подсистемы взаимодейтсвия с ним, а ...

А для чего ты ос делаешь что у тебя просрана память еще до работы с фс?

disba1ancer
если катастрофически мало памяти

Ты под avr с 512 байт рамы пишешь штоль?

disba1ancer- Автор вопроса
Wild_Wind
Ты под avr с 512 байт рамы пишешь штоль?

я просто любитель предусматривать корнеркейсы

disba1ancer
я просто любитель предусматривать корнеркейсы

тогда тебе точно за брендановскими постами

disba1ancer
ну нет

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

disba1ancer
я просто любитель предусматривать корнеркейсы

Тогда тебе надо писать на расте или аде

disba1ancer- Автор вопроса
disba1ancer- Автор вопроса
Boris Vinogradov
Тогда тебе надо писать на расте или аде

не думаю, что это чем-то сильно поможет

disba1ancer
не думаю, что это чем-то сильно поможет

Поможет, вдруг ты будешь писать мимо массива

disba1ancer
не думаю, что это чем-то сильно поможет

Там констрейны можно навешать и компилятор с прувером будут тебе говорить, где ты идиот.

Wild_Wind
Там констрейны можно навешать и компилятор с пруве...

сишников ожидает неприятный сюрприз - ВЕЗДЕ

ᛒ ᛖ ᚱ ᚲ ᚢ ᛊ ᛞ ᛖ ᚲ ᛖ ᚱ
сишников ожидает неприятный сюрприз - ВЕЗДЕ

Ну можно еще предложить frama-c и канистру вазелина.

Boris Vinogradov
Не помогает

Если не знать что проверять то ничего наверное и не поможет уже.

ᛒ ᛖ ᚱ ᚲ ᚢ ᛊ ᛞ ᛖ ᚲ ᛖ ᚱ
сишников ожидает неприятный сюрприз - ВЕЗДЕ

после асма сишные компили тоже говорят что перед монитором дурак сидит

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта