|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/40323c8fac73.html, оценка из 5, голосов 10
|