Автор Тема: Проблем с "struct cdev" и "struct semaphore"  (Прочетена 7696 пъти)

halturata

  • Участник
  • *****
  • Публикации: 20
    • Профил
Здравейте,

Работата е следната - написах си едно малко тестово драйверче, като упражнение към тази книга, и също като прелюдия към написването на функционален драйвер.
За да изпробвам докъде съм я докарал (вече имам open(), read(), write(), ioctl() функциите) си написах проста програмка, за да видя дали въобще ще работят както очаквам:
Примерен код
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>       /* mmap() */
#include <fcntl.h>        /* open(), close(), etc. */
#include <unistd.h>       /* exit() */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/cdev.h>

#include "iptimer_ppc_linux26_fnc.h"
#include "iptimer_ppc_linux26_io.h"

int main(int argc, char ** args)
{
      int fd, status = 0;
      unsigned long quantum, qset;
      
      if( (status = open("/dev/iptimer0", O_RDWR)) < 0 ){
            perror("open");
            printf("Error opening /dev/iptimer device file, errno = %d\n", errno);
            exit (1);
      }
      
      if((status = ioctl(fd, IPTIMER_IOCTL_GET_QUANTUM, quantum)) < 0 ){
            perror("ioctl");
            printf("Error getting quantum, errno = %d\n", errno);
            exit (1);
      }
      printf("*** quantum = %d", quantum);

      if((status = ioctl(fd, IPTIMER_IOCTL_GET_QSET, qset)) < 0 ){
            perror("ioctl");
            printf("Error getting qset, errno = %d\n", errno);
            exit (1);
      }
      printf("*** qset = %d", qset);      
      
      return 0;
}

Когато се опитам да я компилирам обаче, получавам следните грешки:
Примерен код
pi3 ~ELINOS_PROJECT/src/rwtest # make
/opt/elinos-4.1/cdk/ppc/60x/glibc-2.3.4/bin/ppc_60x-gcc -c -o main.o -g main.c
In file included from main.c:13:
iptimer_ppc_linux26_fnc.h:32: error: field `iptimer_cdev' has incomplete type
iptimer_ppc_linux26_fnc.h:33: error: field `iptimer_sem' has incomplete type
make: *** [main.o] Error 1

Ето го въпросното място в хедъра където гърми:
Примерен код
struct iptimer_dev{
      iptimer_qset_t   *iptimer_data;      /* Pointer to first quantum set */
      int                    quantum;            /* The current quantum size */
      int                    qset;               /* The current array size */
      unsigned long int  size;             /* Amount of data stored */
      struct cdev           ptimer_cdev;  /* Char device structure */
      struct semaphore  iptimer_sem;       /* Mutual exclusion semaphore */
      int                       dev_minor;                        
};

Така, тези двете структури на семафора и чаръктър дивайса (омг...) са дефинирани без typedef в кода на ядрото. Въпроса ми е как да оправя тези грешки при компилацията? Иначе драйвера се компилира без проблем. Ето и линк към сорса ако някой се интересува.

Всякакви идеи и флейм са добре дошли '<img'>

P.S. Ето ги и въпросните дефиниции на struct semaphore / struct cdev:
Примерен код
#ifndef _LINUX_CDEV_H
#define _LINUX_CDEV_H
#ifdef
 
struct cdev {
         struct kobject kobj;
         struct module *owner;
         struct file_operations *ops;
         struct list_head list;
         dev_t dev;
         unsigned int count;
 };

Примерен код
#ifdef
 #ifndef _ASM_POWERPC_SEMAPHORE_H
 #define _ASM_POWERPC_SEMAPHORE_H
 #include <asm/atomic.h>
 #include <asm/system.h>
 #include <linux/wait.h>
 #include <linux/rwsem.h>
 
 struct semaphore {
         atomic_t count;
         wait_queue_head_t wait;
 };


Примерен код
07-08-09 12:41 :( # uname -a
Linux 2.4.21-47.0.1.ELsmp #1 SMP Thu Oct 19 10:46:05 CDT 2006 i686 i686 i386 GNU/Linux
07-08-09 12:52 :( # $CC --version
ppc_60x-gcc (GCC) 3.4.4

Да не би да трябва да пъхна някой от тези #define statementsв моя код?
Активен

the_real_maniac

  • Участник
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #1 -: Авг 09, 2007, 20:52 »
Не знам дали ще имам време да погледна, но поне да се разпиша че ми е интересно...

пп: а не трябва ли да отчетеш факта , че може би проблема е че правиш cross compile :?  и може би там нещо ...

едит:

_ASM_POWERPC_SEMAPHORE_H

Примерен код

07-08-09 12:41 :( # uname -a
Linux 2.4.21-47.0.1.ELsmp #1 SMP Thu Oct 19 10:46:05 CDT 2006 i686 i686 i386 GNU/Linux
07-08-09 12:52 :( # $CC --version
ppc_60x-gcc (GCC) 3.4.4




Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

gat3way

  • Участник
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Проблем с "struct cdev" и "struct semaphore"
« Отговор #2 -: Авг 09, 2007, 21:50 »
Емм... gcc си има опция -I с която се указва include директорията. Като ще го билд-ваш за ppc замислял ли си се, че е възможно в /usr/include/linux да има нещо различно от това, което ти трябва?
Активен

"Knowledge is power" - France is Bacon

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #3 -: Авг 10, 2007, 01:07 »
A

Цитат

#ifdef _ _ K E R N E L _ _


 в хедърите забеляза ли? :Р Не можеш да използваш тези структури в userspace.

P.S. Нещо форума "забравя" _ _ K E R N E L _ _ ако го напиша както трябва



Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

halturata

  • Участник
  • *****
  • Публикации: 20
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #4 -: Авг 10, 2007, 10:52 »
@the_real_maniac: Ами за крос компайла не мисля, че той създава проблеми, използвам крос компилатор различен от нативния, който си има и свой собствени include директории.
@gat3way: Колкото до -I опцията на gcc за директориите, даже съм я хард-коднал в мейкфайла, но май по всичко личи че е include проблем...
@tarator: Аз тези структури не ги ползвам директно в user space, искаш да кажеш че дори ако от user space инклудна файл, който ги дефинира пак ще има проблеми?

Ще го мъча още пък да видим '<img'>
Активен

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #5 -: Авг 10, 2007, 20:52 »
Може да не ги използваш, но структурите, които използваш ги включват.

Дефинирай внимателно структурите които ще използваш с ioctl да не включват никакви структури от ядрото.

П.П. ioctl е едно от най-идиотските неща в Юникс.
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

the_real_maniac

  • Участник
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #6 -: Авг 10, 2007, 21:20 »
offtopic: (може би ? )

Но можеш ли по-друг начин да задаваш свойства от-до , т.е имаш ли нещо , с което да го замениш ?

май не ?
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #7 -: Авг 11, 2007, 05:50 »
Разбира се, че имам, не говоря наизуст. Едно време от файловете се е четяло и се е писало в тях. Много авангардна идея, нали? '<img'>

А ти имаш ли някаква идея защо смятам, че ioctl са идиотщина, или ги защитаваш без да мислиш? '<img'>



Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Участник
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Проблем с "struct cdev" и "struct semaphore"
« Отговор #8 -: Авг 11, 2007, 12:15 »
Абе не е точно така. Някои блокови устройства например имат функции, които далеч не се изчерпват с четене/писане. Например как ще си извадиш "софтуерно" CD-то?

Ако става въпрос за streamed I/O е простотия де '<img'>
Активен

"Knowledge is power" - France is Bacon

the_real_maniac

  • Участник
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #9 -: Авг 11, 2007, 14:12 »
Цитат (tarator @ Авг. 11 2007,06:50)
Разбира се, че имам, не говоря наизуст. Едно време от файловете се е четяло и се е писало в тях. Много авангардна идея, нали? '<img'>

А ти имаш ли някаква идея защо смятам, че ioctl са идиотщина, или ги защитаваш без да мислиш? '<img'>

Просто попитах, не съм ползвал нещо различно от ioctl < така че това е идеята..

пп: не си чешам езика, така че не -> не пиша без да мисля '<img'> haha ;-)

:-) :-P



Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

gat3way

  • Участник
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Проблем с "struct cdev" и "struct semaphore"
« Отговор #10 -: Авг 11, 2007, 15:18 »
Обаче би било забавно вместо ioctl-та и някакви слабоумни syscall интерфейси за такива дейности да се минава през sysfs или procfs. Би било много по-удобно, най-малкото доста неща ще могат да се правят с прости шел скриптове, а не с писане на С да речем '<img'>
Активен

"Knowledge is power" - France is Bacon

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #11 -: Авг 11, 2007, 15:54 »
Най-големия проблем на ioctl e, че не може да се прави по мрежа. Замисляли ли сте се защо не може да се експортне блоково устройство в NFS (например) и да се използва на друг компютър? Забравете идиотските оправдания, причината е, че няма как да се реализира ioctl операцията по мрежата.

> Някои блокови устройства например имат функции, които далеч не се
> изчерпват с четене/писане. Например как ще си извадиш "софтуерно"
> CD-то?

Хората са измислили как да стават такива неща преди повече от 15 години '<img'> Защо едно устройство трябва да бъде представено с един файл?

В Plan9 CD-то се вади така:

echo eject > /dev/sdD0/ctl

Как се вади CD-то на отдалечена машина?

echo eject > /mnt/node1/dev/sdD0/ctl

Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

halturata

  • Участник
  • *****
  • Публикации: 20
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #12 -: Авг 13, 2007, 09:41 »
Леле, тука какъв спор се е развихрил '<img'>
За структурите, разбрах, доста небрежно съм се отнесъл към тях, пипнах тук-там и сега всичко е ОК - най-главното беше да отделя лузър спейс от кернел спейс типовете.
А колкото до ioctl()-а, на мене ми трябва да чета и пиша в няколко 16-битови регистъра на устройството, което го представям като character device, не е чак такава философия като CD-та и т.н.

Мерси отново, както виждам тук има поле за разискване на такъв род въпроси.



Активен

the_real_maniac

  • Участник
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #13 -: Авг 13, 2007, 16:59 »
Цитат (tarator @ Авг. 10 2007,02:07)
A

Цитат

#ifdef _ _ K E R N E L _ _


 в хедърите забеляза ли? :Р Не можеш да използваш тези структури в userspace.

P.S. Нещо форума "забравя" _ _ K E R N E L _ _ ако го напиша както трябва

За протокола: Значи tarator се оказа прав и проблема наистина беше в това, че без да искаш си се опитвал да ползваш структури от kernel в userspace :?

е браво за крайният резултат ;-) :-)

----

относно другото:

Толкова ли много ти/ви пречи това, че не може да ползвате ioctl през мрежата :? директно ? И защо това да е проблем, а ако беше възможно, не трябва ли преди това да се помисли как да се подсигури (да е сигурна) една такава комуникация м/у две машини, все пак може да говорим за Ioctl() , свойства на у-ва и прочие , но намесваме и мрежова комуникация ;-) :-)
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Проблем с "struct cdev" и "struct semaphore"
« Отговор #14 -: Авг 13, 2007, 17:05 »
> Толкова ли много ти/ви пречи това, че не може да ползвате ioctl през
> мрежата :?

Да. Такива неща показват дали една операционна система е мрежова, или мрежата е добавена впоследствие и не толкова добре.
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward