Linux内核源码树建立加载hello模块

Linux内核源码树建立加载hello模块

在加载模块之前,书中说要先建立内核源码树,那么,如何建立内核源码树呢?

首先,要先知道你的OS的内核版本,用uname -r可以查得到

在/url/src/目录下可以看到对应的版本目录

如果没有可以用apt-cache search linux-source获取内核

用sudo apt-get install linux-source-3.13.0下载内核

下载完成后在该文件夹中产生一个对应的压缩文件 linux-source-3.13.0.tar.bz2

然后解压该文件tar jxvf linux-source-3.13.0.tar.bz2

进入解压后的目录

然后进入root权限su (这里进入失败提示 Authentication failure),在终端中输入如下命令: 
  sudo passwd 
  Password:你当前的密码 
  Enter new UNIX password:这个是root的密码 
  Retype new UNIX password:重复root的密码 
  然后会提示成功的信息。 

输入指令make oldconfig开始配置内核。

之前上网查资料看到配置内核要用一个小时左右,但我输入指令后输出

Linux内核源码树建立加载hello模块

资料说配置完成后会在/lib/modules下生成新的目录/lib/modules/3.16.0-30-generic/ 

  在该目录ls一下发现已经存在了这个目录= =!也就是原来系统已经存在内核源码树了

既然内核源码树已经存在,下面我们要做的就是将hello模块加载到内核中。

下面是hello的源代码

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
    printk(KERN_ALERT "Hello, world\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
KERNELDIR := /lib/modules/3.16.0-30/build
PWD := $(shell pwd)
modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

运行make

Linux内核源码树建立加载hello模块

生成相应的hello.ko文件

然后加载hello.ko模块,注意要在root模式下加载,然后lsmod查看加载的模块(书中说会在控制台输出hello world ,但是我的控制台没有输出)

卸载模块

虽然控制台没有进行输出,但是可以在/var/log/syslog下查看hello模块的输出

怎样在 CentOS 7 上安装 Kernel 4.0.2 

怎样在 CentOS 7 系统上安装Linux Kernel 4.0 

如何在Ubuntu/CentOS上安装Linux内核4.0 

如何在Ubuntu 13.10上安装Linux内核 3.12  

如何在Ubuntu 14.10,Ubuntu 14.04及其衍生版本安装 3.16.7 CKT2内核  

Linux Kernel 的详细介绍请点这里
Linux Kernel 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15948.html