>Нет продукт в Wine точно не работает (самописные драйвера, даже железо собственной разработки/сборки кое-где )) >Я спрашиваю про такие штуки, например, как : в Linux реализация USB подсистемы лучше, так как в ней есть то и вот это
В Линуксе есть масса готовых решений для USB устройств разных типов в исходниках и проще всего свое железо вкрутить в имеющийся подходящий драйвер.
>и например, драйвера писать проще, а в оффтопике этого нет
Воистину так - собственно в Линуксе любая программа может работать напрямую с железом ежели ей дать привилегию. Можно и с приоритетами играться и с шедулингом.
>Лучше работает к примеру ext2/3
ext3 надежнее чем ext2, сравнение с NTFS можно найти в интернете, и следует учесть что в Линуксе есть и другие варианты XFS,JFS и пр.
> линуксовый USB переписывался с нуля раза три. В итоге, там довольно мало костылей
Зато там используется uninterruptible sleep... если не повезет, можно получить бессмертный процесс. Впрочем, это не является архитектурным преимуществом Линукса :)
> OOPS.. Kernel panic лучше BSOD? Правда, он и встречается реже в разы
паников в Linux преимущественно RHEL-овской ветки за последние три года я встречал штук пять. сюда естественно не входят наведённые разработкой паники - это дело техническое. только нативные. половина из них в инсталяторе, часть от Xов. BSOD не видел уже очень давно. по крайней мере лет пять точно не видел. хотя иногда [два-три раза в год] приходится в том числе ставить XP/Win2k3 на разные железки.
> Ooops - точно лучше BSOD. Обычно система остается жива, по крайней мере.
ну "жива" - это дело такое. что мне толку что она жива, если нужная мне железка а) не работает б) модуль после опса за блокировался и все, что остаётся делать - это reboot? тем более, что мёртвых опсов то-же хватает.
статья интересная, спасибо за ссылку, но из неё никак не следует того, что вообще то простой как три копейки драйвер конкретного устройства - RNG на i8xx - будет тянуть на 2Mb исходников под win32. нас ведь никто не заставляет интегрироваться в Crypto API, правда? вполне достаточно сделать прямо скажем нехитрое устройство, из которого можно читать снимаемые с регистра данные. точно так же, как это сделано в Linux. и это явно не 2 метра - хорошо, если от силы 50kb.
> статья интересная, спасибо за ссылку, но из неё никак не следует того, что вообще то простой как три копейки драйвер конкретного устройства - 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 вполне уместна.
> 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
В своё время приходилось разбираться во внутреннем устройстве оффтопика, так вот читал я Руссиновича. С каждой страницей усиливалось впечатление что оффтопик то не только не уступает линуксу но и во многом превосходит.
Конечно же это сугубо личное мнение, но постарайтесь не относиться предвзято к каким-либо технологиям.
да даже если и превосходит кто-то кого-то в чём-то. Есть готовая inhouse программка на коленке у топикстартера. Есть люди, которые разбираются а) в программке б) в системном программировании.
Теперь допустим завтра выходит Xxxzuper Puper OS, в котором все эти действия делаются в три строчки (на лиспе, ага). А толку? а) это alien technology -- людей свободных, готовых в это втыкать нет -- им работать надо b) программа уже работает c) *существенные* преимущества невнятны.
и чего выгадает топикстартер от переписывания уже готовой, работающей программы?
если старый проект вполне себе работает, и у него самого по себе (а не оффтопика самого по себе) проблем существенных нет -- зачем его трогать-переписывать?
стоит ли говорить, что авто этого эссе ммм.. очень мягко говоря неровно дышит в сторону *NIX и старается ревностно блюсти "UNIX is simply better" аксиому зачастую не взирая на факты, которые в неё не вяжутся.. ;)
> Думаю стоит. Скажи. Только, желательно, конкретно, а не в стиле "мы с ним по-разному смотрим на одни и те же факты, поэтому он неправ".
без проблем, подискутируем да родится истина. но есть одно но: я против переноса темы в general и дискутировать согласен лишь в двух разделах - development и talks. с соотв. окраской дискуссии.
ps: нет, я не имею ничего против general лично, но я его не читаю и менять свои привычки не вижу смысла.
когда я читал Эрика Ре[йд]монда про Art Of Unix Programming, у меня возникло стойкое дежа-вю, что он занимается ревизионизмом.. "это дескать, не баги, это у нас фичи такие".
Одно дело когда это просто best practices и более-менее объективное сравнительное описание архитектурных решений, пускай и с философской подоплёкой вроде DRY, юниксвейности, простоты, и т. п.
Другое дело, когда "если всё что у тебя есть -- молоток, то всё кажется гвоздем", и под это подводить глубокую философию. Ведь ясно же, что абстракции файл как поток байтов и объект -- немного разные, ещё со времен Unix haters handbook.. и что концепция "всё -- это файл" -- та же абстракция которая в некоторых местах ломается, и если уж проводить её последовательно, то в духе Plan 9 и ему подобных.
Есть у нас замшелый BIND с регулярными дырками, suidцидность, громоздкий сверхусложнённый Sendmail с долбанутым sendmail.cf, громоздкий autotools -- простой, как палка, но в расчётё на сферическую в вакууме универсальную среду сборки, иксы, под которые почему-то мало игрушек, в которых до сих пор проигрывание видео может вынести сами иксы.. архитектура по принципу "сначала построим сортир, потом пристроим к нему фундамент, крышу, стены, сарай -- вот тебе и дом готов", а если приспичит -- перепишем заново
Сначала "обживём ноосферу", потом окажется что намусорили и надо разгребать -- так сделаем хорошую мину и скажем, что это глубокий философский смысл и вообще, концепция. А разгребать -- не нужно.
Чисто математически это некрасиво. Некрасиво решать стереометрию в синусах-косинусах планиметрии, надо просто посмотреть на вещи под другим углом, чтобы вся сложность задачи сжалась с этой точки зрения в одну точку, и сделать всё красиво..
..Однако, сама возможность "переписать и сделать красиво" осталась, хоть это уже прогресс :)
Я не готов дискутировать. И книжку ту тоже ещё не дочитал. Готов только слушать. Но и на этом не настаиваю - не создавать же для этого одно-единственное сообщение в Talks :) Пожалуй, снимаю свой вопрос. Лучше спрошу в другой раз, в другом разделе.
> очень мягко говоря неровно дышит в сторону *NIX и старается ревностно блюсти "UNIX is simply better" аксиому зачастую не взирая на факты, которые в неё не вяжутся.. ;)
Это же аксиома, зачем ее доказывать? :D
Нормальный современный UNIX и правда просто лучше NT.
ну Реймонд чем-то похож на Pragmatic Programmer, Programmer's Stone, Алистера Кобёрна, который в Agile Programming сравнивал методологии разработки с тренировками айкидо, всяких там Алхимиков Паоло Коэльо, и т.п. Провозглашается метафора ("файл -- универсальный ресурс"), постулируется концепция ( юникс-вей -- это Ъ, ортогональность -- хорошо), явно озвучен контекст (субкультура гиков-юниксоидов), в которой эти метафоры и концепции имеют смысл. И потом он излагает материал типа сравнительного обзора архитектуры с этих трёх позиций.
По крайней мере, это более целостное изложение, чем просто вывалить на читателя MSDN как "дурацкую книгу кулинарных рецептов". Объясняется зачем и почему так сделано. Эта реализация не повисает в воздухе, а живет в озвученном культурном контексте. Явно озвучены эти мифы и символы, из которых произошла концепция и контекст ( а ведь известно, что мифы и символы, пересказ какого-то мифа -- самая живучая концепция ). Такие "сказки народов сеРвера".
Проблема в том, что набор мифов и символов может быть вообще произволен (например, " глобально&надёжно™ ", " индусtrialьный промстандарт", и т.п.). Посмотри на эти же вещи и концепции с другим набором символов, установок и практик, с другой точки зрения -- и система и архитектура получится другая. Хотя мировозрение вырабатывается более-менее универсальное, с архитектурами чего-то так не получается, и "каждый кулик своё болото хвалит". Или вот в теории есть конструктивная математика, научный метод мышления, а в программировании -- "хотели как лучше, получилось как всегда" и "чем поливали, то и выросло".
Надо как-то отделить "реализацию концепций от интерфейса", общие принципы от частных моментов. И смотреть для целостного восприятия с разных точек зрения, там где это имеет смысл.