Linux 设备驱动程序进阶(0)
很久没有写技术博文了,从这里开始我的研究生生涯,转眼就要在职场上养家糊口,生活真的不容易,幸好还有技术相伴为伍。
由于工作的关系,终于接触到linux网络和kernel的编程,总体来说总是一个好的契机。让我能够深入操作系统内核。做过一段时间的用户程序的开发,总是在Windows平台上,终于有机会在linux上做点东西,还是很兴奋的。
首先是一个Hello World的内核程序,然后就是一大堆编译的问题,由于没有接触过Linux所以花费了很多时间在这上面。
1) hellokernel.c 我的编译环境是在虚拟的Linux Redhat 5.0 上编译的
#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"Goodby,cruel world\n");
}
module_init(hello_init); //当内核模块被装载的时候调用hello_init函数
module_exit(hello_exit); //当内核模块被卸载的时候调用hello_exit函数
2)源代码准备好了之后下面就是编译的问题
step1: 准备好linux内核源代码,注意版本号要与主机一致,这里因为我直接在主机(Linux机器)上编译,所以不存在交叉编译的问题。查看linux机器的内核版本号有很多命令,我用的是uname -r
[root@localhost ~]# uname -r
2.6.18-128.el5
看到内核版本之后就可以在官网上下载对应版本的内核。http://www.kernel.org/pub/linux/kernel/v2.6/在这里找到linux-2.6.18.tar.bz2 这个版本,然后解压到/usr/src/目录下。解压命令是tar -xvf linux-2.6.18.tar.bz2就可以了。
step2: 准备工作做好之后首先是编译内核,如果你下载的内核版本和你的主机版本是一一对应的,那么编译起来很简单的,一般没有什么问题的,主要就是几个make命令:
make oldconfig
make prepare
make scripts
step 3: 下面就是在hellokernel.c的目录下编写Makefile文件,注意Makefile的第一字母必须大写,我就是在这里犯错,查了半天没查出问题。Makefile的编写对于这个例子很简单,但是如果复杂的内核模块的开发还是要好好学习怎么编写的。
其实就是简单的几句话就ok了:
obj-m := hellokernel.o //目标模块的编译来自于hellokernel.o的文件, hellokerne
相关文档:
包含3个文件夹,和一个文件Makefile
目录组织结构如下:
Makefile
inc/hello.h
main/main.c
src/hello.c
Makefile文件在外面,这样生成的.o和可执行文件都在外面,clean之后会很干净,结构清晰
文件内容如下:
Makefile(之所以用大写,因为make可以识别Makefile和makefile,用大写可以鲜明一些)::
# String declar ......
Linux
/ Linux文件系统的入口,也是处于最高一级的目录;
/bin 基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令;比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。做为基础系统所需要的最基础的命令就是放在这里。
/boot Linux的内核及引导系 ......
各section的位置分布看内核的链接脚本
D:\KIDE\target\kernel-version\cgel3.0\linux\include\asm-generic\vmlinux.lds.h
D:\KIDE\target\kernel-version\cgel3.0\linux\arch\powerpc\kernel\vmlinux.lds.S
Kernel镜像起始地址KERNELBASE = 0xc000 0000,这意味着内核代码和内核全局变量等的地址空间在3g-4g的地方,
而 ......
今天看到师兄工位上有本Linux Kernel In a Nutshell,还是全英的影印版,所以就借过来看看,发现现在看英文的书渐渐适应了,还是比较容易的,书中开始介绍如何编译Linux内核,Linux内核大三的时候也学过编译过,但是当时编译比较简单,这次决定再重头到尾好好编译一下,首先下载linux kernel,再用secureCRT上传到Ubuntu 8. ......
1. Workqueue
Workqueue的名字就和他的功能一样:需要处理的工作列表和工作的添加删除(貌似没有看到如何删除的)、以及工作的调度执行。
需要处理的工作列表通常都维护在内核对象workqueue_struct里面。系统里面可以有多个workqueue_struct。 ......