linux驱动开发基础

2019-07-13 02:49发布

参考书籍
《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 #include #include int __init hello_init(void) { printk(KERN_INFO "HELLO WORLD "); return 0; } void __exit hello_exit(void) { printk(KERN_INFO "goodby "); } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR("Etual"); 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