LINUX.ORG.RU

Чем Linux лучше оффтопика в плане внутренней ахитектуры


0

0

собственно хочу рассказать начальству, почему стоит перенести продукт для внутреннего пользования с оффтопика на Linux.

Нужны _очень_ веские причины.

Я надеюсь на ответы _знающих_ людей

Спасибо

Перемещено Die-Hard из Development

★★★★★
Ответ на: комментарий от sniper21

>Нет продукт в Wine точно не работает (самописные драйвера, даже железо собственной разработки/сборки кое-где )) >Я спрашиваю про такие штуки, например, как : в Linux реализация USB подсистемы лучше, так как в ней есть то и вот это

В Линуксе есть масса готовых решений для USB устройств разных типов в исходниках и проще всего свое железо вкрутить в имеющийся подходящий драйвер.

>и например, драйвера писать проще, а в оффтопике этого нет

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

>Лучше работает к примеру ext2/3

ext3 надежнее чем ext2, сравнение с NTFS можно найти в интернете, и следует учесть что в Линуксе есть и другие варианты XFS,JFS и пр.

AlexLorovitch
()
Ответ на: комментарий от anonymous

> линуксовый USB переписывался с нуля раза три. В итоге, там довольно мало костылей

Зато там используется uninterruptible sleep... если не повезет, можно получить бессмертный процесс. Впрочем, это не является архитектурным преимуществом Линукса :)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> OOPS.. Kernel panic лучше BSOD? Правда, он и встречается реже в разы

паников в Linux преимущественно RHEL-овской ветки за последние три года я встречал штук пять. сюда естественно не входят наведённые разработкой паники - это дело техническое. только нативные. половина из них в инсталяторе, часть от Xов. BSOD не видел уже очень давно. по крайней мере лет пять точно не видел. хотя иногда [два-три раза в год] приходится в том числе ставить XP/Win2k3 на разные железки.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous

>> В конце концов segfault лучше BSOD

> OOPS.. Kernel panic лучше BSOD?

Ooops - точно лучше BSOD. Обычно система остается жива, по крайней мере.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Ooops - точно лучше BSOD. Обычно система остается жива, по крайней мере.

ну "жива" - это дело такое. что мне толку что она жива, если нужная мне железка а) не работает б) модуль после опса за блокировался и все, что остаётся делать - это reboot? тем более, что мёртвых опсов то-же хватает.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>было бы любопытно взглянуть на WDM драйвер генератора случайных чисел под 10Mb в сорцах :)

поправка, не 10 Мб, а 2 мегабайта и 20 Кб под линуксом. Запамятовал. И не /dev/random, а /dev/intel_rng

кажется, году в 2001 интел со своего сайта целый SDK давал скачать, с примерами. что-то такое: http://offline.computerra.ru/2001/385/7591/

anonymous
()
Ответ на: комментарий от klalafuda

>> Ooops - точно лучше BSOD. Обычно система остается жива, по крайней мере.

>ну "жива" - это дело такое. что мне толку что она жива

Это экономит время.

> если нужная мне железка а) не работает

Но можно продолжать писать драйвер :)

> б) модуль после опса за блокировался и все

Настоящие джедаи собирают ядро с поддержкой rmmod -f ;)

tailgunner ★★★★★
()
Ответ на: комментарий от AlexLorovitch

>В Линуксе есть масса готовых решений для USB устройств разных типов в исходниках и проще всего свое железо вкрутить в имеющийся подходящий драйвер.

и есть libusb которая работает в юзерспейсе, поэтому и отлаживать проще

anonymous
()
Ответ на: комментарий от anonymous

> ну значит, в четвёртый раз перепишут

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

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

>> было бы любопытно взглянуть на WDM драйвер генератора случайных чисел под 10Mb в сорцах :)

> поправка, не 10 Мб, а 2 мегабайта и 20 Кб под линуксом. Запамятовал. И не /dev/random, а /dev/intel_rng

> кажется, году в 2001 интел со своего сайта целый SDK давал скачать, с примерами. что-то такое: http://offline.computerra.ru/2001/385/7591/

статья интересная, спасибо за ссылку, но из неё никак не следует того, что вообще то простой как три копейки драйвер конкретного устройства - RNG на i8xx - будет тянуть на 2Mb исходников под win32. нас ведь никто не заставляет интегрироваться в Crypto API, правда? вполне достаточно сделать прямо скажем нехитрое устройство, из которого можно читать снимаемые с регистра данные. точно так же, как это сделано в Linux. и это явно не 2 метра - хорошо, если от силы 50kb.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от tailgunner

> Но можно продолжать писать драйвер :)
> Настоящие джедаи собирают ядро с поддержкой rmmod -f ;)

...который сцуко нихрена не работает или валит все к чертям :-/

anyway, отладка - это уже совсем из другой оперы и к опсам и BSODам прямого отношения не имеет.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>> Настоящие джедаи собирают ядро с поддержкой rmmod -f ;)

> ...который сцуко нихрена не работает или валит все к чертям :-/

Ну хз, видно, у меня карма удачная.

> anyway, отладка - это уже совсем из другой оперы и к опсам и BSODам прямого отношения

Очень даже имеет - она их вызывает :) и OP спрашивал в том числе и о разработке драйверов.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Очень даже имеет - она их вызывает :) и OP спрашивал в том числе и о разработке драйверов.

ну в таком случае я видел порядка четырех-пяти сотен опсов линукса за три года и несколько BSODов NT+ за пять :)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> статья интересная, спасибо за ссылку, но из неё никак не следует того, что вообще то простой как три копейки драйвер конкретного устройства - RNG на i8xx - будет тянуть на 2Mb исходников под win32. нас ведь никто не заставляет интегрироваться в Crypto API, правда? вполне достаточно сделать прямо скажем нехитрое устройство, из которого можно читать снимаемые с регистра данные. точно так же, как это сделано в Linux. и это явно не 2 метра - хорошо, если от силы 50kb.

не поленился, заглянул в WINDDK. к примеру, драйвер для serial:

This serial (16550-based RS-232) driver, which is compliant with Plug and Play, supports dynamic device enumeration via serenum and removal via either hotplug or the device manager. The code serves as a sample for most serial-like devices. The behavior of the various routines is documented in the source code files.

The code works on Microsoft® Windows® 2000 or later platforms. This code will not work on previous versions Windows NT® due to issues with support for Plug and Play, Power Management, and the new class drivers.

The driver also supports Power Management;when the port is not opened, it is powered down and powered up on open. It supports wake-on-ring for platforms that support that function. The driver works on both x86 and Alpha platforms.


общий объем исходников - примерно 750kb. из них коментариев в зависимости от файла примерно 1/3..1/2. сам по себе драйвер [да и железка в её реинкарнациях] *существенно* сложнее, чем вроде как простой RNG с тремя регистрами. IMHO оценка в 50кб исходников на голый драйвер RNG вполне уместна.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> общий объем исходников - примерно 750kb. из них коментариев в зависимости от файла примерно 1/3..1/2

400КБайт на драйвер последовательного порта? o_O

Может, это навороченная мультипортовая карта?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> 400КБайт на драйвер последовательного порта?
> o_O Может, это навороченная мультипортовая карта?

да нет, UART & K. но... они очень любят длинные имена переменных :)

NTSTATUS
SerialStartRead(
    IN PSERIAL_DEVICE_EXTENSION Extension
    )

/*++

Routine Description:

    This routine is used to start off any read.  It initializes
    the Iostatus fields of the irp.  It will set up any timers
    that are used to control the read.  It will attempt to complete
    the read from data already in the interrupt buffer.  If the
    read can be completed quickly it will start off another if
    necessary.

Arguments:

    Extension - Simply a pointer to the serial device extension.

Return Value:

    This routine will return the status of the first read
    irp.  This is useful in that if we have a read that can
    complete right away (AND there had been nothing in the
    queue before it) the read could return SUCCESS and the
    application won't have to do a wait.

--*/

{

    SERIAL_UPDATE_CHAR updateChar;

    PIRP newIrp;
    KIRQL oldIrql;
    KIRQL controlIrql;

    BOOLEAN returnWithWhatsPresent;
    BOOLEAN os2ssreturn;
    BOOLEAN crunchDownToOne;
    BOOLEAN useTotalTimer;
    BOOLEAN useIntervalTimer;

    ULONG multiplierVal;
    ULONG constantVal;

    LARGE_INTEGER totalTime;

    SERIAL_TIMEOUTS timeoutsForIrp;

    BOOLEAN setFirstStatus = FALSE;
    NTSTATUS firstStatus;

    SERIAL_LOCKED_PAGED_CODE();


    SerialDbgPrintEx(DPFLTR_TRACE_LEVEL, ">SerialStartRead(%X)\n", Extension);

    updateChar.Extension = Extension;

    do {

        //
        // Check to see if this is a resize request.  If it is
        // then go to a routine that specializes in that.
        //

        if (IoGetCurrentIrpStackLocation(Extension->CurrentReadIrp)
            ->MajorFunction != IRP_MJ_READ) {

            NTSTATUS localStatus = SerialResizeBuffer(Extension);

            if (!setFirstStatus) {

                firstStatus = localStatus;
                setFirstStatus = TRUE;

            }

        } else {

            Extension->NumberNeededForRead =
                IoGetCurrentIrpStackLocation(Extension->CurrentReadIrp)
                    ->Parameters.Read.Length;

            //
            // Calculate the timeout value needed for the
            // request.  Note that the values stored in the
            // timeout record are in milliseconds.
            //

            useTotalTimer = FALSE;
            returnWithWhatsPresent = FALSE;
            os2ssreturn = FALSE;
            crunchDownToOne = FALSE;
            useIntervalTimer = FALSE;

            //
            //
            // CIMEXCIMEX -- this is a lie
            //
            // Always initialize the timer objects so that the
            // completion code can tell when it attempts to
            // cancel the timers whether the timers had ever
            // been Set.
            //
            // CIMEXCIMEX -- this is the truth
            //
            // What we want to do is just make sure the timers are
            // cancelled to the best of our ability and move on with
            // life.
            //

            SerialCancelTimer(&Extension->ReadRequestTotalTimer, Extension);
            SerialCancelTimer(&Extension->ReadRequestIntervalTimer, Extension);


//            KeInitializeTimer(&Extension->ReadRequestTotalTimer);
//            KeInitializeTimer(&Extension->ReadRequestIntervalTimer);

            //
            // We get the *current* timeout values to use for timing
            // this read.
            //

            KeAcquireSpinLock(
                &Extension->ControlLock,
                &controlIrql
                );

            timeoutsForIrp = Extension->Timeouts;

            KeReleaseSpinLock(
                &Extension->ControlLock,
                controlIrql
                );

            //
            // Calculate the interval timeout for the read.
            //

            if (timeoutsForIrp.ReadIntervalTimeout &&
                (timeoutsForIrp.ReadIntervalTimeout !=
                 MAXULONG)) {

                useIntervalTimer = TRUE;

                Extension->IntervalTime.QuadPart =
                    UInt32x32To64(
                        timeoutsForIrp.ReadIntervalTimeout,
                        10000
                        );


                if (Extension->IntervalTime.QuadPart >=
                    Extension->CutOverAmount.QuadPart) {

                    Extension->IntervalTimeToUse =
                        &Extension->LongIntervalAmount;

                } else {

                    Extension->IntervalTimeToUse =
                        &Extension->ShortIntervalAmount;

                }

            }

            if (timeoutsForIrp.ReadIntervalTimeout == MAXULONG) {

                //
                // We need to do special return quickly stuff here.
                //
                // 1) If both constant and multiplier are
                //    0 then we return immediately with whatever
                //    we've got, even if it was zero.
                //
                // 2) If constant and multiplier are not MAXULONG
                //    then return immediately if any characters
                //    are present, but if nothing is there, then
                //    use the timeouts as specified.
                //
                // 3) If multiplier is MAXULONG then do as in
                //    "2" but return when the first character
                //    arrives.
                //

                if (!timeoutsForIrp.ReadTotalTimeoutConstant &&
                    !timeoutsForIrp.ReadTotalTimeoutMultiplier) {

                    returnWithWhatsPresent = TRUE;

                } else if ((timeoutsForIrp.ReadTotalTimeoutConstant != MAXULONG)
                            &&
                           (timeoutsForIrp.ReadTotalTimeoutMultiplier
                            != MAXULONG)) {

                    useTotalTimer = TRUE;
                    os2ssreturn = TRUE;
                    multiplierVal = timeoutsForIrp.ReadTotalTimeoutMultiplier;
                    constantVal = timeoutsForIrp.ReadTotalTimeoutConstant;

                } else if ((timeoutsForIrp.ReadTotalTimeoutConstant != MAXULONG)
                            &&
                           (timeoutsForIrp.ReadTotalTimeoutMultiplier
                            == MAXULONG)) {

                    useTotalTimer = TRUE;
                    os2ssreturn = TRUE;
                    crunchDownToOne = TRUE;
                    multiplierVal = 0;
                    constantVal = timeoutsForIrp.ReadTotalTimeoutConstant;

                }

            } else {

                //
                // If both the multiplier and the constant are
                // zero then don't do any total timeout processing.
                //

                if (timeoutsForIrp.ReadTotalTimeoutMultiplier ||
                    timeoutsForIrp.ReadTotalTimeoutConstant) {

                    //
                    // We have some timer values to calculate.
                    //

                    useTotalTimer = TRUE;
                    multiplierVal = timeoutsForIrp.ReadTotalTimeoutMultiplier;
                    constantVal = timeoutsForIrp.ReadTotalTimeoutConstant;

                }

            }

...............

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от tailgunner

> Ыыыыы... какой унылый ужоснахтунг O_o

ну вообще то никто не заставляет писать именно так. стилистика - это дело сугубо добровольное и DDK никак не декларируется :)

// wbr

klalafuda ★☆☆
()

В своё время приходилось разбираться во внутреннем устройстве оффтопика, так вот читал я Руссиновича. С каждой страницей усиливалось впечатление что оффтопик то не только не уступает линуксу но и во многом превосходит.

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

in_dance
()
Ответ на: комментарий от in_dance

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

Теперь допустим завтра выходит Xxxzuper Puper OS, в котором все эти действия делаются в три строчки (на лиспе, ага). А толку? а) это alien technology -- людей свободных, готовых в это втыкать нет -- им работать надо b) программа уже работает c) *существенные* преимущества невнятны.

и чего выгадает топикстартер от переписывания уже готовой, работающей программы?

если старый проект вполне себе работает, и у него самого по себе (а не оффтопика самого по себе) проблем существенных нет -- зачем его трогать-переписывать?

anonymous
()
Ответ на: комментарий от in_dance

> так вот читал я Руссиновича. С каждой страницей усиливалось впечатление что оффтопик то не только не уступает линуксу но и во многом превосходит.

Когда я читал Роберта Лава по разработке ядра линукс у меня с каждой страницей возникало прямо противоположное впечатление.

Хотя да, в винду первоначально Катлером было заложено немало вкусного, которое маркетоиды M$ хорошо зажали.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous

> В конце концов segfault лучше BSOD. Не надо ждать по пять минут перезагружая ОС и перезапуская все приложения.

Все еще работаем с win98 ?

Reset ★★★★★
()

от начальства прозвучала примерно такая фраза

"портировать можно, только я не вижу выгоды от этого"

p.s да, продвижение OSS это тяжело, но ничего, дорогу осилит идущий :-)

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от alexsaa

> Уж не знаю, может ли в принципе внутренняя архитектура быть веской причиной для начальства, но http://www.catb.org/esr/writings/taoup/html/ch03s02.html#nt_contrast

стоит ли говорить, что авто этого эссе ммм.. очень мягко говоря неровно дышит в сторону *NIX и старается ревностно блюсти "UNIX is simply better" аксиому зачастую не взирая на факты, которые в неё не вяжутся.. ;)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> стоит ли говорить... факты, которые в неё не вяжутся

Думаю стоит. Скажи. Только, желательно, конкретно, а не в стиле "мы с ним по-разному смотрим на одни и те же факты, поэтому он неправ".

alexsaa
()
Ответ на: комментарий от alexsaa

> Думаю стоит. Скажи. Только, желательно, конкретно, а не в стиле "мы с ним по-разному смотрим на одни и те же факты, поэтому он неправ".

без проблем, подискутируем да родится истина. но есть одно но: я против переноса темы в general и дискутировать согласен лишь в двух разделах - development и talks. с соотв. окраской дискуссии.

ps: нет, я не имею ничего против general лично, но я его не читаю и менять свои привычки не вижу смысла.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

когда я читал Эрика Ре[йд]монда про Art Of Unix Programming, у меня возникло стойкое дежа-вю, что он занимается ревизионизмом.. "это дескать, не баги, это у нас фичи такие".

Одно дело когда это просто best practices и более-менее объективное сравнительное описание архитектурных решений, пускай и с философской подоплёкой вроде DRY, юниксвейности, простоты, и т. п.

Другое дело, когда "если всё что у тебя есть -- молоток, то всё кажется гвоздем", и под это подводить глубокую философию. Ведь ясно же, что абстракции файл как поток байтов и объект -- немного разные, ещё со времен Unix haters handbook.. и что концепция "всё -- это файл" -- та же абстракция которая в некоторых местах ломается, и если уж проводить её последовательно, то в духе Plan 9 и ему подобных.

Есть у нас замшелый BIND с регулярными дырками, suidцидность, громоздкий сверхусложнённый Sendmail с долбанутым sendmail.cf, громоздкий autotools -- простой, как палка, но в расчётё на сферическую в вакууме универсальную среду сборки, иксы, под которые почему-то мало игрушек, в которых до сих пор проигрывание видео может вынести сами иксы.. архитектура по принципу "сначала построим сортир, потом пристроим к нему фундамент, крышу, стены, сарай -- вот тебе и дом готов", а если приспичит -- перепишем заново

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

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

..Однако, сама возможность "переписать и сделать красиво" осталась, хоть это уже прогресс :)

anonymous
()
Ответ на: комментарий от klalafuda

Я не готов дискутировать. И книжку ту тоже ещё не дочитал. Готов только слушать. Но и на этом не настаиваю - не создавать же для этого одно-единственное сообщение в Talks :) Пожалуй, снимаю свой вопрос. Лучше спрошу в другой раз, в другом разделе.

alexsaa
()
Ответ на: комментарий от klalafuda

> очень мягко говоря неровно дышит в сторону *NIX и старается ревностно блюсти "UNIX is simply better" аксиому зачастую не взирая на факты, которые в неё не вяжутся.. ;)

Это же аксиома, зачем ее доказывать? :D

Нормальный современный UNIX и правда просто лучше NT.

tailgunner ★★★★★
()
Ответ на: комментарий от alexsaa

ну Реймонд чем-то похож на Pragmatic Programmer, Programmer's Stone, Алистера Кобёрна, который в Agile Programming сравнивал методологии разработки с тренировками айкидо, всяких там Алхимиков Паоло Коэльо, и т.п. Провозглашается метафора ("файл -- универсальный ресурс"), постулируется концепция ( юникс-вей -- это Ъ, ортогональность -- хорошо), явно озвучен контекст (субкультура гиков-юниксоидов), в которой эти метафоры и концепции имеют смысл. И потом он излагает материал типа сравнительного обзора архитектуры с этих трёх позиций.

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

Проблема в том, что набор мифов и символов может быть вообще произволен (например, " глобально&надёжно™ ", " индусtrialьный промстандарт", и т.п.). Посмотри на эти же вещи и концепции с другим набором символов, установок и практик, с другой точки зрения -- и система и архитектура получится другая. Хотя мировозрение вырабатывается более-менее универсальное, с архитектурами чего-то так не получается, и "каждый кулик своё болото хвалит". Или вот в теории есть конструктивная математика, научный метод мышления, а в программировании -- "хотели как лучше, получилось как всегда" и "чем поливали, то и выросло".

Надо как-то отделить "реализацию концепций от интерфейса", общие принципы от частных моментов. И смотреть для целостного восприятия с разных точек зрения, там где это имеет смысл.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.