首页 > 系统相关 >第一个驱动程序(在Ubuntu系统下运行)

第一个驱动程序(在Ubuntu系统下运行)

时间:2023-10-21 16:58:06浏览次数:30  
标签:第一个 make first drv file Ubuntu include open 驱动程序

一、构造内核源码树

# apt-cache search linux-source
# apt-get install linux-source-4.4.0(下载的源码在目录/usr/src下)
# 解压内核源码tar xjf .....
进入源码目录
# make oldconfig
# make
# make modules
make modules_install
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

ref:http://blog.chinaunix.net/uid-24782829-id-3211008.html

由于我主机本身内核版本就为4.4.0-21-generic,所以/lib/modules/4.4.0-21-generic/本身就存在,所以上述过程就不需要执行了。至此,构造内核源码树完成。

make时报错:

scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h: 没有那个文件或目录 compilation terminated. scripts/Makefile.host:91: recipe for target 'scripts/sign-file' failed make[1]: *** [scripts/sign-file] Error 1 Makefile:566: recipe for target 'scripts
  • 1

解决方法:ubuntu下缺少了如下的组件,安装一下即可

sudo apt-get install libssl-dev
  • 1

二、在Linux下写驱动程序

源代码firstdrv.c:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>

static int first_drv_open(struct inode *inode, struct file *file)
{
    printk("first_drv_open\n");
    return 0;
}

static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
    printk("first_drv_write\n");
    return 0;
}

static struct file_operations first_drv_fops = {
    .owner  =   THIS_MODULE,    /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */
    .open   =   first_drv_open,     
    .write  =   first_drv_write,       
};

static int first_drv_init(void)
{
    register_chrdev(246, "first_drv", &first_drv_fops); // 注册, 告诉内核
    return 0;
}

static void first_drv_exit(void)
{
    unregister_chrdev(246, "first_drv"); // 卸载
}

module_init(first_drv_init);
module_exit(first_drv_exit);

MODULE_LICENSE("GPL");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

makefile:

obj-m:=firstdrv.o  #注意.o文件名要和驱动程序文件名一致
CURRENT_PATH :=$(shell pwd)  
LINUX_PATH :=/lib/modules/4.4.0-21-generic/build

all:  
    make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules  
clean:  
    make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# make 编译模块
# insmod firstdrv.ko
#lsmod 
#cat /proc/devices
  • 1
  • 2
  • 3
  • 4

测试程序firstdrvtest.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
    int fd;
    int val=1;
    fd=open("/dev/xyz",O_RDWR);
    if(fd<0)
        printf("can't open\n");
    write(fd,&val,4);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
# mknod /dev/xyz c 246 0 创建设备节点
# ./firstdrvtest 执行测试程序
  • 1
  • 2

2017/9/15目前的情况是firstdrv.c可以正常加载(insmod)到/proc/devices,lsmod命令也能够看到该模块,但是给/dev/xyz创建节点后,在执行firstdrvtest测试时,无法打开该文件。
这里写图片描述
2017/9/18切换成root用户执行./firstdrvtest可执行文件,文件可以打开,但没有按照模块中open和write函数指定的方式打印信息,打印信息只可以在日志中查看。查了原因,是因为printk函数运行在内核态,如果要让它显示到虚拟终端上,还要加上其他的配置,如果不更改printk函数的显示等级,只能用dmesg命令查看输出信息,我又花了点时间折腾了下修改printk的输出日志等级,但是不知道是哪里操作不对,也没有实现理想的效果,暂且把这个问题搁下,接下来学习如何实现设备模块自动设置设备号和设备节点先。
这里写图片描述

 

 

from:  https://codeleading.com/article/62054156384/

标签:第一个,make,first,drv,file,Ubuntu,include,open,驱动程序
From: https://www.cnblogs.com/im18620660608/p/17779189.html

相关文章

  • UBUNTU下第一次写简单驱动(笔记)
    一、环境Ubuntu14.04+vmwaretools二、步骤先写个.c文件,驱动文件一般没有printf,有自己的一套,先写一个helloword.c /* *helloworld.c * *宇文凌风 * */     #include"linux/init.h" #include......
  • linux内核编译安装(Ubuntu替换内核)
    前言:Ubuntu替换内核一般是不会删除自己Ubuntu里面的东西的(只是内核改变,其它影响,放心搞就是了,而且可以变回原来的内核)实验环境:OS:Ubuntu20.04.2LTSOldKernel:linux5.15.0NewKernel:linux5.15.0(我测试过的只有原版本,升级其它版本试了不能开机)注:查看当前内核版本命令"uname......
  • Ubuntu Server LTS 修改网卡ip地址方式
    UbuntuServerLTS修改网卡ip地址方式、固定IP。 18.04之前版本通过修改/etc/network/interfaces方式,18.04版本开始通过netplan方式: 0、备份sudocp/etc/netplan/00-installer-config.yaml/etc/netplan/00-installer-config.yaml.bak 1、编辑yaml配置文件,注意缩......
  • Rockchip RK3399 - DRM eDP驱动程序
    在《RockchipRK3399-DRM驱动程序》》我们已经介绍过了,RK3399有两个VOP,均可以支持HDMI、eDP、DP、MIPIDSI0、MIPIDSI1显示接口,本节我们选择eDP作为分析的对象。一、设备树配置1.1edp设备节点设备节点vopb下的子节点vopb_out_edp通过edp_in_vopb(由remote-endpoint属性指定)......
  • QT cmake工程使用QXlsx源码操作execl,无需编译QXlsx,也不需要下载其他东西,windows和ubu
    一、下载地址:链接二、进入下载好的QXlsx目录下,取出QXlsx目录和README.md待用三、用qt创建一个简单的cmake工程,将QXlsx目录和README.md文件放到cmakelists.txt所在目录 四、修改cmakelists.txt文件cmake_minimum_required(VERSION3.5)project(xlsxTestLANGUAGESCXX)......
  • 如何在Linux中实施密码策略(Ubuntu / CentOS)
    尽管Linux被认为是一个安全的操作系统,但其安全性与登录用户的密码强度一样。密码策略的存在是为了确保为用户设置一个强大的密码,作为一个Linux用户,你应该注意执行这些策略,使违规行为难以发生。你肯定不希望用户配置弱密码或容易猜测的密码,这些密码可以在几秒钟内被黑客强行破解。......
  • Ubuntu 安装MySql
    1.安装sudoaptinstallmysql-serversudoaptinstallmysql-cient启动服务:windows启动:netstartmysql服务名停止:netstopmysql服务名mac启动:mysql.serverstart停止:mysql.serverstoplinux:关闭mysql服务:servicemysqlstop启动mysql服务:servicemysql......
  • Rockchip RK3399 - DRM eDP驱动程序
    在《RockchipRK3399-DRM驱动程序》》我们已经介绍过了,RK3399有两个VOP,均可以支持HDMI、eDP、DP、MIPIDSI0、MIPIDSI1显示接口,本节我们选择eDP作为分析的对象。一、设备树配置1.1edp设备节点设备节点vopb下的子节点vopb_out_edp通过edp_in_vopb(由remote-endpoint属性指定)......
  • 分享第一个自学的程序~找出三个数之中最大的那个数
    我,小龙,小朱恰在同个班级中,前两天进行了开学考试~请找出我,小龙,小朱中成绩最高的那个人~好哒~那么现在让我们记我的成绩为a,小龙的成绩为b,小朱的成绩为c,进行以下操作⭐❤解法1:#include<iostream>usingnamespacestd;intmain(){ inta,b,c; cin>>a>>b>>c; cout<<(a>b)?(a>c?a......
  • vscode远程ubuntu,python不识别opencv的函数
    将opencv-python更新到4.8版本以上https://github.com/microsoft/pylance-release/issues/4838......