Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Apr 20, 2019 3:37 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 34 posts ]  Go to page 1 2 3 Next
Author Message
PostPosted: Tue Jun 07, 2011 3:52 pm 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Здравствуйте!

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

proc START stdcall, state:dword


Top
   
PostPosted: Tue Jun 07, 2011 4:06 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1619
Это оформление процедуры с конвенцией вызова stdcall. Без макросов обойтись можно всегда.
Код
Code:
proc START stdcall,state:dword
mov eax,[state]
ret
endp

раскрывается примерно в
Code:
START:
push ebp
mov ebp,esp
mov eax,[ebp+8]
pop ebp
ret 4

Естественно, при ручном написании можно обойтись без ebp, адресуя параметры через esp, но если таких адресаций больше четырёх, то это оказывается невыгодным по размеру - адресация через esp на байт длиннее.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Tue Jun 07, 2011 6:40 pm 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Спасибо! Стало чуть понятней. Но вот вопрос, зачем это нужно, это именно особенность работы драйвера в 0 кольце? Или мне ещё что-то почитать "глубинное" нужно? :)


Top
   
PostPosted: Tue Jun 07, 2011 6:50 pm 
Offline
Site Founder
User avatar

Joined: Sun Aug 08, 2004 8:55 am
Posts: 689
Почитать можно это: http://en.wikipedia.org/wiki/Function_prologue
Не искал, но должно быть что-то и на русском.

_________________
in code we trust


Top
   
PostPosted: Tue Jun 07, 2011 7:20 pm 
Offline

Joined: Tue Jun 24, 2008 11:12 pm
Posts: 64
popovpa wrote:
Но вот вопрос, зачем это нужно, это именно особенность работы драйвера в 0 кольце?


Это необходимо, ибо ядро использует вызов stdcall и передает параметр state через стек (core\dll.inc):
Code:
mov ebx, [start]
stdcall ebx, DRV_ENTRY


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


Top
   
PostPosted: Wed Jun 08, 2011 8:07 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
popovpa
Очень полезная тема


Top
   
PostPosted: Wed Jun 08, 2011 8:50 pm 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Всем большое спасибо! Почти разобрался, но у меня обычно этот процесс затянутый...озаряет через неделю не раньше...ещё вопрос появился, не понял как осуществить без макроса вот этот вызов:

stdcall RegService, my_service, service_proc

И ещё вопросик, я компилирую драйвер, кладу его в ../driver, а как операционная система осуществит загрузку моего драйвера? она сканирует папку и загружает от туда всё подряд или где-то как то надо прописать вызов моего драйвера?


Top
   
PostPosted: Wed Jun 08, 2011 8:56 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1619
popovpa, этот код раскрывается в
Code:
push service_proc
push my_service
call RegService

Папка с драйверами называется drivers. Ядро никаких массовых запусков из папок не ведёт, а драйвера загружает только по команде - это может быть либо вызов функции 68.16 из приложения, либо вызов stdcall load_driver, <string with driver name> изнутри ядра. Я надеюсь, во что раскрывается этот вызов, уже понятно.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Wed Jun 08, 2011 8:59 pm 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Немного не так спросил видимо, я имею ввиду что без подключения вот этих файлов:

include 'proc32.inc'
include 'imports.inc'

Нельзя будет сделать этот вызов? Если только полностью в драйвер не переносить код RegService?


Top
   
PostPosted: Wed Jun 08, 2011 9:01 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1619
proc32.inc нужен для макроса stdcall. imports.inc объявляет все используемые функции ядра, применительно к RegService это эквивалентно
Code:
extrn RegService

_________________
Сделаем мир лучше!


Top
   
PostPosted: Sat Jun 11, 2011 7:17 pm 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Здравствуйте!

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

Вот код:

Code:
format MS COFF

include 'imports.inc'

struc IOCTL
{  .handle   dd ?
   .io_code   dd ?
   .input   dd ?
   .inp_size   dd ?
   .output   dd ?
   .out_size   dd ?
}

virtual at 0
  IOCTL IOCTL
end virtual

section '.flat' code readable align 16

START:
   push    ebp
   mov ebp,esp
   mov   eax,[esp+8]
   cmp   eax,1
   pop   ebp

   ret   4


Запуская вот так:

Code:
use32              ; включить 32-битный режим ассемблера
  org    0x0         ; адресация с нуля

  db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  dd     0x01        ; версия заголовка (всегда 1)
  dd     START       ; адрес первой команды
  dd     I_END       ; размер программы
  dd     0x1000      ; количество памяти
  dd     0x1000      ; адрес вершины стэка
  dd     0x0         ; адрес буфера для параметров (не используется)
  dd     0x0         ; зарезервировано

START:
mov eax,68
mov ebx,16
mov ecx,bcm
int 0x40

bcm db   'bcm4312',0

I_END:


Доска отладки показала вот это:

Code:
in module bcm4312
K : Process - forced terminate PID: 00000039
K : Undefined Exception
K : EAX : 00000000 EBX : 00000010 ECX : 00000035
K : EDX : 00000000 ESI : 00000000 EDI : 00000000
K : EBP : 00000000 EIP : 00000035 ESP : 00001000
K : Flags : 00011202 CS : 0000001B (application)


Видимо что-то пошло не так...и я не очень понимаю что...что самое обидное...


Top
   
PostPosted: Sun Jun 12, 2011 7:52 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Code:
START:
mov eax,68
mov ebx,16
mov ecx,bcm
int 0x40

после этой команды код заканчивается и процессор начинает выполнять данные.

bcm db   'bcm4312',0


Top
   
PostPosted: Sun Jun 12, 2011 7:56 am 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Спасибо большое...да моя невнимательность...нельзя в программировании кусочничать...сел программировать, так и не чего работай человека отвлекать :)


Top
   
PostPosted: Tue Jun 14, 2011 7:24 pm 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Здравствуйте!

Продолжаю разбираться дальше. Вот 2 кода, один урезанный пример из помощи, второй немного переработанный без макросов, ни один не выводит надписи на доску отладки. Выводит только это: "in module bcm4312, или in module test но это показывает что отработала функция 68 подфункция 16. Подскажите, пожалуйста, что не так?
Spoiler: Show
1. с макросами.
Code:
format MS COFF

include 'proc32.inc'
include 'imports.inc'

;OS_BASE    equ 0;
;new_app_base   equ 0x80000000

struc IOCTL
{  .handle   dd ?
   .io_code   dd ?
   .input   dd ?
   .inp_size   dd ?
   .output   dd ?
   .out_size   dd ?
}

virtual at 0
  IOCTL IOCTL
end virtual

public START
;public version

DRV_ENTRY  equ 1
DRV_EXIT   equ -1

section '.flat' code readable align 16

proc START stdcall, state:dword

      cmp [state], DRV_ENTRY
      jne .exit

   mov   esi,msgStart
   call   SysMsgBoardStr

.entry:
      stdcall RegService, my_service, service_proc
      ret

.exit:

   mov   esi,msgBad
   call   SysMsgBoardStr

      xor eax, eax
      ret
endp

handle      equ   IOCTL.handle
io_code    equ   IOCTL.io_code
input      equ   IOCTL.input
inp_size   equ   IOCTL.inp_size
output      equ   IOCTL.output
out_size   equ   IOCTL.out_size

proc service_proc stdcall, ioctl:dword

   mov   esi,msgProc
   call   SysMsgBoardStr


   mov   edi, [ioctl]
   mov   eax, [edi+io_code]

   xor   eax, eax
   ret
endp

version    dd   0x50005
my_service   db   'test',0

section '.data' data readable writable align 16

msgStart db 'Start...',0
msgProc db 'Proc...',0
msgBad db 'Bad...',0

Spoiler: Show
2. Без макросов
Code:
format MS COFF

include 'proc32.inc'
include 'imports.inc'


section '.flat' code readable align 16

   push   ebp
   mov   ebp,esp
   mov   eax,[ebp+8]

   cmp   eax,1
   jnz   .exit

   mov   esi, msgStart
   call   SysMsgBoardStr

   push    service_proc
   push    my_service
   call   RegService

.exit:
   mov   esi, msgBad
   call   SysMsgBoardStr

   pop   ebp
   ret   4

service_proc:

   push   ebp
   mov   ebp,esp
   mov   edi,[ebp+8]
   mov   eax,[edi+4]

   mov   esi, msgProc
   call   SysMsgBoardStr

   pop   ebp
   ret   4

version    dd   0x50005
my_service   db   'bcm4312',0

section '.data' data readable writable align 16

msgStart db 'Start...',0
msgProc db 'Proc...',0
msgBad db 'Bad...',0


Запускаю вот так:
Code:
use32         ; включить 32-битный режим ассемблера
  org    0x0        ; адресация с нуля

  db    'MENUET01'  ; 8-байтный идентификатор MenuetOS
  dd    0x01        ; версия заголовка (всегда 1)
  dd    START        ; адрес первой команды
  dd    I_END        ; размер программы
  dd    0x1000      ; количество памяти
  dd    0x1000      ; адрес вершины стэка
  dd    0x0        ; адрес буфера для параметров (не используется)
  dd    0x0        ; зарезервировано

START:
mov eax,68
mov ebx,16
mov ecx,bcm
int 0x40

mov eax,-1
int 0x40

I_END:

bcm db   'bcm4312',0


Top
   
PostPosted: Tue Jun 14, 2011 7:44 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
А откуда берется SysMsgBoardStr? У меня в proc32.inc и imports.inc не определен.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 34 posts ]  Go to page 1 2 3 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited