Sebt писал(а):
И все равно не могу себе представить как именно обращаясь к драйверу мы сможем запросить чтото конкретное сделать. Поидее ведь нужно заранее знать что он может. Или тут я не прав?
Именно нужно знать заранее.
Если это блочный драйвер то он должен поддерживать MSG_READ и MSG_WRITE. Если это видео драйвер то он должен поддерживать MSG_GET_MODE.
(SET сделать трудно)
Вам проще взять исходники
MINIX'а и посмотреть как там это реализовано.
Sebt писал(а):
SII, я правильно понял вас, в том что. по вашему мнению. микроядра без написания так скажем специализированного компилятора не имеет смысла? Очень интересная информация, ибо крайне мало информации касательно микроядер, да и пишут их видимо редко.
А как реализуется обмен сообщениями? Я уловил вашу аналогию с почтовым ящиком, идея очень интересно звучит, мне уже чисто из любопытства интересно стало как это) Получается создается некий дополнительный буфер для каждого нового процесса?
Реализовать передачу сообщения это самое простое. Есть две функции GetMessage и SendMessage. Реализация примерно такая:
Приложение заполняет регистры сообщением. Вызывает int 7Fh
Код:
mov eax,GetMessage
mov ebx,0
mov ecx,0
int 7Fh
Процессор переключает стек приложения на стек ядра. Далее ядро обрабатывает регистры примерно так
Код:
// точка входа в ядро
procedure Int_7Fh;
asm
mov DWord ptr [MainReg._EAX],eax
mov DWord ptr [MainReg._ECX],ecx
mov DWord ptr [MainReg._EDX],edx
mov DWord ptr [MainReg._EBX],ebx
mov DWord ptr [MainReg._ESI],esi
mov DWord ptr [MainReg._EDI],edi
CALL OSService;
mov eax, DWord ptr [MainReg._EAX]
mov ecx, DWord ptr [MainReg._ECX]
mov edx, DWord ptr [MainReg._EDX]
mov ebx, DWord ptr [MainReg._EBX]
mov esi, DWord ptr [MainReg._ESI]
mov edi, DWord ptr [MainReg._EDI]
IRETD
end;
Приложение которое вызвало GetMessage как правило усыпляется пока в системе не появится ответ.
Приложения и
драйвера в цикле крутят GetMessage и SetMessage.
В процедуре procedure Int_7Fh; я сохранял регистры, но так же можно сохранять стек. И вичитывать порцию данных из стека.
Так к примеру поступает виндоус и линукс при обработке
DeviceIoControl--------------------------
Есть куча вариантов по мимо очереди сообщений. Есть общая память, есть почтовые ящики, есть сокеты(WinSocks).
Но я бы вам посоветовал по мимо почтовых ящиков реализовать
VFS. Создаете файл в памяти и пишети читаете в него привычными функциями VFSOpenFile() VFSReadData() VFSSeek() VFSCloseFile()
------------------
SII писал(а):
ну а нынешние компиляторы вовсю стремятся сделать любой ход хреновым; лично у меня стойкое ощущение, что Фортран и ПЛ/1 из ОС/360 конца 60-х/начала 70-х давали лучший код, чем современные компиляторы)
И трава была зеленее.