опять cpp в драйвере...
От: MTimur  
Дата: 18.02.10 18:09
Оценка:
Здравствуйте.
В поисках решения очередной проблемы наткнулся на статью microsoft'а How to Use Function typedefs in C++ Driver Code to Improve PREƒast Results.
Очень удивил меня вот этот кусок кода:
class MyDriverClass
{
    PDRIVER_OBJECT m_DriverObject;
public:

    DRIVER_INITIALIZE mf_DriverEntry;
    MyDriverClass();
};

MyDriverClass *g_DriverObject;

// The C linkage wrapper function
extern "C" DRIVER_INITIALIZE DriverEntry;

extern "C" NTSTATUS DriverEntry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath)
{
   // Create/Initialize class MyDriverClass with a pointer
   // to it in g_DriverObject.
   g_DriverObject = new MyDriverClass();
   if (g_DriverObject == NULL)
   {
       //...
   }

   NTSTATUS st = g_DriverObject->mf_DriverEntry(DriverObject,RegistryPath);
   //...
}

// Implement the DriverEntry member function
NTSTATUS MyDriverClass::mf_DriverEntry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath)
{
   m_DriverObject = DriverObject;
   //...
}


Знающие люди, объясните как это понимать, оно вообще скомпилится? Если да, то как? Вроде как microsoft говорил всегда, что CPP в драйверах не поддерживает. Или я что-то упустил?
Re: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 18.02.10 18:19
Оценка: 1 (1)
Здравствуйте, MTimur, Вы писали:

MT>Знающие люди, объясните как это понимать, оно вообще скомпилится? Если да, то как? Вроде как microsoft говорил всегда, что CPP в драйверах не поддерживает. Или я что-то упустил?

C++ в драйверах прекрасно работает с некоторыми ограничениями.
Sapienti sat!
Re[2]: опять cpp в драйвере...
От: MTimur  
Дата: 18.02.10 20:15
Оценка:
Здравствуйте, Cyberax, Вы писали:

MT>>Знающие люди, объясните как это понимать, оно вообще скомпилится? Если да, то как? Вроде как microsoft говорил всегда, что CPP в драйверах не поддерживает. Или я что-то упустил?

C>C++ в драйверах прекрасно работает с некоторыми ограничениями.

Спасибо. Не подскажите где можно почитать подробнее об этом?

Простой тест

    char * a = new char();


Результат:

error LNK2019: unresolved external symbol "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) referenced in function _DriverEntry@8

Re[3]: опять cpp в драйвере...
От: Геннадий Майко США  
Дата: 18.02.10 21:57
Оценка: 2 (1)
Здравствуйте, MTimur,

C>>C++ в драйверах прекрасно работает с некоторыми ограничениями.


MT>Спасибо. Не подскажите где можно почитать подробнее об этом?

--
Можно начать отсюда C++ for Kernel Mode Drivers: Pros and Cons.

C уважением,
Геннадий Майко.
Re[3]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 19.02.10 10:10
Оценка: 2 (1) +2
Здравствуйте, MTimur, Вы писали:

C>>C++ в драйверах прекрасно работает с некоторыми ограничениями.

MT>Спасибо. Не подскажите где можно почитать подробнее об этом?
http://www.microsoft.com/whdc/driver/kernel/KMcode.mspx
http://www.codeproject.com/KB/system/excpt.aspx

MT>Простой тест

MT>
MT>    char * a = new char();
MT>

MT>Результат:
MT>

error LNK2019: unresolved external symbol "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) referenced in function _DriverEntry@8

Ну так определи

Вообще, new() без параметров в ядерной разработке противопоказан. Я бы так и оставил его неопределённым и вместо него использовал бы параметрический new.
Sapienti sat!
Re[4]: опять cpp в драйвере...
От: eagersh  
Дата: 19.02.10 18:04
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, MTimur,


C>>>C++ в драйверах прекрасно работает с некоторыми ограничениями.


MT>>Спасибо. Не подскажите где можно почитать подробнее об этом?

ГМ>--
ГМ>Можно начать отсюда C++ for Kernel Mode Drivers: Pros and Cons.

ГМ>C уважением,

ГМ>Геннадий Майко.
Мне особенно нравится эта фраза в заключении

"Several of the most insidious problems are extremely difficult to reproduce on demand while testing the driver, so a driver with an inherent unreliability might appear to run for extended periods with no problems and fail at random times. This reinforces the need for careful analysis."

Хотя вроде WDF написанна на С++. Так что наверное не все так плохо с С++.
Re[5]: опять cpp в драйвере...
От: TarasCo  
Дата: 19.02.10 18:59
Оценка:
E>Хотя вроде WDF написанна на С++. Так что наверное не все так плохо с С++.

Интересное явление: фреймворк написанный на С++, который не предоставляет С++ интерфейса )).
Да пребудет с тобою сила
Re[4]: опять cpp в драйвере...
От: gear nuke  
Дата: 21.02.10 07:40
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я бы так и оставил его неопределённым и вместо него использовал бы параметрический new.


Отказаться от возможности написать
vector<int> v;
?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 21.02.10 12:17
Оценка:
Здравствуйте, gear nuke, Вы писали:

C>>Я бы так и оставил его неопределённым и вместо него использовал бы параметрический new.

GN>Отказаться от возможности написать
vector<int> v;
?

pool_allocator alloc(....);

std::vector<int, pool_allocator> v(alloc);
Sapienti sat!
Re[6]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 06:31
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>
C>pool_allocator alloc(....);

C>std::vector<int, pool_allocator> v(alloc);
C>


Я и не понимаю — ради чего следует отказаться от возможность использовать дефолтный аллокотор и заставлять пользователя писать повсеместно дополнительный код?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 06:35
Оценка:
В общем пример пока работает против себя.
Сравним 2 варианта:

vector<int> v;

pool_allocator alloc(....);

std::vector<int, pool_allocator> v(alloc);

В каком из случаев можно ответить на вопрос: "в каком пуле аллоцируется память?"
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[8]: опять cpp в драйвере...
От: ononim  
Дата: 22.02.10 08:56
Оценка:
GN>
vector<int> v;

GN>
GN>pool_allocator alloc(....);
GN>std::vector<int, pool_allocator> v(alloc);
GN>

GN>В каком из случаев можно ответить на вопрос: "в каком пуле аллоцируется память?"
В том, который был передан в конструктор pool_allocator'а вместо ... второго варианта
Как много веселых ребят, и все делают велосипед...
Re[7]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 22.02.10 09:00
Оценка:
Здравствуйте, gear nuke, Вы писали:

C>>
C>>pool_allocator alloc(....);
C>>std::vector<int, pool_allocator> v(alloc);
C>>

GN>Я и не понимаю — ради чего следует отказаться от возможность использовать дефолтный аллокотор и заставлять пользователя писать повсеместно дополнительный код?
Удобнее контролировать. Случайно сложнее сделать аллокацию из неправильного пула из повышенного IRQL, например.
Sapienti sat!
Re[9]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 10:53
Оценка:
Здравствуйте, ononim,

GN>>В каком из случаев можно ответить на вопрос: "в каком пуле аллоцируется память?"

O>В том, который был передан в конструктор pool_allocator'а

Боюсь, вопрос недопонят, в свете того, что 2 разных экземпляра одного типа должны быть эквивалентны.
pool_allocator nppa(non_paged_pool);
pool_allocator ppa(paged_pool);
assert( ppa == nppa );

20.4.1.2 allocator globals

template <class T1, class T2>
bool operator==(const allocator<T1>&, const allocator<T2>&) throw();

1 Returns: true.


Если есть мысли как сделать такой хитрый конструктор — с радостью послушаю

O>вместо ... второго варианта


Второй вариант — 2 разных не экземпляра, а типа аллокатора. Какие бенефиты даёт запрет неявного использования одного из типов?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[10]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 22.02.10 10:57
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Если есть мысли как сделать такой хитрый конструктор — с радостью послушаю

Это в теории, на практике Dinkum STL прекрасно работает со stateful-аллокаторами.
Sapienti sat!
Re[8]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 11:09
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Удобнее контролировать. Случайно сложнее сделать аллокацию из неправильного пула из повышенного IRQL, например.


"Случайно" можно и другой пул написать

Про проверки IRQL, ксати, спасибо за намёк. Как я понял, идея делать их в мемберах аллокатора (это наверное и идеологически правильней — при доступе к памяти). Важно ли для реализации, дефолтный аллокатор или нет? По-моему — не важно.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[11]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 11:16
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Это в теории, на практике Dinkum STL прекрасно работает со stateful-аллокаторами.


pool_allocator nppa(non_paged_pool);
pool_allocator ppa(paged_pool);
assert( ppa == nppa );

std::vector<int, pool_allocator> vnpp(nppa);
std::vector<int, pool_allocator> vpp(ppa);
vnpp.swap(vpp); // прекрасно?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[9]: опять cpp в драйвере...
От: ononim  
Дата: 22.02.10 11:44
Оценка:
GN>Про проверки IRQL, ксати, спасибо за намёк. Как я понял, идея делать их в мемберах аллокатора (это наверное и идеологически правильней — при доступе к памяти). Важно ли для реализации, дефолтный аллокатор или нет? По-моему — не важно.
Дело не только в том на каком IRQL ты обращаешься к памяти. А еще в том в каком пуле обязан лежать тот или иной объект ядра, если для него выделена память. К примеру KeInitializeMutex требует non-paged pool для мутекса (впрочем это общее правило для объектов синхронизации). Кроме того просто тупо может быть ситуация когда память, выделенная на PSASSIVE_LEVEL будет использоваться на DISPATCH_LEVEL. Так что концепция "дефолтового" аллокатора в ядре неприменима.
Как много веселых ребят, и все делают велосипед...
Re[12]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 22.02.10 12:31
Оценка:
Здравствуйте, gear nuke, Вы писали:

C>>Это в теории, на практике Dinkum STL прекрасно работает со stateful-аллокаторами.

GN>
GN>pool_allocator nppa(non_paged_pool);
GN>pool_allocator ppa(paged_pool);
GN>assert( ppa == nppa );

GN>std::vector<int, pool_allocator> vnpp(nppa);
GN>std::vector<int, pool_allocator> vpp(ppa);
GN>vnpp.swap(vpp); // прекрасно?
GN>

- Доктор, у меня болит когда я делаю вот так!
- Ну так не делайте вот так.


А если серьёзно, то это баг в Стандарте.
Sapienti sat!
Re[13]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 18:19
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>
C>- Доктор, у меня болит когда я делаю вот так!
C>- Ну так не делайте вот так.
C>

О чём вообще речь? swap совершенно стандартное действие, причём с некоторыми гарантиями. Вот так
Автор: ononim
Дата: 22.02.10
делать не позворляет Стандарт. Вопрос
Автор: gear nuke
Дата: 22.02.10
остался без ответа.

C>А если серьёзно, то это баг в Стандарте.


Если так серьёзно, то что оно делает и в последнем драфте?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[10]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 18:51
Оценка:
Здравствуйте, ononim, Вы писали:

O>Кроме того просто тупо может быть ситуация когда память, выделенная на PSASSIVE_LEVEL будет использоваться на DISPATCH_LEVEL.


Ничего, что я процитирую цитируемый же пост про "проверки IRQL"?

делать их в мемберах аллокатора (это наверное и идеологически правильней — при доступе к памяти)


O> Так что


Не вижу причинно-следственной связи. Для тех случаев нужны другие типы аллокаторов.

O> концепция "дефолтового" аллокатора в ядре неприменима.


А еще баят, что Стандарт врёт и состояние в аллокаторе хранить — можно.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[11]: опять cpp в драйвере...
От: ononim  
Дата: 22.02.10 19:23
Оценка:
O>>Кроме того просто тупо может быть ситуация когда память, выделенная на PSASSIVE_LEVEL будет использоваться на DISPATCH_LEVEL.
GN>Ничего, что я процитирую цитируемый же пост про "проверки IRQL"?
GN>

делать их в мемберах аллокатора (это наверное и идеологически правильней — при доступе к памяти)

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

O>> Так что

GN>Не вижу причинно-следственной связи. Для тех случаев нужны другие типы аллокаторов.
То есть, таки нужны "другие" аллокаторы

O>> концепция "дефолтового" аллокатора в ядре неприменима.

GN>А еще баят, что Стандарт врёт и состояние в аллокаторе хранить — можно.
А мне пофиг че там стандарт говорит. Но если какой нить девелопер даже в Сшном коде у меня на проекте в кернелмоде напишет чтото типа
void *malloc(size_t sz) {return ExAllocatePool( PagedPool, sz); }

то получит по рукам. Ибо нефиг. Но таких кернелдевелоперов у нас слава Богу нету
Как много веселых ребят, и все делают велосипед...
Re[12]: опять cpp в драйвере...
От: gear nuke  
Дата: 23.02.10 10:31
Оценка: 2 (1)
Здравствуйте, ononim, Вы писали:

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


Лучше скажи, какое это отношение имеет к запрету дефолтных аллокаторов? Ровно так же кто-то сохранит где-то указатель полученный кашерной функцией, и разыменует его из другого участка на высоком IRQL.

У аллокатора есть
pointer address(reference x) const;

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

O>>> Так что

GN>>Не вижу причинно-следственной связи. Для тех случаев нужны другие типы аллокаторов.
O>То есть, таки нужны "другие" аллокаторы

Неужели из нужности одних как-то очевидна ненужность других?

O>>> концепция "дефолтового" аллокатора в ядре неприменима.

GN>>А еще баят, что Стандарт врёт и состояние в аллокаторе хранить — можно.
O>А мне пофиг че там стандарт говорит.

Позиция ясна, стандарт говорит что это
Автор: ononim
Дата: 22.02.10
нельзя

O> Но если какой нить девелопер даже в Сшном коде у меня на проекте в кернелмоде напишет чтото типа

O>
O>void *malloc(size_t sz) {return ExAllocatePool( PagedPool, sz); } 
O>

O>то получит по рукам. Ибо нефиг. Но таких кернелдевелоперов у нас слава Богу нету

"Нефиг" это мантра, а не причина.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[13]: опять cpp в драйвере...
От: ononim  
Дата: 23.02.10 11:19
Оценка:
O>>И чем это проверки в мемберах аллокатора помогут при доступе к уже выделенной памяти, когда никакие мемберы аллокатора ваще никаким боком не используюся ?
GN>Лучше скажи, какое это отношение имеет к запрету дефолтных аллокаторов? Ровно так же кто-то сохранит где-то указатель полученный кашерной функцией, и разыменует его из другого участка на высоком IRQL.
GN>У аллокатора есть
pointer address(reference x) const;

Он то есть, вот только им никто не пользуется

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

Ну то есть обычныйvector уже пролетает

O>>>> Так что

GN>>>Не вижу причинно-следственной связи. Для тех случаев нужны другие типы аллокаторов.
O>>То есть, таки нужны "другие" аллокаторы
GN>Неужели из нужности одних как-то очевидна ненужность других?
Именно. Если нужны аллокаторы типа А, Б и С нельзя из них выделять какой то "главный" ака "дефолтовый" класс.


O>> Но если какой нить девелопер даже в Сшном коде у меня на проекте в кернелмоде напишет чтото типа

O>>
O>>void *malloc(size_t sz) {return ExAllocatePool( PagedPool, sz); } 
O>>

O>>то получит по рукам. Ибо нефиг. Но таких кернелдевелоперов у нас слава Богу нету
GN>"Нефиг" это мантра, а не причина.
Эта мантра называется bad practice.
Как много веселых ребят, и все делают велосипед...
Re[14]: опять cpp в драйвере...
От: gear nuke  
Дата: 24.02.10 06:31
Оценка:
Здравствуйте, ononim, Вы писали:

GN>>У аллокатора есть
pointer address(reference x) const;

O>Он то есть, вот только им никто не пользуется

То есть — в имеющихся реализациях STL не используется? Дык они вобще-то на работу в ядре и не расчитаны, браво, пример очень к месту. Появление проверок — вопрос времени, а не изменения дизайна — разница между этими "мелочами" ясна?

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

O>Ну то есть обычныйvector уже пролетает

Пролетают placement new и т.п. "аллокаторы" где нет возможности инкапсулировать проверки в принципе, а не какой-то конкретный вектор, куда у разработчиков руки не дошли.

Где уж пролетает обычный vector — так это в проектах без дефольного аллокатора (поскольку вектор его использует).

И я повторю свой вопрос — зачем отправлять пользователя в пешее путешествие рядом с этим вектором?

GN>>Неужели из нужности одних как-то очевидна ненужность других?

O>Именно. Если нужны аллокаторы типа А, Б и С нельзя из них выделять какой то "главный" ака "дефолтовый" класс.

Спасибо, пример помог вскрыть сифизм. "Главный" и "по умолчанию" — ортогональные сущности.

GN>>"Нефиг" это мантра, а не причина.

O>Эта мантра называется bad practice.

Достаточно повторяться, я уже сделал вывод, что причина не может быть озвучена в силу как субъективных, так и объективных причин
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[15]: опять cpp в драйвере...
От: ononim  
Дата: 24.02.10 08:13
Оценка: 1 (1)
GN>То есть — в имеющихся реализациях STL не используется? Дык они вобще-то на работу в ядре и не расчитаны, браво, пример очень к месту. Появление проверок — вопрос времени, а не изменения дизайна — разница между этими "мелочами" ясна?
Ну то есть уже пришли к тому что имеющиеся STL тоже не подходят

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

O>>Ну то есть обычныйvector уже пролетает
GN>Пролетают placement new и т.п. "аллокаторы" где нет возможности инкапсулировать проверки в принципе, а не какой-то конкретный вектор, куда у разработчиков руки не дошли.
GN>Где уж пролетает обычный vector — так это в проектах без дефольного аллокатора (поскольку вектор его использует).
Вектор использует тот аллокатор, который ему передали 2м шаблонным параметром. Если передали, конечно.

GN>>>Неужели из нужности одних как-то очевидна ненужность других?

O>>Именно. Если нужны аллокаторы типа А, Б и С нельзя из них выделять какой то "главный" ака "дефолтовый" класс.
GN>Спасибо, пример помог вскрыть сифизм. "Главный" и "по умолчанию" — ортогональные сущности.
Не надо искать в словах софизмы и скрытые смыслы. Главный, по умолчанию, preffered в данном случае одно и тоже. И если уж возникают споры по поводу значения слов в какой то сущности, то такая сущность в кернелмоде тем более не нужна — там все должно быть предельно ясным.

GN>>>"Нефиг" это мантра, а не причина.

O>>Эта мантра называется bad practice.
GN>Достаточно повторяться, я уже сделал вывод, что причина не может быть озвучена в силу как субъективных, так и объективных причин
Причина — сокрытие от разработчика деталей, которые он ОБЯЗАН видеть перед своими глазами.
Как много веселых ребят, и все делают велосипед...
Re[16]: опять cpp в драйвере...
От: gear nuke  
Дата: 24.02.10 09:15
Оценка: 2 (2)
Здравствуйте, ononim, Вы писали:

O>Ну то есть уже пришли к тому что имеющиеся STL тоже не подходят


Констатация очевидного факта, который не имеет отношения к делу

Да, существующие STL неработоспособны в ядре. Исходя из этих причин делается альтернативный велосипед, где кстати дефолтный аллокатор есть. На следующей итерации разработки будут добавлены и проверки IRQL в аллокаторе (это польза, что я извлёк из данного топика).

И эта существующая реализация STL позволяет написать vector<int> v; в коде драйвера. Это позволяет, в частности, взять уже готовый отлаженный код и использовать без переделок. Повторное использование кода — очевидный плюс, снижающий стоимость разработки.

Каких-то минусов, увеличивающих стоимость разработки я так и не увидел

GN>>Где уж пролетает обычный vector — так это в проектах без дефольного аллокатора (поскольку вектор его использует).

O>Вектор использует тот аллокатор, который ему передали 2м шаблонным параметром. Если передали, конечно.

Реализованный по Стандарту вектор безусловно использует какой-то аллокатор, если явно не указан, то дефолтный.
template <class T, class Allocator = allocator<T> > class vector;

Запретив дефолтный аллокатор, получим:
1) несоответсвие со Стандартом.
2) неперносимость исходного С++ кода.

Что же прелагается в замен?

O>Не надо искать в словах софизмы и скрытые смыслы. Главный, по умолчанию, preffered в данном случае одно и тоже.


preffered в ядре это подкачиваемый пул (как наиболее дешёвый) что соответствует дефолтному аллокатору. Главный — не знаю что такое, может быть непосредственно с физической памятью работает?

O> И если уж возникают споры по поводу значения слов в какой то сущности


Не вижу предмета для спора, кроме как "была подмена исходных данных, или нет"

O> то такая сущность в кернелмоде тем более не нужна — там все должно быть предельно ясным.


Ага, выходит, что С++ вообще неприемлим в ядре, например, из-за повсеместного использования RAII? И С неприемлим, поскольку скрывает некоторые детали. Real man code in hex!

O>Причина — сокрытие от разработчика деталей, которые он ОБЯЗАН видеть перед своими глазами.


Ок, принимается.

Наличие документации не решит эту пробему?

Разработчик видит что используется дефолтный аллокатор, читает (один раз!) откуда будет аллокация, при необходимости меняет аллокатор.

Пока вижу здесь одну проблему — разработчик плохо понимает что такое STL и алокаторы в частности. Суть данной проблемы в том, что кто-то перепутал разработчика на С++ с разработчиком на языке "С/С++".
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[17]: опять cpp в драйвере...
От: eagersh  
Дата: 25.02.10 19:10
Оценка: -1 :)
Здравствуйте, gear nuke, Вы писали:





GN>Главный — не знаю что такое, может быть непосредственно с физической памятью работает?



У тебя много энтузиазма для этой проблемы, что хорошо.Но я бы посоветовал тебе поработать практически с kernel.
Re[18]: опять cpp в драйвере...
От: gear nuke  
Дата: 25.02.10 21:25
Оценка:
Здравствуйте, eagersh, Вы писали:

E>У тебя много энтузиазма для этой проблемы, что хорошо.


Спасибо, но энтузиазм в решении общей проблемы временами пропадает, особенно под давлением невнятного пессимизма относительно частных проблем, как упомянутый
void* operator new(std::size_t) throw(std::bad_alloc);// ууу как же никто не вспомнил среди проблем такую жирную
и как следствие std::allocator<>

E>Но я бы посоветовал тебе поработать практически с kernel.


Пожалуйста, конкретнее, с чем стоит попрактиковаться?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[19]: опять cpp в драйвере...
От: TarasCo  
Дата: 25.02.10 22:52
Оценка: :))
E>>Но я бы посоветовал тебе поработать практически с kernel.

GN>Пожалуйста, конкретнее, с чем стоит попрактиковаться?


Напиши ка нам ядро ОС на STL. На меньшее мы даже плевать не согласны!
Да пребудет с тобою сила
Re[19]: опять cpp в драйвере...
От: ononim  
Дата: 25.02.10 23:31
Оценка:
GN>Спасибо, но энтузиазм в решении общей проблемы временами пропадает, особенно под давлением невнятного пессимизма относительно частных проблем, как упомянутый
GN>
void* operator new(std::size_t) throw(std::bad_alloc);// ууу как же никто не вспомнил среди проблем такую жирную
и как следствие std::allocator<>

Ну во-первых в ядре на PASSIVE_LEVE даже SEH возможен
Во-вторых исключения могут быть реализованы компилятором без участия оси. Раз уж мы отказались от обычных STL, осталось отказаться от "обычных" компиляторов

E>>Но я бы посоветовал тебе поработать практически с kernel.

GN>Пожалуйста, конкретнее, с чем стоит попрактиковаться?
Сделай х64 beep.sys, который под вистой х64 будет спикером пищать
Как много веселых ребят, и все делают велосипед...
Re[20]: опять cpp в драйвере...
От: gear nuke  
Дата: 26.02.10 08:16
Оценка:
Здравствуйте, ononim,

В этой теме должна быть упомянута хоть одна проблема new, поэтому я и привёл в качестве примера спецификатор throw. Не странно ли, что это сделал защитник new, а не оппонетны?

O>Ну во-первых в ядре на PASSIVE_LEVE даже SEH возможен


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

Есть одно но: не надо писать, что поверх SEH следует реализовать диспетчер C++ исключений. Именно это я подразумевал, написав throw(std::bad_alloc)

O>Во-вторых исключения могут быть реализованы компилятором без участия оси. Раз уж мы отказались от обычных STL, осталось отказаться от "обычных" компиляторов


Каким компилятором следует воспользоваться и как?

Есть ли у этого способа преимущества перед реализацией независимого от ОС диспетчера С++ исключений для MSVC?

O>Сделай х64 beep.sys, который под вистой х64 будет спикером пищать


Я ошибаюсь, или такой драйвер будет содержать пару WRITE_PORT_UCHAR и не иметь места для STL? Тогда к чему это
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[20]: опять cpp в драйвере...
От: gear nuke  
Дата: 26.02.10 08:16
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Напиши ка нам ядро ОС на STL. На меньшее мы даже плевать не согласны!


Всё своим чередом — сначала STL, потом остальное
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[21]: опять cpp в драйвере...
От: ononim  
Дата: 26.02.10 08:29
Оценка:
GN>В этой теме должна быть упомянута хоть одна проблема new, поэтому я и привёл в качестве примера спецификатор throw. Не странно ли, что это сделал защитник new, а не оппонетны?
O>>Ну во-первых в ядре на PASSIVE_LEVE даже SEH возможен
GN>Я с удовольствием послушаю, чем и как может помочь возможность использовать SEH при выбросе bad_alloc. Не раз встречал в сети упоминания этой возможности и сам так когда-то думал. Решений до сих пор не знаю.
Ну как бы в студии C++ исключения, включая bad_alloc, реализованы поверх возможности использовать SEH

GN>Есть одно но: не надо писать, что поверх SEH следует реализовать диспетчер C++ исключений. Именно это я подразумевал, написав throw(std::bad_alloc)

Почему бы и нет, если задокументировать что 'our kernel STL — passive level only'

O>>Во-вторых исключения могут быть реализованы компилятором без участия оси. Раз уж мы отказались от обычных STL, осталось отказаться от "обычных" компиляторов

GN>Каким компилятором следует воспользоваться и как?
Да фиг их знает, как-то таких исследований не проводил. Но уж точно не MSVC

GN>Есть ли у этого способа преимущества перед реализацией независимого от ОС диспетчера С++ исключений для MSVC?

А можно посмотреть на реализацию "независимого от ОС диспетчера С++ исключений для MSVC" ?

O>>Сделай х64 beep.sys, который под вистой х64 будет спикером пищать

GN>Я ошибаюсь, или такой драйвер будет содержать пару WRITE_PORT_UCHAR и не иметь места для STL? Тогда к чему это
Ну дык. Драйвер это в общем случае это не сложный piece of soft с кучей бизнеслогики, а софтинка, которая железом управляет. И как бы все. А всякие тяжелые антивирусные драйвера — это уже от лукавого и совсем не mainstream так сказать.
Как много веселых ребят, и все делают велосипед...
Re[22]: опять cpp в драйвере...
От: gear nuke  
Дата: 26.02.10 11:25
Оценка:
Здравствуйте, ononim, Вы писали:

O>Ну как бы в студии C++ исключения, включая bad_alloc, реализованы поверх возможности использовать SEH


Что есть в Студии, расчитано на юзермод. Отсюда и ограничение ниже:
GN>>Есть одно но: не надо писать, что поверх SEH следует реализовать диспетчер C++ исключений. Именно это я подразумевал, написав throw(std::bad_alloc)
O>Почему бы и нет, если задокументировать что 'our kernel STL — passive level only'

Потому что STL (а тем более остальная чать стандартной библиотеки С++) может аллоцировать в неподкачиваемом пуле и свободно с ним работать

То, что следует документировать ограничения на IRQL для какие-то конкретных функцй я писал еще здесь внизу
Автор: gear nuke
Дата: 24.02.10
.

O>>>Во-вторых исключения могут быть реализованы компилятором без участия оси. Раз уж мы отказались от обычных STL, осталось отказаться от "обычных" компиляторов

GN>>Каким компилятором следует воспользоваться и как?
O>Да фиг их знает, как-то таких исследований не проводил.

Ясно, лишь бы чето написать

O> Но уж точно не MSVC


Хоть одна причина?

GN>>Есть ли у этого способа преимущества перед реализацией независимого от ОС диспетчера С++ исключений для MSVC?

O>А можно посмотреть на реализацию "независимого от ОС диспетчера С++ исключений для MSVC" ?

Я вообще знаю всего одну реализацию, которую можно посмотреть и она пока поверх диспетчера ОС. Технических проблем в реализации не вижу.

O>Ну дык. Драйвер это в общем случае это не сложный piece of soft с кучей бизнеслогики, а софтинка, которая железом управляет. И как бы все. А всякие тяжелые антивирусные драйвера — это уже от лукавого и совсем не mainstream так сказать.


Вывод из этого такой: в ряде случаев С++ в драйвере не даёт никаких преимуществ. Не вижу какой либо связи с запретом на new или в чём мне следует "поработать практически с kernel".
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[23]: опять cpp в драйвере...
От: eagersh  
Дата: 26.02.10 22:52
Оценка: 1 (1)
Здравствуйте, gear nuke, Вы писали:

O>>Ну дык. Драйвер это в общем случае это не сложный piece of soft с кучей бизнеслогики, а софтинка, которая железом управляет. И как бы все. А всякие тяжелые антивирусные драйвера — это уже от лукавого и совсем не mainstream так сказать.


GN>Вывод из этого такой: в ряде случаев С++ в драйвере не даёт никаких преимуществ. Не вижу какой либо связи с запретом на new или в чём мне следует "поработать практически с kernel".

ononim немного поскромничал назвав драйвера софтинкой.Просто в разработке драйверов к дополнению обычных programming skills надо понимать по крайней мере архитектуру hardware.Надо знать также архитектуру OS и чем больше ты знаешь OS тем лучше.Особенно это относится к Windows так как фактически в этой среде ты работаешь с black box.А для этих целей понадобится reverse engineering.
В целом С++ не очень надо in kernel development, но бывают и большые проэкты.И это не только разработка например file system .Лично я бы с удовольствием использовал STL in device driver так как имею опыт работы с STL in application programming. Тебе надо в любом случае опыт разработки в кернел если ты хочешь разработать такие вещи.Хотя бы для тестирования.
Возьми пример из WDK — \WinDDK\...\src\general\toaster. Он включает bus driver, functional driver and filter driver. Это будет тебе достаточно для тестирования.Используй также Driver Verifier для тестирования. Toaster включает себя примеры для WDM и WDF.Попробуй использовать обои среды. На MASM промелькнуло сообщение что кто то собирается делать похожее что и ты.
Re[24]: опять cpp в драйвере...
От: Геннадий Майко США  
Дата: 27.02.10 09:53
Оценка:
Здравствуйте, eagersh,

E>В целом С++ не очень надо in kernel development, но бывают и большые проэкты.И это не только разработка например file system .Лично я бы с удовольствием использовал STL in device driver так как имею опыт работы с STL in application programming.

--
Не вижу особых проблем аккуратного использования STL в драйверах.

Попробуйте найти в google groups известное сообщение Gary Nebbett'a "better timer performance than KeSetTimerEx(...)", там есть пример использования std::map (и это 1999 год!). Numega, в последних своих версиях Driver Studio, поставляла полную библиотеку STL для работы в kernel mode. Так что вполне можете попробовать, тем более если у Вас есть определенный опыт.

C уважением,
Геннадий Майко.
Re[25]: опять cpp в драйвере...
От: gear nuke  
Дата: 27.02.10 11:51
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Numega, в последних своих версиях Driver Studio, поставляла полную библиотеку STL для работы в kernel mode.


Судя по тому, что контекст исключения сохраняется в глобальных переменных:
.text:00000164 ; int __stdcall HandleCppException(int, int, int, int, struct _s_FuncInfo *, __int32, int)

.text:0000017D                 mov     eax, dword ptr ds:_EHExceptionRecord * g_CurrentException
.text:00000182                 test    eax, eax
.text:00000184                 jz      loc_266
.text:0000018A                 mov     [ebp+arg_0], eax
.text:0000018D                 mov     eax, dword ptr ds:_CONTEXT * g_CurrentContext
выполнение кода в arbitrary thread context невозможно.

Другая проблема связана с прекращением продаж, DS 3.2 можно найти в сети и сейчас, но легальность использования не ясна.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[24]: опять cpp в драйвере...
От: gear nuke  
Дата: 27.02.10 13:55
Оценка:
Здравствуйте, eagersh, Вы писали:

E>Просто в разработке драйверов к дополнению обычных programming skills надо понимать по крайней мере архитектуру hardware.


Если говорить о стандартизации доступа к оборудованию, что это относится не к С++, а к С (TR 18037: Embedded C рассматривает такие вещи, как address spaces & I/O hardware addressing).

E>Надо знать также архитектуру OS и чем больше ты знаешь OS тем лучше.


Некоторое понимание есть, но это овольно широкая область, и не ясно в каком месте следует углубляться.

E>Особенно это относится к Windows так как фактически в этой среде ты работаешь с black box.А для этих целей понадобится reverse engineering.


Windows не является black-box, поскольку исполняемые файлы доступны и выпоняются локально, в том числе и трассируются. Так же есть символы, которые сильно упрощают reverce code engineering. Хоть в RE и нет предела совершенству, но я всё таки был первый, кто опубликовал практически полностью рабочий диспетчер С++ исключений (в том числе и для ядра винды) На сколько я знаю, он остаётся единственным.

E> Тебе надо в любом случае опыт разработки в кернел если ты хочешь разработать такие вещи.Хотя бы для тестирования.


Мне кажется, что в стандатрной библиотеке C++ довольно мало вещей, которые требуют тестирования именно в KM.

Вообще, одной из основных целей создания KM STL было упрощение тестирования, за счёт тестов части кода в UM (а для кода, который принципиально не может быть протестирован в UM, часто вообще не могут быть сделаны даже KM unit tests). В частности сборка с такой STL и прогон TUT selftest позволяет говорить об отсутствии по крайней мере некоторого количества багов.

E>Возьми пример из WDK — \WinDDK\...\src\general\toaster. Он включает bus driver, functional driver and filter driver. Это будет тебе достаточно для тестирования.Используй также Driver Verifier для тестирования. Toaster включает себя примеры для WDM и WDF.Попробуй использовать обои среды.


Тостер содержит мало функционала и болше подходит для не-STL части ontl, когда-нибудь дорастём и до её рефакторинга и включения тостера как примера, а пока не хватает FAQ, документации, тестов и энтузиазма

E>На MASM промелькнуло сообщение что кто то собирается делать похожее что и ты.


Можно подробнее?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[24]: опять cpp в драйвере...
От: TarasCo  
Дата: 27.02.10 13:58
Оценка: +1
А зачем все время вставлять англицкие слова? Формально это нарушение правил конфы.
Да пребудет с тобою сила
Re[22]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 27.02.10 14:11
Оценка:
Здравствуйте, ononim, Вы писали:

O>Ну дык. Драйвер это в общем случае это не сложный piece of soft с кучей бизнеслогики, а софтинка, которая железом управляет. И как бы все. А всякие тяжелые антивирусные драйвера — это уже от лукавого и совсем не mainstream так сказать.

Хех. Человек из ATI, занимающийся разработкой драйверов, как-то сказал, что графические драйверы сейчас по размеру больше всего остального ядра Windows вместе со стандартными приложениями.
Sapienti sat!
Re[14]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 27.02.10 14:26
Оценка: 1 (1)
Здравствуйте, gear nuke, Вы писали:

C>>
C>>- Доктор, у меня болит когда я делаю вот так!
C>>- Ну так не делайте вот так.
C>>

GN>О чём вообще речь?
О swap между контейнерами в разных аллокаторах.

Я на это натыкался, когда писал контейнеры с поддержкой copy-on-write и гибких стратегий. Решил очень тупо — требованием от аллокаторов быть Swappable.

Такие же проблемы, AFAIR, у контейнеров, размещающихся в shared memory.

C>>А если серьёзно, то это баг в Стандарте.

GN>Если так серьёзно, то что оно делает и в последнем драфте?
Не интересовался. Вот тут есть описание этого дефекта:
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#431

Вроде даже какой-то resolution есть, но читать лень.
Sapienti sat!
Re[15]: опять cpp в драйвере...
От: gear nuke  
Дата: 27.02.10 16:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>О swap между контейнерами в разных аллокаторах.


Стоп. Стандарт явно позволяет это делать, причём оговорено время — O(1).

C>Вот тут есть описание этого дефекта:

C>http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#431

C>Вроде даже какой-то resolution есть, но читать лень.


А вот и зря, что лень. И я зря ленился написать подробно Но сейчас разберёмся.

В последнем драфте (n3035.pdf):

20.9.5.2 allocator globals

template <class T1, class T2>
bool operator==(const allocator<T1>&, const allocator<T2>&) throw();

1 Returns: true.


В этот драфт не входит упомянутый пункт 20.2.2/4, а если точнее — В Стандарте это:

20.1.5/4 Implementations of containers described in this International Standard are permitted to assume that their
Allocator template parameter meets the following two additional requirements beyond those in Table 32.
— All instances of a given allocator type are required to be interchangeable and always compare equal to
each other.

— The typedef members pointer, const_pointer, size_type, and difference_type are
required to be T*,T const*, size_t, and ptrdiff_t, respectively.


Но это ничего не меняет.

Мы вкладываем разный смысл в "разные аллокаторы".

Я подразумеваю, что аллокаторы одного типа всегда используют один и тот пул (не PoolType Винды, а в общем понимании — место откуда берётся память). Аллокаторы разных типов могут использовать разные пулы. При этом проблемы со swap нет впринципе — код не скопилируется, поскольку типы контейнеров будут разные.

Когда разные экземпляры одного типа аллокатора хранят как состояние PoolType и передают его в ExAllocatePoolWithTag, код может работать, поскольку в ExFreePoolWithTag не учитывается PoolType — и только поэтому. Это частный случай, а в общем случае, когда аллокатор использует, например, ExAllocateFromPagedLookasideList — невозможно обеспечить либо O(1) для swap, либо корректное освобождение выделенных другим экземпляром аллокатора элеменотов.

Поэтому передавать тип пула в алолокатор как предложено здесь
Автор: ononim
Дата: 22.02.10
некорректно, хоть и можно заставить "работать" в частном случае.


Требование о равенстве аллокаторов с разным состоянием, впринципе, не исключает возможности аллокатора хранить состояние — в случает когда это состояние не является типом пула, а является например номером элемента в пуле — проблем никаких нет во swap, пусть он себе обменивает аллокаторы и элементы контейнера за O(1).

Вот так. Когда тип пула привязан к типу, а не экземпляру аллокатора, то все эти страшилки насчёт разных пулов становятся непонятны
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[26]: опять cpp в драйвере...
От: Геннадий Майко США  
Дата: 27.02.10 18:36
Оценка:
Здравствуйте, gear nuke,

ГМ>>Numega, в последних своих версиях Driver Studio, поставляла полную библиотеку STL для работы в kernel mode.


GN>Судя по тому, что контекст исключения сохраняется в глобальных переменных:

GN>
GN>.text:00000164 ; int __stdcall HandleCppException(int, int, int, int, struct _s_FuncInfo *, __int32, int)

GN>.text:0000017D                 mov     eax, dword ptr ds:_EHExceptionRecord * g_CurrentException
GN>.text:00000182                 test    eax, eax
GN>.text:00000184                 jz      loc_266
GN>.text:0000018A                 mov     [ebp+arg_0], eax
GN>.text:0000018D                 mov     eax, dword ptr ds:_CONTEXT * g_CurrentContext
GN>
выполнение кода в arbitrary thread context невозможно.


GN>Другая проблема связана с прекращением продаж, DS 3.2 можно найти в сети и сейчас, но легальность использования не ясна.

--
Вы имеет в виду, как сделана поддержка исключений в этой библиотеке?
Если да, то это верно, такая проблема действительно существует. Это одна из причин, по которой я добавил "аккуратное" к своему утверждению.

Когда я в свое время игрался с STL и С++ исключениями в драйверах, то использовал как библиотеку из DS, так и runtime библиотеку из VS; вполне возможно, что последние, особенно от новых версий, и поддерживают многопоточную обработку исключений. Я особо не копал в этом направлении, так как специально ограничил использование исключений только при инициализации драйвера.
Кроме того, насколько мне известно, эту версию STL можно было скомпилировать так, чтобы она не поддерживала исключений.

C уважением,
Геннадий Майко.
Re[25]: опять cpp в драйвере...
От: eagersh  
Дата: 27.02.10 19:16
Оценка:
Здравствуйте, gear nuke, Вы писали:



E>>На MASM промелькнуло сообщение что кто то собирается делать похожее что и ты.


GN>Можно подробнее?


Я опечатался
не а MASM WASM
Great это не ты?
Вот цитата из его сообщения.
"
Хотя я реализовывал поддержку экцепшонов С++ для ядра
"

http://www.wasm.ru/forum/viewtopic.php?id=29640&amp;p=5

И он где то раньше упоминал что собирается импортировать STL в кернел.
Re[25]: опять cpp в драйвере...
От: eagersh  
Дата: 27.02.10 19:27
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>А зачем все время вставлять англицкие слова? Формально это нарушение правил конфы.

Буду придержоваться правил.
Re[25]: опять cpp в драйвере...
От: x64 Россия http://x64blog.name
Дата: 27.02.10 20:51
Оценка:
TC>А зачем все время вставлять англицкие слова?

Похоже, человек слишком много работал с западными заказчиками.

TC>Формально это нарушение правил конфы.


+1
JID: x64j@jabber.ru
Re[26]: опять cpp в драйвере...
От: gear nuke  
Дата: 27.02.10 20:55
Оценка:
Здравствуйте, eagersh, Вы писали:

E>Я опечатался

E>не а MASM WASM
E>Great это не ты?

Нет. Если потыкать по линкам на его блог то видно, Great есть и на RSDN.

E>Вот цитата из его сообщения.

E>"
E>Хотя я реализовывал поддержку экцепшонов С++ для ядра
E>"

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

E>http://www.wasm.ru/forum/viewtopic.php?id=29640&amp;p=5


Спасибо за ссылку, дальше интереснее:

У меня не совсем отлажено. В целом работает, но могут быть косяки. Если что я предупреждал ща поищу

написано 2009-12-07. Похоже, до сих пор других новостей нет

E>И он где то раньше упоминал что собирается импортировать STL в кернел.


Мы это давно сделали
Автор: gear nuke
Дата: 07.10.09
, довести бы до ума.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[27]: опять cpp в драйвере...
От: gear nuke  
Дата: 27.02.10 21:07
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Вы имеет в виду, как сделана поддержка исключений в этой библиотеке?


Да, это фрагмент её реализации.

ГМ>Когда я в свое время игрался с STL и С++ исключениями в драйверах, то использовал как библиотеку из DS, так и runtime библиотеку из VS; вполне возможно, что последние, особенно от новых версий, и поддерживают многопоточную обработку исключений.


VS поддерживает, но хранит контекст исключений в TLS + имеет еще какие-то (сейчас сходу не вспомню) зависимости в юзермоде. Возможно, у кого-то и получится "после сборки доработать напильником".

ГМ>Кроме того, насколько мне известно, эту версию STL можно было скомпилировать так, чтобы она не поддерживала исключений.


То же самое говорят про STLPort. Судя по этому
Автор:
Дата: 26.05.08
, только алгоритмы + контейнеры.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[25]: опять cpp в драйвере...
От: gear nuke  
Дата: 28.02.10 01:52
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>А зачем все время вставлять англицкие слова? Формально это нарушение правил конфы.


Я тоже постараюсь исправиться, но это вряд ли получится, потому что при слове "поток" не ясно о thread или stream идёт речь. Подобные проблемы и с переводом reverse engineering — по-русски нет особого смысла в первом слове, поскольку в CCCP инженеров учили разбирать на винтики, пилить кристаллы (и упрощать производственный процесс) еще до появления термина RE.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[23]: опять cpp в драйвере...
От: IID Россия  
Дата: 28.02.10 20:25
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, ononim, Вы писали:


O>>Ну дык. Драйвер это в общем случае это не сложный piece of soft с кучей бизнеслогики, а софтинка, которая железом управляет. И как бы все. А всякие тяжелые антивирусные драйвера — это уже от лукавого и совсем не mainstream так сказать.

C>Хех. Человек из ATI, занимающийся разработкой драйверов, как-то сказал, что графические драйверы сейчас по размеру больше всего остального ядра Windows вместе со стандартными приложениями.

По какому размеру ? Бинарников ? Очевидно, это не так. Достаточно посмотреть размер бинарников. Исходников ? Тоже мимо, размер исходников коррелирует с размером бинарников. Вот по количеству багов видеодрова впереди всего кернелмода, это известный факт.
kalsarikännit
Re[24]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 28.02.10 20:48
Оценка: 1 (1)
Здравствуйте, IID, Вы писали:

C>>Хех. Человек из ATI, занимающийся разработкой драйверов, как-то сказал, что графические драйверы сейчас по размеру больше всего остального ядра Windows вместе со стандартными приложениями.

IID>По какому размеру ? Бинарников ? Очевидно, это не так. Достаточно посмотреть размер бинарников. Исходников ? Тоже мимо, размер исходников коррелирует с размером бинарников. Вот по количеству багов видеодрова впереди всего кернелмода, это известный факт.
Он сказал, что в дровах ATI сейчас 52 миллиона строк кода (драйвера ATI занимают что-то около 100Мб, почти чисто только в виде кода). Это примерно столько же, сколько в остальной Винде.

Так что, вполне реально. То что в этом коде много багов — совсем ничего удивительного.

Это я к тому, что эпоха прошла, когда драйверы были чем-то простым, для чего не требовалось что-то большее С или ассемблера.
Sapienti sat!
Re[25]: опять cpp в драйвере...
От: ononim  
Дата: 28.02.10 23:28
Оценка:
C>>>Хех. Человек из ATI, занимающийся разработкой драйверов, как-то сказал, что графические драйверы сейчас по размеру больше всего остального ядра Windows вместе со стандартными приложениями.
IID>>По какому размеру ? Бинарников ? Очевидно, это не так. Достаточно посмотреть размер бинарников. Исходников ? Тоже мимо, размер исходников коррелирует с размером бинарников. Вот по количеству багов видеодрова впереди всего кернелмода, это известный факт.
C>Он сказал, что в дровах ATI сейчас 52 миллиона строк кода (драйвера ATI занимают что-то около 100Мб, почти чисто только в виде кода). Это примерно столько же, сколько в остальной Винде.
Это именно кернелмодный код? Потому что в "дровах" ATI помимо кернелмодных драйверов есть еще туева хуча софта, на .нете написанная, именуемая ATI Control Center который я лично не ставлю и никому не советую ставить. Я не сомневаюсь в монструзности кода этой байды, ибо она с минуту грузится на 8гиговой w2k3 и после 1го запуска никогда не выходит, видимо чтобы быстрее грузится второй и более разы, если юзеру вдруг захочется его опять запустить. Если не ошибаюсь ati control center занимает на диске около 40мб, в то время как если его не ставить — инсталлятору всего пару метров надо.

C>Так что, вполне реально. То что в этом коде много багов — совсем ничего удивительного.

Таки да. этот ati control center — просто ппц какое глюкало.

Вообще в целом подход большого и толстого драйвера ущербен сам по себе. В кернелмоде должно быть только то, что нельзя сделать в юзермоде. А единственное что нельзя сделать в юзермоде — это работать с железом (писать в IO/DMA etc)и модифицировать другой кернелмод код. Это и стоит пихать в драйвер. Все остальное — в юзермодные длл общающиеся с вашим драйвером или в сервисы.
Как много веселых ребят, и все делают велосипед...
Re[26]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 28.02.10 23:47
Оценка:
Здравствуйте, ononim, Вы писали:

C>>Он сказал, что в дровах ATI сейчас 52 миллиона строк кода (драйвера ATI занимают что-то около 100Мб, почти чисто только в виде кода). Это примерно столько же, сколько в остальной Винде.

O>Это именно кернелмодный код? Потому что в "дровах" ATI помимо кернелмодных драйверов есть еще туева хуча софта, на .нете написанная, именуемая ATI Control Center который я лично не ставлю и никому не советую ставить.
Ага, именно ядерного кода. ATICC — это мелочь по сравнению со всем остальным.

O>Вообще в целом подход большого и толстого драйвера ущербен сам по себе. В кернелмоде должно быть только то, что нельзя сделать в юзермоде. А единственное что нельзя сделать в юзермоде — это работать с железом (писать в IO/DMA etc)и модифицировать другой кернелмод код. Это и стоит пихать в драйвер. Все остальное — в юзермодные длл общающиеся с вашим драйвером или в сервисы.

Вот только видеокарты — это фактически сейчас отдельные компьютеры. Для них нужны свои планировщики, там своя виртуальная память с поддержкой защиты процессов и т.п. Вот и получается, что не всё так просто.
Sapienti sat!
Re[26]: опять cpp в драйвере...
От: gear nuke  
Дата: 01.03.10 09:09
Оценка: +1
Здравствуйте, ononim, Вы писали:

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


Предлагаю это рассказать разработчикам винды, которые перенесли графическую подсистему win32 из юзерленда в ядро (из-за тормозов)
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[27]: опять cpp в драйвере...
От: ononim  
Дата: 01.03.10 11:33
Оценка: 7 (1) +1
O>>Вообще в целом подход большого и толстого драйвера ущербен сам по себе. В кернелмоде должно быть только то, что нельзя сделать в юзермоде.
GN>Предлагаю это рассказать разработчикам винды, которые перенесли графическую подсистему win32 из юзерленда в ядро (из-за тормозов)
А все почему? А все потому, что у x86 очень дорогое переключение контекстов между потоками. А дорогое оно потому что при переключении контекста сбрасывается TLB. И что-то не заметно чтобы микрософт пытался тут чтото соптимизировать — могли бы в семерке поддержу TLB тэгов сделать чтоли. Потому вызов в кернелмод на несколько порядков быстрее чем вызов в соседний юзермод процесс через IPC/синхронизацию.
Кстати есть еще одна полагаю очень неафишируемая причина почему user32 переехал в ядро полностью вместо хорошей оптимизации в юзермоде и переносе в ядро минимального функционала. Когда появилиась первые NT с user32 отдельном процессе быстренько быстренько нарисовался citrix который создал терминал сервер свой — Citrix WinFrame for win 3.51. И надо-же надо-же, микрософт увидев сие чудо лицензировало разработку citrix и в следующей NT4 перенесло user32 в ядро целиком и полностью, даже NtUser*/NtGdi* системные вызовы не потрудившись заэкспортировать из win32k. Ну и на основе лицензированного цитрикса сделало свой терминал сервер, в чем легко лишний раз убедиться сделав grep -i Citrix -r по знаменитым исходникам. И сказало — вау а теперь user32 быстрее работает. Ну оно то конечно быстрее, но чтото я не верю в такие совпадения и думается мне что скорость была далеко не единственной причиной врастания user32 в ядро.
Как много веселых ребят, и все делают велосипед...
Re[28]: опять cpp в драйвере...
От: gear nuke  
Дата: 01.03.10 13:02
Оценка:
Здравствуйте, ononim, Вы писали:

O>Ну оно то конечно быстрее, но чтото я не верю в такие совпадения и думается мне что скорость была далеко не единственной причиной врастания user32 в ядро.


Если одна причина достаточно для переноса в ядро, зачем тратить время на другие? Это ж был один из возможных примеров, есть еще и IIS

Если уж говорить "Вообще в целом", то не "подход большого и толстого драйвера ущербен сам по себе", а "микроядро имеет ряд преимуществ перед монолитным или гибридным" — красивая теория как надо делать ОС, но есть еще и действиельность в виде Виндоус, с которой надо как-то жить и работать.

Кстати, зачем делается разделение по кольцам защиты? Причина одна — обезопасить код ядра системы от ошибок в других модулях. Ошибки могут быть 2х видов: намеренные атаки, и случайные ошибки в коде. С++ как раз позволяет уменьшить количество последних.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[29]: опять cpp в драйвере...
От: ononim  
Дата: 01.03.10 14:11
Оценка:
GN>Если уж говорить "Вообще в целом", то не "подход большого и толстого драйвера ущербен сам по себе", а "микроядро имеет ряд преимуществ перед монолитным или гибридным" — красивая теория как надо делать ОС, но есть еще и действиельность в виде Виндоус, с которой надо как-то жить и работать.
GN>Кстати, зачем делается разделение по кольцам защиты? Причина одна — обезопасить код ядра системы от ошибок в других модулях. Ошибки могут быть 2х видов: намеренные атаки, и случайные ошибки в коде. С++ как раз позволяет уменьшить количество последних.
Не знаю не знаю. Могу по своему опыту сказать что в моем кернелмодном коде багов получается меньше чем в юзермодном. Причем в кернелмоде я пишу чисто на С, в юзермоде — на С++/st/boost/whatever else.. Общий уровень рас?издяйства знаете ли предрасполагает. А если добавить что С++ вобщемто снижает уровень сложности "порога вхождения" для новичков то...
Как много веселых ребят, и все делают велосипед...
Re[30]: опять cpp в драйвере...
От: gear nuke  
Дата: 01.03.10 15:35
Оценка:
Здравствуйте, ononim, Вы писали:

O>Могу по своему опыту сказать что в моем кернелмодном коде багов получается меньше чем в юзермодном. Причем в кернелмоде я пишу чисто на С, в юзермоде — на С++/st/boost/whatever else..


Я другого и не ожидал. Для полноты картины неплохо бы заодно сравнить еще и объём кода и затрачиваемое время, вывести метрику "стоимость безошибочного кода", а вот потом и сравнивать.

O> Общий уровень рас?издяйства знаете ли предрасполагает.


Вот в этом то и дело. В ядре основную часть времени думаешь "как бы не навредить", а в юзермоде занимаешься другим делом — решаешь задачу.

Причём, если в ядре "без ошибок" значит отсутсвие BSoD, то в прикладной задаче ошибкой может считаться выбор неоптимального по скорости алгоритма, напимер двоичный поиск вместо trie
Автор: ononim
Дата: 30.12.09
. Поэтому разделение труда между специалистами в своих областях может оказаться разумным.

O> А если добавить что С++ вобщемто снижает уровень сложности "порога вхождения" для новичков то...


Помимо порога вхождения в ядро, где можно заботливо разложить грабли есть еще порог выхождения на рынок, который определяется не языком, а другими факторами, например репутацией или прохождением WHQL.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[31]: опять cpp в драйвере...
От: ononim  
Дата: 01.03.10 15:59
Оценка:
O>>Могу по своему опыту сказать что в моем кернелмодном коде багов получается меньше чем в юзермодном. Причем в кернелмоде я пишу чисто на С, в юзермоде — на С++/st/boost/whatever else..
GN>Я другого и не ожидал. Для полноты картины неплохо бы заодно сравнить еще и объём кода и затрачиваемое время, вывести метрику "стоимость безошибочного кода", а вот потом и сравнивать.
Я и имел ввиду соотношение количество багов/количество кода. Насчет затраченного времени — имхо вот здесь как раз не стоит экономить — потом выйдет гораздо больше времени на исправление проблем.

O>> Общий уровень рас?издяйства знаете ли предрасполагает.

GN>Вот в этом то и дело. В ядре основную часть времени думаешь "как бы не навредить", а в юзермоде занимаешься другим делом — решаешь задачу.
Да. Потому что в ядре если навредишь — то всем и сразу, причем заодно и систему можешь угробить так что она не загрузится. А юзермоде в крайнем случае и перезапуститься можно. Подход себя вполне оправдывает. И по этой же причине в ядре не надо ниче делать кроме того что там приходится делать. А если чтото можно сделать в юзермоде — там это и надо делать, для того юзермод и был вобщемто придуман. Потому меня очень напрягают вопросы в стиле а как мне показать messagebox из кернелмода, у меня единственный вопрос возникает — а какие есть технические причины этому кроме того что "вот хочется чтоб из кернелмода".

mid=3657240&only=1]двоичный поиск вместо trie[/url]. Поэтому разделение труда между специалистами в своих областях может оказаться разумным.
O>> А если добавить что С++ вобщемто снижает уровень сложности "порога вхождения" для новичков то...
GN>Помимо порога вхождения в ядро, где можно заботливо разложить грабли есть еще порог выхождения на рынок, который определяется не языком, а другими факторами, например репутацией или прохождением WHQL.
Вобщем я считаю так, что если уж человек полез в ядро, то он должен досконально знать куда лезет.
Так что если вдруг вылетит бсод при доступе к Paged памяти из под высокого IRQL или вдруг окажется что человек забыл задереференсить какой то объект получиутечку, чтобы потом первая мысль в голове глядя на дамп от юзера в течении первой минуты была не "какого хрена???" а "а ну я лопух ступил".
И в этом плане порог вхождения желательно сделать повыше, чтобы для людей входящих в область обычные AV и мелкие утечки и прочее вообще не считались сколько нибудь большой проблемой на фикс которой приходится тратить кучу времени, включая знакомтсво с архитектурой того под что они пишут. Они вообще не должны писать такой код в котором возникают такие проблемы, а раз уж написали — "ух я и ступил" — и зафиксили через 5 минут. Я лично задолго до того как написал свой первую строчку в кернелмоде прекрасно знал многие кернелмодные тонкости, так что реально новых вещей которые я узнал на практике — практически не было.
Кстати учитывая количество вопросов в этом топике в стиле а как мне выделить полгига nonpaged памяти — такого народу "не в теме" очень много и становится больше и больше. Снижение порога слоэности входа в кернелмод привлечет еще орду нубов и в результате наступит полный бардак, который давно царит в юзермоде. Я конечно против DRM, но введение обязательной подписи для х64 в этом плане хоть както сдерживает ситуацию.
Как много веселых ребят, и все делают велосипед...
Re[32]: опять cpp в драйвере...
От: gear nuke  
Дата: 01.03.10 19:31
Оценка: 2 (1)
Здравствуйте, ononim, Вы писали:

O>Я и имел ввиду соотношение количество багов/количество кода. Насчет затраченного времени — имхо вот здесь как раз не стоит экономить — потом выйдет гораздо больше времени на исправление проблем.


Так чего ж экономим, а не тратим его в таких количествах как NASA, заказчик виноват?

O>И по этой же причине в ядре не надо ниче делать кроме того что там приходится делать. А если чтото можно сделать в юзермоде — там это и надо делать, для того юзермод и был вобщемто придуман. Потому меня очень напрягают вопросы в стиле а как мне показать messagebox из кернелмода, у меня единственный вопрос возникает — а какие есть технические причины этому кроме того что "вот хочется чтоб из кернелмода".


Всё это интересно, микроядра, грамотные архитектуры, но к С++ отношения не имеет.

O>Вобщем я считаю так, что если уж человек полез в ядро, то он должен досконально знать куда лезет.


И это не имеет, хоть и верно.

O>Так что если вдруг вылетит бсод при доступе к Paged памяти из под высокого IRQL или вдруг окажется что человек забыл задереференсить какой то объект получиутечку, чтобы потом первая мысль в голове глядя на дамп от юзера в течении первой минуты была не "какого хрена???" а "а ну я лопух ступил".


А вот это имеет самое непосредственное отношение к С++.

Про аллокаторы, как я понял из пролитой воды, проблемы надуманы, либо вызваны неправильным использованием
Автор: ononim
Дата: 22.02.10
.

Про дерефенренс — какие преимущества имеет С по сравнению с С++ и RAII где ресурсы освобождаются автоматически?

O>Снижение порога слоэности входа в кернелмод привлечет еще орду нубов и в результате наступит полный бардак


Окей, притянем к С++ этот оффтоп — порог вхождения в сам язык на порядок выше, чем в С, какие можно сделать выводы?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[32]: опять cpp в драйвере...
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 02.03.10 14:16
Оценка:
всем привет!

кгхм, извините, что вмешиваюсь в по-настоящему интересную дискуссию. Редкие забеги в янус не оставляют шансов полноценно тут поучаствовать.

Однако, ознакомившись с топиком и тут же, буквально следом за
O>Кстати учитывая количество вопросов в этом топике в стиле а как мне выделить полгига nonpaged памяти — такого народу "не в теме" очень много и становится больше и больше. Снижение порога слоэности входа в кернелмод привлечет еще орду нубов и в результате наступит полный бардак, который давно царит в юзермоде. Я конечно против DRM, но введение обязательной подписи для х64 в этом плане хоть както сдерживает ситуацию.
встретив вот этот вопрос
Автор: rsdnhomer
Дата: 01.03.10
, задумался — а так ли уж расходятся во мнениях участники дискуссии?!

С++ в ядре при правильном обращении, несомненно, полезен и от того, о чем говорит gear nuke &amp; co
Автор: gear nuke
Дата: 01.03.10
например

Про дерефенренс — какие преимущества имеет С по сравнению с С++ и RAII где ресурсы освобождаются автоматически?

отказываться, считаю, неразумно. Писал об этом не раз — последним было у меня Зачем пытаться отстать от прогресса?
Автор: Valery A. Boronin
Дата: 28.12.09
.

пожалуй, главной для меня является тут следующая мысль: любые дополнительные вспомогательные инструменты, будь то verifier, SDV, prefast или DTM или вот язык С++ (вполне себе рабочий инструмент), позволяющие при правильном обращении повысить качество кода — это хорошо. Если обращение неправильно — априори вопроса ИМХО просто нет: ну прицелился хорошенько да пальнул человек себе в ногу из двустволки — кто ж виноват что не обучился использовать оружие? Таких деятелей жизнь быстро научит.

Но при этом вопросы, подобные заданному по ссылке выше
Автор: rsdnhomer
Дата: 01.03.10
, действительно, в определенный момент могут не только заставить улыбнуться, а еще и настроить следом на весьма и весьма радикальный лад.

Поэтому на мой взгляд, истина (или даже точнее — согласие), как это часто бывает, где-то рядом. Если бы ononim чуть мягче использовал кванторы всеобщности и уникальности (собственно, за которые и зацепились коллеги), наверное бы даже подписался под его позицией.

Но все же лично мне пока со столь жесткими заявлениями вида
>Вообще в целом подход большого и толстого драйвера ущербен сам по себе. В кернелмоде должно быть только то, что нельзя сделать в юзермоде. А единственное что нельзя сделать в юзермоде — это работать с железом (писать в IO/DMA etc)и модифицировать другой кернелмод код.
сложно согласиться.

Если оставить от цитаты фразу "В кернелмоде должно быть только то, что нельзя сделать в юзермоде", заменить "должно быть" на "следует стараться делать", не усилять условие "большим и толстым" (не хочется даже выяснять что есть большой а что толстый), а также попыткой перечислить в одну строку все то, "что нельзя делать в user mode" — то получилось бы гораздо лучше. Вряд ли кто из коллег возмущался бы потом.

Но думаю что и gear nuke и остальные скорее согласны чем нет — что безотносительно С++ и т.п. идея-то абсолютно верная в основе — "не суйся в воду, не зная броду"! Тем более, что времена когда брод практически невозможно было найти даже при запредельном уровне желания и старания — давно канули в Лету... Сейчас вполне можно не тупить и найти все что нужно для старта (и не только) самостоятельно — вопрос "где взять информацию?!" уже гораздо менее актуален. Главным становится вопрос "какому источнику верить?!"

Может, оно и к лучшему, конечно — но романтики в нашем деле становится меньше, факт.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[33]: опять cpp в драйвере...
От: eagersh  
Дата: 02.03.10 19:53
Оценка:
Здравствуйте, Valery A. Boronin, Вы писали:


VAB>С++ в ядре при правильном обращении, несомненно, полезен и от того, о чем говорит gear nuke &amp; co
Автор: gear nuke
Дата: 01.03.10
например

Про дерефенренс — какие преимущества имеет С по сравнению с С++ и RAII где ресурсы освобождаются автоматически?

отказываться, считаю, неразумно. Писал об этом не раз — последним было у меня Зачем пытаться отстать от прогресса?
Автор: Valery A. Boronin
Дата: 28.12.09
.

Основная проблемма использования С++ в кернеле это отсуствия поддержки от Microsoft.А если такой поддержки, нет то менэджмент не будет рисковать пускать энтузиастов С++ на рабочии проэкты.Энтузиасты могут уйти, а найти других энтузиастов бутет очень трудно.В целом найти хорошего разработчика для Windows кернел очень трудно, а энтузиаста С++ практически невозможно.
Я в Штатах давно работаю и только встретил один проэкт где испоьзовалься С++.Лично я вижу одно преимущество С++ в кернел .Это использования *.cpp файлов.Но в моей текущем проэкте мы даже отказались от этого.В проэкте используется код общий не только для Windows, но и для других OS кернел.Windows оказывается более дружественный к использованию С++ компилятора чем Linux и Unix.
Все что я написал относится в кернел.Для приложений я конечно использую С++.
Re[34]: опять cpp в драйвере...
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 03.03.10 06:29
Оценка:
eagersh, спасибо, интересно. понимаю, что если есть успешный опыт и рабочий — от него не отказываются.

VAB>>С++ в ядре при правильном обращении, несомненно, полезен и от того, о чем говорит gear nuke &amp; co
Автор: gear nuke
Дата: 01.03.10
например

Про дерефенренс — какие преимущества имеет С по сравнению с С++ и RAII где ресурсы освобождаются автоматически?

отказываться, считаю, неразумно. Писал об этом не раз — последним было у меня Зачем пытаться отстать от прогресса?
Автор: Valery A. Boronin
Дата: 28.12.09
.

E>Основная проблемма использования С++ в кернеле это отсуствия поддержки от Microsoft.А если такой поддержки, нет то менэджмент не будет рисковать пускать энтузиастов С++ на рабочии проэкты.Энтузиасты могут уйти, а найти других энтузиастов бутет очень трудно.В целом найти хорошего разработчика для Windows кернел очень трудно, а энтузиаста С++ практически невозможно.
да, ситуация с кадрами очень непростая. с тем, что в работающих десятилетиями проектах у энтузиастов по любому будут чем-либо связаны руки — тоже понимаю и согласен с менеджментом

Молодежь всегда стремится к прогрессу и поэтому рано или поздно, но даже на самые закостеневшие проекты будет оказано влияние.

Конечно, нужно запускать энтузиастов с опытом, чтобы за энтузиазмом стояли знания и профессионализм. По одиночке тут ингридиенты не работают — только вместе.

E>Я в Штатах давно работаю и только встретил один проэкт где испоьзовалься С++.Лично я вижу одно преимущество С++ в кернел .Это использования *.cpp файлов.Но в моей текущем проэкте мы даже отказались от этого.В проэкте используется код общий не только для Windows, но и для других OS кернел.Windows оказывается более дружественный к использованию С++ компилятора чем Linux и Unix.

ну вот видите — плюсы они есть и если их просуммировать собрав обратную связь со всех (уже это в какой-то мере сделала эта и сопутствующие ветки), их окажется не так уж и мало. Вполне себе повод задуматься, на чем начинать новый проект.

E>Все что я написал относится в кернел.Для приложений я конечно использую С++.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[34]: опять cpp в драйвере...
От: gear nuke  
Дата: 03.03.10 11:09
Оценка:
Здравствуйте, eagersh, Вы писали:

E>Основная проблемма использования С++ в кернеле это отсуствия поддержки от Microsoft.


Microsoft негласно похоронили язык С 10 лет назад. Поддерживается API OS, которое имеет С интерфейс.

Microsoft не поддерживает C++ в полной мере в ядре, поскольку на данный момент не накоплено достаточной базы знаний о возможных проблемах и методах их решений, они не хотят что бы шишки летели в них. Microsoft ждёт созревание рынка и потом "внезапно" окажется там всерьёз и надолго.

E>А если такой поддержки, нет то менэджмент не будет рисковать пускать энтузиастов С++ на рабочии проэкты.Энтузиасты могут уйти, а найти других энтузиастов бутет очень трудно.В целом найти хорошего разработчика для Windows кернел очень трудно, а энтузиаста С++ практически невозможно.


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

E>Я в Штатах давно работаю и только встретил один проэкт где испоьзовалься С++.


Какой сложности проекты?


Тут стоит вспомнить, что качественный софт — не тот, который "работает" 24*7, а который выполняет работу, решая проблемы клиента. Так вот в Штатах пишут кучу совершенно бесполезных поделок-антивирусов, которые детектят разве что фейковые антималвары, и то через неделю.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[35]: опять cpp в драйвере...
От: eagersh  
Дата: 03.03.10 17:12
Оценка:
Здравствуйте, gear nuke, Вы писали:


E>>Я в Штатах давно работаю и только встретил один проэкт где испоьзовалься С++.


GN>Какой сложности проекты?



GN>Тут стоит вспомнить, что качественный софт — не тот, который "работает" 24*7, а который выполняет работу, решая проблемы клиента. Так вот в Штатах пишут кучу совершенно бесполезных поделок-антивирусов, которые детектят разве что фейковые антималвары, и то через неделю.

Это был даже не драйвер, а библиотека поддержки.Драйвер — тюнер.Сам драйвер, та часть что работает с железом, была написана на С.Библиотека на С++ делала какую ту обработку сигнала.Детали не знаю.
Меня интервьюровали по знанию С++ на драйвер позицию только один раз.Это было в McAfee.
Re[35]: опять cpp в драйвере...
От: TarasCo  
Дата: 03.03.10 18:06
Оценка:
GN>Microsoft негласно похоронили язык С 10 лет назад. Поддерживается API OS, которое имеет С интерфейс.

Зачем тогда они новый код пишут на С? И занимаются такой херней: http://vcc.codeplex.com/?

А похоронили они 10 лет назад С++ ибо сие мерворожденное чудо, которое откачали медики-чудесники. Перспектива вообщем понятная: все что можно (99%) будет на управляемом коде написано, остальное, где уж совсем никак без этого — С напополам с асмом.
Да пребудет с тобою сила
Re[36]: опять cpp в драйвере...
От: TarasCo  
Дата: 03.03.10 18:11
Оценка: -1
Да самый главный лозунг:
Статические верификаторы кода обыгрывают С++ с его "строгой" типизацией. С код, проверенный хорошим верификатором становится надежней плюсового, который верифицировать гораздо сложнее. А раз С код надежней, то какие плюсы остаются у плюсов?
Да пребудет с тобою сила
Re[37]: опять cpp в драйвере...
От: gear nuke  
Дата: 03.03.10 20:40
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Статические верификаторы кода обыгрывают С++ с его "строгой" типизацией. С код, проверенный хорошим верификатором становится надежней плюсового, который верифицировать гораздо сложнее.


Верификация С кода так же невозможна, как и С++, верификаторы принимают другой язык — аннотированный С
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[36]: опять cpp в драйвере...
От: gear nuke  
Дата: 03.03.10 21:04
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Зачем тогда они новый код пишут на С?


Какой именно? В каждом случае могут быть свои причины.

TC> И занимаются такой херней: http://vcc.codeplex.com/?


Сам же ответил в следующем посте — С++ сложнее верифицировать, нало же с чего то начинать.

TC>А похоронили они 10 лет назад С++ ибо сие мерворожденное чудо, которое откачали медики-чудесники.


MS и в частности Герб Саттер активно развивают язык С++, VC поддерживает C++0x в отличае от C99.

TC> Перспектива вообщем понятная: все что можно (99%) будет на управляемом коде написано, остальное, где уж совсем никак без этого — С напополам с асмом.


Одно не понятно в этой перспективе, когда настанет её время и смерть Windows. Пока что Wintel пережила не один прогноз о своей смерти, Итаник, дотнет в ядре Висты...
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[37]: опять cpp в драйвере...
От: IID Россия  
Дата: 04.03.10 07:58
Оценка:
Здравствуйте, TarasCo, Вы писали:


TC>Да самый главный лозунг:

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

Ерунда. Аккуратно написанный С++ код верифицируется самым лучшим инструментом — мозгами читающего его программиста. А в дебрях pureC за деревьяеми можно не разглядеть леса. К тому же RAII надёжно делает кучу работы, которую никакой source-based верификатор никогда не осилит.
kalsarikännit
Re[37]: опять cpp в драйвере...
От: TarasCo  
Дата: 04.03.10 08:23
Оценка: +1
GN>Какой именно? В каждом случае могут быть свои причины.

Ну, тот же HyperV. Проект новый, практически с 0 написанный. Довольно объемный. По всем показателям ему бы на плюсах писаться?

GN>Сам же ответил в следующем посте — С++ сложнее верифицировать, нало же с чего то начинать.


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

TC>>А похоронили они 10 лет назад С++ ибо сие мерворожденное чудо, которое откачали медики-чудесники.

GN> MS и в частности Герб Саттер активно развивают язык С++, VC поддерживает C++0x в отличае от C99.

С++0х — это гимн и реквием одновременно . А С развивать не надо — это совершенный ( в своей парадигме естественно ) язык. Например, обсуждая С++, можно придумать кучу фич, которых не хватает в языке или стандартной библиотеке. Собственно, за пару десятилетий активного использования накопился целый том, который и назвали С++0x ( пора бы в C++1x переименовать? ) А за годы использования С все пожелания свелись к жалкому С99. Что там в нем? bool считать встронным типом и переменные объявлять не в начале блока? Мне лично С99 вообще на фиг не нужен.

TC>> Перспектива вообщем понятная: все что можно (99%) будет на управляемом коде написано, остальное, где уж совсем никак без этого — С напополам с асмом.

GN>Одно не понятно в этой перспективе, когда настанет её время и смерть Windows. Пока что Wintel пережила не один прогноз о своей смерти, Итаник, дотнет в ядре Висты...

Windows и не умрет. А NT перестанет быть доминирующей платформой. С++ — доминирующим языком в разработке десктопных приложений.
Да пребудет с тобою сила
Re[38]: опять cpp в драйвере...
От: TarasCo  
Дата: 04.03.10 08:44
Оценка:
IID>Ерунда. Аккуратно написанный С++ код верифицируется самым лучшим инструментом — мозгами читающего его программиста.

Да-да. Мозг — прекрасное средство поиска ошибок. Только он обычно включается после того, как ошибка уже случилась. А статический верификатор — это просто вспомогательное средство, позволяющее мозг подлючить до возникновения ошибки, а не после.

IID>К тому же RAII надёжно делает кучу работы, которую никакой source-based верификатор никогда не осилит.


Утечки ресурсов верификаторы ловят очень неплохо. А RAII — это не панацея. В реализации класса-владельца ресурса также могут быть ошибки. Кроме того RAII — это гарантированные дополнительные расходы: памяти и процессорного времени. То, что верификатор проверят единожды, твой код будет делать постоянно, на всех пользовательских машинах. И чем той код будет становится надежней, тем больше будет накладных расходов.
Да пребудет с тобою сила
Re[39]: опять cpp в драйвере...
От: gear nuke  
Дата: 04.03.10 10:06
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Кроме того RAII — это гарантированные дополнительные расходы: памяти и процессорного времени.


Откуда гарантия расходов?

здесь
Автор: gear nuke
Дата: 07.04.07
в конце поста видно что auto_ptr может не давать никакого оверхеда.

здесь
Автор: gear nuke
Дата: 07.04.07
приведена реализация такого auto_ptr, по 2м выделенным фрагментам кода видно, что проблемы остальных реализаций были вызваны недооптимизатором.

TC> То, что верификатор проверят единожды, твой код будет делать постоянно, на всех пользовательских машинах.


Хм, уже научились верифицировать хранимое состояние?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[38]: опять cpp в драйвере...
От: gear nuke  
Дата: 04.03.10 11:23
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Ну, тот же HyperV. Проект новый, практически с 0 написанный. Довольно объемный. По всем показателям ему бы на плюсах писаться?


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

TC>С++ сложнее на порядок верифицировать.


Трансляция С++ в С тривиальна, проблемы лишь с языком аннотаций.

TC> И похоже, у MS нет желения тратить время на разработку бесполезного с их точки зрения продукта.


Уже давно тратят, делая управляемый С++. Верификатор С кода идёт к той же проблеме но с дургой стороны.

TC>С++0х — это гимн и реквием одновременно .


Ну... да Концепты, rvalue references — хороший показатель, что авторитеты тоже ошибаются, никто не может точно знать наперёд...

TC> А С развивать не надо — это совершенный ( в своей парадигме естественно ) язык. Например, обсуждая С++, можно придумать кучу фич, которых не хватает в языке или стандартной библиотеке. Собственно, за пару десятилетий активного использования накопился целый том, который и назвали С++0x ( пора бы в C++1x переименовать? ) А за годы использования С все пожелания свелись к жалкому С99.


За годы существования K&R C появилось достаточно усовершенствований как самого языка: C89, С90, C99 и сюрприз — C1X, так и изменений выхордящих за рамки языка: С--, C++, Go, Objective C, ...

С остайтся поскольку обычно выполняет роль стандартного бинарного интерфейса.

TC> Что там в нем? bool считать встронным типом и переменные объявлять не в начале блока?


здесь. inline, restrict, массивы переменной длины. C1X вносит гораздо больше, упомяну лишь стандартизацию _ReadWriteBarrier & Co. Показательно, что даже изменения в препроцессоре VC делались ради C++.

TC> Мне лично С99 вообще на фиг не нужен.


Дело не в ком-то лично. Нельзя взять С99 код и скомпилировать его под Виндовс без шаманства.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: опять cpp в драйвере...
От: Аноним  
Дата: 04.03.10 15:55
Оценка:
Здравствуйте, MTimur, Вы писали:


MT>Знающие люди, объясните как это понимать, оно вообще скомпилится? Если да, то как? Вроде как microsoft говорил всегда, что CPP в драйверах не поддерживает. Или я что-то упустил?


если код правильный то скомпилиться (я код не читал)
а вообще что вы удивляетесь? вчера программирование начали изучать что ли?
в винде win2k.sys GUI написано в перемешку на С,C++
DirectX написан на C,C++, и в оптимизациях на asm
всем известный syser дебаггер, написан на C++ полностью
Re[38]: опять cpp в драйвере...
От: x64 Россия http://x64blog.name
Дата: 04.03.10 20:57
Оценка: -2
TC>А С развивать не надо — это совершенный ( в своей парадигме естественно ) язык. Например, обсуждая С++, можно придумать кучу фич, которых не хватает в языке или стандартной библиотеке. Собственно, за пару десятилетий активного использования накопился целый том, который и назвали С++0x ( пора бы в C++1x переименовать? ) А за годы использования С все пожелания свелись к жалкому С99. Что там в нем? bool считать встронным типом и переменные объявлять не в начале блока? Мне лично С99 вообще на фиг не нужен.

Двачую! Оставьте C и выкиньте уже этот недосишарп в лице C++.
JID: x64j@jabber.ru
Re[39]: опять cpp в драйвере...
От: IID Россия  
Дата: 04.03.10 21:50
Оценка: -1
Здравствуйте, x64, Вы писали:

x64>Двачую! Оставьте C и выкиньте уже этот недосишарп в лице C++.


Ниасиливший детектед!

не сподвигнувшиеся выучить ООП (а некоторые из них про него и не слышали, искренне считая все технологии после 1981 г. унылым говном), разжигают холивар, который, как правило, сводится к необходимости описывать каждый чих в ООП с одной стороны и необходимость изобретать уйму велосипедов для хоть какой-нибудь объектности с другой.

kalsarikännit
Re[39]: опять cpp в драйвере...
От: gear nuke  
Дата: 05.03.10 01:59
Оценка:
Здравствуйте, x64, Вы писали:

x64>Двачую! Оставьте C и выкиньте уже этот недосишарп в лице C++.


Ява имеет мало общего с С++ а С слишком ограничен
Автор: gear nuke
Дата: 05.03.10
. Ваш ход, маэстро.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[40]: опять cpp в драйвере...
От: gear nuke  
Дата: 05.03.10 02:07
Оценка: +1 -1
Здравствуйте, IID, Вы писали:

IID>Ниасиливший детектед!


ИМХО больше похоже на сильное влияние Дельфи.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[40]: опять cpp в драйвере...
От: x64 Россия http://x64blog.name
Дата: 05.03.10 04:42
Оценка: -1
GN>Ваш ход, маэстро.

Мне не нужен C++ в драйверах. В юзерспейсе в системных вещах у меня тоже C везде. А для прикладных задач или там UI какого-нибудь десктопного у меня C# есть (да и то, только из-за FCL). Ну вот как-то не вписался C++ в мой быт. Вот это мой аргумент — не нужен C++, нет потребности. И я не один
Автор: TarasCo
Дата: 04.03.10
такой, похоже. И вряд ли ты сможешь предложить задачу, которая заставила бы меня взять в руки C++. Тем не менее, это всё не мешает мне писать то, за что платят деньги в итоге, ибо в итоге, как известно, платят за решение проблем, а не за язык. Ну и что после этого ещё обсуждать?
JID: x64j@jabber.ru
Re[41]: опять cpp в драйвере...
От: gear nuke  
Дата: 05.03.10 11:08
Оценка: +1 -1
Здравствуйте, x64, Вы писали:

x64>И вряд ли ты сможешь предложить задачу, которая заставила бы меня взять в руки C++.


Я её уже предложил Разумеется, если ограничиваться личными предпочтениями — её можно рашить и на С, вопрос в эффективности, гибкости решения и затраченном времени. Потому вместо решения последовали отмазки. не надо было даже кода, хватило бы "а на С это можно следать так-то". Но я знаю, что даже этого не будет, любое решение на С проиграет предложенному мы уже это проходили, достаточно сравнить Kernel: Загрузка DLL из памяти (x86)
Автор: x64
Дата: 06.12.08
(незаконченное решение) и это
Автор: gear nuke
Дата: 20.04.09


x64>Тем не менее, это всё не мешает мне писать то, за что платят деньги в итоге, ибо в итоге, как известно, платят за решение проблем, а не за язык. Ну и что после этого ещё обсуждать?


Можно бы обсудить что лучше: освоить средства заказчика в полной мере, или экономить их но это уж не совсем программирование.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[42]: опять cpp в драйвере...
От: x64 Россия http://x64blog.name
Дата: 05.03.10 21:27
Оценка:
GN>...вопрос в эффективности, гибкости решения и затраченном времени.
GN>любое решение на С проиграет предложенному...

Это всё ни чем не подкреплённые заявления. Приведи сравнительные тесты. Или приведи примеры, когда два аналогичных системных продукта (с драйверами, разумеется) писаны один на C, по-старинке, другой на C++. И приведи показатели вроде вот продукт на C, вот он падает каждые 15 минут, и писали его в 10 дольше, и денег, соответственно, потрачено в 20 раз больше, и т.д. и т.п. Разумеется, при условии что и тот и другой продукт писали ребята вполне квалифицированные, вот твоего уровня, например. Вот это был бы другой разговор, а пока у тебя только два кода (при чём решающих разные, по-большому счёту, задачи), один на C другой твой на С++, и твои слова, что код на C++ лучше. Чем он лучше, — не понятно. Ещё раз говорю, приводи примеры, иначе сейчас это всё смахивает на попытки пропихнуть NTL куда надо и куда не надо. Мне вообще сама идея NTL нравится, но только как исследовательский проект. Использовать это лично я вряд ли когда-нибудь буду, у меня у самого сишная Kernel-Mode Library, отлаженная, откомментированная, проверенная временем, зачем мне ещё что-то?
JID: x64j@jabber.ru
Re[41]: опять cpp в драйвере...
От: x64 Россия http://x64blog.name
Дата: 05.03.10 21:28
Оценка:
IID>>Ниасиливший детектед!
GN>ИМХО больше похоже на сильное влияние Дельфи.

Ребят, почините уже детекторы, ни хрена угадать не можете...
JID: x64j@jabber.ru
Re[43]: опять cpp в драйвере...
От: IID Россия  
Дата: 06.03.10 08:50
Оценка:
Здравствуйте, x64, Вы писали:

GN>>...вопрос в эффективности, гибкости решения и затраченном времени.

GN>>любое решение на С проиграет предложенному...

x64>Это всё ни чем не подкреплённые заявления. Приведи сравнительные тесты. Или приведи примеры, когда два аналогичных системных продукта (с драйверами, разумеется) писаны один на C, по-старинке, другой на C++. И приведи показатели вроде вот продукт на C, вот он падает каждые 15 минут, и писали его в 10 дольше, и денег, соответственно, потрачено в 20 раз больше, и т.д. и т.п.

Совершенно бессмысленное сравнение, потому что...

x64>Разумеется, при условии что и тот и другой продукт писали ребята вполне квалифицированные, вот твоего уровня, например.

...как только pure-C сольёт ты тут же начнёшь вопить о низкой квалификации сишников.

x64>Вот это был бы другой разговор, а пока у тебя только два кода (при чём решающих разные, по-большому счёту, задачи), один на C другой твой на С++, и твои слова, что код на C++ лучше.

Именно так, два небольших примера, из которых можно сделать определённые выводы. Уровень квалификации тоже можно усмотреть. В отличие от "системных продуктов", которые ещё и closed source будут, в случае "квалифицированных разработчиков".

x64>Чем он лучше, — не понятно.

А ещё говоришь что детекторы сломались. "Ниасилил" в канонической форме.

x64>Ещё раз говорю, приводи примеры,

С его стороны С++ пример был, ждём твой на pure-C

x64>иначе сейчас это всё смахивает на попытки пропихнуть NTL куда надо и куда не надо. Мне вообще сама идея NTL нравится, но только как исследовательский проект. Использовать это лично я вряд ли когда-нибудь буду, у меня у самого сишная Kernel-Mode Library, отлаженная, откомментированная, проверенная временем, зачем мне ещё что-то?

О, раз у тебя своя либа есть — тогда за чем же дело встало ? Раз pure-C такой весь замечательный да ещё с качественной библиотекой поддержки, то написать killer sample будет делом часа-двух. Вместо воплей на форуме и злобного минусования всех постов.
kalsarikännit
Re[43]: опять cpp в драйвере...
От: gear nuke  
Дата: 15.03.10 04:09
Оценка: 1 (1)
Здравствуйте, x64, Вы писали:

GN>>...вопрос в эффективности, гибкости решения и затраченном времени.

GN>>любое решение на С проиграет предложенному...

x64>Это всё ни чем не подкреплённые заявления.


Боюсь, ты их банально не понял, но не знаю с какого места нужно объяснять подробнее.

x64>Приведи сравнительные тесты.


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

x64> Или приведи примеры, когда два аналогичных системных продукта (с драйверами, разумеется) писаны один на C, по-старинке, другой на C++. И приведи показатели вроде вот продукт на C, вот он падает каждые 15 минут, и писали его в 10 дольше, и денег, соответственно, потрачено в 20 раз больше, и т.д. и т.п.


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

Ну вот давай сравним твой файрвол и OSSS. Окей, тест на стабильность второй пока не прошёл. Исправление багов — вопрос времени. Но когда твой начнёт выполнять функцию блокировки нежелательного трафика?

x64>Ещё раз говорю, приводи примеры, иначе сейчас это всё смахивает на попытки пропихнуть NTL куда надо и куда не надо.


Она туда уже давно нагуглилась и без RSDN. А на самом деле и сейчас рановато. Парадокс? Верхи не могут, низы не хотят...
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[44]: опять cpp в драйвере...
От: x64 Россия http://x64blog.name
Дата: 15.03.10 04:34
Оценка: :))
GN>Ну вот давай сравним твой файрвол и OSSS. Окей, тест на стабильность второй пока не прошёл. Исправление багов — вопрос времени. Но когда твой начнёт выполнять функцию блокировки нежелательного трафика?

Некорректное сравнение, ибо разработка OSSS ведётся уже более двух лет, а jFirewall Personal Pro писан одним человеком за считанные месяцы и далеко не на fulltime при чём. Было б у меня два года чистого времени плюс некоторые финансы, то ваш OSSS, равно как и Касперские, Аутпосты и прочая, по фичам и стабильности сосали бы не нагибаясь. А так... ну этот проект и не задумывался изначально как коммерчески успешный, так что придумай что-нибудь получше.
JID: x64j@jabber.ru
Re[45]: опять cpp в драйвере...
От: gear nuke  
Дата: 15.03.10 06:26
Оценка: 1 (1) +1
Здравствуйте, x64, Вы писали:

x64>Некорректное сравнение


Дык, а к чему такое вообще было предложено в контексте С vs C++?

x64>ваш OSSS, равно как и Касперские, Аутпосты и прочая, по фичам и стабильности сосали бы не нагибаясь.


Пожалуй, все вендоры фаерволлов заявляют что-то подобное, разве что без намёков на высоту табурета, а rustock вот уже сколько лет их и обходит, кроме (не нашего) OSSS.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[45]: опять cpp в драйвере...
От: Testator Россия  
Дата: 16.03.10 21:16
Оценка:
Здравствуйте, x64, Вы писали:

x64>Было б у меня два года чистого времени плюс некоторые финансы, то ваш OSSS, равно как и Касперские, Аутпосты и прочая, по фичам и стабильности сосали бы не нагибаясь.


Уссацца Нука, какие имеются ввиду фичи, хотя бы примерно? Тема блокировки трафика со всякими правилами и методами детектирования вредоносных данных уже обсосана практически до предела. Осталось только прикрутить полноценную экспертную систему для последнего, но и это уже антивирусы практически реализуют со всякими эвристиками для "proactive". Целые подразделения сидят и постоянно занимаются пополнением онлайновых баз знаний. Все эти Security Suits уже как швейцарские ножи, монструозные серебряные крылатые ракеты стреляющие по воробьям. Что тут можно добавить, сделать баллистическую ракету с разделяющимися боеголовками? Зачем?
▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬
Мы — то, во что верим.
Re[45]: опять cpp в драйвере...
От: IID Россия  
Дата: 17.03.10 07:57
Оценка: 6 (1) -1
Здравствуйте, x64, Вы писали:

GN>>Ну вот давай сравним твой файрвол и OSSS. Окей, тест на стабильность второй пока не прошёл. Исправление багов — вопрос времени. Но когда твой начнёт выполнять функцию блокировки нежелательного трафика?


x64>Некорректное сравнение, ибо разработка OSSS ведётся уже более двух лет, а jFirewall Personal Pro писан одним человеком за считанные месяцы и далеко не на fulltime при чём. Было б у меня два года чистого времени плюс некоторые финансы, то ваш OSSS, равно как и Касперские, Аутпосты и прочая, по фичам и стабильности сосали бы не нагибаясь. А так... ну этот проект и не задумывался изначально как коммерчески успешный, так что придумай что-нибудь получше.


(наш) OSSS это не только фаерволл Точнее это далеко не фаерволл. Фаерволл в чистом виде дай бог чтобы 10% от размера _ЯДРА_ составлял. И при этом он на порядки мощнее и навороченее чем jFW. И да, ядро OSSS написано на С++, как уже заметил gear_nuke.
kalsarikännit
Re[46]: опять cpp в драйвере...
От: x64 Россия http://x64blog.name
Дата: 17.03.10 15:42
Оценка:
IID>это не только фаерволл

jFirewall Personal Pro это тоже не только фаервол, элементы проактивки присутствуют.

IID>И при этом он на порядки мощнее и навороченее чем jFW.


Я уже объяснил почему это некорректное сравнение, а ты продолжаешь гнуть свою линию. Успокойся уже, в вас нет ничего особенного. Имея в наличии ваш арсенал (время и финансы) у любого более-менее грамотного человека получится на выходе OSSS.
JID: x64j@jabber.ru
Re[47]: опять cpp в драйвере...
От: gear nuke  
Дата: 17.03.10 16:29
Оценка: +1
Здравствуйте, x64, Вы писали:

x64>Я уже объяснил почему это некорректное сравнение, а ты продолжаешь гнуть свою линию.


А я уже высказывал удивление, зачем ты пытаешься повернуть разговор в другое русло — от сравнения функций в 20 строк, где видно влияние языка, к сравнению больших продуктов, где играют роль многие факторы. Вот и получил, что хотел. И IID сразу спрогнозировал, куда это русло приведёт.

На данный момент выводы следующие: моё утверждение, что С не имеет средств для эффективного решения некоторых задач верно, поскольку пример на С++ есть
Автор: gear nuke
Дата: 05.03.10
, а на С нет. Аналогичного кода на С нет не потому, что мне или кому-то еще его лень делать, а так как это попросту невозможно. Я могу легко признать этот факт, поскольку именно он вынуждает меня пользовать С++, не смотря на большую сложность языка. А противники С++ признать его не хотят, потому что такое признание будет иметь форму: "я не могу написать", а кто её обнародует в здравом уме? Вот и происходит перевод темы...
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[47]: опять cpp в драйвере...
От: IID Россия  
Дата: 17.03.10 22:57
Оценка:
Здравствуйте, x64, Вы писали:

x64>Имея в наличии ваш арсенал ... у любого более-менее грамотного ...


Если бы был арсенал, если бы было время, если бы писалось фуллтайм, если бы изначально коммерческий... Если бы у бабушки что-то было, то это уже была бы не бабушка. Верно ?
kalsarikännit
Re[48]: опять cpp в драйвере...
От: eagersh  
Дата: 18.03.10 17:25
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, x64, Вы писали:


x64>>Я уже объяснил почему это некорректное сравнение, а ты продолжаешь гнуть свою линию.


GN>А я уже высказывал удивление, зачем ты пытаешься повернуть разговор в другое русло — от сравнения функций в 20 строк, где видно влияние языка, к сравнению больших продуктов, где играют роль многие факторы. Вот и получил, что хотел. И IID сразу спрогнозировал, куда это русло приведёт.


GN>На данный момент выводы следующие: моё утверждение, что С не имеет средств для эффективного решения некоторых задач верно, поскольку пример на С++ есть
Автор: gear nuke
Дата: 05.03.10
, а на С нет. Аналогичного кода на С нет не потому, что мне или кому-то еще его лень делать, а так как это попросту невозможно. Я могу легко признать этот факт, поскольку именно он вынуждает меня пользовать С++, не смотря на большую сложность языка. А противники С++ признать его не хотят, потому что такое признание будет иметь форму: "я не могу написать", а кто её обнародует в здравом уме? Вот и происходит перевод темы...

И практически все продолжают использовать С в драйверах
Ты привел не типичный пример который редко может использоваться в драйверах.Я тебе советовал получить больше практического опыта в разработке драйверов.И для разных типов драйверов.Тогда ты будешь лучше понимать какие проблемы разработчик решает в кернеле.
Например я пишу сейчас miniport StorPort driver.Я честно говоря не вижу как использования С++ поможет мне написать этот драйвер быстрее и надежней.Проблемы которые я сейчас решаю совершенно далеки от проблем использования языка.
Re[49]: опять cpp в драйвере...
От: gear nuke  
Дата: 18.03.10 18:00
Оценка:
Здравствуйте, eagersh, Вы писали:

E>Ты привел не типичный пример который редко может использоваться в драйверах.Я тебе советовал получить больше практического опыта в разработке драйверов.И для разных типов драйверов.Тогда ты будешь лучше понимать какие проблемы разработчик решает в кернеле.


Кроме этих "обычных" проблем, я понимаю, что есть и другие проблемы — которые в рамках С не решаются. По крайней мере, ни у кого до сих пор не получилось, начинает получаться только на С++.

Я уже приводил в пример Lugh. Вот часть функционала:

We have tested our unpacking algorithm against the following, widely used, packers:

* acprotect
* andpakk2
* armadilo
* aspack
* asprotect
* execrypter
* expressor
* fsg
* morphine
* npack
* nspack
* packman
* pecompack
* pelock
* pespin
* rlpack
* svk protector
* telock
* themdia
* upx
* winunpack
* yoda protector

For all these packers Lugh has successfully identified and extracted the self modifying code nearly in real-time.

сколько есть аналогов на С? Ну я знаю про трейсеры, которые могут быть использованы для подобного, жаль только real-time не применимо.

E>Например я пишу сейчас miniport StorPort driver.Я честно говоря не вижу как использования С++ поможет мне написать этот драйвер быстрее и надежней.Проблемы которые я сейчас решаю совершенно далеки от проблем использования языка.


Стоит ли обобщать частный случай на всех остальных.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[49]: опять cpp в драйвере...
От: IID Россия  
Дата: 18.03.10 22:04
Оценка: +1
Здравствуйте, eagersh, Вы писали:

E>Я тебе советовал получить больше практического опыта в разработке драйверов.И для разных типов драйверов.Тогда ты будешь лучше понимать какие проблемы разработчик решает в кернеле.


Ты меня забавляешь Нет, ну серъёзно. Отставь в сторонку свой высокомерный тон. gear_nuke специалист, и специалист высокого класса. Чтобы это понять достаточно почитать его посты на РСДНе. А пока твои высказывания напоминают попытку научить курицу нести яйца.
kalsarikännit
Re[50]: опять cpp в драйвере...
От: eagersh  
Дата: 18.03.10 23:46
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>For all these packers Lugh has successfully identified and extracted the self modifying code nearly in real-time.

GN>[/q]сколько есть аналогов на С? Ну я знаю про трейсеры, которые могут быть использованы для подобного, жаль только real-time не применимо.

E>>Например я пишу сейчас miniport StorPort driver.Я честно говоря не вижу как использования С++ поможет мне написать этот драйвер быстрее и надежней.Проблемы которые я сейчас решаю совершенно далеки от проблем использования языка.


GN>Стоит ли обобщать частный случай на всех остальных.

Это ты обобщаешь частные проблемы сикьюрити стаф на все разработки в Windows kernel.Посмотри на примеры в WDK, которая является базовым тоолкитом для разработки драйверов, и укажи где лучше в этих примерах использовать С++. Также посмотри форумы на OSR, которые являются лучшим форумами по Windows device drivers, и оцени по количеству вопросов какие в основном драйвера разрабатываются сейчас.И имеет ли смысл использовать там С++.Меня этот вопрос интересует.Пока теоритически.К сожелению твой пример не убедителен для большинства приложений в Windows kernel.
Re[50]: опять cpp в драйвере...
От: eagersh  
Дата: 18.03.10 23:57
Оценка:
Здравствуйте, IID, Вы писали:

IID>Здравствуйте, eagersh, Вы писали:


E>>Я тебе советовал получить больше практического опыта в разработке драйверов.И для разных типов драйверов.Тогда ты будешь лучше понимать какие проблемы разработчик решает в кернеле.


IID>Ты меня забавляешь Нет, ну серъёзно. Отставь в сторонку свой высокомерный тон. gear_nuke специалист, и специалист высокого класса. Чтобы это понять достаточно почитать его посты на РСДНе. А пока твои высказывания напоминают попытку научить курицу нести яйца.

Пока я не увидел на его примерах реального применения С++.Я имею ввиду то что нельзя сделать на С в kernel. Если бы у него был достаточный опыт разработки драйверов для железа, которые в основном и разрабатываются для Windows kernel, то он бы не приводил тот пример как преимущества С++ над С.
Re[51]: опять cpp в драйвере...
От: gear nuke  
Дата: 19.03.10 00:50
Оценка: 1 (1) +1
Здравствуйте, eagersh, Вы писали:

E>Это ты обобщаешь частные проблемы сикьюрити стаф на все разработки в Windows kernel.


Я пытаюсь показать знание логики Если мне нужно, а тебе не нужно — то в общем, нужно. Где ошибка в моих рассуждениях?

E>Посмотри на примеры в WDK, которая является базовым тоолкитом для разработки драйверов, и укажи где лучше в этих примерах использовать С++. Также посмотри форумы на OSR, которые являются лучшим форумами по Windows device drivers, и оцени по количеству вопросов какие в основном драйвера разрабатываются сейчас.


RAII много где уместно и позволяет чуть экономить время на написание, и иногда сильно — на отладку изменённого через год goto спагетти (ага, его никто не пишет, оно само получается). И еще экономит время на чтение кода новым человеком. Примеры в WDK слишком долго листать приходится

E>И имеет ли смысл использовать там С++.Меня этот вопрос интересует.Пока теоритически.


Может быть сначала можно посмотреть на мелочи? Стал бы использовать:

std::uint32_t вместо DWORD
std::wstring вместо RtlInitUnicodeString & Co?
std::list<> вместо ExInterlockedInsertHeadList & Co?
std::mutex?
std::atomic<> вместо ReadWriteBarrier и CAS?

Предположим, оно будет. Никаких преимуществ, лишь чуть меньше строк.
Просто потому, что это стандартизовано?

Понятно, что если человек уже 20 лет пишет на С, у него давно есть отлаженные библиотеки, то ему нет никакого практического смысла переучиваться. Пока не перейдёт в другой проект, где используется другой велосипед. А так — приходит студент знакомый с С++ и... он сразу может написать по крайней мере некоторые тесты. Это помогает решить проблему с людьми. Часть кода может ревьювить не-кернел специалист.

E>К сожелению твой пример не убедителен для большинства приложений в Windows kernel.


Это из-за его не-кернельности, точнее ему все равно в каком месте системы работать — ядре, или юзермоде.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[52]: опять cpp в драйвере...
От: Аноним  
Дата: 19.03.10 03:42
Оценка: +2
Здравствуйте, gear nuke, Вы писали:

GN>Понятно, что если человек уже 20 лет пишет на С, у него давно есть отлаженные библиотеки, то ему нет никакого практического смысла переучиваться. Пока не перейдёт в другой проект, где используется другой велосипед. А так — приходит студент знакомый с С++ и... он сразу может написать по крайней мере некоторые тесты. Это помогает решить проблему с людьми.


Вот этого они и боятся job security, понимаешь... Наколбасить кучу кода и самому его же поддерживать — а что, деньги-то платят, студенты — "не доросли еще"... ляпота. IMHO, в пустую gear nuke ты здесь распыляешся, в пустую... Тот кто плюшки увидел — тот уже давно использует, остальные с крутым видом ("реальное применение С++ — это то что нельзя сделать на С в kernel") едят кактусы.

PS: привет с rsdn.cpp
Re[51]: опять cpp в драйвере...
От: Аноним  
Дата: 19.03.10 09:32
Оценка:
Здравствуйте, eagersh, Вы писали:

E>Здравствуйте, IID, Вы писали:


IID>>Здравствуйте, eagersh, Вы писали:


E>>>Я тебе советовал получить больше практического опыта в разработке драйверов.И для разных типов драйверов.Тогда ты будешь лучше понимать какие проблемы разработчик решает в кернеле.


IID>>Ты меня забавляешь Нет, ну серъёзно. Отставь в сторонку свой высокомерный тон. gear_nuke специалист, и специалист высокого класса. Чтобы это понять достаточно почитать его посты на РСДНе. А пока твои высказывания напоминают попытку научить курицу нести яйца.

E>Пока я не увидел на его примерах реального применения С++.Я имею ввиду то что нельзя сделать на С в kernel. Если бы у него был достаточный опыт разработки драйверов для железа, которые в основном и разрабатываются для Windows kernel, то он бы не приводил тот пример как преимущества С++ над С.

какие ж вы программисты под ядро виндовса, если даже не в курсе что в самой винде написано на С++ в ядре?
а приимущество С++ в ядре одно, это красивый структурированый логический обьектно ориентированый код
но откуда ж об этом знать просто кодерам на чистом С?

я не говорю что и на С и на С++ можно такое накодить... лес дров и :%?*:%?: неразбериха
но не будем рассматривать этот момент.
Re[52]: опять cpp в драйвере...
От: eagersh  
Дата: 19.03.10 19:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, eagersh, Вы писали:


А>я не говорю что и на С и на С++ можно такое накодить... лес дров и :%?*:%?: неразбериха

А>но не будем рассматривать этот момент.
Насколько я знаю написанны только некоторые компоненты на С++.Хотя я в Microsoft не работаю и точно не знаю.
Ядро Linux вообще все на С.Неужели Linus Torvalds такой закостенелый что не хочет переписовать все на С++?
продукты наращивают сложность
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 19.03.10 20:16
Оценка: 2 (2)
Здравствуйте, eagersh, Вы писали:

IID>>Ты меня забавляешь Нет, ну серъёзно. Отставь в сторонку свой высокомерный тон. gear_nuke специалист, и специалист высокого класса. Чтобы это понять достаточно почитать его посты на РСДНе. А пока твои высказывания напоминают попытку научить курицу нести яйца.

E>Пока я не увидел на его примерах реального применения С++.Я имею ввиду то что нельзя сделать на С в kernel. Если бы у него был достаточный опыт разработки драйверов для железа, которые в основном и разрабатываются для Windows kernel, то он бы не приводил тот пример как преимущества С++ над С.
не вполне согласен с выделенным — скорее наоборот, давайте все вместе позагибаем пальцы:

1) многие драйвера для некоторых вещей (типа USB девайсов) уже давно подходят базовые
2) MSFT давно озаботилось вопросами совместимости в "новых" ОС и постаралось сделать так, чтобы нам не было нужды переписывать свои грамотно сделанные решения, привет адептам "хуков на каждый чих" (с)
3) минифильтры, офрэймворчивание, класс-порт-минипорт-минидрайвер модель проникает во все места, что опять же при определенном уровне понимания (куда и зачем нужно врезаться) значительно уменьшает объем необходимых телодвижений, несмотря на по-прежнему существенную кривизну learning curve
4) KMDF/WMDF/DSF и прочие F активно способствуют тому, чтобы работа в т.ч. и с железом шла в большей степени через код, также написанный MSFT — в т.ч. и для вот этого
Автор:
Дата: 19.03.10

5) портированием с 32х бит уже тоже почти все озаботились, кто-то уже даже не строит 32-битные билды, этот рынок тоже сжимается

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

А вот продукты, тесно переплетающиеся с ядром на программном (выше HAL и DMA transfers) уровне (c компонентами типа software drivers в составе) — капитально наращивают сложность. С которой, как тут пытается объяснить gear nuke, и связаны определенные проблемы (с которыми, похоже, просто не так активно сталкиваются именно что разработчики железных драйверов), решаемые в т.ч. и с помощью тех же плюсов. Хотя они (плюсы) и не панацея, конечно, ибо как и любой инструмент — все зависит от того, в чьих он руках. И это есть хорошо для нас — проблемы с job security для многих из нас в этом форуме в обозримом будущем явно не грозят.

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

PS почему продукты однозначно наращивают сложность, кто-то может быть спросит? Да потому что есть такой закон — сколько мощи не дай инженерам — они постараются задействовать всю максимально быстро. И уж поверьте мне, это не новый драйвер диска или audio driver будет требовать "в топку" новых ресурсов в таких объемах. Это будут новые релизы продуктов.

PS Кстати, gear nuke — занеси в коллекцию серьезных С++ проектов в ядре изделия от Lumension
Автор: Valery A. Boronin
Дата: 09.05.06
(более 5 миллионов официально проданных лицензий на endpoint protection решения — данные начала 2009 года) — там на C++ (без фанатизма и дозированно) все делали с начала тысячелетия и это оказалось очень правильным, а также очень удобным (это я уже как разработчик режима ядра со стажем говорю) решением.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re: продукты наращивают сложность
От: eagersh  
Дата: 19.03.10 22:16
Оценка:
Здравствуйте, Valery A. Boronin, Вы писали:

VAB>Здравствуйте, eagersh, Вы писали:


IVAB>Резюмируя, пока драйвера для железа "держат марку" — продукты потихоньку уходят в отрыв. Возможно, это лучше объясняет разрыв в мнениях в топике.


VAB>PS почему продукты однозначно наращивают сложность, кто-то может быть спросит? Да потому что есть такой закон — сколько мощи не дай инженерам — они постараются задействовать всю максимально быстро. И уж поверьте мне, это не новый драйвер диска или audio driver будет требовать "в топку" новых ресурсов в таких объемах. Это будут новые релизы продуктов.


Valery ты смотрешь со своей точки зрения на проблему.Как специалиста который занимается продуктом.Я смотрю на проблему как специалист который в основном занимается железом.И я не вижу уменьшения работы с железом.Несмотря на усилия Microsoft по унификации разработке драйверов, прежде всего в создании модели Port/Miniport, очень часто возникают решения которые не могут использовать эту модель.Пример — virtual miniport StorPort driver, который позволяет разрабатывать storage driver с нижним интерфейсом отличным от HBA .Твой пример с USB не удачный, так как около четверть вопросов на форуме OSR относяться к USB.
Существует другая проблема использования С++.Многие компании разрабатывают керноловские компоненты не только для Windows но и для других OS прежде всего nix.И наиболее подходящий язык для крос-платформых библиотек это С. Для nix платформ очень трудно компилировать С++ для кернел.По этой причине мы даже не используем *.cpp файлы.
Re[52]: опять cpp в драйвере...
От: eagersh  
Дата: 19.03.10 22:30
Оценка:
Здравствуйте, gear nuke, Вы писали:



GN>Может быть сначала можно посмотреть на мелочи? Стал бы использовать:


GN>std::uint32_t вместо DWORD

GN>std::wstring вместо RtlInitUnicodeString & Co?
GN>std::list<> вместо ExInterlockedInsertHeadList & Co?
GN>std::mutex?
GN>std::atomic<> вместо ReadWriteBarrier и CAS?

В minport StorPort driver я не могу использовать RtlInitUnicodeString, ExInterlockedInsertHeadList и ReadWriteBarrier. Я вообще не могу использовать никакие Windows kernel API функций за исключением
функций StorPortXXXXX, которые включают в себя определенные функции memory allocation. Другой Port, например NDIS, включает в себя дрогой набор функций.Это значит что надо разрабатывать каждую версию STL для каждого Port type.И память в драйверах используется разная.
Re[53]: опять cpp в драйвере...
От: IID Россия  
Дата: 19.03.10 23:09
Оценка:
Здравствуйте, eagersh, Вы писали:

E>Ядро Linux вообще все на С.Неужели Linus Torvalds такой закостенелый что не хочет переписовать все на С++?


Ты не поверишь... А ещё он отладчики не любит, и считает их пережитком прошлого Надо писать сразу код без багов, ну или логами пользоваться в крайнем случае.
kalsarikännit
Re[53]: опять cpp в драйвере...
От: gear nuke  
Дата: 19.03.10 23:17
Оценка:
Здравствуйте, eagersh, Вы писали:

E>В minport StorPort driver я не могу использовать RtlInitUnicodeString, ExInterlockedInsertHeadList и ReadWriteBarrier.


Это — нет, но std:: "аналоги" можно будет. ReadWriteBarrier это встроенная функция компилятора.

E> Я вообще не могу использовать никакие Windows kernel API функций за исключением

E>функций StorPortXXXXX, которые включают в себя определенные функции memory allocation. Другой Port, например NDIS, включает в себя дрогой набор функций.Это значит что надо разрабатывать каждую версию STL для каждого Port type.И память в драйверах используется разная.

Вопрос с памятью должен решаться аллокаторами, остальная часть STL не меняется. И код, использующий STL, тоже не меняется, то есть его можно будет перенести в в другой Port, если он там уместен.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[52]: опять cpp в драйвере...
От: ononim  
Дата: 20.03.10 00:59
Оценка: +1
GN>std::uint32_t вместо DWORD
Во первых DWORD это из мира Win32. В ядре больше принято ULONG. И ULONG лучше чем std::uint32_t — печатать меньше и проще

GN>std::mutex?

И что он заменит? KeInitializeMutex, ExInitializeFastMutex, ExInitializeResourceLite?
А ждать он как будет? Как указать Alertable, WaitType, WaitReason, WaitMode?
А дождавшись, как можно будет указать что я вот ща опять буду что-то ждать, дабы шедулер заоптимизировал переключение контекстов?

GN>std::wstring вместо RtlInitUnicodeString & Co?

кстати насчет std::wstring и UNIODE_STRING:
1) чтобы удобно юзать std::wstring в ядре надо чтобы у нее был метод, который возвращает указатель на внутренний буфер в виде UNICODE_STRING. в "стандартовом" basic_string такого нету.
2) UNICODE_STRING может быть не NULL-terminated, кроме того может содержать в строке символы-нули что тоже очень плохо накладывается на std::string с ее c_str

кроме того:
3) концепция stl'ным стримов очень хреново, вернее никак, не ложится на концепцию асинхронного IO
4) стек потока в ядре — 12кб. Так что STLные классы придется делать максимально компактными (и сразу отказаться от "минибуфера" в теле basic_string.
....
имхо глупо натягивать STL на ядро. Правильнее сделать некий KTL — Kernel Templates Library, и не гнаться за совместимость со стандартным STL.
Как много веселых ребят, и все делают велосипед...
Re[53]: опять cpp в драйвере...
От: Аноним  
Дата: 20.03.10 09:49
Оценка:
Здравствуйте, eagersh, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, eagersh, Вы писали:


А>>я не говорю что и на С и на С++ можно такое накодить... лес дров и :%?*:%?: неразбериха

А>>но не будем рассматривать этот момент.
E>Насколько я знаю написанны только некоторые компоненты на С++.Хотя я в Microsoft не работаю и точно не знаю.
E>Ядро Linux вообще все на С.Неужели Linus Torvalds такой закостенелый что не хочет переписовать все на С++?

торвальдс тот еще ублюдок, но не будем об этом.
да и вопрос, а зачем "ВСЕ" переписывать на С++?
есть определенный круг задач http://rsdn.ru/forum/asm/3725161.1.aspx
Автор:
Дата: 04.03.10
для которых С++ очень гибок и полезен, и также избавляет от лишнего ненужного кодинга

тот же syser, написан на С и С++
базовые основные функциональные обертки на С
а класс прорисовки и управления оконной системой на С++

безграмотный подход — везде пихать только С или только С++
говоря что этот язык лучше или тот
лучше когда они правильно комбинируються — если это требуеться

ps
меня например злит когда ублюдочные программеры пишут на С

void hand_init(struct hand_t *h)
{
....
}

void hand_deinit(struct hand_t *h)
{
....
}

void hand_up(struct hand_t *h)
{
....
}

void hand_down(struct hand_t *h)
{
....
}

void hand_right(struct hand_t *h)
{
....
}


void hand_left(struct hand_t *h)
{
....
}

ну не ублюдки а?
а внутри каждой функции ХХкуча указателей
спрашиваеться почему не поюзать С++?
потому что они..... дальше думаю смысл понятен
Re[53]: опять cpp в драйвере...
От: gear nuke  
Дата: 20.03.10 10:15
Оценка:
Здравствуйте, ononim, Вы писали:

O>Во первых DWORD это из мира Win32. В ядре больше принято ULONG.


Вот о том и речь, расплодили заопарк. У *них long вообще 64 бита. А в С обычно принято в так писать МАКРОСЫ. В глазах рябит, лишние пустые строки приходится добавлять, функции не помешаются на 3 экрана

O>И ULONG лучше чем std::uint32_t — печатать меньше и проще


Неймспейс можно не печатать и шифт не надо нажимать

GN>>std::mutex?

O>И что он заменит? KeInitializeMutex, ExInitializeFastMutex, ExInitializeResourceLite? А ждать он как будет? Как указать Alertable, WaitType, WaitReason, WaitMode?

recursive_timed_mutex? А сам как считаешь? Смысл стандартной библиотеки — показать как должен выглядеть интерфейс, не запрещая создавать дополнительные реализации. И использовать совместно с lock_guard (оно даже для аттача к АП процесса пдойдёт).

O>А дождавшись, как можно будет указать что я вот ща опять буду что-то ждать, дабы шедулер заоптимизировал переключение контекстов?


В крайнем случая, ипользуя native_handle(); ограничивать никто не будет.

O>кстати насчет std::wstring и UNIODE_STRING:

O>1) чтобы удобно юзать std::wstring в ядре надо чтобы у нее был метод, который возвращает указатель на внутренний буфер в виде UNICODE_STRING. в "стандартовом" basic_string такого нету.

И не надо Подойдёт конструктор UNICODE_STRING, можно свободной функцией конвертить, вразу принимать std::wstring в конце концов

O>2) UNICODE_STRING может быть не NULL-terminated, кроме того может содержать в строке символы-нули


аналогично std::wstring

O>что тоже очень плохо накладывается на std::string с ее c_str


Зачем c_str() в ядре

O>кроме того:

O>3) концепция stl'ным стримов очень хреново, вернее никак, не ложится на концепцию асинхронного IO

Угу, особенно strstream Они ж буферизированы и для другого нужны: конфиг распарсить, в лог или дебагпорт писать. Template Unit Test Framework собрать.

Кстати Asio на эту модель хорошо ложится.

O>4) стек потока в ядре — 12кб. Так что STLные классы придется делать максимально компактными

O>и сразу отказаться от "минибуфера" в теле basic_string.

Это что принципиальная проблема С++? Я вот думаю о полной бинарной совместимости basic_string с UNIODE_STRING...

O>имхо глупо натягивать STL на ядро. Правильнее сделать некий KTL — Kernel Templates Library, и не гнаться за совместимость со стандартным STL.


Софт ведь не "взял и сделал", надо дизайнить и реализовать. Идею взять готовый, изученный массой людей дизайн — ты называешь глупостью. Правильно задизайнить свой велосипед Вот только колеса и педали меж самодельных велосипедов плохо стыкуются да и первые 1-2 версии в мусор пойдут
Кстати первую версию можно обсудить, что там должно быть (в дополнение или вместо STL)?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[54]: опять cpp в драйвере...
От: ononim  
Дата: 20.03.10 10:31
Оценка:
GN>Зачем c_str() в ядре
Затем что std::wstring без c_str уже не является "стандрартовой" basic_string. А string с c_str а ядре тоже совершенно не нужен.
Как много веселых ребят, и все делают велосипед...
Re[2]: продукты наращивают сложность
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 20.03.10 16:33
Оценка: 1 (1)
Здравствуйте, eagersh, Вы писали:

IVAB>>Резюмируя, пока драйвера для железа "держат марку" — продукты потихоньку уходят в отрыв. Возможно, это лучше объясняет разрыв в мнениях в топике.


VAB>>PS почему продукты однозначно наращивают сложность, кто-то может быть спросит? Да потому что есть такой закон — сколько мощи не дай инженерам — они постараются задействовать всю максимально быстро. И уж поверьте мне, это не новый драйвер диска или audio driver будет требовать "в топку" новых ресурсов в таких объемах. Это будут новые релизы продуктов.


E>Valery ты смотрешь со своей точки зрения на проблему.Как специалиста который занимается продуктом. Я смотрю на проблему как специалист который в основном занимается железом.

eagersh, FYI — в свое время мне приходилось заниматься и тем и тем. И на С и на С++ — все возможные комбинации перепробовал на собственной шкуре, поэтому считаю что неплохо представляю себе специфику работы коллег по ремеслу.

E>И я не вижу уменьшения работы с железом.

Открою маленький секрет — работы меньше вообще не становится. Никогда

E>Несмотря на усилия Microsoft по унификации разработке драйверов, прежде всего в создании модели Port/Miniport, очень часто возникают решения которые не могут использовать эту модель.Пример — virtual miniport StorPort driver, который позволяет разрабатывать storage driver с нижним интерфейсом отличным от HBA .

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

Представь, что твой драйвер лишь часть моего продукта. Да сложный, да возможно весь продукт на него завязан, но это в лучшем случае. В худшем начинаются решения где уже связки драйверов + активности на стыке KM\UM — как ни крути тут общая сложность и энтропия растут быстрее. И это уже не важно какая модель или какие frameworks используются у тебя в компоненте типа драйвер, это есть подмножество всего решения. И поэтому пока при грамотной, слабосвязанной архитектуре и возможно работать с этой частью по-старому, это нормально.

E>Твой пример с USB не удачный, так как около четверть вопросов на форуме OSR относяться к USB.

кол-во вопросов по теме — это не очень удачный критерий в данном случае, не находишь?
впрочем, соглашусь — может быть USB и не самый удачный пример, уверен ты сам можешь подобрать более удачный пример при желании.

E>Существует другая проблема использования С++.Многие компании разрабатывают керноловские компоненты не только для Windows но и для других OS прежде всего nix.И наиболее подходящий язык для крос-платформых библиотек это С. Для nix платформ очень трудно компилировать С++ для кернел.

Можно уточнить, в чем именно сложность такая? вот MSFT давно вывесили документ по поводу ограничений \ нюансов плюсов в ядре под Windows. А тут какие овраги?

E>По этой причине мы даже не используем *.cpp файлы.

спасибо, это мне интересно — поможешь тут разобрать подетальнее?

У меня нет коммерческого опыта в kernel *nix вещах, хотя кроссплатформенными штучками тоже приходилось немного заниматься. И именно поэтому все равно не очень ясно — вот смотри, C++ компилятор есть же под *nix — почему нельзя использовать С++ как "С с классами", чтобы хотя бы не использовать разные языки?

PS С тем, что сложность и значимость работы у разработчиков железных драйверов может быть запредельной для конкретно взятого человека или даже команды — не спорю, наоборот взаимодействие с отлаживаемым железом и электронщиками добавляет перцу и разнообразия в и без того непростой процесс. Пример выше (как я понимаю, это твоя область) — это солидный уровень — ни в коем случае не следует мой пост выше
Автор: Valery A. Boronin
Дата: 19.03.10
рассматривать как принижение заслуг тех ребят, кто работает по железу перед продуктовыми, чисто software, решениями. Это есть попытка разобраться в столь кардинально различающихся позициях в ветке. Правда, весьма религиозная тема этому поспособствовала, надо признать.
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[55]: опять cpp в драйвере...
От: gear nuke  
Дата: 20.03.10 19:42
Оценка:
Здравствуйте, ononim, Вы писали:

GN>>Зачем c_str() в ядре

O>Затем что std::wstring без c_str уже не является "стандрартовой" basic_string. А string с c_str а ядре тоже совершенно не нужен.

Не пойму, троллишь, или С++ не знаешь?

Еще раз: basic_string может содержать '\0'. "что тоже очень плохо накладывается на c_str". Поэтому c_str нужно пользоваться с учётом этого, то есть не нужно С чего ты взял что для этого обязательно менять интерфейс? Для эжтого достаточно почитать описание basic_string.

И всё это никак не зависит от UNICODE_STRING.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[56]: опять cpp в драйвере...
От: ononim  
Дата: 20.03.10 20:33
Оценка: 1 (1)
GN>Не пойму, троллишь, или С++ не знаешь?
GN>Еще раз: basic_string может содержать '\0'. "что тоже очень плохо накладывается на c_str". Поэтому c_str нужно пользоваться с учётом этого, то есть не нужно С чего ты взял что для этого обязательно менять интерфейс? Для эжтого достаточно почитать описание basic_string.
Если не менять интерфейс то его добрая половина окажется не у дел и будет лишь мозолить глаза.
А вторую половину придется юзать в стиле:
UNICODE_STRING us;
//
std::wstring s;
s.append(us.Buffer, us.Length/sizeof(WCHAR));

что есть большой геморрой и совершенно не юзабельно.
а если добавим в нашу строку перегрузку operator+=(const UNICODE_STRING *us); она уже перестанет соответствовать стандарту.
а имеющийся согласно стандарту operator+=(const wchar_t *psz); будет соблазнять неокрепшие умы писать так:
UNICODE_STRING us;
//
std::wstring s;
s+= us.Buffer;

и получать бсоды от юзеров, а не qa.
Как много веселых ребят, и все делают велосипед...
Re[57]: опять cpp в драйвере...
От: gear nuke  
Дата: 20.03.10 22:35
Оценка:
Здравствуйте, ononim, Вы писали:
.
O>Если не менять интерфейс то его добрая половина окажется не у дел и будет лишь мозолить глаза.

Так часто смотришь заголовки STL?

O>А вторую половину придется юзать в стиле:

O>
O>UNICODE_STRING us;
O>//
O>std::wstring s;
O>s.append(us.Buffer, us.Length/sizeof(WCHAR));
O>

O>что есть большой геморрой и совершенно не юзабельно.

Ну по крайней мере даже ЭТО проще чем существующий интерфейс к строчкам

Я уже отвечал на этот вопрос, пишется свободная функция:
append(s, us);
Кроме того, хотелось бы взглянуть на use-case. За всё время сущесвования ntl такое не понядобилось, иначе бы наверно добавили.

Скажу даже больше: ради эксперимента делали
s += "\0 ";
без использования strlen, но отказались за ненадобностью, а не из-за расхождений со Стандартом в обработке 0.

Пока все вопросы что ты пишешь — давно пройдённый этап. Во-первых, по Стандарту (новому) basic_string::begin() и data() возвращяет указатель на непрерывный буфер, что решает вопросы с c_str(). Во-вторых, вместо UNICODE_STRING пишется другой класс, позволяющий как минимум делать инициализацию по-человечески:
const_unicode_string cus(L"format c:");

// а вот так можно сконструировать basic_string без strlen, привет Стандарту ;)
std::wstring ws(cus.get_string());

На текущий момент совсем другие проблемы со строками. Из-за поддержки глубокой константности наплодилось много классов: const_unicode_string, unicode_string, в процессе использования стало понятно что это была перестраховка и можно упростить интерфейс. Похоже, можно упростить интерфейс гораздо сильнее и сделать wstring бинарно совместимым с UNICODE_STRING, что избавит от необходимости конверсий, но я когда-то убедил коллегу что так нельзя и теперь он против Конверсии и в самом деле практически не нужны: UNICODE_STRING требуется только для взяимодействия с АПИ, а там всегда можно (а обычно и нужно) написать обёртки.

O>а если добавим в нашу строку перегрузку operator+=(const UNICODE_STRING *us); она уже перестанет соответствовать стандарту.

O>а имеющийся согласно стандарту operator+=(const wchar_t *psz); будет соблазнять неокрепшие умы писать так:
O>
O>UNICODE_STRING us;
O>//
O>std::wstring s;
O>s+= us.Buffer;
O>

O>и получать бсоды от юзеров, а не qa.

Заметно сильное влияниев С, а в С++ Buffer будет приватным членом К тому же, ты продемонстировал advanced-технику, неокрепший ум скорее будет использовать
s + us;
а свободный operator+() можно реализовать без проблем.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[58]: опять cpp в драйвере...
От: ononim  
Дата: 20.03.10 23:24
Оценка:
O>>Если не менять интерфейс то его добрая половина окажется не у дел и будет лишь мозолить глаза.
GN>Так часто смотришь заголовки STL?
Откройте для себя Visual Assist.

O>>s.append(us.Buffer, us.Length/sizeof(WCHAR));

O>>что есть большой геморрой и совершенно не юзабельно.
GN>Ну по крайней мере даже ЭТО проще чем существующий интерфейс к строчкам
Нет, не проще.

GN>Я уже отвечал на этот вопрос, пишется свободная функция:

GN>append(s, us);
GN>Кроме того, хотелось бы взглянуть на use-case. За всё время сущесвования ntl такое не понядобилось, иначе бы наверно добавили.
usecase чего? Нуля в строчках? Ну банальнейший юскейс — если вы пишете драйвер фильтр или какой либо перехват (обычное дело в ядре) и ваш драйвер работает с чужими UNICODE_STRING'ами — вы _должны_ поддерживать возможные нули в них, как и возможное отсутствие нулей в их конце.

GN>Скажу даже больше: ради эксперимента делали

GN>s += "\0 ";
GN>без использования strlen, но отказались за ненадобностью, а не из-за расхождений со Стандартом в обработке 0.
Любопытно было бы увидеть как делали. Впрочем это не тот кейс.

GN>Пока все вопросы что ты пишешь — давно пройдённый этап. Во-первых, по Стандарту (новому) basic_string::begin() и data() возвращяет указатель на непрерывный буфер, что решает вопросы с c_str().

Это не имеет отношения к делу.

GN>Во-вторых, вместо UNICODE_STRING пишется другой класс, позволяющий как минимум делать инициализацию по-человечески:

GN>const_unicode_string cus(L"format c:");
const_unicode_string не является частью STL. Собственно я про это и говорил — STL натягивать на ядро глупейшая идея. Идеология стандартных C/RTL и далее идеология С++/STL основана на posix канонах. Ядро винды совершенно иная штука, потому натягивать wstring на UNICODE_STRING и написание кучи вспомогательного геморроя чтобы их скрутить вместе глупейшая идея. А написать специательные хелперы — это конечно дело хорошее и благородное, его многие пытались сделать, мир праху их

GN>// а вот так можно сконструировать basic_string без strlen, привет Стандарту

GN>std::wstring ws(cus.get_string());
GN>На текущий момент совсем другие проблемы со строками. Из-за поддержки глубокой константности наплодилось много классов: const_unicode_string, unicode_string, в процессе использования стало понятно что это была перестраховка и можно упростить интерфейс. Похоже, можно упростить интерфейс гораздо сильнее и сделать wstring бинарно совместимым с UNICODE_STRING, что избавит от необходимости конверсий, но я когда-то убедил коллегу что так нельзя и теперь он против Конверсии и в самом деле практически не нужны: UNICODE_STRING требуется только для взяимодействия с АПИ, а там всегда можно (а обычно и нужно) написать обёртки.
Я вот драйвера всегда делаю так чтобы все что в них было — было по сути хардкорным взаимодействием с апи, а все остальное не относящееся к этому — вытаскиваю в юзермод. И таких проблем воще не встречаю. Стандартные отмазки по поводу перфоманса считаю просто отмазками и ленью разработчиков создать нормальную архитектуру продукта, в которой не было бы узким местом взаимодействие к-мода и ю-мода частей. Впрочем мы это уже обсуждали.

GN>Заметно сильное влияниев С, а в С++ Buffer будет приватным членом

Приватным членом он не будет, так как он часть структуры входящей в состав DDK API. Она _уже_ есть в DDK. Или вы свое DDK заодно напишете? Тогда не забудьте его поддерживать в адекватной форме, а то мс частенько делает изменения знаете ли в своем.

GN>К тому же, ты продемонстировал advanced-технику, неокрепший ум скорее будет использовать

s + us;
а свободный operator+() можно реализовать без проблем.
А за это ваще убивать, ибо лишнее перевыделение памяти.

ЗЫ строка и нулики в ней это лишь одно маленькая деталь. Среди кучи других.
Как много веселых ребят, и все делают велосипед...
Re[59]: опять cpp в драйвере...
От: gear nuke  
Дата: 21.03.10 00:07
Оценка:
Здравствуйте, ononim, Вы писали:

O>Нет, не проще.


Аргументы? Строк меньше, нет ручного управления памятью, как минимум поэтому проще.

O>usecase чего?


В этом коде что будет вместо '//'?
UNICODE_STRING us;
//
std::wstring s;
s+= us.Buffer;
что бы я написал как это можно сделать (если будут варианты кроме свобожной функции)

O> Нуля в строчках?


basic_string не имеет проблем с 0, тут вопросов нет.

O> Ну банальнейший юскейс — если вы пишете драйвер фильтр или какой либо перехват (обычное дело в ядре) и ваш драйвер работает с чужими UNICODE_STRING'ами — вы _должны_ поддерживать возможные нули в них, как и возможное отсутствие нулей в их конце.


Только что показывал решение
const_unicode_string cus;//(L"format c:");
// ... берём откудато UNICODE_STRING

// если со строкой из внешнего мира надо как следует поработать, делаем копию. Иначе - <algorithm> не имеет проблем с 0м.
std::wstring ws(cus.get_string());


GN>>Скажу даже больше: ради эксперимента делали

GN>>
s += "\0 ";
без использования strlen, но отказались за ненадобностью, а не из-за расхождений со Стандартом в обработке 0.

O>Любопытно было бы увидеть как делали.

Тут я как бы альтернатив и не знаю:
    template<typename CT>
    basic_string& operator+=(const CT* const& s)
    {
      static_assert((is_same<CT, value_type>::value), "charT must to be value_type");
      return append(s, traits_type::length(s));
    }

    template<size_t Size>
    basic_string& operator+=(const charT(&s)[Size])   { return append(s, Size-1); }
здесь

O>Впрочем это не тот кейс.


Понимаю, потому и попросил показать "тот".

GN>>Пока все вопросы что ты пишешь — давно пройдённый этап. Во-первых, по Стандарту (новому) basic_string::begin() и data() возвращяет указатель на непрерывный буфер, что решает вопросы с c_str().

O>Спасибо, кэп. Но это не имеет отношения к делу.

Чуть выше ты сам пишешь о проблеме с 0.

O>const_unicode_string не является частью STL.


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

O> Собственно я про это и говорил — STL натягивать на ядро глупейшая идея. Идеология стандартных C/RTL и далее идеология С++/STL основана на posix канонах. Ядро винды совершенно иная штука, потому натягивать wstring на UNICODE_STRING и написание кучи вспомогательного геморроя чтобы их скрутить вместе глупейшая идея.


Беспочвенные обвинения в адрес достаточно большого количества людей. Почитай, к примеру, про C++ threads — есть документ обосновывающий непригодность для них POSIX канонов. А сама Standart Template Library (кстати ошибочно включаешь в неё string & I/O libs) вообще-то к C отношения не имеет абсолютно никакого, скорее к ML языкам.

O> А написать специательные хелперы — это конечно дело хорошее и благородное, его многие пытались сделать, мир праху их


Не рой яму другому. Мы ещё тебя переживём

O>Я вот драйвера всегда делаю так чтобы все что в них было — было по сути хардкорным взаимодействием с апи, а все остальное не относящееся к этому — вытаскиваю в юзермод. И таких проблем воще не встречаю. Стандартные отмазки по поводу перфоманса считаю просто отмазками и ленью разработчиков создать нормальную архитектуру продукта, в которой не было бы узким местом взаимодействие к-мода и ю-мода частей. Впрочем мы это уже обсуждали.


Обсуждали, расскажи это создателям того же IIS.

GN>>Заметно сильное влияниев С, а в С++ Buffer будет приватным членом

O>Приватным членом он не будет, так как он часть структуры входящей в состав DDK API. Она _уже_ есть в DDK.

Про наследование слышал?

O> Или вы свое DDK заодно напишете?


Ну вообще-то с самой первой версии ntl не зависило от WDK Конечно пока реализовано не в полной мере, но есть и отсутствующие в WDK вещи.

O> Тогда не забудьте его поддерживать в адекватной форме, а то мс частенько делает изменения знаете ли в своем.


Не многим чаще, чем новыя ОС выходит. А изменения мог бы перечислить? Не дополнения, а именно изменения

GN>>К тому же, ты продемонстировал advanced-технику, неокрепший ум скорее будет использовать
s + us;
а свободный operator+() можно реализовать без проблем.

O>А за это ваще убивать, ибо лишнее перевыделение памяти.

Ну, нет, это решено в STLPort.

O>ЗЫ строка и нулики в ней это лишь одно маленькая деталь. Среди кучи других.


0-ки не являются проблемой, а других пока не показано.

P.S. это ответ на удалённую версию поста, отличий не заметил.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[60]: опять cpp в драйвере...
От: Свиридов Роман Россия  
Дата: 22.03.10 05:56
Оценка: 1 (1)
Здравствуйте, gear nuke, Вы писали:

[skip]

Не знаю как для вас я для меня С в драйверых это во всяком случае "более" простая отладка при битом стеке и не забываем что данные в памяти тоже могут часто бится соседними драйверами. И для анализа желательно иметь более простую структуру данных и работу с ними.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[61]: опять cpp в драйвере...
От: gear nuke  
Дата: 23.03.10 19:32
Оценка: +2
Здравствуйте, Свиридов Роман, Вы писали:

СР>Не знаю как для вас я для меня С в драйверых это во всяком случае "более" простая отладка при битом стеке


То есть имеются ввиду ошибки 2го (и выше) порядка.

Когда пришлсь писать первый драйвер, я начал с работы с Service Control Manager. Так вот, отработав, приложение падало при выходе из-за того, что забыл (впринципе, умышленно — хотелось быстрее заняться задачей, а не деталями) закрыть хендл от OpenSCManager. Не думал, что это может привести к такому эффекту и потратил часа 2 на поиск бага. Сам драйвер содержал довольно мало кернел-ориентированного кода, зато слал в разные IOCTL USB устройствам. Необходимо было эксперементировать с последовательностями, то есть менять логику построенную на if/while. Вместе с этим приходилось постоянно помнить про освобождение ресурсов, иначе были лики, невозможность выгрузить драйвер и прочие чудеса, которые приводили к необходимости перегружать виртуалку и терять время. В то время я не понимал С++, а позже узнал что RAII решает эти проблемы в принципе.

СР> и не забываем что данные в памяти тоже могут часто бится соседними драйверами.


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

СР>И для анализа желательно иметь более простую структуру данных и работу с ними.


Хотелось бы примеры, как С++ может усложнить структуру данных, не могу придумать сам, видимо привык


Сам аргумент очень серьёзный, но я сам не смог увидеть преимуществ С в отладке. Вероятно, предвзято к нему отношусь
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[62]: опять cpp в драйвере...
От: Свиридов Роман Россия  
Дата: 25.03.10 07:04
Оценка:
Здравствуйте, gear nuke, Вы писали:

[skip]
GN>Хотелось бы примеры, как С++ может усложнить структуру данных, не могу придумать сам, видимо привык

GN>
Сам аргумент очень серьёзный, но я сам не смог увидеть преимуществ С в отладке. Вероятно, предвзято к нему отношусь


Наверное это можно почуствовать когда в стеке будет три и более драйвера написанных на С++, именно с использование всего функционала не просто как СуперС.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re: Bug ID:549856
От: gear nuke  
Дата: 09.04.10 06:56
Оценка:
Набрался наглости и засабмитил баг Visual Studio здесь. Упор сделан на то, что не выполняются требования Стандарта (17.4.1.3/2) к стандатрной библиотеке.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Bug ID:549856
От: eagersh  
Дата: 09.04.10 16:03
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Набрался наглости и засабмитил баг Visual Studio здесь. Упор сделан на то, что не выполняются требования Стандарта (17.4.1.3/2) к стандатрной библиотеке.

Правильно, пинай их
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.