linux驱动程序开发环境配置

<Linux> Ubuntu kernel 源码编译 替换 本次是在win10自带的hyper-v上安装Ubuntu 16.04 server虚拟机进行试验(desktop版本类似),ubuntu的系统源代码编译后大概需要15G的内存空间,加上压缩包,及编译之后安装modules, kernel等等,大概需要20G空间. 1, 下载Ubuntu Server http://releases.ubuntu.com/16.04/ubuntu-16.04.7-server-amd64.iso 镜像大概800多M,国内下载比较慢,可以用迅雷(2M/s还是没问题的)等下 阅读详情

本文是参考了网上多篇帖子而写的算不上什么原创。唯一值得欣慰的只不过在本机上实现罢了。因为毕竟失败了几次。也因为本人是初学驱动编程 很多简单的问题在我来说是相当的困难的。望有识之士不要笑话。最后,希望本文能给刚学驱动而还没开头的人提供一些帮助。

刚看 O'REILLY 写的《LINUX 设备驱动程序》时。作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。那怎么建立呢?为此上网“翻云覆雨”起来而结果却是“惨败而归“。
为此托了一天又4个小时(当然包括吃饭睡觉的时间),连个简单的 hello wrold 都没实现。(书中p22页最简单也最没用的驱动事列)
不过功夫不负有心人。在今天终于弄明白了怎么回事。下面就请让我慢慢道来吧。

先查看自己OS使用的内核版本

shana@shana:~$ uname -r
2.6.22-14-generic /* 这是我显示的结果 */

如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的)

shana@shana:/usr/src$ ls
linux-headers-2.6.22-14
linux-headers-2.6.22-14-generic
linux-source-2.6.22 /*这个就是解压后的源码目录 */
linux-source-2.6.22.tar.bz2 /* 这是我下的源码 包 */
shana@shana:/usr/src$

如果没有源码。(一般ubuntu 都没有吧)
查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没有此命令)

shana@shana:/usr/src$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches
linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches
shana@shana:/usr/src$

我选择了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 这个~
然后 install 之

shana@shana:/usr/src$ sudo apt-get install linux-source-2.6.22

下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:

shana@shana:/usr/src$ sudo tar jxvf linux-source-2.6.20.tar.bz2

解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。

进入该目录

开始配置内核 选择最快的原版的配置(默认)方式 (我是如此)

root@shana:/usr/src/linux-source-2.6.22# make oldconfig

当然你也可以使用 自己喜欢的配置方式 如 menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。

完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。

shana@shana:/usr/src/linux-source-2.6.22$ sudo make

linux-2.6.32 编译问题(ld: /ubuntu/omnibook/sections.lds: No such file: No such file or directory)

(hi.baidu.com/tibelf/blog/item/9f7e1fbf81cb260719d81f1b.html)

解决方法:

在/usr/src/linux-source-2.6.32/ubuntu/omnibook/Makefile 中

ifeq ($(KERNELRELEASE),)

# Support for direct Makefile invocation
的前面增加:
PWD=$(shell pwd)

shana@shana:/usr/src/linux-source-2.6.22$ sudo make bzImage

当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。

然后 :

root@shana:/usr/src/linux-source-2.6.22# sudo make modules /* 编译 模块(root) */

增加

define CONFIG_DEBUG_SECTION_MISMATCH

在

ifdef CONFIG_DEBUG_SECTION_MISMATCH

KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
endif

的前面

root@shana:/usr/src/linux-source-2.6.22# sudo make modules_install /* 安装 模块(root) */

执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.22-14-generic/
。 在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。

至此 内核树就建立啦 原来不是很难.....

写一个 最简单 最没用的驱动吧
我在 /home/shana/linux_q/ 目录下创建2个文本文件 hello.c Makefile

//hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

程序我就不解释了……

Makefile 文件

obj-m := hello.o
KERNELDIR := /lib/modules/2.6.20/build
PWD := $(shell pwd)

modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

如果以上你都完成了在 make 时出现这样的错误

shana@shana:~/linux_驱动开发$ make
make: 没有什么可以做的为 `modules'。

原因很简单 你肯定是从我这直接复制的吧~~~呵呵,Makefile格式错误啦~
解决办法就是 你把如 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 移动到行首 然后按Tab 键自动对齐
这时里边的变量都变成绿色了~然后在 make 吧

shana@shana:~/linux_驱动开发$ make modules
make -C /lib/modules/2.6.22-14-generic/build M=/home/shana/linux_驱动开发 modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.22-14-generic'
CC [M] /home/shana/linux_驱动开发/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/shana/linux_驱动开发/hello.mod.o
LD [M] /home/shana/linux_驱动开发/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.22-14-generic'
shana@shana:~/linux
_驱动开发$


shana@shana:~/linux
_驱动开发$ ls -l
总用量 124
-rw-r--r-- 1 shana shana 303 2008-03-16 10:43 hello.c
-rw-r--r-- 1 shana shana 49039 2008-03-16 12:11 hello.ko
-rw-r--r-- 1 shana shana 687 2008-03-16 12:11 hello.mod.c
-rw-r--r-- 1 shana shana 25840 2008-03-16 12:11 hello.mod.o
-rw-r--r-- 1 shana shana 24360 2008-03-16 12:11 hello.o
-rw-r--r-- 1 shana shana 8344 2008-03-16 09:17 linux_qudong_qu.txt
-rw-r--r-- 1 shana shana 266 2008-03-16 12:09 Makefile
-rw-r--r-- 1 shana shana 0 2008-03-16 12:11 Module.symvers
shana@shana:~/linux
_驱动开发$


然后加载模块 (超级用户)

root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko

按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解)

root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko
root@shana:/home/shana/linux
_驱动开发#

查看加载模块

root@shana:/home/shana/linux_驱动开发# lsmod
Module Size Used by
hello 2560 0

已经加载上咯~~

删除模块

root@shana:/home/shana/linux_驱动开发# rmmod hello
root@shana:/home/shana/linux
_驱动开发#

那程序的输出在那呢?书中说明 如果不出现在终端 则会写进 syslog 文件中

shana@shana:~/linux_驱动开发$ cat /var/log/syslog |grep world
Mar 16 12:14:53 shana kernel: [ 5937.529297] Hello, world
Mar 16 12:16:05 shana kernel: [ 6009.439036] Goodbye, cruel world
shana@shana:~/linux
_驱动开发$

至此 全部工作都完成了。是否对你有用呢?


Ubuntu下获取当前系统内核源码 Ubuntu下获取内核源码 查看当前系统使用的内核版本: apt-cachesearch linux-source 输出如下: linux-source- Linux kernel source with Ubuntu patches linux-source-3.13.0 -Linux kernel source for version 3.13.0 with Ubun 阅读详情

相关推荐

将驱动程序集成到Linux内核中的开发指南

将驱动程序添加到Linux内核中的好处之一是可以实现更高的性能和更好的系统稳定性。首先,你需要编写你的驱动程序代码。接下来,使用适当的构建工具链编译和构建新的内核映像。具体的构建步骤可能因你的系统和工具链而有所不同,你可以参考相关文档或教程获得更详细的指导。在Linux内核开发中,将驱动程序添加到内核是一个常见的任务。在配置菜单中,找到并启用与你的驱动程序相关的选项。构建完成后,将新的内核映像和相关的模块安装到适当的位置。在将驱动程序添加到内核之前,需要确保内核配置中启用了相关的配置选项。

TechCraze的博客 278

ubuntu 2.6.22 内核树建立

本文是参考了网上多篇帖子而写的算不上什么原创。唯一值得欣慰的只不过在本机上实现罢了。因为毕竟失败了几次。也因为本人是初学驱动编程 很多简单的问题在我来说是相当的困难的。望有识之士不要笑话。最后,希望本文能给刚学驱动而还没开头的人提供一些帮助。 刚看 OREILLY 写的《LINUX 设备驱动程序》时。作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码

emlinux的专栏 849

FUSB30x系列芯片Linux驱动程序开发

USB Type-C作为一种新型的连接标准,已经在众多设备中获得了广泛的应用。它解决了传统USB接口正反插易损坏问题,并拥有更好的正反面可插拔的用户体验。USB Type-C还支持更高的数据传输速率,例如高达20Gbps的USB 3.1标准,以及USB Power Delivery(PD)标准,允许以更高的功率进行充电。FUSB302驱动程序的整体架构遵循Linux内核的驱动程序开发标准。

weixin_29363791的博客 524

【超详细】Linux内核树的构建

想要编写自己的Linux驱动(driver),第一步是要先构建 Linux内核进程树。这里介绍构建进程树的具体步骤。

Xav Pun的博客 4421

告别VBA!用Python+PyWin32自动化你的SolidWorks建模流程(附完整代码)

本文详细介绍了如何利用Python和PyWin32实现SolidWorks建模流程的自动化,替代传统的VBA宏开发。通过环境配置、宏代码转换、高级开发模式及工程化实践等实战内容,帮助机械设计师构建高效、可维护的自动化工作流,显著提升设计效率。

weixin_30485379的博客 367

实战!在 AMD RX 9070 XT (16G) 上使用原生 Windows ROCm 7.1 部署 ComfyUI + Z-Image-Turbo

本文详细介绍了如何在Windows系统下为AMD Radeon RX 9070 XT显卡配置Z-Image-Turbo AI绘图环境。主要内容包括:安装VS Build Tools和最新显卡驱动,配置Conda Python 3.12环境,安装ROCm 7.1.1 SDK及PyTorch适配版本,部署ComfyUI可视化界面。重点解决了AMD显卡在AI绘图中的适配问题,通过--use-split-cross-attention参数优化显存使用,最终成功搭建了可在消费级16G显存设备上运行的AI绘图环境

qq_33614778的博客 4701

Ubuntu编译并安装新驱动程序

Ubuntu编译并安装新驱动程序 内容 以编译模块的方法在ubuntu内核中增加一个新的设备驱动程序,功能为实现简单的字符设备(如键盘)读写。 环境 ubuntu版本:16.04.6 内核版本:4.15.0-74-generic 虚拟机:VMware 步骤 1.安装源码和工具包 执行命令查看是否安装源码。 ls -l /usr/src 执行命令查看内核版本。 uname -r 查看当...

Milaaa__的博客 4063

按照autoware.universe官方从零搭建自己的自动导航小车(三)(续)

本文介绍了在Autoware框架下完善自定义传感器套件描述包的详细过程。主要内容包括:1)创建传感器描述包tinyplc_sensor_kit_description,包含YAML标定文件和URDF模型;2)配置传感器与车辆基座的相对位姿,实现sensor_kit.xacro和sensors.xacro宏文件;3)更新sensor_kit.launch.xml文件以集成激光雷达和GNSS/IMU驱动。通过xacro验证URDF模型正确性后,下一步计划接入Helios16激光雷达数据并在Rviz2中验证点云显

qq_45335326的博客 1273

【转】linux驱动程序开发环境配置

原文链接:http://hi.baidu.com/igtdqoihjhbacsq/item/9b937ad7c69d4311d78ed091 我试过hzxing的这个方法,在我的64位 10.04的ubuntu上运行过,方法能行得通。 感谢hzxing! 以下是文章正文 ******************************************** hzxing101

Kevin的专栏 1061

[VisionPro] CogPMAlignTool 工具详解

[VisionPro] [CogPMAlignTool] [模板匹配]

weixin_43163656的博客 1万+

信息学奥赛一本通高手训练1680:序列

题目 代码 #include<cstdio> #include<iostream> #include<cmath> #define LL long long using namespace std; const LL N = 1400000+7; const LL mod = 1e9+7; int n, t; LL pos[N], sum[N], ans[N]; struct node{ LL ll, rr; }a[N]; int main(){ p

qingfeixueyue的博客 470

SigmaStudio进阶技巧:如何用ADAU1701实现60段EQ与防啸叫算法

本文深入探讨了如何在ADAU1701 DSP芯片上实现专业级音频处理系统。通过精密的资源规划与架构设计,详细讲解了构建高达60段参数均衡器(EQ)的有效方法,并集成了移频与自适应陷波双策略的智能防啸叫算法。内容涵盖从SigmaStudio工程优化、算法模块组合到系统联调实战的全流程,旨在帮助中高级开发者充分利用ADAU1701性能,打造稳定、高效的音频处理解决方案。

weixin_28256233的博客 387

(转)linux驱动程序开发环境配置

刚看 O'REILLY 写的《LINUX 设备驱动程序》时。作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。那怎么建立呢?为此上网“翻云覆雨”起来而结果却是“惨败而归“。 为此托了一天又4个小时(当然包括吃饭睡觉的时间),连个简单的 hello wrold 都没实现。(书中p22页最简单也最没用的驱动事列) 不过功夫不负有心人。在今天...

weixin_34120274的博客 87

Google Earth Engine:LandTrendr (Landsat Collection 2)全更新使用(代码调用+UI交互)

本文介绍了使用Landsat Collection 2进行连续变化监测的分析方法,包含代码实现和可视化界面两部分。代码部分通过Google Earth Engine平台运行LandTrendr算法,设置参数包括时间范围、光谱指数、变化检测阈值等,最终生成变化幅度和检测年份的可视化图层,并将结果导出至Google Drive。可视化界面部分展示了基于LandTrendr的土地覆盖变化结果,结合Landsat影像进行分析。整个方法实现了从数据处理到结果展示的完整流程,适用于森林覆盖等环境变化监测。

此星光明博客 211

linux内核源码树构造,Linux驱动开发环境配置(内核源码树构造)

Linux驱动开发环境配置(内核源码树构造)初次接触Linux驱动程序开发,买了一本《Linux设备驱动程序》,第一件事当然就是构建开发环境了!!!它上面有一个Hello World的列子://hello.c#include#includeMODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){printk(KERN_ALERT "He...

weixin_35708609的博客 116

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux驱动开发环境配置 构造内核源代码树

初次接触linux驱动开发,这篇文章对配置linux驱动开发环境有很大帮助,在此留作记录,也希望对大家有帮助。同时感谢原作者的分享 来源:季义钦BLOG 作者:季义钦   初次接触Linux驱动程序开发,买了一本《Linux设备驱动程序》,第一件事当然就是构建开发环境了!!! 它上面有一个Hello World的列子: //hello.c #include #inclu

MR.Ting 1099

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NVIDIA Jetson Linux驱动程序包开发人员指南 - 快速入门指南

NVIDIA Jetson Linux驱动程序包开发人员指南 - 快速入门指南 去发现同类优质开源项目:https://gitcode.com/ 欢迎阅读《NVIDIA Jetson Linux驱动程序包开发人员指南 - 快速入门指南》。本指南旨在帮助开发者快速了解如何使用NVIDIA Jetson Linux驱动程序包,以及如何在项目中高效地集成相关功能。 内容概述 本指南涵盖了以下关键内容: ...

gitblog_06793的博客 469

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

手把手教你写第一个Linux驱动程序

说到写第一个linux内核驱动程序,再简单不过了。以前也写过,这次将做一个图形化的整理。我这里以我的开发环境tiny4412为主,我将在这上面写第一个驱动程序。首先,我在driver/目录下创建yangyx目录,在目录下新建一个hello.c和一个Makefilehello.c内容如下:hello.c包含的头文件就类似咱们写标准C一样的头文件。驱动程序__init ,加上这个,程序在编译的过程中会

Bruce.yang的嵌入式之旅 1万+

rm310 网络linux驱动程序。

RM310是一款高精度磁力计传感器,广泛应用于工业自动化、无人机导航和地质勘探等领域。在Linux系统中,RM310通常通过I2C或SPI接口与主机通信。开发Linux驱动程序需要了解内核模块编程、设备树配置以及传感器数据读取的基本原理。RM310是一款高精度磁力计传感器,广泛应用于工业自动化、无人机导航和地质勘探等领域。在Linux系统中,RM310通常通过I2C或SPI接口与主机通信。开发Linux驱动程序需要了解内核模块编程、设备树配置以及传感器数据读取的基本原理。

cfU_t2tw的博客 560

linux 内核树生成配置,Linux驱动开发环境配置内核源码树构造.doc

Linux驱动开发环境配置内核源码树构造Linux驱动开发环境配置(内核源码树构造)初次接触Linux驱动程序开发,买了一本《Linux设备驱动程序》,第一件事当然就是构建开发环境了!!!它上面有一个Hello World的列子://hello.c#include #include MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void)...

weixin_35930255的博客 119
上一篇: 各种数转换成字符串
下一篇: 内核编程的hello world!
AstrayLinux
博客等级 码龄15年 55粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值