ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Идея о ядре-обёртке

Сообщений 1 страница 19 из 19

1

Не писать ядро, а реализовать на языке программирования Си, используя стандартный интерфейс вызовов Linux свой другой бинарный интерфейс вызовов.
Тогда программы будут опираться на этот новый интерфейс системных вызовов,
и его можно будет специфицировать в виде документа, похожего на стандарты POSIX.

А к тому времени и Будден со своим ядром подтянется...

QEMU же как-то эмулирует некоторые инструкции? Вот будет тут тоже такая поддерживающая "виртуализация".

т.е. запускаем виртуальную машину qemu, у неё там есть ключи командной строки, явно задающие - какое ядро грузить.
Вместо линуксового ядра указываем наше прокси-ядро, которое реализует наш не POSIX-интерфейс системных вызовов,
но само вместо реализаций функций самостоятельно все вызовы перенаправляет в стандартное ядро хост-машины.

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

Т.е. форкнуть ядро Linux и приделать к нему дополнительное API, не такое как там уже есть.

Зачем это нужно? Для того, чтобы АПИ ядра понимал русский язык, как никто другой (русские названия функций, параметров - вот это всё).
В частности, есть в Linux неприятный вызов exec, которому bash передаёт аргументы уже распарсенными.
Если мы хотим парсить по-своему, то желательно, чтобы АПИ принимал все аргументы одной строкой, а программа уже сама потом по-русски парсила (без всяких там bash).

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

Этот пост спровоцирован фразой

Будден написал(а):

отвратительный механизм токенизации

[html]<a href="http://xn--b1aga5e.xn-----6kcajervcdvqarhfgengcekya4c.xn--p1ai/viewtopic.php?f=5&t=148#p858">с форума "Вече"</a>[/html]

Я не уверен, что конкретно exec и fork требуют создания нового АПИ (надо копать реализацию exec в libc), но БудДену там ещё сокеты не нравились... Поэтому новый АПИ решит все эти и им подобные проблемы сразу, "одним махом".

"The child process goes on either to execute a different set of functions in the same code as the parent, or, frequently, to use the execve() system call to load and execute an entirely new program. An execve() call destroys the existing text, data, stack, and heap segments, replacing them with new segments based on the code of the new program." - тут надо обратить внимание, что execve это system call, т.е. является частью ABI.

пример вызова на ассемблере:
[html]<a href="https://stackoverflow.com/questions/9342410/sys-execve-system-call-from-assembly">https://stackoverflow.com/questions/9342410/sys-execve-system-call-from-assembly</a>[/html]

Т.е. нам нужен ещё один системный вызов, вместо этого. Этот новый системный вызов не будет входить в стандарт POSIX, зато можно ввести его в свой собственный стандарт. Ведь когда будет несколько русскоязычных ядер, желательно чтобы прикладные программы работали на них всех сразу.

Открывается новое направление деятельности для энтузиастов: придумывание нового АПИ, причём не абстрактно, а довольно малыми затратами реализуемого.

Отредактировано Лис (2019-08-30 21:37:01)

0

2

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

0

3

Я не понял, что тут имеется в виду. И зачем это делать.

Если кто-нибудь понял, что написал БудДен (и к чему он это написал), то перескажите мне, пожалуйста, разумными словами.

0

4

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

Отредактировано БудДен (2019-09-02 16:09:08)

0

5

БудДен написал(а):

Стандарты POSIX уже уязвимы, т.е. их реализация в любом случае получится уязвимой.

Я предлагаю иное. Я предлагаю сделать свой АПИ, а POSIX тут только в качестве примера опубликованного документа.

0

6

Что бы сделать свой апи нужно определиться будет ли у нас полиморфизм и будет ли динамическое создание типов.

Обёртка нам некчему. Так как API определяется ядром на 95%. Оберон нам тоже негодится, так как там есть указатели. А это нарушает правила инкапсулирования.

0

7

Ээээ. Ну ведь A2 уже есть, и в ней есть подобие ядра. Хорошо оно или плохо - можно изучать. Но зачем тогда ПИСАТЬ что-то.

Идея занять нас чем-то, чтобы мы меньше обращали внимание на Лиса и его незанятость, выглядит довольно смешной.

Насчёт полиморфизма - в том или ином виде он всё равно неизбежен, потому что он есть в природе вещей. Хотя с точки зрения ИБ это опасная вещь. Вопрос, который мне жаль задавать на весь мир, но можно, потому что всё равно никто не прочитает - это как сделать такой полиморфизм, который доставляет минимум трудностей.

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

Это вроде как неплохо, но эффективность пострадает очень ощутимо. Мы будем вынуждены любые межмодульные обращения, в т.ч. чтение поля, реализовывать в виде функций. Я не уверен, что это приемлемо с т.з. производительности. Хотя ничто не мешает в этом случае сливать модули в один...

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

Отредактировано БудДен (2019-09-03 21:45:44)

0

8

P.S. ну и кстати наличие хендла тоже ни от чего не защищает. Если хендл - это число из ограниченного диапазона, то модуль может выгрузиться и все его хендлы станут невалидными. А модуль клиент удержит у себя ссылку на этот инвалидный хендл. Потом модуль-сервер создаст новый экземпляр с тем же номером и беда всё равно произойдёт.

0

9

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

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

0

10

В вебе есть концепция REST. https://ru.wikipedia.org/wiki/REST
В вебе рекомендуют по мимо хэндла (iD) использовать ещё и временную метку.
Если время жизни истекло сервер даёт отказ.

Клиент тогда должен обновить страницу для получения нового хэндла.

БудДен написал(а):

P.S. ну и кстати наличие хендла тоже ни от чего не защищает. Если хендл - это число из ограниченного диапазона, то модуль может выгрузиться и все его хендлы станут невалидными. А модуль клиент удержит у себя ссылку на этот инвалидный хендл. Потом модуль-сервер создаст новый экземпляр с тем же номером и беда всё равно произойдёт.

У виндоуса есть рекомендации для каждой программы есть её контейнейр. Сервер хранит данные в этих контенерах и хэндл привязан к номеру потока. Контенер тоже привязан к номеру потока. (Тажи идея что в REST с СУБД)

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

БудДен написал(а):

Это вроде как неплохо, но эффективность пострадает очень ощутимо. Мы будем вынуждены любые межмодульные обращения, в т.ч. чтение поля, реализовывать в виде функций. Я не уверен, что это приемлемо с т.з. производительности. Хотя ничто не мешает в этом случае сливать модули в один...

В QT практически так и сделано. А сейчас куда его только не пихают.

0

11

БудДен написал(а):

Я так понял, вместо указателей вы предлагаете обмениваться "хендлами", т.е. условными номерами объектов. При этом сам объект остаётся в том модуле, который его породил, и модуль как бы превращается в действительно изолированную по данным сущность.

Не обязательно. Объекты тоже можно передавать. Но только как порождённые или как инстацированные(отчуждённые). При отчуждении объект копируется. Либо присваиваются все его поля(копирование через оператор присвоения).

БудДен написал(а):

это как сделать такой полиморфизм, который доставляет минимум трудностей.


Убрать из интерфейса объектов указатели и всё дела. К примеру как в Smalltalk.

Но я так понимаю вы попутали полиморфизм с метопрограммированием.  Берём описания объекта и преобоазовываем П-код плюс таблица методов. Jit  делаем подстановку для унаследованных методов.
А работать с такими объектами через обёртка. Её делать как интересный объект.

0

12

Не обязательно. Объекты тоже можно передавать. Но только как порождённые или как инстацированные(отчуждённые). При отчуждении объект копируется. Либо присваиваются все его поля(копирование через оператор присвоения).

Это уже не объекты (которые обладают поведением, идентичностью и могут нести ответственность за ресурсы), а просто "структурированные данные".

В вебе рекомендуют по мимо хэндла (iD) использовать ещё и временную метку.

Это резко удорожает идентификатор объекта и накладывает довольно заковыристые ограничения на частоту перезапусков сервиса, чтобы не получилось, что код "единица" будет дважды выдан разными экземплярами сервера в один и тот же момент времени. Не общее решение, не годится. Кроме того, узнать время - это ведь системный вызов, не?

Отредактировано БудДен (2019-09-05 15:41:07)

0

13

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

0

14

БудДен написал(а):

Это резко удорожает идентификатор объекта и накладывает довольно заковыристые ограничения на частоту перезапусков сервиса, чтобы не получилось, что код "единица" будет дважды выдан разными экземплярами сервера в один и тот же момент времени. Не общее решение, не годится. Кроме того, узнать время - это ведь системный вызов, не?

Хэнделы выдаёт не ядро, а сервис.  Если ядро это сервер, то выдаёт ядро.
Если хэнделы совпадут, то ничего страшного. Так как различие осуществляется на транспортном уровне.
Если рассматривать ядро, то оно одно, а следовательно если несколько клиентов обратятся одновременно, к ядру, то оно выдаст разные хэнделы. К примеру за счёт мьютекса на аппаратных спинлоках.
Время жизни нашей вселенной 13 миллиард лет или 2^59 секунды. Что-бы таймер не переполнился нужно 90 бит. Или любой случайное 128 битное число.

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

Если переменное число хэделов вас смущает. Тогда надо ограничить число программ и число хэдлев. Как в старых ОСРВ. Где 1 квант равен 1 мс. Не более 1000 процессов и не более 40 хэдлов на всех.   Процессы фиксируются на этапе компиляции, ровно как и хэндлы.

БудДен написал(а):

Это уже не объекты (которые обладают поведением, идентичностью и могут нести ответственность за ресурсы), а просто "структурированные данные".

Почему не объекты? Как раз таки объекты. Объекты это данные плюс методы. Тежи методы можно кодировать П-кодом и передавать как данные. Либо не передавать, а хранить отдельно.

БудДен написал(а):

но и не-хранение - это тоже плохо.

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

БудДен написал(а):

На самом деле есть вопрос, кто отвечает за изоляцию модулей - компилятор или железо

Не вижу смысла загонять себя в рамки A2. Изоляцию делаем на уровне процесса. В одном процессе несколько объектов. А многозадачность вытесняющую, а не кооперативную. (Кооперативная в А2). И прилично разбавляем сигнал/слотовым выполнением. При испускании сигнала можно переключаться на обработку более приоритетных сигналов.

Отредактировано Павиа (2019-09-05 21:03:37)

0

15

> 2^59 секунды. Что-бы таймер не переполнился нужно 90 бит.
Это при какой частоте выделения хендлов?
> Или любой случайное 128 битное число.
Качественное случайное число стоит изрядно дорого, во многих отношениях. Синхронизация, уязвимость, вычислительная стоимость - вот три аспекта этой цены.

> Почему не объекты? Как раз таки объекты. Объекты это данные плюс методы
Я бы предлагал делать отличие между "живым" объектом и "данными". Живой объект - это открытый файл, таймер, окно, мьютекс. Он связан с другими объектами и его нельзя просто так упаковать и передать. Если некая сущность полностью определяется своим состоянием и может без ущерба для смысла передаваться в другое место или записываться в файл, то я это называю "данными". Так вот если мы запрещаем указатели и оставляем хендлы, то мы не можем отдать объект другому модулю, а можем отдать его хендл (вообще говоря, без гарантии, что он не исчезнет в любой момент) или данные. Я пока не понял, хорошо это или нет.

Но суть не в том: для меня идея не использовать межмодульные указатели - это некая революция сознания, которую нужно долго осмысливать. Она не выглядит универсальной, а вот понять область её применения - это и есть задача. В частности, я пока не понял, нужно ли убирать указатели. Они в целом безвредны. Вредна адресная арифметика и опасные преобразования типов. В чём ещё

> Не вижу смысла загонять себя в рамки A2. Изоляцию делаем на уровне процесса. В одном процессе несколько объектов. А многозадачность вытесняющую, а не кооперативную. (Кооперативная в А2). И прилично разбавляем сигнал/слотовым выполнением. При испускании сигнала можно переключаться на обработку более приоритетных сигналов.

Это Вы излагаете какую-то конкретную модель. Рамки A2 можно и подвинуть. Но в целом вопрос о том, чем обезпечивается изоляция - это вопрос общий, не зависящий от вопроса "A2 или не A2". Например, веб технология полностью опирается на то, что компилятор и среда исполнения JS соблюдают некие правила игры. Если, конечно, они их действительно соблюдают. Это даёт возможность веб-серверу управлять вычислениями на клиенте. Клиент доверяет браузеру, полагая, что браузер не позволит веб-серверу сожрать CPU, память, украсть пароли, наплодить выпадающих окон. Соблюдается ли это в действительности или нет, но весь веб основан на этом доверии, а вовсе не на аппаратной защите. Веб-бразуер по идее может делать всё, что могу делать я как пользователь, но он (якобы) ведёт себя культурно.

Вот и к нашему межмодульному взаимодействию можно попробовать применить ту же логику.

0

16

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

0

17

БудДен написал(а):

Веб-бразуер по идее может делать всё, что могу делать я как пользователь, но он (якобы) ведёт себя культурно.

Вот и к нашему межмодульному взаимодействию можно попробовать применить ту же логику.

Доказательная логика если честно не работает и не может работать. Так что везде принята надёжность на доверии. Тот же блок-чейн эта та же система на доверии. Вы доверяете процесиногому серверу блок-чейна следить за верностью транзакций. Если он честный то хорошо. А если он нечестный то он может менять данные как ему захочется. И хранит он логи всего полгода. Так что к тому времени всё будет шито-крыто.

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

БудДен написал(а):

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

Синхронизация не требуется. Достаточно, что-бы вероятность коллизий была ничтожно малой. Сервер ведёт перечень кому выдал какой хэндел. Поэтому посторонний модуль не сможет воспользоваться чужим. Отсюда исчезают уязвимости, и нет нужны в усложнение алгоритма для увеличения времени расчёта. Достаточно алгоритма псевдо случайных чисел  ксорить биты и переставлять байты 1 раз. Так что вычисления будут быстрыми.

БудДен написал(а):

Это при какой частоте выделения хендлов?

1 ГГц.

БудДен написал(а):

Я бы предлагал делать отличие между "живым" объектом и "данными". Живой объект - это открытый файл, таймер, окно, мьютекс. Он связан с другими объектами и его нельзя просто так упаковать и передать.

Файл вы можете передать. REST требует чтобы API позволяла кэшировать ресурсы. А написать такой APIкоторый бы позволил нам передавать файл мы можем благодаря теории транзакций.
Таймер это сичтемный счётчик плюс таблица сигналов и 1 слот для приема сигнала от ядра. Передать вы его можите если обновите сигнал в ядре. А так как перенос делает ядро то оно будет знать как и что сделать.
Мьютекс бывают двух видов. Глобальный и локальный. А глобальные мьютексы они и так сидят в отельном модуле.
Локальный мьютекс не должен иметь копии если мы не порождаем объект.Тут надо подумать. Но честно я не вижу проблем. Тут главное что-бы хэндел принадлежал нужному классу(коллекционеру). т.е запретить критические секции.

БудДен написал(а):

отдать объект другому модулю, а можем отдать его хендл

Это так. Но я разрабатываю теории в которой хэндел может эволюционировать до объекта.

БудДен написал(а):

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

Есть теория ООП. Просто создаётся шаблон декаратор.

0

18

> Просто создаётся шаблон декаратор.
Ну это как-то из серии "наполовину беременна".

0

19

Павиа написал(а):

Доказательная логика если честно не работает и не может работать.

На самом деле только логика доверия и работает. Мы доверяем тому, что компьютеры сделаны по-честному и не содержат докладок. Точнее, мы не доверяем, но ведём себя так, как будто доверяем, потому что иначе нужно не пользоваться компьютерами, а мы к этому не готовы. Аппаратная защита тоже требует доверия и в этом отношении она ничем не лучше других средств защиты, включая те, которые используются компилятором. Учитывая уязвимости типа metldown, аппаратная защита тоже не заслуживает доверия.

Но всё равно, нужно стремиться к логической проверке (видимо, это Вы назвали "доказательной логикой"), потому что если мы не понимаем, как оно работает, то нет оснований для доверия.

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

И вопрос, что проще верифицировать - аппаратную защиту, программную или комплекс?

Отредактировано БудДен (2019-09-09 16:40:48)

0