linux device driver 第三版 - 1. hello world

0. 说明
因为书是第三版,需要linux 2.6的内核,所以用了centos-6.5

1. 安装 centos-6.5虚拟机
   下载centos-6.5的dvd镜像1, 然后安装在虚拟机里

2. 设置光盘安装源
   修改 /etc/yum.repos.d/CentOS-Media.repo 为如下内容:

[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS_6.5_Final/       这个设置为实际的光盘mount目.
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=0
enabled=1
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

** 将其它的 .repo文件删除或挪走。

3. 添加源码树

  下载centos-6.5源代码rpm文件: http://vault.centos.org/6.5/os/Source/SPackages/kernel-2.6.32-431.el6.src.rpm
 

# yum install -y gcc bison patchutils rpm-build redhat-rpm-config hmaccalc perl-ExtUtils-Embed pesign xmlto audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel ncurses-devel numactl-devel  python-devel zlib-devel
# useradd -s /sbin/nologin mockbuild
# rpm -ivh kernel-2.6.32-431.el6.src.rpm


  这样源代码就安装好了,放在/usr/src/kernels/2.6.32-431.el6.i686

4. hello模块的.c源文件 hello.c
  创建目录 /opt/driver/ch2, 创建文件hello.c

 

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
        printk(KERN_ALERT "Hello, LINUX DRIVER\n");
        return 0;
}

static void hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

 
Makefile: 只有一行

obj-m := hello.o

 
5. 编译

  在/opt/driver/ch2目录里:

# make -C /usr/src/kernels/2.6.32-431.el6.i686 M=`pwd` modules


  其中 -C 表示会进入到 /usr/src/kernels/2.6.32-431.el6.i686目录里。
  编译成功,会生成 hello.ko,  2.6内核模块是.ko为扩展名

6. 运行

 # insmod hello.ko

   运行后控制台无显示

# tail -n 20 /var/log/messages 可查看printk打印信息
...
Sep 19 22:18:13 centos6 yum[2793]: Installed: numactl-devel-2.0.7-8.el6.i686
Sep 19 22:49:30 centos6 kernel: Hello, LINUX DRIVER
Sep 19 22:49:54 centos6 kernel: Goodbye, cruel world

 7. 卸载

# rmmod hello

 

posted @ 2022-09-18 23:21  北极熊129  阅读(79)  评论(0)    收藏  举报