linux驱动基础知识(一)

对于无操作系统的驱动,就是裸机,也就是我们常说的单片机。我们并不需要操作系统,可以直接使用单片机进行通断控制,从编程角度来看,就是直接控制寄存器。

对于有操作系统时的驱动(此处来到我们要说的linux系统驱动),我们开发驱动需要基于linux的各种框架进行编程,按照linux系统给出的框架进行编程,可以提供一个统一的接口给应用程序调用(统一的接口就是指dev下的设备节点)。

linux驱动分为字符设备、网络设备,块设备三类(此处不再赘述,可百度)

linux源码目录是一个树状结构,下图为linux顶层目录的各个文件说明

一个最简单的驱动加载程序应具备以下几个方面:

1.头文件

2.驱动加载函数

3.驱动卸载函数

4.许可证声明。linux是开源的驱动在加载的时候也需要遵守相关协议,可以接收到的license有GPL、GPL v2等

5.模块参数(可选)选择是否被编译为内核模块

#include <linux/module.h>
#include <linux/init.h>

static int helloworld_init(void)//模块加载函数需要返回一个int类型
{
    printk("hello world\n");//驱动程序的打印需要使用printk!!!!因为我们并没有加载stdio.h这个头文件,难道不是嘛
    return 0;
}
static void helloworld_exit(void)//驱动卸载程序是没有返回值的
{
    printk("bye world\n");
} 
module_init(helloworld_init);//此处调用模块加载函数,输出hello world
module_exit(helloworld_exit);//此处调用模块卸载函数,输出bye world

MODUBLE_LICENSE("GPL");//此处是声明调用的协议

那么如何编译linux驱动程序呢?

共有两种方法:

第一:将驱动程序放在Linux内核当中,然后编译Linux内核,将驱动编译到Linux内核当中。

第二:将驱动编译成内核模块,独立于Linux内核之外

此处的内核模块是指,linux所具有的功能,使用Linux模块可以减少内核体积,加快速度。内核模块的后缀是.ko

将驱动编译为内核模块往往通过makefile,以下为makefile的代码

#在#号后边表示注释

#此处-m是指编译为模块,“+=” 表示对变量进行追加赋值,表示把目标文件hello.o作为模块进行编译
obj-m += hello.o
#对于变量赋值的情况 “:=”是立刻赋值,就是a:= $(object) 变量a就已经等于 变量object了,此处为内核源码的绝对路径,你需要根据自己的实际路径进行填写
KDIR := /home/topeet/linux-kernel
#"?="FOO ?= bar

#其含义是,如果 FOO 没有被定义过,那么变量 FOO 的值就是“bar”。而此处$(shell pwd)表示使用命令 pwd获取当前地址
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules  
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order

在编译之前需要,首先编译通过linux内核,然后设置环境变量

交叉编译器也需要根据自己的实际路径进行填写

模块加载命令

insmod模块名

modprobe 模块名

模块卸载命令

rmmod 模块名

查看模块命令

lsmod或者用cat /pro/modules

查看内核模块信息

modinfo 模块名

在linux内核源码使用命令make menuconfig,记得使用这条命令之前,先用环境变量初始化linux的架构,有三种方式,空的,不对驱动进行操作,*编译进内核,M编译成linux内核模块

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux驱动是用于与硬件设备进行交互的软件模块。它允许操作系统与硬件进行通信,控制设备的功能和行为。以下是一些Linux驱动基础知识: 1. 设备驱动程序:设备驱动程序是一个软件模块,用于控制特定的硬件设备,例如网卡、声卡或显示器。驱动程序通过与硬件设备进行交互,向操作系统提供访问该设备的接口。 2. 内核空间和用户空间:Linux驱动程序可以运行在内核空间或用户空间。内核空间是操作系统的核心部分,具有直接访问硬件的能力。用户空间是应用程序运行的环境,无法直接访问硬件。大多数驱动程序在内核空间运行。 3. 内核模块:Linux驱动程序通常以内核模块的形式存在。内核模块可以在运行时加载和卸载,而无需重新启动操作系统。内核模块通常是编译成单独的文件(.ko文件),并通过insmod或modprobe命令加载到内核中。 4. 设备节点:在Linux系统中,每个设备都有一个对应的设备节点。设备节点是一个特殊文件,用于与设备进行通信。设备节点可以通过设备驱动程序创建,并通过文件系统进行访问。 5. 设备树:设备树是一种描述硬件设备及其连接关系的数据结构。它在Linux驱动开发中起到重要的作用,用于在系统启动时自动加载适当的驱动程序。 这些是Linux驱动程序的基础知识,希望能对你有所帮助。如果你有更具体的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值