Linux驱动
文章平均质量分 87
TrustZone_Hcoco
一个搞技术的读书人,妄图分享最干货的技术知识与世界运转的底层逻辑。公ZH:TrustZone
展开
-
Linux内核初始化过程中加载TCP/IP协议栈
Linux内核初始化过程中加载TCP/IP协议栈,从start_kernel、kernel_init、do_initcalls、inet_init,找出Linux内核初始化TCP/IP的入口位置,即为inet_init函数。原创 2024-09-11 20:20:06 · 1436 阅读 · 0 评论 -
底软驱动 | U-boot管脚复用
需要配置寄存器:pad控制器,Mux控制器,select input寄存器和Data寄存器配置IOMUX的必备工具:1.芯片原理图;2.芯片软件手册;3.内核源代码GPIO1_IO02代表GPIO1组寄存器的第02个寄存器,也就是第3位设置ALT5: 101模式。原创 2024-07-21 15:58:12 · 543 阅读 · 0 评论 -
底软驱动 | U-boot移植
【代码】底软驱动 | U-boot移植。原创 2024-07-21 15:45:43 · 295 阅读 · 0 评论 -
底软驱动 | U-boot启动内核
FDT(flattened device tree)**的一种实现机制,它使用一定语法和格式把需要的镜像(如kernel,dtb等)组合到一起生成一个image文件。a) **its(image source file)文件:**类似于dts,负责描述image的信息,需要自行构造。b) **itb文件: **最终得到的image文件,类似于dtb文件,u-boot直接对其识别和解析。c) **mkimage:**负责dtc的角色,通过解析its生成itb。长度较大,需要额外信息较长。实现简单,长度较小;原创 2024-07-21 15:43:00 · 810 阅读 · 0 评论 -
底软驱动 | uboot 与 代码重定位
重定位:把代码搬移到你想要的地址,本来程序是运行在运行地址处的,你可以通过重定位搬移到链接地址处。链接地址: 编译器对代码中的变量名、函数名等东西进行一个地址的编排,赋予这些抽象的东西一个地址,然后在程序中访问这些变量名、函数名就是在访问一些地址,这些地址我们称之为编译地址。运行地址:是指程序指令真正运行的地址,是由用户指定的,用户将运行地址烧录到哪里,也就是PC当前执行指令所在的实际地址,就是运行的地址。也就是真实在程序中运行的地址。由我们程序员自己定义,段的属性和特征也由我们自己定义。原创 2024-07-21 15:33:29 · 1115 阅读 · 0 评论 -
底软驱动 | 大厂面试爱考的C++内存相关
当基类指针指向子类对象时,如果基类的析构函数不是。原创 2024-07-15 21:57:58 · 1843 阅读 · 0 评论 -
底软驱动 | 块设备文件与文件系统的关系
Linux操作系统秉承“一切皆文件”的设计思想,将所有的设备页看作文件来进行处理。目前的Linux版本中,当内核发现一个块设备时,用户空间会利用udev这一数据结构以及相关的操作来为块设备创建其所需的块设备文件。关于块设备文件,可以从两方面来进行理解。从块设备文件的外部表现来看,它是属于某个外部文件系统上的一个文件。通常Linux内核将其存放在/dev目录下,用户像对常规文件一样来对其进行访问。原创 2024-07-14 20:49:54 · 895 阅读 · 0 评论 -
底软驱动 | 字符设备基础
/fops结构体dev_t dev;//设备号(包含主设备号和次设备号);dev_t类型:typedef u_long dev_t;cdev_alloccdev_initcdev_addcdev_del(2)设备号:主设备号+次设备号MKDEV:由一个主设备号和次设备号算出设备号MAJOR:从设备号提取主设备号MINOR:从设备号提取次设备号代码示例:新的接口注册字符设备驱动需要两步(定义一个全局cdev结构体)│├── 模块安装函数xxx。原创 2024-07-14 20:49:42 · 946 阅读 · 0 评论 -
底软驱动 | Linux字符设备驱动开发基础
/fops结构体dev_t dev;//设备号(包含主设备号和次设备号);dev_t类型:typedef u_long dev_t;cdev_alloccdev_initcdev_addcdev_del(2)设备号:主设备号+次设备号MKDEV:由一个主设备号和次设备号算出设备号MAJOR:从设备号提取主设备号MINOR:从设备号提取次设备号代码示例:新的接口注册字符设备驱动需要两步(定义一个全局cdev结构体)│├── 模块安装函数xxx。原创 2024-07-13 18:14:21 · 749 阅读 · 0 评论 -
底软驱动 | 动态内存管理
int i;int a[];// 也可写成 int a[0]}Test;原创 2024-07-13 18:02:20 · 655 阅读 · 0 评论 -
面试真题 | 内存泄漏的原因,内存泄漏如何避免?内存泄漏如何定位?
内存溢出 OOM (out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。原创 2024-07-13 17:56:58 · 1325 阅读 · 0 评论 -
底软驱动 | 一文搞懂块设备
本文详细叙述了块设备的基本结构体以及块设备从挂载到访问的全部过程,由此可以对块设备有一个全面的了解。原创 2024-07-13 17:28:19 · 927 阅读 · 0 评论 -
底软驱动 | 进程间通信之共享内存和信号量
共享内存和信号量是有着相似性有可以共同使用从而完成进程通信的手段。下面引用极客时间中的两幅图来总结二者的整个过程。原创 2024-07-13 09:18:46 · 851 阅读 · 0 评论 -
底软驱动 | Linux进程间通信——使用共享内存
共享内存就是允许两个不相关的进程访问同一个逻辑内存。不同进程之间共享的内存通常安排为同一段物理内存。,就好像它们是由用C语言函数malloc分配的内存一样。而。。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。原创 2024-07-13 09:17:16 · 820 阅读 · 0 评论 -
底软驱动 | Linux用户空间与内核空间通信(Netlink通信机制)
我们看一下内核代码的逻辑,收到用户消息后,根据消息中的pid发送回去,而pid为0,内核并不认为这是用户程序,认为是自身,所有又将回发的10个消息发给了自己(内核),这样就陷入了一个死循环,而用户态这时候进程一直处于D。下面分析这三处设置pid分别有什么作用,首先A和B位置的比较好理解,这是在地址(sockaddr_nl)上进行的设置,就是相当于设置源地址和目的地址(其实是端口),只是注意B处设置pid为0,0就代表是内核,可以理解为内核专用的pid,那么用户进程就不能用0做为自己的pid吗?原创 2024-07-13 09:12:09 · 894 阅读 · 0 评论 -
底软驱动 | linux内核空间和用户空间如何通信?
Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式,一般不用Netlink。除非需要用到Netlink的广播特性时。那么Netlink有什么优势呢?一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,但是Netlink可以实现双工通信。原创 2024-07-12 22:46:27 · 870 阅读 · 0 评论 -
底软驱动 | 用户空间和内核空间通讯
假如,你向内核发送了一个消息需要获取内核中某些信息,比如路由表,或其他信息,如果路由表过于庞大,那么内核在通过Netlink向你返回数据时,你可以好生琢磨一下如何接收这些数据的问题,毕竟你已经看到了那个输出队列了,不能视而不见啊。消息序列号一般和NLM_F_ACK类型的消息联合使用,如果用户的应用程序需要保证其发送的每条消息都成功被内核收到的话,那么它发送消息时需要用户程序自己设置序号,内核收到该消息后对提取其中的序列号,然后在发送给用户程序回应消息里设置同样的序列号。有点类似于TCP的响应和确认机制。原创 2024-07-12 14:01:03 · 645 阅读 · 0 评论 -
底层软件 | 十分详细,为了学习设备树,我写了5w字笔记!
由于一个SoC可能对应多个设备(一个SoC可以对应多个产品和电路板),这些.dts文件势必须包含许多共同的部分,Linux内核为了简化,**把SoC公用的部分或者多个设备共同的部分一般提炼为.dtsi,**类似于C语言的头文件。(我要解析的就是.dtsi文件)其他的设备对应的.dts就包括这个.dtsi。这个和我写bp那里有点相似的思维,果然include包含世界。原创 2024-07-04 22:46:31 · 851 阅读 · 0 评论 -
【转】超详细分析Bootloader到内核的启动流程(万字长文)
Bootloader的启动过程可以通常多阶段的 Bootloader能提供从固态存储设备上启动的 Bootloader大多都是两阶段的启动过程。第一阶段使用汇编来实现,它完成一些,并调用第二阶段的代码;第二阶段则通常使用C语言来实现,转载 2024-07-04 15:37:49 · 271 阅读 · 0 评论 -
底层软件 | Linux内核启动之zImage自解压过程
顶层vmlinux ---->如果要分析zImage的反汇编反汇编文件,可将arch/arm/boot/compressed/vmlinux进行反汇编,对顶层的vmlinux反汇编得到的是未压缩的内核的反汇编文件,这个vmlinux才是真正的Linux内核。原创 2024-07-04 15:13:47 · 847 阅读 · 0 评论 -
底层软件 | 设备树、设备注册、驱动注册与驱动匹配
前面我们学习了设备如何和驱动匹配,也学习了设备树。一直觉得,需要有一篇文章系统、项目般的结合讲解一下,加深一下影响,正当我准备动笔之时,发现了一篇很不错的文章!就分享给大家一起来看看设备树、设备驱动模型是如何相互结合的。文章以背光调整设备为例,记录设备描述,设备注册,驱动注册,驱动与设备匹配的过程。原创 2024-07-04 11:30:12 · 1152 阅读 · 0 评论 -
底层软件 | Linux 总线、设备、驱动模型的探究
总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。举个例子,充电墙壁插座安静的嵌入在墙面上,无论设备是电脑还是手机,插座都能依然不动的完成它的使命——充电,没有说为了满足各种设备充电而去更换插座的。所谓高内聚低耦合是模块内各元素联系越紧密就代表内聚性就越高,模块间联系越不紧密就代表耦合性低。所以高内聚、低耦合强调的就是内部要紧紧抱团。设备和驱动就是基于这种模型去实现彼此隔离不相干的。这里,有的读者就要问了,高内聚、低耦合的软件模型理解,可设备和驱动为什么要采用这种模型呢?原创 2024-07-04 10:48:01 · 932 阅读 · 0 评论 -
底层软件 | Linux设备驱动模型和sysfs文件系统
综上述分析,可以看到驱动注册的过程中,会尝试寻找总线上可以与之匹配的设备;同样地,设备注册的过程中,也会尝试寻找总线上可以与之绑定的驱动。从sysfs的角度,可以清楚地看到total 0bindueventunbindtotal 0... ...total 0modaliaspower/ueventtotal 0。原创 2024-07-04 10:22:38 · 1159 阅读 · 0 评论 -
proc文件系统怎么玩三?
前面我们看了这个怎么玩,这里我们来看看怎么用?原创 2023-06-08 10:56:22 · 108 阅读 · 0 评论 -
proc文件系统怎么玩二?
最近不是在搞测试嘛,需要使用到proc。【proc文件系统怎么玩?这个是可以看一下的,今天来跟着前辈来学习一下更进一步的关于proc源码的东西。一直以为PROC文件系统很是晦涩难懂,平时仅仅是使用它,不愿意去触碰内核中的具体实现。今天突发奇想,想看看里面究竟是怎么实现的,结果……真是大跌眼镜,没想到里面并不复杂关于PROC文件系统的功能以及在Linux中的地位就不多说了,在用户空间和内核空间交互的界面也扮演者举足轻重的地位。转载 2023-06-08 10:40:09 · 211 阅读 · 0 评论 -
Linux设备驱动中的并发控制(四)
并发和竞态广泛存在,中断屏蔽、原子操作、自旋锁和互斥体都是解决并发问题的机制。中断屏蔽很少单独被使用,原子操作只能针对整数进行,因此自旋锁和互斥体应用最为广泛。自旋锁会导致死循环,锁定期间不允许阻塞因此要求锁定的临界区小。互斥体允许临界区阻塞,可以适用于临界区大的情况。原创 2023-05-21 17:18:48 · 127 阅读 · 0 评论 -
Linux设备驱动中的并发控制(三)
信号量(Semaphore)是操作系统中最典型的用于同步和互斥的手段,信号量的值可以是0、1或者n。信号量与操作系统中的经典概念PV操作对应。该函数初始化信号量,并设置信号量sem的值为val。,因此不能在中断上下文中使用。该函数功能与down类似,不同之处为,因为down()进入睡眠状态的进程不能被信号打断,但因为该函数尝试获得信号量sem,如果能够立刻获得,它就获得该信号量并返回0,否则,返回非0值。它不会导致调用者睡眠,可以在中断上下文中使用。该函数释放信号量sem,唤醒等待者。原创 2023-05-21 15:58:34 · 183 阅读 · 0 评论 -
Linux设备驱动中的并发控制(二)
自旋锁(Spin Lock)是一种典型的对临界资源进行互斥访问的手段,其名称来源于它的工作方式。**为了获得一个自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设置(Test-And-Set)某个内存变量。**(为什么需要执行一个原子操作?)由于它是原子操作,所以在该操作完成之前其他执行单元不可能访问这个内存变量。**如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行**;**如果测试结果表明锁仍被占用,程序将在一个小的循环内重复这个“测试并设置”操作,即进行所谓的“原创 2023-05-18 11:40:33 · 246 阅读 · 0 评论 -
Linux设备驱动中的并发控制(一)
在Linux设备驱动中必须解决的一个问题是,并发的访问会导致竞态,即使是经验丰富的驱动工程师也会常常设计出包含并发问题bug的驱动程序。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。一起了解一下。原创 2023-05-18 10:08:33 · 311 阅读 · 0 评论 -
字符设备驱动(2):globalmem虚拟设备实例描述
内核中预定义了一些I/O控制命令,如果某设备驱动中包含了与预定义命令一样的命令码,这些命令会作为预定义命令被内核处理而不是被设备驱动处理,下面列举一些常用的预定义命令。FIOCLEX:即File IOctl Close on Exec,对文件设置专用标志,通知内核当exec()系统调用发生时自动关闭打开的文件。FIONCLEX:即File IOctl Not Close on Exec,与FIOCLEX标志相反,清除由FIOCLEX命令设置的标志。原创 2023-05-17 10:09:27 · 312 阅读 · 0 评论 -
字符设备驱动(1):Linux字符设备驱动结构
在整个Linux设备驱动的学习中,字符设备驱动较为基础。本章将讲解Linux字符设备驱动程序的结构,并解释其主要组成部分的编程方法。原创 2023-05-17 09:30:10 · 358 阅读 · 0 评论 -
【转】Linux sysfs设备驱动管理简介
sysfs是非持久性虚拟文件系统,它提供系统的全局视图,并通过它们的kobiect显示内核对象的层次结构(拓扑)。每个kobiect显示为录和目录中的文件,目录代表相关kobject导出的内核变量。这些文件称为属性,可以读取或写入。如果任何已注册的kobiect在sysfs中创建目录,则目录的创建位置取决于kobiec的父项(它也是kobiect)。这些目录自然创建为kobject父项的子目录。这向用户空间出显示了内部对象的层次结构。sysfs 中的顶级目录表示对象层次结构的共同祖先,即对象所属的子系统。转载 2023-05-16 22:07:56 · 388 阅读 · 0 评论 -
udev用户空间设备管理
Linux用户空间的文件编程有两种方法,即通过Linux API和通过C库函数访问文件。用户空间看不到设备驱动,能看到的只有与设备对应的文件,因此文件编程也就是用户空间的设备编程。Linux按照功能对文件系统的目录结构进行了良好的规划。/dev是设备文件的存放目录,devfs和udev分别是Linux 2.4和Linux 2.6以后的内核生成设备文件节点的方法,前者运行于内核空间,后者运行于用户空间。Linux 2.6以后的内核通过一系列数据结构定义了设备模型,原创 2023-05-16 21:51:28 · 490 阅读 · 2 评论 -
devfs
devfs(设备文件系统)是由Linux 2.4内核引入的,引入时被许多工程师给予了高度评价,它的出现使得设备驱动程序能自主地管理自己的设备文件。,使用的register_chrdev()和unregister_chrdev()在Linux 2.6以后的内核中仍被采用。是被普遍采用并值得大力推荐的好方法。代码清单5.5给出了一个使用devfs的范例。驱动程序应调用下面这些函数来进行设备文件的创建和撤销工作。在Linux 2.4的设备驱动编程中,分别在。代码中第7行和第23行分别用于。原创 2023-05-16 21:19:36 · 191 阅读 · 0 评论 -
驱动工程师成长历程是怎样的?
来自知乎雅诺。原创 2023-05-16 20:48:01 · 209 阅读 · 0 评论 -
Linux文件系统与设备驱动
由于字符设备和块设备都良好地体现了“一切都是文件”的设计思想,掌握Linux文件系统、设备文件系统的知识就显得相当重要了。原创 2023-05-16 20:23:27 · 510 阅读 · 0 评论 -
proc文件系统怎么玩?
(1)proc是虚拟文件系统,虚拟的意思就是proc文件系统里的文件不对应硬盘上任何文件,我们用去查看proc目录下的文件大小都是零;(2) proc文件系统是开放给上层了解内核运行状态的窗口,通过读取proc系统里的文件,可以知道内核中一些重要数据结构的数值,从而知道内核的运行情况,也可以方便调试内核和应用程序;(3) proc文件系统的思路:在内核中构建一个虚拟文件系统/proc,内核运行时将内核中一些关键的数据结构以文件的方式呈现在/proc目录中的一些特定文件中,这样相当于。原创 2023-04-26 21:02:40 · 695 阅读 · 0 评论 -
Linux驱动的软件架构(三):主机驱动与外设驱动分离的设计思想
Linux设备驱动开发详解》的学习笔记。原创 2022-10-31 23:45:51 · 466 阅读 · 0 评论 -
Linux驱动的软件架构(二):设备驱动的分层思想
在Linux 2.6以后的设备驱动模型中,需关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而。一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,原创 2022-10-31 23:37:16 · 1852 阅读 · 0 评论 -
Linux驱动的软件架构(一):驱动的软件设计模式理念
这个内容是我观看《Linux设备驱动开发详解》的学习笔记,其实书里面是先讲了关于驱动的很多的基础知识,然后再讲驱动的软件架构。但是我最近深深地沉迷于自顶向下的学习逻辑,所以打算先对整个驱动有了框架之后,再带着这个学习的过程中的疑惑与思维去学习基础。老师是基于globalmem和globalfifo两个虚拟得驱动开始讲解的,所以先说一下这两个是什么?原创 2022-10-31 23:13:41 · 1402 阅读 · 0 评论