学习linux也有一段时间了,感觉是渐渐上手了。最开始是想看看驱动的自动加载(参考网上的内核代码树编译之类的文章,都是insmod手动加载驱动),然后我就很想知道类似wince的驱动是如何加载到系统中去的呢?
所以决定深入的了解一下内核的编译以及更新。当然这些也被前辈们做烂了,但是对于自己还是一个新东西。简单的列一下具体步骤,原则是你按照我的文章基本上就可以重复我的工作。
前提条件:windows系统安装vmware虚拟机,在安装ubuntu10.10,安装vmware-tools vim fictx。sudoapt-get install build-esstial防止编译出问题。
1.下载内核代码:linux-3.0.1.tar.bz2
2.解压到任何目录,这里是/opt/linux_kernel.
3.cp /usr/src/linux-headers-2.6.35.-22-generic/.config /opt/linux_kernel/linux-3.0.1
4.cd /opt/linux_kernel/linux-3.0.1
5.我们添加了hello.c文件到/opt/linux_kernel/linux-3.0.1/drivers/char下面,修改Kconfig Makefile.内容如下:
//hello.c
#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);
Kconfig中添加
config TE_HELLO
bool "this is a test for virtual device support"
default y
help
say Y there if you want to support the test.
Makefile中添加:
obj -$(CONFIG_TE_HELLO) +=hello.o
6.make menuconfig直接load在save即可。注意看看添加的hello是选中了。
7.make大概3小时在源代码处生成相应的.o文件
make bzImage 在/arch/x86/boot生成bzp_w_picpath
make modules 编译modules
make modules_install 将上面编译好的模块都拷贝到/lib/modules/3.0.1下面
make install拷贝System-wap-3.0.1 vmlinuz-3.0.1到/boot/目录下
8.生成initrd.img这里注意网上有使用sudo mkinitramfs -o /boot/initrd.img-3.0.1,它会引起 could not load .../modules.dep的问题。
使用sudo update-initramfs -c -k 3.0.1才正确。
sudo update-grub出现下列信息表示正确了。
Found linux p_w_picpath: /boot/vmlinuz-3.0.1
Found linux p_w_picpath: /boot/initrd.img-3.0.1
9.reboot系统,是否有hello的信息出现,有的话那就说明正确了。
这里我们实现了linux驱动添加到linux内核,linux内核的更新。当然对于每一步为什么这么做我们还没有深究。