当前位置: 首页 > news >正文

最简单的驱动程序

简介

在 Linux 内核中,Makefile 和 Kconfig 是两个重要的文件,它们分别承担着不同的作用。

Makefile

Makefile 是一个文本文件,用于定义编译和构建内核的规则。它使用 make 工具来管理和自动化构建过程。Makefile 定义了编译器、链接器、编译选项、目标文件、源文件等信息,以及构建不同配置的内核所需的规则。通过执行 make 命令,可以根据 Makefile 中的规则,自动执行编译、链接和安装等操作,生成可执行的内核映像文件。

Makefile 还允许用户自定义构建选项和调整内核配置。通过修改 Makefile,可以指定编译器选项、优化级别、链接选项等,以满足特定的需求。Makefile 还提供了一些常用的目标,如编译内核模块、安装内核等,简化了构建和安装的流程。

Kconfig

Kconfig 是内核源代码树中的一个配置系统,用于管理和配置内核的编译选项。它提供了一种交互式的配置界面,允许用户选择和配置内核选项,以定制构建出的内核映像。Kconfig 文件位于内核源代码树的顶层目录下,并通过菜单和菜单项的方式组织配置选项。

Kconfig 文件中的每个配置选项都有一个唯一的标识符和名称,并由其所对应的 C 语言宏定义来表示。通过使用配置界面工具,如 make menuconfigmake xconfig,用户可以浏览和修改 Kconfig 文件中的选项,并根据需求进行配置选择。

Kconfig 不仅用于配置编译选项,还用于启用或禁用不同的内核功能、设备驱动、文件系统等。它提供了一个灵活的配置系统,可以根据特定的硬件平台或用户需求进行定制化配置,从而生成适合特定环境的内核映像。

总结起来,Makefile 和 Kconfig 在 Linux 内核中分别负责构建规则和配置选项的管理。Makefile 管理编译和构建过程,而 Kconfig 管理内核的配置选项和功能。它们共同协作,使得 Linux 内核具有高度的可定制性和灵活性。

环境

操作环境: Ubuntu20.04

内核源码: linux-6.6版本,官网下载

下载之后,把linux-6.6.tar.xz解压到Ubuntu中任意目录即可,例如:解压到~/linux-test/目录下:

编译进内核

驱动程序目录

linux 中的驱动,一般都放在 linux-6.6/drivers/ 目录下,因此在这个目录中创建一个hello文件夹。

$ mkdir linux-6.6/drivers/hello

对于一个驱动来说,最重要的就是3个文件:

源代码

Kconfig

Makefile

只要按照固定的格式来编写这3个文件,linux内核的编译脚本就可以确保把我们的驱动程序编译进去。

源文件

首先是源码,在hello文件夹中创建源文件 hello.c:

$ cd linux-6.6/drivers/hello

$ touch hello.c

源文件hello.c的内容是:

#include <linux/module.h>
#include <linux/init.h>// 当驱动被加载的时

相关文章:

  • 【Mybatis源码】注册器 - TypeAliasRegistry
  • java - IDEA IDE - 设置字符串断点
  • 什么是NPM(Node Package Manager)?它的作用是什么?
  • 姓名脱敏方法
  • Java面试基础
  • Sqlserver2012和Sqlserver2019数据库设置最大并行数解决数据库CPU高问题
  • 在 Mac 中卸载 Node.js
  • 火山引擎ByteHouse:如何用OLAP引擎提升数字营销效果?
  • Mybatis—基础操作
  • 框架安全-CVE 漏洞复现DjangoFlaskNode.jsJQuery框架漏洞复现
  • ts 简易封装 axios,统一 API
  • 中国电子云-隐私计算-云原生安全可信计算,物理-硬件-系统-云产品-云平台,数据安全防护
  • Python Django 之模板语法详解
  • SpringMVC Day 11 : 零 xml 配置
  • Docker Tomcat 搭建文件服务器
  • [译] 怎样写一个基础的编译器
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【EOS】Cleos基础
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • es6--symbol
  • js
  • Just for fun——迅速写完快速排序
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • SwizzleMethod 黑魔法
  • 计算机常识 - 收藏集 - 掘金
  • 开发基于以太坊智能合约的DApp
  • 七牛云假注销小指南
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端性能优化--懒加载和预加载
  • 双管齐下,VMware的容器新战略
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序测试方案初探
  • 白色的风信子
  • ​如何防止网络攻击?
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (3)llvm ir转换过程
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (十六)串口UART
  • (译) 函数式 JS #1:简介
  • (转)Oracle存储过程编写经验和优化措施
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 使用配置文件
  • .NET6 开发一个检查某些状态持续多长时间的类
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • []FET-430SIM508 研究日志 11.3.31
  • [2016.7 test.5] T1
  • [Android]使用Retrofit进行网络请求
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [C++]C++基础知识概述
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法