Общесистемный буфер обмена

Internal structure and you change requests/suggestions
  • Serge wrote:Imho буфер обмена это функция оконной системы
    а насколько это безопасно?
  • Albom

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

    Т.е. если это ресурс статический и расшареный только на чтение: шрифт, битмап и т.п. будет работать замечательно, пока сервер не захочет изменить ресурс. Блокировки доступа нет. Единственный выход сделать счётчик версий для динамичных ресурсов и проверять до и после копирования в локальную память процесса.

    P.S. Я вообще не вижу безопасного решения для расшареной памяти. Любой процесс с доступом на запись может забить на синхронизацию и прицип "сейчас другой джигит на красный свет ехать будет" не сработает. Джигит может оказаться дальтоником.
  • Serge
    Imho буфер обмена это функция оконной системы
    Я не согласен. Мы взяли курс на уход от принципа "все в ядро".
    Буфер обмена не обязан быть частью оконной подсистемы. Он может передавать разные типы данных.
    P.S. Я вообще не вижу безопасного решения для расшареной памяти. Любой процесс с доступом на запись может забить на синхронизацию и принцип "сейчас другой джигит на красный свет ехать будет" не сработает. Джигит может оказаться дальтоником.
    Все решаемо, структура получится немного сложней, но все будет работать. Джигиты будут соблюдать правила, как и все!

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

    З.Ы. Ну, так никто и не ответил - занимается кто-нибудь вопросом?
  • Mario

    Так опиши алгоритм. Я действительно не вижу относительно простого и безопасного решения. На строгое соблюдение ПДД не надеюсь. И самый законопослушный водитель может заглохнуть на перекрёстке.
  • Mario wrote:Мы взяли курс на уход от принципа "все в ядро".
    Да, правильно. Но есть такие вещи, которые неплохо всё же было иметь в ядре... Вот моё сообщение в этой теме от 21 февраля 2008 года:

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

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

    Список файлов можно сделать как в винде - файлы разделяются нулями, список заканчивается двойным нулём. Работать с таким списком очень удобно. И ещё хочу пояснить, что под словом "битмап" я понимаю файл bmp, а не только данные. Потому что из него можно извлечь размеры и глубину цвета.
    Хотя ранее (18 февраля 2008 года) я писал:
    по моему мнению, оптимальный вариант - приложение-монитор, выделяющее нужный объём памяти и указывающий какой тип информации хранится в буфере (текст, битмап, список файлов)
    Я и сейчас тоже за такую реализацию... Хотя сис. функцию использовать проще :)
  • Albom
    Хотя сис. функцию использовать проще
    Не согласен.
    1)Трудозатраты на организацию взаимодействия через системные функции или через такой же код реализованный посредством макроса, приблизительно одинаковы. Только в последнем случае не придется трогать ядро.
    2)Плодить баги дешевле на уровне приложения, поскольку вероятность грохнуть всю систему ниже. К тому же при появлении джигита не соблюдающего правила грохнуть и перезапустить поток-сервер отвечающий за механизм буфера обмена проще и быстрее, чем перезагружать всю систему, в которой на этот момент могут работать приложения, работу которых прерывать не желательно.
  • Mario

    В данном случе это будет баг уровня системы. Падающий сервис не намного приятней упавшего ядра.
    В худшем случае (не джигит а малолетний долбо... террорист) перезапускать сервер придётся постоянно. Вероятно вместе с задействованными приложениями. Защитить ядро намного проще.
  • Защитить ядро намного проще.
    На аппаратном уровне через страницы или как-то по другому?
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Serge
    Падающий сервис не намного приятней упавшего ядра
    Не приятно согласен, но не фатально как в случае с ядром.
    В худшем случае (не джигит а малолетний долбо... террорист) перезапускать сервер придётся постоянно. Вероятно вместе с задействованными приложениями.
    Таких вещей в системе предостаточно и без этого и даже текущее ядро можно уронить, в большинстве случаев это получается случайно. Дырки то все не исследованы, а даже не все известные заштопаны. А от малолетних и не совсем малолетних долботерористов не застрахованы даже более развитые системы. Единственно реальный выход - жесткий, я бы даже сказал жесточайший, контроль со стороны всего сообщества: раздача бананов и прекращение консультации.
    От лобовой атаки значительными силами - брутфорса, ничто не спасает.
    Защитить ядро намного проще.
    В том то и дело что если делать реализацию через ядро, то я сомневаюсь, что у меня хватит знаний о ядре, на реализацию полноценного буфера - только на один слот, с возможностью записи для всех. А вот для потока-сервиса я мог бы извернуться.
  • andrew_programmer

    Ядру проще контролировать указатели и буферы. Досточно проверить таблицы страниц. А как одному приложению проверить другое ? Если я просто читаю память без всяких блокировок и неправильно посчитал размер то будет страничная ошибка и вылет. Сам себе буратино. А если я получил блокировку, даже для галочки, и вылетел ? Галочка останется и все остальные будут ждать. В случае ядра можно тупо поставить cli и скопировать весь буфер. Не айс, но надёжно.

    Mario

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

    То есть приложение должно каждый раз получать новое имя области а потом её открывать ?
  • Serge
    Почему каждый раз? Только для вставки в буфер обмена.

    Для вставки из буфера обмена будет использоваться область текущего указателя для вставки.

    Будет одна область указателей размещенная в именованной памяти, которую при желании долботерроиста (или чайника) можно испортить, а можно и не портить, если использовать для работы с буфером макрос. Плюс процесс-сервер будет хранить резервную копию на этот случай в уже недоступной области.

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

    И одновременно будет существовать только одна область на запись, из которой в слоты чтения будет перемещаться информация.
    По идее для буфера достаточно 16-32 слотов.

    Сколько кстати именованных областей может держать ядро?

    В общем шибко подробную модель я еще не продумывал, потому что не знаю - может уже кто-то работал над подобным. Если никто не отзовется то возьмусь.
  • Mario

    Как-то громоздко получается. Если делать по Таненбауму то только через IPC. У него на этот случай есть привилегированный вызов для копирования данных между адресными пространствами. В таком варианте можно сделать надежно и относительно просто. А через расшареную память не получится.
  • Who is online

    Users browsing this forum: No registered users and 0 guests