ARM嵌入式学习笔记——《设备驱动基础》(一)

简介: ARM嵌入式学习笔记——《设备驱动基础》

Linux设备驱动基础

  • 明确:Linux系统的两个空间:用户态(用户空间)和内核态(内核空间)。
  • 推荐:
  • 《Unix环境高级编程》第三版
  • 《Linux设备驱动程序》第三版
  • 《Linux内核设计与实现》第三版

用户空间的特点

  • 用户空间包含的软件就是各种应用程序(ls/cd/,),也包括自己编写的UC程序,QT程序,静态库,动态库等等,这些软件在运行的时候就运行在用户空间。
  • 用户空间的软件在运行的时候,对应的CPU核的工作模式就是user用户模式。
  • 用户空间的软件不允许直接访问内核空间的代码,地址和数据。要想访问内核空间必须只能通过系统调用。
  • Linux系统的4G虚拟地址空间中,用户空间每个进程独占前3G,用户虚拟地址范围:0x0000000xBFFFFFF。内核空间进程共享后1G,内核虚拟地址为:0xC0000000xCFFFFFF。
  • 用户空间的软件同样不允许直接访问外设的物理地址,要想访问外设的物理地址必须将物理地址映射到用户空间的虚拟地址上(简称用户虚拟地址),将来访问虚拟映射的用户虚拟地址就是在访问物理地址。
  • 用户空间的软件如果对内存进行非法访问,不会造成Linux系统的奔溃,但是进程将会被系统干掉。
  • 用户空间软件类似网络编程的客户端,它总是向Linux内核空间的软件发起一个服务请求,然后Linux内核空间根据请求完成需求,并且最终的结果返回给用户空间的软件。

Linux内核空间特点

  • 内核空间包含的软件就是uImage。

  • 包含七大子系统的内容,
  • 设备驱动程序(.ko)属于内核空间软件。
  • 内核空间的软件在运行的适合,CPU核的工作模式为SVC管理模式,内核空间的软件权限最高。

  • 内核空间的软件同样不允许直接访问外设的物理地址,要想访问外设的物理地址必须将物理地址映射到内核虚拟地址上,0XC000000~0XFFFFFFF。

  • 内核空间的软件如果对内存进行非法的访问,直接会导致Linux系统奔溃,类似Windows蓝屏。

Linux内核驱动开发基础:

int module_init(void);
void module_exit(void);
MODULE_LICENSE("GPL");


  • 内核程序使用的头文件位于Linux内核源码中。

  • 内核程序的入口函数要用module_init宏来修饰,并且入口函数的返回数据必须是int型。

  • 入口函数的形参列表为void。
  • 入口函数执行成功返回0,失败返回负值。
  • 当执行insmod安装内核程序到内核uImage中,或者采用编译在一起的方式(选择),当内核uImage在启动的时候,这两种情况内核uImage会自动调用入口函数。
  • 切记:入口函数执行成功,这个内核程序的生命周期才刚刚开始,并且内核程序会存储在内存中等待应用程序的访问(通过系统调用来间接访问)。
  • 内核程序的出口函数用module_exit修饰,出口函数的返回值和形参都是void,当执行rmmod从内核uImage中卸载内核程序或者采用不选择的方式编译uImage后。这两种情况内核uImage会自动调用出口函数。

  • 切记:一旦出口函数被调用,这个内核程序将会从内存中彻底清除,不能再为应用程序服务。
  • 任何内核程序,只要是一个.c文件,必须添加MODULE_LICENSE(“GPL”),否则内核会出错并且部分内核函数及变量无法使用。

  • 内核打印函数printk,只要是内核程序调用的函数,不是自己编写的就是内核源码提供的,一律不允许调用标准C库的函数。


Linux内核程序的编译

  • 内核程序的编译一定要关联内核源码(kernel),头文件和调用的函数都是位于内核源码中。

  • 回顾内核程序的编译步骤:

  • 拷贝内核程序到内核源码的某个目录下。
  • 修改Kconfig添加配置菜单。
  • 修改Makefile添加编译支持。
  • 对内核源码使用make menuconfig选择添加模块。
  • make uImage; make modules;
  • 总结:这种内核程序的编译过程极其繁琐,简化只需要一个Makefile即可解决。


编写解决问题的Makefile

cd /opt/drivers/day01/
vim Makefile
#将helloworld.o和uImage分开编译,单独编译
obj-m += helloworld.o
#all:伪目标,对应的命令当前执行make或者make all时执行。
#-C /opt/kernel :进入/opt/kernel目录下。
#SUBDIRS:子目录。
all:
    make -C /opt/kernel SUBDIRS=$(PWD) modules
#当执行make clean时进行清除操作
clean:
    make -C /opt/kernel SUBDIRS=$(PWD) clean
//将内核程序目标文件拷贝到根文件系统进行安装和卸载。
mkdir /opt/rootfs/home/drivers
cp helloworld.ko /opt/rootfs
#下位机测试:
#重启下位机,进入uboot命令执行:
setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/opt/rootfs  ip=192.168.1.110:192.168.1.8:192.168.1.1:255.255.255.0  init=/linxurc console=ttySAC0,115200 maxcpus=1
saveenv
tftp 0x48000000 uImage
bootm 0x48000000
#下位机Linux系统启动后执行:
cd /home/drivers
ls
    helloworld.ko
#将内核程序安装到uImage中
insmod helloworld.ko
lsmod
rmmod helloworld #从内核中卸载内核程序。
lsmod
相关文章
|
1月前
|
数据处理
基于ARM的嵌入式原理与应用:ALU的功能与特点
基于ARM的嵌入式原理与应用:ALU的功能与特点
|
5月前
|
存储 Ubuntu 编译器
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
|
5月前
|
Ubuntu Unix Linux
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)
|
5月前
|
Linux 编译器 语音技术
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)
|
4月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
|
5月前
|
存储 算法 Linux
详细解读ARM嵌入式整理
详细解读ARM嵌入式整理
34 0
|
6月前
|
安全 Unix Linux
【ARM】在NUC977上搭建基于boa的嵌入式web服务器
【ARM】在NUC977上搭建基于boa的嵌入式web服务器
178 0
|
30天前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
1月前
|
存储 Docker 容器
ARM架构鲲鹏主机BClinux离线安装docker步骤
下载并安装适用于ARM架构的Docker CE二进制文件,解压后移动至/usr/bin目录。创建docker组,配置systemd服务脚本(docker.service、docker.socket、containerd.service),重载systemd配置,启动并启用docker服务。编辑daemon.json配置存储驱动、镜像加速地址等,最后拉取所需镜像。
44 0
|
1月前
|
NoSQL MongoDB Docker
求助,有没有大神可以找到arm64架构下mongodb的3.6.8版本的docker镜像?
在Docker Hub受限的情况下,寻求适用于ARM架构的docker镜像资源或拉取链接,以便在x86架构上获取;内网中的机器为ARM架构,因此优先请求适合ARM的Docker镜像或Dockerfile,非常感激您的帮助。