1.字符设备驱动基础知识图解链接:
Linux 设备驱动之字符设备(一)
http://blog.chinaunix.net/uid-26833883-id-4369060.html
Linux 设备驱动之字符设备(二)
http://blog.chinaunix.net/uid-26833883-id-4369117.html
Linux 设备驱动之字符设备(三)
http://blog.chinaunix.net/uid-26833883-id-4371047.html
linux设备驱动程序之简单字符设备驱动
http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html
字符设备驱动模型
http://blog.youkuaiyun.com/coding__madman/article/details/51347290
2.Ubantu下驱动环境搭建及命令
1.开发本机使用的驱动程序
http://blog.csdn.net/bugonline/article/details/45822611
1.安装开发工具:
* apt-get install build-essential
2./home/linux_test/hello.c Makefile
3.编译:sudo make
编译成功之后会生成相应有ko文件,也就是我们想要的驱动了.
4.查看ko模块的信息 modinfo hello.ko
5.插入模块 sudo insmod ./hello.ko 查看模块sudo lsmod
6.卸载模块 rmmod hello
7.查看信息 cat /var/log/syslog |grep world
2.开发第三方使用的驱动程序
如果驱动不是为本机用的,则需要下载目标版本的源代码并编译
sudo rm -rf 文件名
1. 查看源内的内核源码类表
apt-cache search Linux-source
2. 下载安装内核源代码
sudo apt-get install linux-source-4.8.0
3.源码解压到/usr/src/
sudo kxvf linux-source-4.8.0.tar.bz2
4.进入linux-source-(版本号)目录中执行下面几个命令:
* sudo make oldconfig 或 menuconfig
* sudo make prepare
* sudo make scripts
* sudo make
* sudo make modules
* sudo make modules_install 会安装到/lib/modules$ 中
3. makefile 指向/lib/modules/中指定的路径。就可以编译了。
cat /proc/devices
lu@lu-vm:~/linux-test/mycdev$ ls -l /dev/memdev0
crw-r--r-- 1 root root 66, 0 4月 22 14:18 /dev/memdev0
modinfo mem_dev.ko
# ./app-mem
sudo mknod /dev/memdev c 245 0
sudo ls -l /dev/memdev
sudo chmod 666 /dev/memdev
然后就是编译,打开终端,进入目录
sudo rm /dev/memdev
然后用gcc进行编译
gcc -Wall ./app-mem.c
gcc会显示编译过程中发现的问题于错误,若无错误出现则会编译成文件a.out
运行程序(a.out为编译生成的文件)
./a.out
dmesg |tail
cat /dev/mycdev
printk(KERN_INFO "The process is \"%s\" (pid %i)\n",
字符设备的读写
echo "nihao">/dev/dev_fifo0
cat /dev/dev_fifo0
current->comm, current->pid);
cat /proc/kallsyms | grep saved_command_line
驱动有需求要从cmdline获取参数来配置。
init/main.c可以直接读取cmdline。一开始我直接想从main.c里直接EXPORT_SYMBOL(boot_command_line),编译的时候会有提示SECTION_MISMATCH的警告。
仔细分析查看是__init段不能EXPORT_SYMBOL.
后来参考fs/proc/cmdline.c代码。直接使用saved_comand_line即可。
obj-m := -DEXPORT_SYMTAB
KBUILD_EXTRA_SYMBOLS = /export_symbol_module_dir/Module.symvers
lu@lu-vm:/usr/src/linux-source-4.8.0$ nm vmlinux|grep command_line
ffffffff82032920 T boot_command_line
ffffffff8203f2e0 t command_line
ffffffff820fd030 b initcall_command_line
ffffffff820fd008 B saved_command_line
ffffffff820fd038 b static_command_line