拿着还是12年买的郭天祥的arm7开发板,重新学习uclinux相关内容,首先在虚拟机中安装redhat4,以前一直是井底之蛙,现在才知道别说redhat4了,就是redhat9都是老掉牙的东西了,apt-get for redhat4 没有,看到for redhat9有,就下了,结果安装教程不明朗确定,问题百出,遂放弃直接用ubuntu14 高级货。。。这说明还是要紧跟时代的步伐,老学些老掉牙的东西,不仅知识体系是旧的,而且很麻烦,学着很痛苦。
首先还是用虚拟机装的ubuntu14,装好后巨卡,也难怪,同时又win7和ubuntu运行,我这华硕破电脑担待不起,于是用U盘启动在d盘安装了ubuntu14 麒麟版本。果然比土的掉渣的redhat9 炫酷多了,很有苹果mac os 的感觉。小激动后,准备研究linux内核的第一步工作:即建立内核树,这个内核树到底是个什么概念,现在其实也没搞清楚,先不管了,毕竟知识是一步步学的,不要让前面太多分支的东西干扰主线,后面有基础了回过头来再学就轻松了。
百度,翻墙google,搞清基本步骤:
(1)$apt-get install build-essential kernel-package libncurses5-dev libncurses5 ,把工具安装了,没管具体有啥用,先安了再说,还是那句话,对于初学者,如果抱着什么都想立马知道,会学得很痛苦,先把当前的事干好了再说;
(2)apt-get install linux-source-2.6.32 下载内核,那个版本号可以搜下最新的;
(3)解压缩 用 tar -gxvf path(linux-source的路径);
(4)make menuconfig ,save和load 都是.config
(5)开始编译 make -j4(笔记本双核)(忘了多久,反正从晚上7点多到第二天早上弄编译好了);
(6)make bzImage 可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x ;
(7)make modules ;
(8)make modules_install 搞定 内核树建立好了
(9)选个目录建立一个linuxq文件夹,里面好放例子,比如helloworld驱动例子,需要hello.c 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);
//Makefile
obj-m := hello.o
KERNELDIR := /lib/modules/2.6.32-21-generic/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions $(TARGET)
需要注意的是makefile的格式$(MAKE)前面要加个tab.
make 编译,不出现错误的话,用ls -al查看linux_modules目录下产生了如下文件:
hello.c hello.mod.c hello.o modules.order
hello.ko hello.mod.o Makefile Module.symvers
其中hello.ko就是可加载的模块文件
现在我们就可以将编译好的模块helloworld加载到内核中去了
#insmod ./hello.ko //这个命令把hello.ko加载到内核
#lsmod|grep hello //lsmod 这个命令可以查看当前所有的驱动模块,结果应该显示hello 680 0
#rmmod hello //这个命令是把hello这个模块移除掉
程序的输出结果可以在
/var/log/syslog文件中查看
Hello,World
Goodbye,cruel world
这是程序的输出。