Linux 驱动学习笔记1 -- HelloWorld
2012-07-09 22:11
399 查看
想学习一下驱动,于是找了一个实例HelloWorld,编写自己的第一个驱动程序
查看自己linux内核包
本机的内核包是 linux-source-3.0.0
接着下载内核源码包
下载完成后,先cs到/usr/src目录,再解压linux-source-3.0.0.tar.bz2
接下来编译 oldconfig
再编译 bzImage,这个大概需要1个多小时
继续编译modules,也需要1个多小时
最后是安装modules
到目前为止,环境已经搭建完毕,下面是我们第一个驱动程序HelloWorld
编写hello.c
下面编写Makefile文件
解释一下,$(shell uname -r)是指你在终端输入shell命令uname -r输出的内容,实际是一个目录名,$(shell pwd)是指当前路径
最后一步就是make了
你可以ls查看一下make以后多了哪些文件
当然还不够,我们还没有看到属性的HelloWorld。用insmod命令将hello.ko装载到内核中
好像没有HelloWorld的啊,好,我们进入日志文件看看,打开/var/log/syslog就会看到
Jul 9 21:30:36 borya kernel: [20377.621046] Hello World linux_driver_module
卸载hello
再次打开/var/log/syslog就看到最后一行
Jul 9 22:06:51 borya kernel: [22551.983955] This is first step linux_driver_module
到此位置,linux第一个驱动程序完美结束!
1、环境搭建
安装ubuntu系统,打开终端,以root权限进入,命令如下bory@borya:~$ sudo -s
查看自己linux内核包
root@borya:~# apt-cache search linux-source linux-source - Linux kernel source with Ubuntu patches linux-source-3.0.0 - Linux kernel source for version 3.0.0 with Ubuntu patches
本机的内核包是 linux-source-3.0.0
接着下载内核源码包
root@borya:~# apt-get install linux-source-3.0.0
下载完成后,先cs到/usr/src目录,再解压linux-source-3.0.0.tar.bz2
root@borya:~# cd /usr/src/ root@borya:/usr/src# ls linux-headers-3.0.0-12 linux-source-3.0.0 vboxguest-4.1.16 linux-headers-3.0.0-12-generic linux-source-3.0.0.tar.bz2 root@borya:/usr/src# tar jxvf linux-source-3.0.0.tar.bz2
接下来编译 oldconfig
root@borya:/usr/src/linux-source-3.0.0# make oldconfig
再编译 bzImage,这个大概需要1个多小时
root@borya:/usr/src/linux-source-3.0.0# make bzImage
继续编译modules,也需要1个多小时
root@borya:/usr/src/linux-source-3.0.0# make modules
最后是安装modules
root@borya:/usr/src/linux-source-3.0.0# make modules_install
到目前为止,环境已经搭建完毕,下面是我们第一个驱动程序HelloWorld
2、运行驱动程序HelloWorld
在自己任意工作目录下,新建一个目录test。编写hello.c
#include "linux/init.h" #include "linux/module.h" static int hello_init(void) { printk(KERN_ALERT "Hello World linux_driver_module\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "This is first step linux_driver_module\n"); } module_init(hello_init); module_exit(hello_exit);
下面编写Makefile文件
ifneq ($(KERNELRELEASE),) obj-m := hello.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif
解释一下,$(shell uname -r)是指你在终端输入shell命令uname -r输出的内容,实际是一个目录名,$(shell pwd)是指当前路径
最后一步就是make了
bory@borya:~/driver/hello$ make
你可以ls查看一下make以后多了哪些文件
当然还不够,我们还没有看到属性的HelloWorld。用insmod命令将hello.ko装载到内核中
bory@borya:~/driver/hello$ insmod ./hello.ko
好像没有HelloWorld的啊,好,我们进入日志文件看看,打开/var/log/syslog就会看到
Jul 9 21:30:36 borya kernel: [20377.621046] Hello World linux_driver_module
卸载hello
root@borya:~/driver/hello$rmmod ./hello.ko
再次打开/var/log/syslog就看到最后一行
Jul 9 22:06:51 borya kernel: [22551.983955] This is first step linux_driver_module
到此位置,linux第一个驱动程序完美结束!
相关文章推荐
- 嵌入式Linux驱动学习笔记(一)------第一个LED驱动程序
- linux I2C驱动学习笔记
- 学习笔记 --- LINUX USB设备驱动的编写
- linux设备驱动学习笔记--内核调试方法之printk
- 境界篇:linux 驱动开发的境界(学习笔记)
- Linux设备驱动模型学习笔记(kobject,kset,subsystem子系统)
- Zynq-Linux移植学习笔记之12-gpio驱动配置
- [Linux驱动]字符设备驱动学习笔记(三)———高级
- Zynq-Linux移植学习笔记之七-网络驱动
- 驱动学习笔记(一)HelloWorld
- linux驱动学习笔记4
- linux网络设备应用与驱动编程学习笔记(2)——网络驱动基础
- [linux驱动][Linux内存]DMA学习笔记一
- LINUX驱动学习笔记一
- linux 下块设备驱动开发学习笔记 2(sbull驱动分析)
- Linux驱动结构学习笔记 pci之pci_dev
- Linux驱动学习相关记录笔记
- linux学习笔记-读《Linux设备驱动开发详解》~第一章 设备驱动概述
- Linux驱动学习笔记(1) hello world !
- linux驱动学习笔记:USB README