http://blog.sina.com.cn/s/blog_6035432c0100jraf.html
最近开始学Linux驱动,就从最简单的开始练起,就从LDD-3里的第一个驱动程序hello world练起。
The following code is a complete "hello world" module:
#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 "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
保存为 hello.c
再写一个Makefile,代码如下:
obj-m := hello.o
KERNELDIR := /usr/src/kernels/2.6.9-42.EL-smp-i686
PWD := $(shell pwd)
all:
make -C $(KERNELDIR) M=$(PWD) modules
.PHONY: clean
clean:
rm -rf *.o *.ko
加载驱动:
屏幕没有显示。
查看驱动,lsmod hello已在,说明已经加载进去了。
网上查看,寻求解决之法,
说可以在/var/log/message中显示hello world!,但还是没有、
最后使用dmesg命令,看到了显示。
卸载驱动:
rmmod hello
途中问题:
加载驱动时遇到 insmod: error inserting 'hello.ko': -1 invalid module format 错误
原因:使用的内核和编译的内核版本不一样。
我使用的PC内核版本如下:
在/usr/src/kernels/下有三个内核,选择和上面系统一样的内核。
修改 Makefile中的 KERNELDIR 为
KERNELDIR := /usr/src/kernels/2.6.9-42.EL-smp-i686
或者为 KERNELDIR := /lib/modules/$(shell uname -r)/build
cd /lib/modules/$(uname -r)/build/
这个目录实际上指向了:/usr/src/kernels/2.6.9-42.EL-smp-i686
分享到:
相关推荐
本文档是最基本的Linux设备驱动程序hello world的技术文档,hello world很简单,但如果没有高手指导,或者你的开发板提供的资料做得不够好,那是足够让你花上一个星期也不一定能够搞出来的。本文档是针对Linux设备...
"Linux驱动开发之旅(一)--helloworld"是一个针对初学者的教程,旨在帮助新手理解驱动开发的基本步骤和关键点。在这个教程中,我们将创建一个简单的字符设备驱动,它的主要功能就是向用户空间输出"Hello, World!...
- **编写简单的字符设备驱动**:从最基础的字符设备驱动开始,包括初始化、卸载等基本操作,并在驱动的 init 函数中输出 "Hello World"。 - **实现完整的字符设备驱动**:进一步扩展字符设备驱动的功能,如读取、...
- **解释**: HelloWorld是一个简单的示例,用于演示如何创建和加载一个基本的内核模块。这部分通过一个具体的例子,帮助读者理解模块的基本构建过程。 - **2.3. 内核模块相比于应用程序** - **解释**: 内核模块与...
- **Hello World模块**:这是最简单的驱动程序示例,通过它可以学习如何编译和加载模块。 - **内核模块与应用程序的区别**:内核模块直接运行在内核空间,而应用程序则运行在用户空间。内核模块可以访问更多的系统...
- **入门示例**:创建一个简单的HelloWorld模块作为初学者的第一个项目。 - **实现步骤**: - 编写模块初始化函数。 - 编写模块卸载函数。 - 使用`module_init()`和`module_exit()`进行注册。 #### 2.3 内核模块...
《ARM嵌入式Linux设备驱动实例开发》--最简单模块--Helloworld,《ARM嵌入式Linux设备驱动实例开发》--hello.c 及Makefile
例如,在编写一个简单的“Hello World”驱动时,只需要包含这个文件即可。 - **`linux/fs.h`**:该头文件包含了文件操作相关的结构体定义,如`struct file_operations`和`struct inode`。此外,还包括了`MINOR`和`...
通过上述步骤,我们不仅搭建了一个适合于Linux驱动开发的环境,还编写并测试了一个简单的驱动程序。这对于初学者来说是一个非常好的起点。随着对Linux内核和驱动开发理解的深入,可以尝试更复杂的驱动开发项目,不断...
- **“Hello World”驱动模块**:通过一个简单的例子,介绍了如何编写并加载第一个驱动模块。 - **编译与链接驱动程序**:详细讲解了编译和链接驱动程序的过程,包括如何设置编译环境和使用必要的工具链。 - **版本...
- **4.1 Helloworld** - 简单示例介绍如何编写一个简单的内核模块。 - **4.2 GPIO驱动** - **4.2.1 硬件分析** - 分析目标硬件的GPIO接口。 - **4.2.2 LED驱动的编写** - 使用C语言实现对LED的控制。 - **...
本篇文章将详细讲解如何开发一个最简单的Linux内核模块,以此来入门Linux驱动开发。 首先,我们要理解内核模块的概念。内核模块是Linux内核的一部分,可以在需要时动态加载或卸载,这样可以减小内核体积并提高灵活...