编写 Hello world 模块驱动
华清远见-嵌入式领域著名讲师 O(∩_∩)O 牛牛猛
点击链接加我好友!
http://student.csdn.net/invite.php?u=111047&c=758a60d66d3a92d1
欢迎大家去我CSDN博客上踩踩
我的个人主页
晚上没事,同学邀我写个模块的实验手册,拿出来和大家分享一下
(1) 模块动态加载驱动方式
在内核源码的“drivers/char/”目录下新建一个名为“hello .c”的文件,内容如下:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE ("GPL");
static int __init hello_init (void)
{
printk (KERN_INFO "Hello world/n");
return 0;
}
static void __exit hello_exit (void)
{
printk (KERN_INFO "Goodbye world/n");
}
module_init (hello_init);
module_exit (hello_exit);
|
修改Makefile里面的内核源码包的路径,这里我们必须用到一个已经编译好的内核的源码
这里我们用了
KERNELDIR ?= /mnt/mengyang/source/kernel/linux-2.6.33
根据自己的实际情况修改,一定确保你的内核可以编译通过,内核可以正常运行!
在命令行里运行make命令,顺利的会生成*.ko文件。将*.ko文件复制到nfs目录,或是其他的存储设备。
在命令行里运行插入模块的命令
ismod *.ko
顺利的可以看到init函数将会被调用。
同样,运行
rmmod *.ko
顺利的可以看到clean函数被执行了。
执行上面命令时,可能报错误rmmod: chdir(2.6.33.2-TE2440): No such file or directory
这是由于busybox 1.13.1导致的,,原来是现在的内核模块在插入卸载时都会要转到/lib/modules/内核版本号/ 这个目录里。 所以只要建立这个目录并且把要使用的模块*.ko文件复制到这个目录就行了。
(2)静态的加载驱动
在内核源码中添加对hello 驱动的支持
修改drivers/char/目录下的“Kconfig”文件,在7 行添加如下内容:(红色部分所示)
#
# Character device configuration
#
menu "Character devices"
config CCTE_HELLO
tristate "CCTE2440 Hello Driver"
depends on ARCH_S3C2440
help
CCTE2440 Hello.
修改同目录下的“Makefile”文件,在合适的行添加如下内容:
#
# Makefile for the kernel character device drivers.
#
#
# This file contains the font map for the default (hardware) font
#
obj-$(CONFIG_ CCTE_HELLO) += hello.o
配置内核
然后输入:#make menuconfig,然后配置如下:
Device Drivers --->
Character devices --->
<*> CCTE2440 Hello Driver
将其选择为“M”(模块),然后保存配置,编译出内核镜像烧写到开发板中。或是下载到开发板上运行。
分享到:
相关推荐
Linux驱动开发之编写第一个内核模块--Hello World源码, 亲测OK,对应文章链接: https://dingdong.blog.csdn.net/article/details/106329048
1. 查看内核版本 [root@localhost test]# uname -r 3.10.0-862.el7.x86_64 ...3. 编写hello.c 及 Makefile cat hello.c: [root@localhost test]# cat hello.c #include #include MODULE_LICENSE(Dua
自己编写测试,教程详见文章https://blog.csdn.net/szm1234/article/details/112601700
4.加载和卸载helloworld模块。5.移植编写led驱动模块。6.移植编写lcd驱动模块。上面的学习过程没有阶跃,应该不存在从某一步到某一步无法跨越的问题,再深入的,去理解驱动模块,去改写移植其他类型的驱动模块应该也...
Hello World模块 核心模块与应用程序的对比 编译和装载 内核符号表 预备知识 初始化和关闭 模块参数 在用户空间编写驱动程序 快速参考 第三章 字符设备驱动程序 scull的设计 主设备号和次设备号 一些...
make -C /home/tekkaman/working/SBC2440/linux-2.6.22.2 M=/home/tekkaman/working/Linuxdriver/Helloworld modules make[1]: Entering directory `/home/tekkaman/working/SBC2440/linux-2.6.22.2' CC [M] /home/...
4、Linux shell编程:输出Hello World、获取系统信息、获取网卡信息、监控CPU负载 5、Linux内核编译与运行:Busybox准备、环境配置、编译最小文件系统、编译内核、运行QEMU 6、Linux内核模块编程:内核模块编程、...
Hello world模块 核心模块与应用程序的对比 编译和装载 内核符号表 预备知识 初始化和关闭 模块参数 在用户空间编写驱动程序 快速参考 ch03.第三章 字符设备驱动程序 scull的设计 主设备号和次设备号 一些重要的数据...
基于Raspberry Pi 3B+平台学习Linux驱动开发的记录与分享,旨于对Linux内核模块机制的熟悉、常见接口的Linux驱动...目前实现hello world, gpio led, gpio key, device io,pwm, 红外, PDD与设备树相关驱动,还有一些文档
面向对象,事件驱动,交互式CLI模块。 Seeli旨在为您提供所需的工具,以按您希望的方式编写命令行界面,否则,您将无法使用。 const os = require ( 'os' ) const cli = require ( 'seeli' ) cli . set ( { ...
Hello World模块 22 核心模块与应用程序的对比 24 编译和装载 28 内核符号表 33 预备知识 35 初始化和关闭 36 模块参数 40 在用户空间编写驱动程序 42 .快速参考 44 第三章 字符设备驱动程序 46 scull的...
Hello World 模块 ......................................................................................................... 28 3.3 2.3. 内核模块相比于应用程序 ............................................
目录 第1章 Linux快速入门 1 1.1 嵌入式Linux基础 1 1.1.1 Linux发展概述 1 1.1.2 Linux作为嵌入式操作系统的优势 2 ...12.3 实验内容——使用Qt编写“Hello,World”程序 420 本章小结 428
实现了hello_world内核模块,在x86和arm32上运行 实现了一个字符设备驱动,在arm32上运行 20200701 实现了字符设备驱动客户端 实现了misc设备 20200708 实现了虚拟设备的FIFO读写 20200925 自己动手写docker ...
03. 用Koa简单介绍Web框架我们选择 Koa 是因为它是一个非常小的框架,使您能够使用节点模块生态系统编写简单而强大的 API。04. CRUD 端点在这个例子中,我们将为我们的应用程序设置几个端点。 它们将允许我们:列出...
《嵌入式Linux应用程序开发标准教程(第2版)》主要分为3个部分,包括Linux基础、搭建嵌入式Linux环境和嵌入式Linux的应用开发。Linux基础部分从Linux...12.3 实验内容——使用Qt编写“Hello,World”程序 12.4 本章小结