О шароваре и десктопном Линуксе
Sep. 17th, 2009 01:46 pmВнезапно всплывший перевод интервью двухлетней давности с кернел-разработчиком, который пытался улучшить поведение декстопного Линукса, но не мог толком эти улучшения продемонстрировать, вызвал очередные дискуссии про перспективы Линукса на десктопе.
Да нет у него никаких перспектив.
Основная его проблема - мало нужного, качественного и удобного софта. И главная ее причина, на мой взгляд, - отсутствие бинарной совместимости. Когда есть куча плохо совместимых дистрибутивов, в них куча несовместимых версий, единственный более-менее работающий способ распространения софта - в исходниках, со сборкой на месте. Кому это подходит?
Сильно дорогой софт может себе позволить распространяться в исходниках или поставляться сразу с настроенной системой и даже аппаратурой. Но среднему юзеру на десктопе он не по карману, да и не нужен вобщем-то - нет у него ни терабайтных баз, ни тысячи процессоров, для которых такой софт делается.
Бесплатный софт может поставляться в исходниках, но он пишется либо гиками для себя, либо большими корпорациями для продажи чего-то другого (оборудования, например), поэтому никогда его авторы не будут делать его настолько простым и удобным в использовании, чтобы им могли пользоваться рядовые хоум-юзеры, не гики.
Типичные слова линуксоеда: "Если бы люди умели пользоваться vim, grep, sed, awk, то миллионы программных продуктов так никогда и не были бы созданы (C) кто-то умный". В том-то и беда. Именно так теряется 95% аудитории - основная масса юзеров не будет тратить по полгода на изучение этих ваших vim, grep, sed, awk, perl и bash. Им нужна программа с красивым окошком и кнопкой "сделать п%$дато", а не набирать в консоли "ps aux | grep dmz | awk '{ print $3, " ", $2 }' | sort | tail -n 5 | awk '{ print $2 }' | xargs kill -9". Нужен простой и удобный в использовании софт, решающий конкретные задачи рядовых и не очень пользователей. Такие программы будут только там, где будут коммерческие разработчики, которые смогут их продавать за доступные хоум-юзерам деньги. А для такого софта дистрибуция в исходниках никак не годится.
Вот есть, например, Маки. Там дистрибуция и установка программ в бинарной форме была отточена отлично, оттого куча удобного, приятного и радующего пользователей софта, за который те с радостью платят деньги. Есть винда, где я компилю в Win7 бинарник с минимумом зависимостей, и он прекрасно работает и в Висте, и в ХР, и даже в Win98. В нем я могу реализовать какую-то пусть не идеальную, но работающую защиту от взлома, и спокойно его продавать. А вот понадобилось мне недавно простейшую консольную прогу запустить на хостинге с этим вашим линупсом, так нет - нужного компилятора там не стоит и прав нет поставить, просто собранный бинарник не работает из-за другой версии GLIBC, а статически собранный - не работает, потому что ядро, дескать, слишком старое, хотя и там и там 2.6.чего-то. При таком подходе я буду продолжать делать шаровары для винды и мака, а линуксоеды пусть дальше довольствуются своими поделками.
Да нет у него никаких перспектив.
Основная его проблема - мало нужного, качественного и удобного софта. И главная ее причина, на мой взгляд, - отсутствие бинарной совместимости. Когда есть куча плохо совместимых дистрибутивов, в них куча несовместимых версий, единственный более-менее работающий способ распространения софта - в исходниках, со сборкой на месте. Кому это подходит?
Сильно дорогой софт может себе позволить распространяться в исходниках или поставляться сразу с настроенной системой и даже аппаратурой. Но среднему юзеру на десктопе он не по карману, да и не нужен вобщем-то - нет у него ни терабайтных баз, ни тысячи процессоров, для которых такой софт делается.
Бесплатный софт может поставляться в исходниках, но он пишется либо гиками для себя, либо большими корпорациями для продажи чего-то другого (оборудования, например), поэтому никогда его авторы не будут делать его настолько простым и удобным в использовании, чтобы им могли пользоваться рядовые хоум-юзеры, не гики.
Типичные слова линуксоеда: "Если бы люди умели пользоваться vim, grep, sed, awk, то миллионы программных продуктов так никогда и не были бы созданы (C) кто-то умный". В том-то и беда. Именно так теряется 95% аудитории - основная масса юзеров не будет тратить по полгода на изучение этих ваших vim, grep, sed, awk, perl и bash. Им нужна программа с красивым окошком и кнопкой "сделать п%$дато", а не набирать в консоли "ps aux | grep dmz | awk '{ print $3, " ", $2 }' | sort | tail -n 5 | awk '{ print $2 }' | xargs kill -9". Нужен простой и удобный в использовании софт, решающий конкретные задачи рядовых и не очень пользователей. Такие программы будут только там, где будут коммерческие разработчики, которые смогут их продавать за доступные хоум-юзерам деньги. А для такого софта дистрибуция в исходниках никак не годится.
Вот есть, например, Маки. Там дистрибуция и установка программ в бинарной форме была отточена отлично, оттого куча удобного, приятного и радующего пользователей софта, за который те с радостью платят деньги. Есть винда, где я компилю в Win7 бинарник с минимумом зависимостей, и он прекрасно работает и в Висте, и в ХР, и даже в Win98. В нем я могу реализовать какую-то пусть не идеальную, но работающую защиту от взлома, и спокойно его продавать. А вот понадобилось мне недавно простейшую консольную прогу запустить на хостинге с этим вашим линупсом, так нет - нужного компилятора там не стоит и прав нет поставить, просто собранный бинарник не работает из-за другой версии GLIBC, а статически собранный - не работает, потому что ядро, дескать, слишком старое, хотя и там и там 2.6.чего-то. При таком подходе я буду продолжать делать шаровары для винды и мака, а линуксоеды пусть дальше довольствуются своими поделками.
Re: подсказка
Date: 2009-09-20 05:08 pm (UTC)Re: подсказка
Date: 2009-09-20 05:19 pm (UTC)Происходит только обращение к правильным методам, но система ломается.
Виртуальная машина при том, что она такие конструкции запрещает в рантайме.
Re: подсказка
Date: 2009-09-20 05:46 pm (UTC)2. Что-то мне подсказывает, что запретить класть инт в указатель или вылазить за границу массива в рантайме можно только путём хранения типа (что у нас там указатель, а не инт) или размера. Это не си, а другой язык программирования.
Re: подсказка
Date: 2009-09-20 05:49 pm (UTC)Это в статике запретить можно, но вот обращение уже удалённому объекту в статике запретить не получится.
Re: подсказка
Date: 2009-09-20 05:53 pm (UTC)Re: подсказка
Date: 2009-09-20 06:01 pm (UTC)Я про это недавно писал у себя в блоге — в значительном количестве случаев оверхед на проверку выхода за границу массива отсутствует.
Повторяю ещё раз: запретить обращение к удалённому объекту в статике невозможно.
Но можно придумать какую-нибудь более хитрую атаку.
Нельзя. Насколько я знаю, за последние несколько лет ни одной уязвимости Sun JVM (к примеру) не было — а это очень мощная и сложная виртуальная машина.
Re: подсказка
Date: 2009-09-20 07:30 pm (UTC)Если мы говорим о языках со сборкой мусора и без арифметики указателей, то там обращение к удалённым объектам просто невозможно, его и запрещать не надо.
Нельзя.
Это доказано кем-то или это только эмоции?
Re: подсказка
Date: 2009-09-20 07:43 pm (UTC)Код создания какого объекта?
Переключения контекста вообще не будет, и это одна из фишек виртуальных машин.
Если мы говорим о языках со сборкой мусора и без арифметики указателей, то там обращение к удалённым объектам просто невозможно, его и запрещать не надо
Виртуальная машина не поддерживает арифметику указателей, это я и имел в виду. При этом код реально компилируется в машинный код с арифметикой указателей, и всем от этого хорошо.
Это доказано кем-то или это только эмоции?
Либо я не понял вопрос, либо это очевидно. В виртуальной машине есть набор инструкций, каждая из которых не позволяет выйти за рамки машины, поэтому нет такой атаки. В реальных ВМ, конечно, могут быть баги.
Re: подсказка
Date: 2009-09-20 08:18 pm (UTC)Того объекта, к которому невозможно будет обратиться, если он удалён.
Переключения контекста вообще не будет, и это одна из фишек виртуальных машин.
Вообще никогда? То есть, у нас получится однозадачная система?
Виртуальная машина не поддерживает арифметику указателей
Арифметика указателей - свойство не реализации, а языка. Не важно, компилируем мы C статически или создаём для него VM - арифметика указателей будет. Языки без арифметики указателей тоже бывают разные - рассчитанные на VM и статически компилируемые. Правда, у статически комилируемых в рантайме появляется обязательно сборщик мусора, а это уже как бы кусок виртуальной машины.
В виртуальной машине есть набор инструкций, каждая из которых не позволяет выйти за рамки машины
Вы не поняли вопрос. В рамках машины доступны все ресурсы процесса под данной ОС. То есть, можно много всего испортить, не выходя из рамок машины. Например, ява-задачам я на своём компе не ставлю каких-то ограниченных прав, не понижаю им scheduling priority по сравнению с обычными программами, не запускаю их под специальным бесправным юзером java-task и т.д. Они, вероятно, не могут делать атаки на ядро через переполнение стека и т.п. - от этого защищает их проверка типов (возможные баги в JVM исключаем напрочь - речь не о них). Защищает ли их типизация от открытия сокетов без закрытия, от поедания данным куском кода излишнего количества памяти (что, напоминаю, должно проверяться статически, перед началом выполнения задачи, динамически линукс умеет сишные задачи убивать, когда весь своп выжрут) и подобных неприятностей? А если мы размещает ВМ в ядре, то у неё возможностей ещё больше и проверять правильность запускаемого кода хотелось бы ещё строже. Либо тупо следить в рантайме - есть ли выход за границы массива, не схавала ли она памяти больше положенного и т.д.
Re: подсказка
Date: 2009-09-20 08:30 pm (UTC)Того объекта, к которому невозможно будет обратиться, если он удалён.
Создание объекта через malloc и в хитрой виртуальной машине стоит примерно одинаково. Удалять объект дорого. Удалять можно через GC. Можно делать escape analysis.
Re: подсказка
Date: 2009-09-20 09:25 pm (UTC)А почему?
Re: подсказка
Date: 2009-09-20 08:33 pm (UTC)Вообще никогда? То есть, у нас получится однозадачная система?
Не будет переключеня контекста в смысле изменения адресного пространства. Переключение потоков, конечно, будет.
Re: подсказка
Date: 2009-09-20 09:24 pm (UTC)Re: подсказка
From:неясно
From:Re: неясно
From:Re: подсказка
Date: 2009-09-20 08:42 pm (UTC)Виртуальной машине все ресурсы доступны, конкретному модулю — нет. Драйверу сетевой карты доступен интерфейс DMA. Драйверу файловой системы доступен только интерфейс блочных устройств, и никакого прямого доступа к оборудованию у него нет. У пользовательского процесса есть только API типа POSIX.
От поедания памяти защищает счётчик использованной памяти, привязанный к каждому модулю. Сокеты должны явно закрываться (либо неявно при завершении процесса/модуля), и тут нет отличия от обычных операционных систем.
Re: подсказка
Date: 2009-09-20 09:21 pm (UTC)Re: подсказка
From:Re: подсказка
From:Re: подсказка
From:Re: подсказка
From:Re: подсказка
From:Re: подсказка
Date: 2009-09-20 06:04 pm (UTC)Re: подсказка
Date: 2009-09-20 05:51 pm (UTC)В рантайме не обязательно хранить тип объекта, если весь код, работающий с этим типом знает, что он работает именно с этим типом.
Естественно, это не C. C не годится для компилирования в код для виртуальной машины (хотя это возможно).
Re: подсказка
Date: 2009-09-20 05:59 pm (UTC)Тогда оверхед на компиляцию внезапно возрастает. Придётся проверять, что код всё правильно знает про типы.
Естественно, это не C
Тогда что мы тут обсуждаем? Для не-С есть виртуальная машина, но нет статических компиляторов? :)
C не годится для компилирования в код для виртуальной машины
Я бы сказал "не годится для компилирования в код той виртуальной машины, о которой мы тут ведём речь".
Re: подсказка
Date: 2009-09-20 06:15 pm (UTC)Возрастёт по сравнению с чем? Мне кажется, компилировать код, который уже статически типизирован в байткоде виртуальной машины, сравнительно дёшево.
Тогда что мы тут обсуждаем?
Вы спрашивали про ядра, основанные на виртуальных машинах, я вам рассказываю.
Для не-С есть виртуальная машина, но нет статических компиляторов?
Я не понял, в чём вопрос. Если я правильно понимаю, что происходит в мире, managed environment без виртуальной машины (точнее, без рантайма) в принципе быть не может.
C не годится для компилирования в код для виртуальной машины
Я бы сказал "не годится для компилирования в код той виртуальной машины, о которой мы тут ведём речь".
Не годится для компилирования в код такой виртуальной машины, на которой можно запускать ядро операционной системы.
Суть копиляции C в код виртуальной машины — это эмуляция реальной машины на виртуальной, см., например, проект NestedVM. Т. е. это с трудом можно назвать компиляцией в код виртуальной машины.
Re: подсказка
Date: 2009-09-20 07:33 pm (UTC)По сравнению с JIT-компиляцией кода, который не нужно проверять. В Вашей конструкции мы получаем на выполнение код, в котором надо провести вывод типов и убедиться, что некоторые важные инварианты соблюдаются. Не знаю, насколько трудна такая компиляция, но она явно тяжелей компиляции сишной.
Вы спрашивали про ядра, основанные на виртуальных машинах, я вам рассказываю.
И точно, спрашивал. Есть ли POSIX-совместимые (то есть, как бы, реальные) оси на таких ядрах или это техника будущего?
Не годится для компилирования в код такой виртуальной машины, на которой можно запускать ядро операционной системы.
Да, где-то так.
Не годится для компилирования в код такой виртуальной машины, на которой можно запускать ядро операционной системы.
LLVM-бэкенды к сишным компиляторам делают, значит, там всё не очень печально. Если бы сишный код (который представляет из себя высокоуровневый ассемблер для PDP-7) выполняли на виртуальной машине, а код виртуальной машины на реальной - то это было бы как-то совсем невесело. Наверно, где-то там что-то можно сэкономить.
Re: подсказка
Date: 2009-09-20 07:50 pm (UTC)По-моему проще. Компилятор C делает ровно те же проверки на типы.
выдаёт ошибку.
По сравнению с JIT-компиляцией кода, который не нужно проверять
Компиляция вызова метода — это генерация инструкции перехода по определённому адресу, если есть статическая типизация. Проверка производится неявно — мы же вызываем метод класса, значит для генерации адреса перехода надо знать адрес метода именно этого класса. Всё, что нужно проверять — это соответствие типов при присвоении переменных, а это копейки.
А если статической типизации нет, то вызов метода — это вообще очень сложная конструкция, которая зависит от того, что представляет из себя объект виртуальной машины.
Re: подсказка
Date: 2009-09-20 07:59 pm (UTC)То есть, Вы предполагаете, что для кода, выполняющегося в ядре, не нужно проверять какие-нибудь дополнительные инварианты, кроме тех, которые проверяет сишный компилятор. Удивительно. Вы верите в магию? Взяли систему типов, не сложней сишной, засунули в виртуальную машину - и всё работает непосредственно с оборудованием со скоростью, сравнимой с сишным кодом, но изолированно и безопасно?
Re: подсказка
Date: 2009-09-20 08:12 pm (UTC)Да, кроме нескольких моментов, о которых я писал выше — выход за границы массива, обращение к удалённому объекту, присвоение переменных разных типов, может быть что-то ещё. Так работает JVM или CLR. Нет разницы, происходит ли работа с оборудованием в ядре или работа с ядром в процессе.
Re: подсказка
From:Re: подсказка
From:Re: подсказка
From:Re: подсказка
From:Re: подсказка
From:Re: подсказка
Date: 2009-09-20 07:59 pm (UTC)Есть JNode OS, есть Singularity, есть какие-то другие, есть тонны научных работ на эту тему. Существующие ОС — не POSIX и медленно работают. Да, это технология будущего. Бурного энтузиазма по поводу таких систем в сети я не вижу, так что в ближайшие 5 лет вряд ли это будет промышленное решение.
LLVM-бэкенды к сишным компиляторам делают, значит, там всё не очень печально
LLVM — это слишком низкоуровневая машина. Она не проверяет выход за границы массива (и вообще предоставляет арифметику указателей). Я имел в виду совсем не LLVM, когда описывал операционную систему будущего.
Re: подсказка
Date: 2009-09-20 08:32 pm (UTC)Я упомянул LLVM только в контексте C-на-виртуальной-машине. Естественно, ОС будущего пишут не на С и VM для неё делают такую, что C на неё кладётся плохо.
тонны научных работ
То есть, однозначно, техника будущего.