环境准备

        Ubuntu版本信息:
$ uname -a
Linux ubuntu 2.6.32-38-generic-pae #83-Ubuntu SMP Wed Jan 4 12:11:13 UTC 2012 i686 GNU/Linux

下载源码

$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.bz2
$ tar -xjvf linux-2.6.32.tar.bz2
$ cd linux-2.6.32

安装依赖的库

        按后面的步骤中的提示安装。

配置内核

$ make menuconfig # 进入后直接选exit。

编译内核

$ make
$ make modules

安装内核

        此步类似于安装操作系统文件。
$ sudo make modules_install
$ sudo make install
$ cd /boot
$ sudo mkinitramfs -o initrd.img-2.6.32 2.6.32

配置开机启动菜单

$ sudo vi /etc/default/grub # 行“GRUB_HIDDEN_TIMEOUT=0”,由0改为30
$ sudo vi /etc/grub.d/30_os-prober # 行“timeout = 0”,由0改为30
# update-grub

启动内核

$ sudo reboot # 重启后,选择对应版本的内核即可

hello模块

创建目录

$ mkdir hello # 任意目录下创建此文件夹

源码

#include <linux/init.h>  /* Needed for the macros */
#include <linux/module.h> /* Needed for all modules */

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("fred_yu");

static int __init hello_init(void)
{
    printk(KERN_ALERT "Hello, world!/n");
    return 0;
}

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

module_init(hello_init);
module_exit(hello_exit);

Makefile

obj-m += hello.o

编译

        没有选择使用下载的内核源码编译hello模块,是因为会导致编译后的ko文件无法加载,必须使用Ubuntu下的Linux内核来编才行。
$ sudo make -C /usr/src/linux-headers-2.6.32-38-generic-pae SUBDIRS=$PWD modules # 注意路径名称和Ubuntu版本信息中的对应。

加载、卸载

$ sudo insmod hello.ko
$ sudo rmmod hello.ko

查看输出打印

$ dmesg # 查看最后两行,即对应源码中的两行打印。


Logo

更多推荐