OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 16 Октябрь, 2025 19:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 25 Сентябрь, 2025 23:23 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 500
Откуда: KZ
В одном непрерывном куске памяти подряд расположены metadata, code и область для глобальных переменных.

Сейчас память выделяется одним mmap, и получается, что на одной странице могут оказаться и данные, и код. Из-за этого не получается разделить права: хотелось бы, чтобы код был PROT_READ|PROT_EXEC, а данные — PROT_READ|PROT_WRITE. Но mprotect работает постранично, и получается, что память приходится помечать RWX.

В Linux и FreeBSD это ещё разрешено, но в OpenBSD с политикой W^X это не работает.

Есть ли способ реализовать настоящую модель W^X (чтобы код был только RX, а данные только RW), не меняя генерацию объектных файлов? Или всё-таки нужно править компилятор/эмиттер и добавлять paddings, чтобы code и metadata всегда выравнивались на границу страницы?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Сентябрь, 2025 08:54 

Зарегистрирован: Пятница, 07 Май, 2021 11:06
Сообщения: 33
Не знаю каков формат объектного файла у BlackBox, а в "Виртовской модели" (см. Проект Оберон) переменные находятся по отрицательным смещениям. Если константы и код выровнять по началу страницы, то всё остальное будет выше, т.е. в другой странице. Вроде бы ни каких проблем нет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Сентябрь, 2025 14:55 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1444
Загрузчик можно переписать, чтобы код и данные раздельно грузил. Но интерфейс к ядру придется изменить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Сентябрь, 2025 16:39 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 500
Откуда: KZ
Trurl писал(а):
Загрузчик можно переписать, чтобы код и данные раздельно грузил. Но интерфейс к ядру придется изменить.

Я так понял, нужно поменять реализацию StdLoader.Fixup?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 27 Сентябрь, 2025 16:35 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1444
И еще вызовы Fixup. Там память выделяется двумя блоками, потом в один из них загружается код вместе с данными, а в Fixup передаются адреса внетри блока.
Код:
Kernel.AllocModMem(mod.ds, mod.ms + mod.cs + mod.vs, mod.dad, mod.mad);
(* выделяем блок для дескрипторов (1) и для всего остального (2) *)
..
 inp.ReadBytes(mp^, 0, mod.ms);
(* загружаем константы в блок (2) *)
 inp.ReadBytes(dp^, 0, mod.ds);
(* загружаем дескрипторы в блок (1)  *)
 inp.ReadBytes(mp^, mod.ms, mod.cs);
(* загружаем код  в блок (2), после констант, а после кода - место для переменных *)
 ...
  Fixup(mod.mad, mod); (* фиксим  ссылки на константы *)
  Fixup(mod.dad, mod); (* фиксим  ссылки на дескрипторы *)
  Fixup(mod.mad + mod.ms, mod); (* фиксим  ссылки на код *)
  Fixup(mod.mad + mod.ms + mod.cs, mod); (* фиксим  ссылки на переменные *)

И в самом Fixup такое же размещение подразумевается
Код:
 linkadr := mod.mad + mod.ms + link
 linkadr := mod.mad + link
 linkadr := mod.dad + link - mod.ms


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Октябрь, 2025 22:34 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 500
Откуда: KZ
Спасибо. Похоже всё работает.

Сделал 4 (page-aligned) области памяти вместо 2-х:
d (desc), m (meta + code + var) →d (desc), m (meta), c (code), v (var)

mod.mad + mod.ms → mod.cad
mod.mad + mod.ms + mod.cs → mod.vad

права доступа:
  • desc: write, read
  • meta: read
  • code: exec, read
  • var: write, read

BlackBox заработал в OpenBSD 7.7 (пока только CLI, GUI не пробовал)

В моём "ретро"-репозитории


Но ещё в Kernel есть такое место:

Код:
PROCEDURE InvalModMem (modSize, modAdr: INTEGER);
BEGIN
   DEC(used, modSize);
   HeapFree(modAdr, modSize)
END InvalModMem;

которое используется в Kernel.UnloadMod:
Код:
IF dyn IN mod.opts THEN   (* release memory *)
   InvalModMem(mod.data + mod.dsize - mod.refs, mod.refs)
END

Что с этим делать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 02 Октябрь, 2025 21:51 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1444
Область дескрипторов оставить, остальные три освободить.Так же сейчас работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 09 Октябрь, 2025 12:20 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1573
а ещё можно кому-то сходить в LC и забрать из евойной Kernel полноценный сканер объектов модуля, который позволяет безопасно освобождать всю память модуля, а не как сейчас — оставляя каждый раз мусор и протекая. для этого чуть-чуть изменён формат объектных файлов (обратно совместим, старые объектные файлы будут выгружаться по старому алгоритму, потому что там недостаточно информации) и добавлен новый сканер на выгрузку. формат хипа я не менял.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 09 Октябрь, 2025 19:51 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 500
Откуда: KZ
arisu писал(а):
а ещё можно кому-то сходить в LC и забрать из евойной Kernel полноценный сканер объектов модуля, который позволяет безопасно освобождать всю память модуля, а не как сейчас — оставляя каждый раз мусор и протекая. для этого чуть-чуть изменён формат объектных файлов (обратно совместим, старые объектные файлы будут выгружаться по старому алгоритму, потому что там недостаточно информации) и добавлен новый сканер на выгрузку. формат хипа я не менял.

но fossil-репозиторий с LC недоступен...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 10 Октябрь, 2025 14:31 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1573
вообще-то должен быть доступен. для клонирования вообще проверки отключены, а для веб-интерфейса надо пройти простенький челлендж, даже печеньки включать не надо. если вас не пускает даже в челлендж — попробуйте тор. потому что украинские ip — как ни смешно — блокируются с российской стороны в оба направления. сюда вот я через тор хожу, и до меня многие из рф достучаться не могут напрямую. от провайдера/хостера зависит, насколько я понял.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 10 Октябрь, 2025 14:48 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1573
только дошло. про «кому-то сходить» — это я не ехидничал, а имел в виду, что там всё равно придётся разбираться (хотя большинство кода в одной кучке, но и смотреть изменения в писалке объектных файлов придётся, например, и небольшие, хоть и совместимые, изменения записи модуля в Kernel), так что я имел в виду: «кому-то, у кого есть время и вдохновение».


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 10 Октябрь, 2025 17:21 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 500
Откуда: KZ
arisu писал(а):
вообще-то должен быть доступен. для клонирования вообще проверки отключены, а для веб-интерфейса надо пройти простенький челлендж, даже печеньки включать не надо. если вас не пускает даже в челлендж — попробуйте тор. потому что украинские ip — как ни смешно — блокируются с российской стороны в оба направления. сюда вот я через тор хожу, и до меня многие из рф достучаться не могут напрямую. от провайдера/хостера зависит, насколько я понял.

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

Из Казахстана: вчера был редирект на fuck.off, сегодня был доступен, сейчас снова редирект.
С российского VPN: вчера вроде бы был редирект на fuck.off, сегодня работает.
С VPN USA: недоступен (соединение с сервером устанавливается, но после отправки запроса не получается ответ).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 11 Октябрь, 2025 03:56 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1573
да не надо туда браузером ходить: просто фоссилом напрямую клонировать. там довольно дубовая защита от «аи»-ботов, которые мне сервер чуть не завалили, а fossil clone/pull пускают напрямую. только не после посылания — тогда надо денёк выждать, кулдаун будет.

впны же в большинстве своём поблочены, потому что приходят с помоек типа digital ocean, которые мне сервер постоянно долбят попытками поиска «сплоетов», за то и забанено всё скопом.

там в веб-интерфейсе реально делать нечего: вы после клона сделаете fossil ui reponame — и получите точно такой же, но локальный. фоссил склонирует всё, что есть — и код, и вики, и билетики.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 11 Октябрь, 2025 04:04 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1573
и, кстати, там в Docu/Kernel.odc есть небольшое описание того, как работает менеджер памяти: «Memory Manager Details (WIP)» в конце. совсем мало, но лучше, чем ничего. можете себе забрать, они у нас одинаковые.

впрочем, мой менеджер памяти чуть-чуть лучше оригинального в плане управления кластерами: он в состоянии их отдавать системе, если они долго не использовались. и ещё там есть важный фикс: когда выделяется большой кластер (очень большой массив, например), и потом GC его собирает, то оригинальный BBCB использует этот «огромный кластер» для выделения маленьких объектов. и может заякорить его низачем вместо чтобы вернуть системе. оно не то чтобы фатально (оригинал довольно плохо умеет кластеры возвращать), но неприятно. это у меня тоже починено.

ещё я оттуда COM к чёртовой бабушке выпилил (как и из компилятора), но если надо — восстановить не особо проблема, я думаю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 12 Октябрь, 2025 13:38 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 500
Откуда: KZ
Trurl писал(а):
Область дескрипторов оставить, остальные три освободить.Так же сейчас работает.

Нужно освободить 3 области:
  • meta
  • code
  • var

Как было:
Код:
InvalModMem(mod.data + mod.dsize - mod.refs, mod.refs)

mod.refs = meta address
mod.data = var address
mod.dsize = var size

mod.data + mod.dsize - mod.refs = var address + var size - meta address = meta size + code size + var size (так как это всё было в одном куске памяти)

Сейчас вместо этого нужно вызвать:
  • InvalModMem(meta size, meta address)
  • InvalModMem(code size, code address)
  • InvalModMem(var size, var address)

meta address = mod.refs
code address = mod.code
var address = mod.dsize

похоже code size — это mod.csize с выравниванием по 4 Б:
code size = ((mod.csize - 1) DIV 4 + 1) * 4

var size = mod.dsize

но где взять meta size?
mod.rsize — это только часть meta size


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 12 Октябрь, 2025 13:44 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1573
ну так получается, что рефсайз — это конечный адрес модуля минус мод.рефс, нет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 12 Октябрь, 2025 13:58 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 500
Откуда: KZ
arisu писал(а):
ну так получается, что рефсайз — это конечный адрес модуля минус мод.рефс, нет?

Что такое конечный адрес модуля?

meta = refs + Export + Pointers + Perpare Type Descriptors + Import List + Names + Const
(см. DevCPE.OutCode)

mod.refs = meta address
mod.rsize — похоже это только refs size


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Октябрь, 2025 07:11 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 500
Откуда: KZ
Похоже придётся при выделении памяти для meta добавить 4 Б в самом начале этого куска памяти для хранения meta size.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Октябрь, 2025 17:54 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1444
Похоже на то. Размеры областей нигде не сохраняются. Ну, можно еще в поле Module.ext запихнуть, но это как-то того.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB