【Linux】设备驱动开发环境配置

在这里插入图片描述

博客主页:PannLZ
系列专栏:《Linux系统之路》
不要让自己再留有遗憾,加油吧!


文章目录

    • 1.1工具配置(Ubuntu)
    • 1.2获取源代码
    • 1.3配置构建内核
    • 1.4内核约定


1.1工具配置(Ubuntu)

$ sudo apt-get update
$ sudo apt-get install gawk wget git diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm
$ sudo apt-get install ncurses-dev lzop
$ sudo apt-get install gcc-arm-linux-gnueabihf

gawk:GNU awk,一个用于文本处理的编程语言。

wget:一个用于从网络上下载文件的自由工具。

git:一个分布式版本控制系统,用于跟踪和协调工作,既可以在小型项目中使用,也可以在大型项目中使用。

diffstat:一个程序,用于生成统计信息,以反映在一个补丁文件中添加、删除和修改了多少行。

unzip:一个用于解压缩ZIP文件的工具。

texinfo:一个官方的文档格式,用于GNU项目。

gcc-multilib:GNU编译器集合,支持多库。

build-essential:包含一些用于编译和安装Debian包的工具。

chrpath:一个用于修改ELF二进制文件的rpath或runpath的工具。

socat:一个用于读取、写入、重定向、更改、打开、关闭、连接和管理各种类型的I/O流的命令行工具。

libsdl1.2-dev:Simple DirectMedia Layer开发文件,一个跨平台的开发库,用于提供对音频、键盘、鼠标、操纵杆和图形硬件的低级别访问。

xterm:X Window系统的终端模拟器。

ncurses-dev:开发者用的新型curses库,包含了用于终端独立的I/O、屏幕优化和颜色的函数。

lzop:一个使用LZO库进行压缩的实用程序,它的主要优点是压缩和解压速度非常快。

1.2获取源代码

git clone https://github.com/torvalds/linux 
//创建一个名为linux的新目录,并从GitHub上克隆Linux内核的源代码到这个目录中
git checkout v4.1  
//在linux目录中执行这条命令。这条命令会切换到版本号为v4.1的Linux内核。

使用ls查看:

.arch/:Linux内核是一个快速增长的工程,支持
越来越多的体系结构。这意味着,内核尽可能通用。与
体系结构相关的代码被分离出来,并放入此目录中。该
目录包含与处理器相关的子目录,例如alpha/、arm/、
mips/、blackfin/等。
·block/:该目录包含块存储设备代码,实际上也
就是调度算法。
·crypto/:该目录包含密码API和加密算法代码。
·Documentation/:这应该是最受欢迎的目录。它
包含不同内核框架和子系统所使用API的描述。在论坛
发起提问之前,应该先看这里。
·drivers/:这是最重的目录,不断增加的设备驱
动程序都被合并到这个目录,不同的子目录中包含不同
的设备驱动程序。
·fs/:该目录包含内核支持的不同文件系统的实
现,诸如NTFS、FAT、ETX{2,3,4}、sysfs、procfs、
NFS等。
·include/:该目录包含内核头文件。
·init/:该目录包含初始化和启动代码。
·ipc/:该目录包含进程间通信(IPC)机制的实
现,如消息队列、信号量和共享内存。
·kernel/:该目录包含基本内核中与体系架构无关
的部分。
·lib/:该目录包含库函数和一些辅助函数,分别
是通用内核对象(kobject)处理程序和循环冗余码
(CRC)计算函数等。
·mm/:该目录包含内存管理相关代码。
·net/:该目录包含网络(无论什么类型的网络)
协议相关代码。
·scripts/:该目录包含在内核开发过程中使用的脚
本和工具,还有其他有用的工具。
·security/:该目录包含安全框架相关代码。
·sound/:该目录包含音频子系统代码。
·usr/:该目录目前包含了initramfs的实现。

Git下载太慢可以从国内的网站下载需要版本的内核源码https://mirrors.edge.kernel.org/pub/

1.3配置构建内核

大多情况下不需要从头开始配置。每个arch目录下面都有默认的配置文件可用,可以把它们用作配置起点:

ls arch/<you_arch>/configs/

对于x86处理器,可以在arch/x86/configs/找到配置文件,仅有两个默认配置文件:i386_defconfig和x86_64_defconfig,它们分别对应于32位和64位版本。对x86系统,内核配置非常简单:

make x86_64_defconfig
make zImage -j16
make modules
makeINSTALL_MOD_PATH </where/to/install>
modules_install

对于基于iMX6的主板,可以先执行ARCH=arm makeimx_v6_v7_defconfig,然后执行ARCH=arm makemenuconfig。前一个命令把默认的内核选项存储到.config文件中;后一个命令则根据需求来更新、增加或者删除选项。

构建自己的内核需要指定相关的体系结构和编译器。这也意味着,不一定是本地构建

eg.示例

进入源代码目录

cd linux-4.1

从当前机器的启动目录拷贝配置信息到源代码目录。这步操作的意思是我们编译内核的配置采用用当前环境一致的配置。

cp -v /boot/config-$(uname -r) .config

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

make menuconfig

【Linux】设备驱动开发环境配置_第1张图片

vi .config #可查看配置

【Linux】设备驱动开发环境配置_第2张图片

编译内核

make -j 10

make的-j命令(加速Linux程序编译)

make -j10意思即make最多允许10个编译器同时执行,提高编译速度,充分利用本机计算资源。

报错了(不止这一个错)

【Linux】设备驱动开发环境配置_第3张图片

解决方法->【Linux内核编译】编译linux4.1问题总结-CSDN博客

构建自己的内核需要指定相关的体系结构和编译器。这也意味着,不一定是本地构建

make bzImage
make modules_install		#安装模块
 make install		#安装内核

之后修改好grub文件(并更新),重启就可切换内核。

sudo update-grub
sudo reboot

【Linux】设备驱动开发环境配置_第4张图片

【Linux】设备驱动开发环境配置_第5张图片
【Linux】设备驱动开发环境配置_第6张图片

1.4内核约定

编写风格:位于/Documentation/process目录下,也可查看中文文档Linux 内核代码风格 — The Linux Kernel documentation

内核总是为其数据结构和函数提供两种可能的分配机制。下面是其中的一些数据结构:
·工作队列。
·列表。
·等待队列。
·Tasklet。
·定时器。
·完成量。
·互斥锁。
·自旋锁。

表示框架设备的数据结构总是动态分配的,每个都有其自己的分配和释放API。框架设备类型如下:

.网络设备。
·输入设备。
·字符设备。
·IIO设备。
·类设备。
·帧缓冲。
·调节器。
·PWM设备。
·RTC。

静态对象在整个驱动程序范围内都是可见的,并且通过该驱动程序管理的每个设备也是可见的。而动态分配对象则只对实际使用该模块特定实例的设备可见。

​ 内核通过类和设备实现面向对象的编程。内核子系统被抽象成类,有多少子系统,/sys/class/下几乎就有多少个目录。struct kobj ect结构是整个实现的核心,它包含一个引用计数器,以便于内核统计有多少用户使用了这个对象。每个对象都有一个父对象,在sysfs(加载之后)中会有一项。属于给定子系统的每个设备都有一个指向operations(ops)结构的指针,该结构提供一组可以在此设备上执行的操作。

你可能感兴趣的:(Linux系统之路,linux,运维,服务器)