免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2456 | 回复: 6
打印 上一主题 下一主题

Debian/Ubuntu Linux下内核编程者必备的几件法宝 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-01 23:20 |只看该作者 |倒序浏览
Debian/Ubuntu Linux下内核编程者必备的几件法宝

如果你想要升级你的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(zhoulifa@163.com) 周立发(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 "Hello, linux kernel module\n");
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye, I've created a linux kernel module sucessfully\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

你需要这此源程序编写一个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命令来查看运行结果。

论坛徽章:
0
2 [报告]
发表于 2006-07-03 02:35 |只看该作者
法宝,,起名要合适,做人要厚道。

论坛徽章:
0
3 [报告]
发表于 2006-07-03 09:22 |只看该作者
楼主,如果是原创,表明你很久没接触debian了,许多都过时,比如initrd-tools,早已被initramfs-tools代替
还有一些简单的例子google下都有,简单的拼凑谈不上原创,所以作人要厚道,起名要厚道

论坛徽章:
0
4 [报告]
发表于 2006-07-03 22:49 |只看该作者
楼主显然不用ubuntu。gcc和make都是自动装的。

论坛徽章:
0
5 [报告]
发表于 2006-07-04 14:09 |只看该作者
呵呵,大家也不要为难楼主了,他能把这些东西合在一起也是一种贡献,虽然标题有些大,但也是可以原谅的嘛。

论坛徽章:
0
6 [报告]
发表于 2006-07-04 14:33 |只看该作者

欢迎讨论

除了上面这几位,全中国起码还有10亿人都不知道这些吧。
激励我发这个贴的原因就是因为我经常要告诉很多人这几个东西,我想在“关于此文档”里已经说得很明白了:
*purpose: 记录Linux内核开发者必备的几个软件包
至少下一次有朋友再问我“为什么我编译内核报这个错?”、“为什么我编译不了啊?”……之类的问题时我只需要告诉朋友来这里对照一下,是不是少了哪几个包。

我想那些遇到问题的朋友之所以来问我就是因为他们google不到合适的文章说明这些。上面这几位你虽然早就知道了,可惜你没能让大家都早点知道。是不是你也在吸收着开源的成果而没有贡献你的开源力量呢?再说了,高手如东方不败又怎么样呢?还不如王重阳,是吧?

Ubuntu我也一直在用着,现在用LTS 606 Desktop天天办公用着,好久不用Windows了,但我之前安装Ubuntu时也是象安装Debian那样,安装一个Base System,只有apt可用,然后一切都是一点点自己安装来的,不过是在5月吧。6月出来的确实好多了,用了Live CD技术,安装使用都很方便

仁者见仁、智者见智!讨论是有益的,剑桥凭下午茶的讨论出了那么多诺贝尔奖呢;争论更会促进进步,否则只能停滞不前了,欢迎扔砖头……

[ 本帖最后由 zhoulifa 于 2006-7-4 14:34 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-07-04 14:37 |只看该作者

还有个问题

我学习的过程中确实要google,但我闭着眼睛就可以写出来的程序算不算是原创呢?
我也迷惑,你说是我写的吧,和网上所有人写的一样,你说不是吧,可真是我写的啊

有点无厘头,浪费时间了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP