Linux驱动开发 驱动程序的具体编写及出口入口函数解析,printk打印内核信息

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Linux驱动开发 驱动程序的具体编写及出口入口函数解析,printk打印内核信息

前言

本文将带大家学习驱动程序的具体编写及出口入口函数解析。

一、出口函数入口函数解析

每一个驱动程序都是含有出口函数和入口函数的,装载驱动的时候先调用入口函数,卸载驱动的时候则调用出口函数。

入口出口函数的形式如下:

static __init int hello_dev_init(void)
{
  printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__); 
  return 0;
}
static __exit void hello_dev_exit(void)
{
  printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}
module_init(hello_dev_init);
module_exit(hello_dev_exit);

module_init和module_exit的作业是将上面两个函数分别修饰为入口函数和出口函数,一般的函数我们不能随意指定他就是出口函数和入口函数,必须经过指定后才能认为他是入口函数和出口函数。


有同学可能会有疑惑为什么这两个函数前面要加__init和__exit呢?

其实__init和__exit就只是一个空的宏,入口函数和出口函数在整个过程中都只会调用一次,调用完后我们可以将其释放节省内存,使用这两个标识就可以达到这样的效果。

1f27c2a24fae43489fc5acc40ffff145.png

二、printk内核打印信息

在普通的程序中我们一般使用的是printf来输出打印信息,但是在Linux内核中要用printk来打印输出信息。

一般默认情况下内核的打印信息是没有打开的,我们需要将其打开

cat /proc/sys/kernel/printk//查看设置值
echo 7       4       1      7 > /proc/sys/kernel/printk//打开内核打印信息

将内核的打印功能打开后我们就可以使用printk去打印输出信息了。

三、驱动程序的具体编写

1.确定主设备号

主设备号可以由我们自己指定,也可以由系统帮我们指定

static int major = 0;

2.构造file_operations结构体

static struct file_operations hello_drv = {
  .owner   = THIS_MODULE,
  .open    = hello_drv_open,
  .read    = hello_drv_read,
  .write   = hello_drv_write,
};

3.实现对应的open,read,write函数

static ssize_t hello_drv_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
{
  printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
  return 1;
}
static ssize_t hello_drv_write (struct file *file, const char __user *buf, size_t size, loff_t *offset)
{
  printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
  return 1;
}
static int hello_drv_open (struct inode *node, struct file *file)
{
  printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
  return 0;
}

4.注册驱动程序

在Linux中我们会经常听到注册这个词,注册其实就是将结构体添加进链表。

major = register_chrdev(0, "hello", &hello_drv);

5.编写入口函数

static int __init hello_init(void)
{
  int err;
  printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
  major = register_chrdev(0, "hello", &hello_drv);  /* /dev/hello */
  hello_class = class_create(THIS_MODULE, "hello_class");
  err = PTR_ERR(hello_class);
  if (IS_ERR(hello_class)) {
    printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
    unregister_chrdev(major, "hello");
    return -1;
  }
  device_create(hello_class, NULL, MKDEV(major, 0), NULL, "hello"); /* /dev/hello */
  return 0;
}

6.编写出口函数

static void __exit hello_exit(void)
{
  printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
  device_destroy(hello_class, MKDEV(major, 0));
  class_destroy(hello_class);
  unregister_chrdev(major, "hello");
}

7.完善信息

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

总结

本篇文章的内容不多大家看完后有什么疑问可以留言。

相关文章
|
8天前
|
存储 编解码
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
《FFmpeg开发实战》书中介绍了音视频编码历史,重点讲述H.264的成功在于其分为视频编码层和网络抽象层。H.264帧类型包括SPS(序列参数集,含视频规格参数),PPS(图像参数集,含编码参数)和IDR帧(立即解码刷新,关键帧)。SPS用于计算视频宽高和帧率,PPS存储编码设置,IDR帧则标志新的解码序列。书中还配以图片展示各帧结构详情,完整内容可参考相关书籍。
36 7
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
|
4天前
|
前端开发 数据库 开发者
构建高效后端:Django框架在Web开发中的深度解析
**Django框架深度解析摘要** Django,Python的高级Web框架,以其快速开发和简洁设计备受青睐。核心特性包括Model-Template-View架构、ORM、模板引擎和URL路由。通过创建博客应用示例,展示从初始化项目、定义模型、创建视图和URL配置到使用模板的流程,体现Django如何简化开发,提高效率。其强大功能如用户认证、表单处理等,使Django成为复杂Web应用开发的首选。学习Django,提升Web开发效率。【6月更文挑战第24天】
35 1
|
8天前
|
Java 开发工具 Android开发
安卓与iOS开发差异解析
【6月更文挑战第21天】本文旨在深入探讨安卓和iOS两大移动操作系统在应用开发过程中的主要差异。通过对比分析,揭示各自的设计哲学、编程语言选择、用户界面构建、性能优化策略以及发布流程的异同。文章将提供开发者视角下的实用信息,帮助他们更好地理解各自平台的特点和挑战,从而做出更明智的开发决策。
|
8天前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
13 1
|
10天前
|
存储 安全 算法
网络安全与信息保护:解析漏洞、加密技术与安全意识
在当今数字化社会中,网络安全与信息保护显得尤为关键。本文深入探讨了网络安全漏洞的种类与影响,加密技术的演变与应用,以及个体与组织在提升安全意识方面的关键作用。通过系统的分析与实例,读者将对如何应对当今复杂的网络安全挑战有更清晰的理解与启发。
16 2
|
3天前
|
移动开发 程序员 Linux
老程序员分享:linux驱动开发笔记_ioctl函数
老程序员分享:linux驱动开发笔记_ioctl函数
|
5天前
|
安全 Linux Shell
深入探索Linux命令pinentry:安全处理敏感信息的利器
`pinentry`是GnuPG的安全工具,用于安全获取密码等敏感信息,它在终端中显示隐藏输入的提示,确保信息安全。支持交互式操作、多种输入方式,且有丰富的选项,如`--tty`和`--window-title`。示例脚本展示了如何在bash中使用它获取密码。使用时注意环境安全,勿明文显示密码,结合其他工具增强安全性,熟悉参数选项,并考虑备份相关配置。
|
7天前
|
分布式计算 DataWorks 大数据
MaxCompute操作报错合集之pyodps3的报错信息里,报了程序的解析错误,是什么导致的
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
9天前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
11 0
|
Linux
Linux系统调用二、open()函数与close()函数介绍
Linux系统调用二、open()函数与close()函数介绍
308 0
Linux系统调用二、open()函数与close()函数介绍