当前位置: 技术问答>linux和unix
花高分,与各位高手探讨一个linux内核开发的问题,权且当作抛砖引玉!
来源: 互联网 发布时间:2015-11-22
本文导语: 先说明一下背景:本人近来动念想在linux下开发一个网络入侵防御系统,为了降低开发的难度,准备先实现为一个linux应用程序(与snort相似),后续再移植到linux内核中,因为毕竟在内核中实现入侵防御,在性能方面...
先说明一下背景:本人近来动念想在linux下开发一个网络入侵防御系统,为了降低开发的难度,准备先实现为一个linux应用程序(与snort相似),后续再移植到linux内核中,因为毕竟在内核中实现入侵防御,在性能方面有优势,而且要实现实时阻断黒客入侵,也只有在内核中才能实现。
本人以前使用C++开发跨平台应用软件的经历已经有五年多了,最近两年来,则是在使用C语言开发嵌入式的软件。个人的感觉,C++比C,在大的软件开发中的表现,要更胜一筹。因此本人倾向于采用C++来开发这个网络入侵防御系统。
特别说明一下,本人在linux上的开发经验还不多,所以想向大家多多请教啦。
接下来说明一下想探讨的问题:就本人的印象,在linux下的开发,大部分都是使用的C,使用C++来开发的很少,特别是在内核下使用C++来开发的,更是从来没有见过。想请教一下:在linux内核下,能否支持使用C++来开发?如果可以的话,开发中有什么方面需要注意的?使用C++开发内核,有没有风险和缺点?
linux下为什么会大部分项目使用C来开发?有谁能详细的说明一下?
如果哪位高人,能够推荐一下使用C++开发内核的开源项目,或者有这方面的开发资料,请帮忙提供一下。在此先行谢过。
请大家帮我一下。多谢了!
本人以前使用C++开发跨平台应用软件的经历已经有五年多了,最近两年来,则是在使用C语言开发嵌入式的软件。个人的感觉,C++比C,在大的软件开发中的表现,要更胜一筹。因此本人倾向于采用C++来开发这个网络入侵防御系统。
特别说明一下,本人在linux上的开发经验还不多,所以想向大家多多请教啦。
接下来说明一下想探讨的问题:就本人的印象,在linux下的开发,大部分都是使用的C,使用C++来开发的很少,特别是在内核下使用C++来开发的,更是从来没有见过。想请教一下:在linux内核下,能否支持使用C++来开发?如果可以的话,开发中有什么方面需要注意的?使用C++开发内核,有没有风险和缺点?
linux下为什么会大部分项目使用C来开发?有谁能详细的说明一下?
如果哪位高人,能够推荐一下使用C++开发内核的开源项目,或者有这方面的开发资料,请帮忙提供一下。在此先行谢过。
请大家帮我一下。多谢了!
|
我不是高人,不过也来凑一下热闹:
C++编译之后无非也是二进制文件,它同样遵循ELF目标文件格式,只要你的代码在编译后可以让连接器识别出来就一切OK了,所以在理论上是完全可行的方案!不过实际操作中会出现以下若干问题:
1.由于C++是基本兼容C的,但C++在包含C头文件时,C头文件里定义的所有变量与函数声明都必须包含#ifdef _cplusplus_之类,而LINUX内核头文件都没有提供这种形式,所以实际操作上基本上行不通,如果你非得要使用,你必须将你所用到的C头文件所有文件加上这样的标识,这是一个非常大的改动量
2.C语言的函数调用你的C++函数,这就出大问题了,由于在C++编译器中,把你的函数编译后形成的目标文件中的相应符号表不再是原来的函数名了,连接器就无法找到你的函数,所以你的模块初始化函数与模块卸载函数,以及其中所使用的函数与全局变量必须加上extern "C"标识,这样insmod才能认出你的符号,在你的那个fs_op****结构体中的所有函数接口要么就需要是extern "C"标识,要么就一定是C++的静态函数,因为你这个结构体会被加载到内核中去,内核由C语言编写,它无法识别你的this指针,你不能在C++代码使用任何C++库,仅能使用最基本的C++语法,如果你非得要使用C++库,就得要静态连接-lstdc++,并且将连接器用上-r参数(仅连接,不重定位),这样一来,文件相当大,注意了这一些问题后,还有最后一点:你只要去将你自己的C++函数回挂到内核的时候就一定跟上个规则一样,比如中断注册函数等,这样一来,你肯定觉得太麻烦了
总结:不要动这种想法,在写驱动时C语言足够了,如果在上面写应用的话,就用C++吧
C++编译之后无非也是二进制文件,它同样遵循ELF目标文件格式,只要你的代码在编译后可以让连接器识别出来就一切OK了,所以在理论上是完全可行的方案!不过实际操作中会出现以下若干问题:
1.由于C++是基本兼容C的,但C++在包含C头文件时,C头文件里定义的所有变量与函数声明都必须包含#ifdef _cplusplus_之类,而LINUX内核头文件都没有提供这种形式,所以实际操作上基本上行不通,如果你非得要使用,你必须将你所用到的C头文件所有文件加上这样的标识,这是一个非常大的改动量
2.C语言的函数调用你的C++函数,这就出大问题了,由于在C++编译器中,把你的函数编译后形成的目标文件中的相应符号表不再是原来的函数名了,连接器就无法找到你的函数,所以你的模块初始化函数与模块卸载函数,以及其中所使用的函数与全局变量必须加上extern "C"标识,这样insmod才能认出你的符号,在你的那个fs_op****结构体中的所有函数接口要么就需要是extern "C"标识,要么就一定是C++的静态函数,因为你这个结构体会被加载到内核中去,内核由C语言编写,它无法识别你的this指针,你不能在C++代码使用任何C++库,仅能使用最基本的C++语法,如果你非得要使用C++库,就得要静态连接-lstdc++,并且将连接器用上-r参数(仅连接,不重定位),这样一来,文件相当大,注意了这一些问题后,还有最后一点:你只要去将你自己的C++函数回挂到内核的时候就一定跟上个规则一样,比如中断注册函数等,这样一来,你肯定觉得太麻烦了
总结:不要动这种想法,在写驱动时C语言足够了,如果在上面写应用的话,就用C++吧
|
还有一个大问题,如果你要insmod到内核中去,还需要考虑内核给每个应用程序的内核堆栈只有8k
,不大可能给你很深的函数调用层次。
就你这个应用来说,应该内核做一部分工作,大部分的工作还是要放到应用层上来做。内核的部分你用c语言写,应用层部分用c++写,是个不错的选择,关键要把这两个部分分清楚。
,不大可能给你很深的函数调用层次。
就你这个应用来说,应该内核做一部分工作,大部分的工作还是要放到应用层上来做。内核的部分你用c语言写,应用层部分用c++写,是个不错的选择,关键要把这两个部分分清楚。
|
另外,C++程序需要额外初始化,如全局类实例的构造,而作为一个内核模块,内核并不知道要先调用此初始化入口,内核模块有自己的初始化规则(__init)。而且,new/delete不能用,因为它们要调用标准库....有如此众多的限制,C++的优势也所剩无几,为什么还要用C++ ?
|
以LZ对C,C++编译器,内核模块的了解,目前还是不要用C++写模块了,当你遇到一些技术难题的时候,你以目前的水平就无有为力了
|
Linus是反对用C++来实现内核的, 所以目前来说基本没希望在内核中用C++
|
说明一下 : 内核用C主要是考虑到系统性能问题。
而应用程序未必要只用C的,用C++的很多。 譬如用于实现KDE的QT。
实现GNOME的GTK也有C++ wrap的
而应用程序未必要只用C的,用C++的很多。 譬如用于实现KDE的QT。
实现GNOME的GTK也有C++ wrap的
|
分两部
一部分用于内核,可以做成模块驱动,c
一部分就在应用上,c++
我觉的这样可能好些,在功能上分的开,扩展也方便
一部分用于内核,可以做成模块驱动,c
一部分就在应用上,c++
我觉的这样可能好些,在功能上分的开,扩展也方便
|
mark
|
关注一下。。。刚刚建立的一个内核交流群。。。希望大家都能来一起交流学习
QQ群:10931036
QQ群:10931036