Ubuntu下编译Linux内核和hello模块
环境准备 Ubuntu版本信息:$ uname -aLinux 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/lin
·
环境准备
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 # 查看最后两行,即对应源码中的两行打印。
更多推荐
已为社区贡献2条内容
所有评论(0)