├── .gitignore ├── Makefile ├── README.md ├── cppmod.cpp ├── cppmod.h ├── interface.c ├── kernel_api.c ├── kernel_api.h ├── new.h └── src.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files 2 | *.slo 3 | *.lo 4 | *.o 5 | 6 | # Compiled Dynamic libraries 7 | *.so 8 | *.dylib 9 | 10 | # Compiled Static libraries 11 | *.lai 12 | *.la 13 | *.a 14 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ##################################################### 2 | # Makefile 3 | obj-m += mydrv.o 4 | mydrv-objs := interface.o cppmod.o kernel_api.o 5 | list-multi := mydrv.o 6 | all: cppmod.o module 7 | module: 8 | make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 9 | clean: 10 | make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 11 | cppmod.o : cppmod.cpp new.h kernel_api.h cppmod.h 12 | $(CC) -c -o $@ -mcmodel=kernel -fpermissive -fno-builtin -fno-exceptions -fno-rtti -nostdinc $< 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | fpw(From Pograph's Weblog) 2 | === 3 | 4 | Empty C++ module without exceptions for linux kernel from Pograph's Weblog 5 | 6 | Original source: 7 | http://pograph.wordpress.com/2009/04/05/porting-cpp-code-to-linux-kernel/ 8 | 9 | It works at least on Linux 3.7.3-101.fc17.x86_64 10 | 11 | 12 | In c++ code you shouldn't ust stdlibc++, rtti or exceptions 13 | 14 | Howto: 15 | 16 | make; 17 | sudo insmod mydrv.ko; 18 | sudo rmmod mydrv.ko; 19 | 20 | $dmesg|tail 21 | 22 | ..] <6>C++ driver started 23 | 24 | ..] cpp module installed 25 | 26 | ..] <6>Goodbye C++ driver 27 | 28 | ..] cpp module removed 29 | 30 | -------------------------------------------------------------------------------- /cppmod.cpp: -------------------------------------------------------------------------------- 1 | //========================================== 2 | //  cppmod.cpp, finally, my C++ code 3 | #include "kernel_api.h" 4 | #include "new.h" 5 | #include "cppmod.h" 6 | class Driver { 7 | public: 8 | 9 | Driver(unsigned int dev_id):_id(dev_id){printk(KERN_INFO "C++ driver started\n");} 10 | ~Driver(void){printk(KERN_INFO "Goodbye C++ driver\n");} 11 | private: 12 | unsigned int _id; 13 | }; 14 | 15 | static Driver *g_driver = NULL; 16 | extern "C" int start_driver(void *data) { 17 | g_driver = new Driver(*(unsigned int*)data); 18 | if(!g_driver) 19 | return -1; 20 | return 0; 21 | } 22 | extern "C" void stop_driver(void) { 23 | if(g_driver) 24 | delete g_driver; 25 | } 26 | -------------------------------------------------------------------------------- /cppmod.h: -------------------------------------------------------------------------------- 1 | //========================================== 2 | // cppmod.h, exported C interface from C++ code 3 | #ifndef CPP_MOD_H 4 | #define CPP_MOD_H 5 | #ifdef __cplusplus 6 | extern "C" { 7 | #endif 8 | extern int start_driver(void* data); 9 | extern void stop_driver(void); 10 | #ifdef __cplusplus 11 | } 12 | #endif 13 | #endif 14 | -------------------------------------------------------------------------------- /interface.c: -------------------------------------------------------------------------------- 1 | //========================================== 2 | // interface.c, required interface for every kernel module 3 | #include 4 | #include 5 | #include 6 | #include "cppmod.h" 7 | static int __init cppmod_init(void) 8 | { 9 | start_driver("Hello"); 10 | printk(KERN_INFO "cpp module installed\n"); 11 | return 0; 12 | } 13 | static void __exit cppmod_exit(void) 14 | { 15 | stop_driver(); 16 | printk(KERN_INFO "cpp module removed\n"); 17 | } 18 | module_init(cppmod_init); 19 | module_exit(cppmod_exit); 20 | MODULE_LICENSE("GPL"); 21 | -------------------------------------------------------------------------------- /kernel_api.c: -------------------------------------------------------------------------------- 1 | //========================================== 2 | // kernel_api.c 3 | #include 4 | #include 5 | void *my_alloc(size_t s) { 6 | return kmalloc(s, GFP_KERNEL); 7 | } 8 | void my_free(void *p) { 9 | return kfree(p); 10 | } 11 | -------------------------------------------------------------------------------- /kernel_api.h: -------------------------------------------------------------------------------- 1 | // ========================================= 2 | // kernel_api.h. 3 | #ifndef KERNEL_API_H 4 | #define KERNEL_API_H 5 | #ifdef __cplusplus 6 | extern "C" { 7 | #endif 8 | typedef unsigned int size_t; 9 | #define KERN_INFO "<6>" 10 | #define NULL 0UL 11 | extern void printk(const char *fmt, ...); 12 | extern void *my_alloc(size_t size); 13 | extern void my_free(void *p); 14 | #ifdef __cplusplus 15 | } 16 | #endif 17 | #endif 18 | -------------------------------------------------------------------------------- /new.h: -------------------------------------------------------------------------------- 1 | #ifndef NEW_H 2 | #define NEW_H 3 | #include "kernel_api.h" 4 | inline void *operator new(size_t s) { 5 | return my_alloc(s); 6 | } 7 | inline void operator delete(void *p) { 8 | return my_free(p); 9 | } 10 | // you may need other forms of new and delete 11 | #endif 12 | -------------------------------------------------------------------------------- /src.txt: -------------------------------------------------------------------------------- 1 | http://pograph.wordpress.com/2009/04/05/porting-cpp-code-to-linux-kernel/ 2 | --------------------------------------------------------------------------------