Сегодня у меня окончательно оформилась одна мысль, которую я запишу.
Идея общения системы с пользователем в том, чтобы независимо от аппаратной части пользователь мог пользоваться одним и тем же терминалом. То есть, есть некоторое аппаратно независимый терминал, который обрабатывает команды, пришедшие неведомо откуда. И есть что-то, что преобразует непосредственную входную информацию в команды, понятные терминалу.
Но, вот скажем, общаемся мы с устройством по telnet. Мы должны не только считать входную информацию, но еще и выдать в канал эхо. Кто должен сгенерировать эхо? Внешний обработчик или консоль. Если внешний обработчик, то консоль не сможет в случае чего запретить, например, эхо без танцев с бубном (она ведь не должна знать, кто с ней разговаривает, иначе какая нафиг модульность)... Но и писать обработку ответа в консоль тоже нельзя, потому что, консоль понятия не имеет, в каком формате надо отвечать.
Опять же... Вывод может быть на страницу видеопамяти... А вход с клавиатуры. Вывод на страницу видеопамяти, а вход с телнета... И, блин... Вывод на страницу видеопамяти, при сквозном входе с клавиатуры (то бишь вообще без консоли).
В процессе работы над системой GenOS я раз двадцать переписывал внутренние интерфейсы. Я всегда ставил во главу угла символьную обработку, но тягать символы внутри ядра очень неудобно. Передача команд, а она, порой, нужна сквозная, требует соответствующей обработки внутри каждого модуля. Очень неудобно.
И тут до меня наконец-то дошло, на каком языке на самом деле общаются между собой части базовой системы.
... Барабанная дробь.
Это - язык клавиатурных команд. Причём, самих команд, а не каких-то кодирующих их символов. Если пользователь нажимает backspace, то он хочет, чтобы консоль стёрла символ. Если консоль говорит backspace, это значит, что она хочет, чтобы поток вывода каким-то ему ведомым способом выполнил этот backspace.
Если пользователь говорит backspace, а в консоле символов нет, то она и у себя ничего стирать не будет, и не будет говорить backspace потоку вывода...
Немного расширив функциональность команд, например сделав backspace с параметром... Мы уже можем довольно резво форматировать выходной поток и прочее... И нам пофиг, кто у нас на выходе, и слушает ли вообще кто-то этот вывод...
Таким образом, внутри ядра модули могут изъясняться обобщенными командами клавиатуры, представленными в виде соответствующих функций...
Возможности такой системы, очевидно, достаточно полны, ибо человек пользуется клавиатурой и ему достаточно удобно. А если не хватит, функционал в случае чего всегда можно нарастить дополнительными функциями. Типо "убить всех" или "вывести отладочную информацию"
С точки зрения реализации все модули, поддерживающие этот интерфейс будут наследниками класса предка этого интерфейса (напоминаю, c++). Реализовывать все функции предка, кстати, необязательно... Тоесть если кто то будет работать только с char, то пусть и работает. При приходе "левой" команды с командой разберется функция заглушка "предка"...
Хм... Это надо обмозговать....
|