OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 10 Октябрь, 2025 09:39

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




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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 492
Откуда: 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
Сообщения: 1443
Загрузчик можно переписать, чтобы код и данные раздельно грузил. Но интерфейс к ядру придется изменить.


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

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

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


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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1443
И еще вызовы 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
Сообщения: 492
Откуда: 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
Сообщения: 1443
Область дескрипторов оставить, остальные три освободить.Так же сейчас работает.


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

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


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

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

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


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

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


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

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


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

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