设为首页 收藏本站
查看: 1794|回复: 0

[经验分享] Debian/Ubuntu Linux下内核编程者必备的几件法宝[转]

[复制链接]

尚未签到

发表于 2018-5-16 06:55:51 | 显示全部楼层 |阅读模式
Debian/Ubuntu Linux下内核编程者必备的几件法宝2007-09-10  14:20                                    
            
            如果你想要升级你的Debian/Ubuntu Linux内核,或者你希望为内核开发新的模块,或者您要为某个硬件写新的驱动程序……这一切都涉及到Debian/Ubuntu Linux内核编程。
            作为一个内核编程者,有那么几个软件是你必须要有的,看作是你进行内核编程的几件法宝吧,下面我一一列举出来:
            
            1、gcc
            大名鼎鼎的gcc我想没有人不知道的吧?它是任何编程者必然要先安装的一个武器了。不过一般如果你是安装的Debian系统,应该已经默认安装了的。要是Ubuntu你就安装一下吧,安装方法嘛,就是输入:
            apt-get install gcc
            
            2、make
            如果你实实在在地写过有用的程序,你一定输入过make clean、make、make install等命令的,make是一个源代码维护工具,它能自动检测出需要重新编译的源文件并根据你设定的编译规则去重新编译程序。这里也不多说,如果 不了解的朋友就google一下吧。不过一般如果你是安装的Debian系统,应该已经默认安装了的。要是Ubuntu你就安装一下吧,安装方法一样,输 入:
            apt-get install make
            
            3、kernel-source
            从这个包的名称上已经知道了,这是内核源码包。你可以apt-cache search kernel-source搜索到内核源代码包,并用uname -r命令查看到当前系统内核版本,然后用apt-get install kernel-source-xxxx来安装和你内核版本一致的内核源代码包。
            但我并不建议你这样做,因为大多数发行版的Linux的内核源代码包并不是和你从kernel.org上下载来的完全一致,应该是经过发行者们修改优化过 的包,虽然发行版的制作者们花了心血在上面,但对我们编程者来说这并不是件好事,因为大多发行版的源代码包缺少某些必要的头文件和某些有用的脚本程序,这 会导致我们在编写内核模块时遇到麻烦,比如编译时可能会报错说某个头文件找不到,又可能报错说某个脚本程序不存在啦。
            如果你直接去kernel.org上下载一个新的内核来编译升级你的内核,并在此基础上进行内核编程可能会省事一些,至少我后面讲到的这些包你都可以不用安装了,把KERNEL_DIR变量设置为你内核源代码包的位置就够了。
            在这里还是以Debian 3.1、内核2.6.8-2-386为基础来教大家准备内核编程环境吧。那么你依次用这几个命令来安装kernel-source包吧。
            apt-cache search kernel-source
            uname -r
            apt-get install kernel-source-xxxx
            注:如果你不想重新编译内核,内核源代码包kernel-source是完全可以不下载来的。
            
            4、kernel-headers
            这是内核源代码头文件包,不管你是要进行内核模块开发还是进行驱动程序开发,这个包都是必须要安装的。因为作为一个内核模块编写者,通常会调用内核里的一 些东西,比如内核头文件,内核数据结构申明等。它里面包含了一些关键的内核头文件。否则在编译内核时会报类似下面的错误:
            HOSTCC     scripts/basic/fixdep
            scripts/basic/fixdep.c:105:23: error: sys/types.h: 没有那个文件或目录
            输入如下命令来安装吧:
            apt-cache search kernel-headers
            uname -r
            apt-get instakk kernel-headers-xxxx
            注:在Ubuntu下,好象这个包的前面都加上了linux-,从而变成了linux-kernel-headers。
            如果之前没有安装过kernel-kbuild包,安装此包的过程中会安装kernel-kbuild包,这个包在下面介绍。
            
            关于本文档:
            /*********************************************************************
            *filename: Debian/Ubuntu Linux下内核编程者必备的几件法宝
            *purpose: 记录Linux内核开发者必备的几个软件包
            *wrote by: zhoulifa() 周立发(http://zhoulifa.bokee.com)
            Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
            *date time:2006-07-01 22:50:00
            *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
            * 但请遵循GPL
            *********************************************************************/
            
            
            5、kernel-kbuild
            这个包是用来编译内核模块的,下载安装这个包后会发现在/usr/src目录下多了一个kernel-kbuild-xxxx开头的目录,下面只有scripts一个目录,显然这是用来编译内核模块的一些脚本程序。安装方法一样:
            apt-cache search kernel-kbuild
            uname -r
            apt-get install kernel-kbuild-xxxx
            注:你也会发现,在上面安装kernel-headers包后,/usr/src/kernel-headers-xxxx目录下有个scripts目录,其实是到/usr/src/kernel-kbuild-xxxx目录下的scripts的一个链接。
            
            6、build-essential
            这个包包含一个在建立deb包过程中起关键作用的包的信息列表,如果你不想建立deb包你就不需要安装此表,如果需要生成deb包就最好安装一下这个包吧。安装方法:
            apt-get install build-essential
            
            7、kernel-package
            如果你想把内核镜像做成一个deb包来用,那么必须用安装这个包了。也就是说只有安装了这个软件包你才能有make-kpkg命令可用。安装方法一样了:
            apt-get install kernel-package
            
            8、initrd-tools
            如果你想制作启动过程的initrd镜像,则这个包是必不可少的。安装了这个包之后才有mkinitrd命令可用的。安装方法:
            apt-get instakk initrd-tools
            
            最后来一个内核模块编程示例吧:
            
            
            假设你编写了一个内核模块程序,源代码如下:
            /* hello.c */
            #include <linux/init.h>
            #include <linux/module.h>
            #include <linux/kernel.h>
            static int hello_init(void)
            {
            printk(KERN_ALERT &quot;Hello, linux kernel module\n&quot;);
            return 0;
            }
            static void hello_exit(void)
            {
            printk(KERN_ALERT &quot;Goodbye, I've created a linux kernel module sucessfully\n&quot;);
            }
            module_init(hello_init);
            module_exit(hello_exit);
            MODULE_LICENSE(&quot;GPL&quot;);
            
            你需要这此源程序编写一个makefile,内容如下:
            #Makefile for hello.c file
            #
            KERNEL_DIR:=/usr/src/linux
            obj-m:=hello.o
            default:
            $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
            clean:
            $(RM) .*.cmd *.mod.c *.o *.ko -r .tmp
            
            注意:这里的KERNEL_DIR是指内核源代码头文件所在目录的上一级目录,通常就是指内核源代码目录。该目录一般包括有arch,drivers, fs,include,init,ipc,kernel,lib,mm,net,scripts,usr,sound,security等目录。
            
            在本示例中,/usr/src/linux是一个链接,指向了/usr/src/kernel-headers-2.6.8-3目录。
            
            
            编写好makefile后就可以输入make命令生成hello.ko内核模块了,然后你可以用:
            
            insmode hello.ko
            
            命令来加入内核模块,然后用:
            
            rmmod hello
            
            来删除内核模块。
            
            当然,操作过程中,你可以用dmesg命令来查看运行结果。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-460734-1-1.html 上篇帖子: SVN 在Debian/Ubuntu、windows 2003 的配置安装与使用 下篇帖子: Gentoo、Debian、FreeBSD软件包管理大比拼[zt]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表