linux驱动开发基础

参考书籍
《Linux设备驱动第三版》
《嵌入式linux应用开发完全手册》(韦东山)
《Linux设备驱动开发详解》(宋宝华)

我的系统是 ubuntu 10.04 LTS
虚拟机 VirtualBox 4.20
开发板 友善之臂 SBC2440 

虚拟机中安装 ubuntu,我折腾过CentOS,最后还是选择ubuntu,感觉ubuntu人性化做的比较好,比较简单,而且用的人多,遇到问题随便搜索一下,大多能找到解决办法。
主机用 winxp 能使用 source insight 快速的阅读和修改代码。纯 linux环境对于我等实在是有点郁闷的。况且虚拟机编译起来速度也不慢。
主机和虚拟机直接的交换,还是建议使用 samba ,因为window的工具可以直接访问网络主机的目录,这样就非常方便了,比如一个 uboot 的项目本来是在虚拟中编译的,
通过 samba ,你完全可以直接在window下建立一个基于远程主机的 source insight 项目,直接修改代码,非常快速方便。
虚拟机开启我就让它最小化了,使用 SecureCRT 登陆ubuntu主机,直接敲命令,对于修改代码则通过 samba 直接编辑源代码。 
最后就是有一个能跑起来内核的开发板,而且必须有网卡驱动,这个最重要。

准备开发板的当前运行的内核的内核树,说白了就是编译过的内核源代码,因为驱动程序必须和内核的版本一致
其次就是要配置NFS,让开发板可以以NFS作为根文件系统启动,这样是最方便的了,必须拷贝代码,直接用开发板访问虚拟机中的文件。

hello world 驱动代码,参看 LDD 第二章的代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>

int __init hello_init(void)
{
	printk(KERN_INFO "HELLO WORLD\n");

	return 0;
}

void __exit hello_exit(void)
{
	printk(KERN_INFO "goodby\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("Etual<[email protected]>"); 
MODULE_DESCRIPTION("simple hello world demo");
MODULE_LICENSE("Dual BSD/GPL");

makefile 的内容
TARGET = hello
obj-m := $(TARGET).o
KERNELDIR ?= /sbc2440/kernel/linux-2.6.22.6
PWD = $(shell pwd)

INST_DIR = /sbc2440/rootfs/root

all: clean install

install : module
	rm -rf $(INST_DIR)/$(TARGET).ko
	cp $(PWD)/$(TARGET).ko $(INST_DIR)
	
module:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	rm -rf *.o \.*.cmd \.tmp_versions $(TARGET).ko 
	rm -rf $(TARGET).mod.c Module.symvers modules.order

一切正常的话生成 hello.ko ,这个就是驱动模块的,只需要加载进系统。


# insmod ./hello.ko
# rmmod hello

你可能感兴趣的:(linux驱动开发基础)