Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Kirill Smelkov                       2:5030/885.37  13 Mar 2002  20:44:42
 To : lAll
 Subject : Re: Writing a driver programme
 -------------------------------------------------------------------------------- 
 
 
  Hарод, поскольку моё первое и второе письма похоже не дошли пишу в третий раз.
 
  [...]
 
  >>  "Добро пожаловать в Линукс".
  >>  Тут не делают жизнь легче. Как и не пишут ядро на C++.
  a> Этого-то я и боялся. Если не секрет, то почему ядро не пишут на С++?
  a> Ведь весь вопрос в компоновке. Или в этом-то и проблема?
 
  Если ты _ОЧЕHЬ_ захочешь -- можешь написать модуль на C++.
 
  С моей точки зрения тебе для этого понадобится:
 
  o все экспортируемые символы помечать как extern "C" (это к проблеме
 компоновки)
  o либо забыть о куче, либо написать свои operator new(size_t) new[](size_t)
 т.д.
  о возможно подправить libstdc++
 
 вот пример работующего модуля (я и сам удивлён что всё получилось!)
 
 === Begin hello++.c++ ===
 #define new __new
 #define virtual __virtual
 
 extern "C" {
 #include <linux/version.h>
 
 #if LINUX_VERSION_CODE < 0x020400
 #error This module should be compiled on 2.4.x and higher kernels
 #endif
 
 #include <linux/config.h>
 #ifdef CONFIG_SMP
 #define __SMP__
 #endif
 
 #ifndef __KERNEL__
 #define __KERNEL__
 #endif
 
 #ifndef MODULE
 #define MODULE
 #endif
 
 #include <linux/module.h>
 
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <asm/current.h>
 #include <linux/sched.h>
 
 #include <linux/init.h>
 
 MODULE_AUTHOR("Kirill Smelkov -- smelkov@ic.ff.phys.spbu.ru");
 MODULE_DESCRIPTION("Teach-in related \"C++ piece of code\"");
 
 }
 
 #undef virtual
 #undef new
 
 void *operator new(size_t size)
 {
  void *ptr;
 
  ptr = kmalloc(size, GFP_KERNEL); // FIXME: throw throw throw...
  return ptr;
 }
 
 void operator delete(void *ptr)
 {
  // safe delete(0)
  if (ptr) kfree(ptr);
 }
 
 class Hello {
  int id;
 public:
  Hello(int id=0);
  ~Hello();
 };
 Hello::Hello(int id) : id(id)
 {
  printk("Hello ");
 
  if (id) printk("%i!\n", id);
  else printk("World!\n");
 }
 
 Hello::~Hello()
 {
  printk("GoodBye ");
 
  if (id) printk("%i!\n", id);
  else printk("World!\n");
 }
 
 static Hello *hello_msg=0;
 
 extern "C" void /* __exit */ hello_cleanup(void);
 
 extern "C" int __init hello_init(void)
 {
  printk("<1>Hello world!\n");
  printk("The process is \"%s\" (pid %i)\n", current->comm, current->pid);
 
  {
   Hello msg;
  }
 
  hello_msg = new Hello(1);
  if (!hello_msg) {
   hello_cleanup();
   return -EBUSY;
  }
 
  return 0;
 }
 
 extern "C" void /* __exit */ hello_cleanup(void)
 {
  printk("<1>Goodby cruel world\n");
  delete hello_msg;
 }
 
 extern "C" {
 module_init(hello_init);
 module_exit(hello_cleanup);
 }
 
 === End hello++.c++ ===
 
 собирается так:
 g++ -fno-rtti -fno-exceptions -D__KERNEL__ -I/usr/src/linux/include -Wall -c
 hello++.c++
 
 Кривовато конечно, да и в ядре (у меня 2.4.18) пришлось два заголовка
 подправить:
 (diff пишу от руки)
 
 512:include/linux/mm.h
 -struct zone_t
 +//struct zone_t
 
 и то-же для
 101:include/linux/swap.h
 
 вот как оно себя ведёт:
 
 ===
 [root@roro linux-studing]# lsmod
 Module                  Size  Used by
 es1371                 25856   1
 soundcore               3472   4  [es1371]
 ac97_codec              9296   0  [es1371]
 [root@roro linux-studing]# insmod ./he.llo++.o
 Hello world!
 The process is "insmod" (pid 9293)
 Hello World!
 GoodBye World!
 Hello 1!
 [root@roro linux-studing]# lsmod
 Module                  Size  Used by
 hello++                 1056   0  (unused)
 es1371                 25856   1
 soundcore               3472   4  [es1371]
 ac97_codec              9296   0  [es1371]
 [root@roro linux-studing]# rmmod hello++
 Goodby cruel world
 GoodBye 1!
 ===
 
 можно наверное включить как rtti так и исключения -- думаю будет работать.
 Вообщем принципиальная возможность писать модули на C++ есть, только это не
 всегда нужно.
 
         Всего хорошего, Кирилл.
 
 --- Gold Editor
  * Origin: *** Romantic Robot Station *** (2:5030/885.37)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: Writing a driver programme   Kirill Smelkov   13 Mar 2002 20:44:42 
 Re: Writing a driver programme   Dmitry Fedorov   14 Mar 2002 12:27:23 
 Re: Writing a driver programme   Kirill Smelkov   15 Mar 2002 01:18:26 
 Re: Writing a driver programme   Dmitry Fedorov   16 Mar 2002 10:27:30 
 Re: Writing a driver programme   Dmitry Fedorov   16 Mar 2002 10:27:30 
 Re: Writing a driver programme   Kirill Smelkov   17 Mar 2002 02:02:28 
 Re: Writing a driver programme   Dmitry Fedorov   17 Mar 2002 18:52:42 
 Re: Writing a driver programme   Kirill Smelkov   19 Mar 2002 22:13:10 
Архивное /ru.linux/40323c8fac73.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional