![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 78
一只青木呀
life,just smile
展开
-
如何知道你的Linux内核占用的内存大小?
并且是通过slab分配的内存,所以知道slab的内存大小就知道了kmalloc的大小。其中每个字段的含义可以在内核的文档中找到,路径如下:/Documentation/filesystems/proc.txt。综上所述,当前内核所占用的内存大小为:15824K + 6632KB + 104KB = 22M。所以我们得到这些乱七八糟的段使用的内存大小为(也就是内核保留的内存):15824K。故内核堆内存为: 6060 kB + 572 KB = 6632KB。可以看到进程的页表大小为:104 kB。原创 2022-11-28 12:03:26 · 7493 阅读 · 0 评论 -
Linux- struct list_head简介
在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用。Linux内核中的链表方式与众不同,他不是将数据结构塞入链表,而是将链表结点塞入数据结构。链表代码在中声明。};next指向下一个链表结点,prev指向前一个链表结点。原创 2022-10-24 22:21:05 · 2911 阅读 · 0 评论 -
container_of宏简介
这里使用的是一个利用编译器技术的小技巧,即先求得结构成员在结构中的偏移量,然后根据成员变量的地址反过来得出主结构体的地址。这句代码意思是用typeof()获取结构体里member成员属性的类型,然后定义一个该类型的临时指针变量__mptr,并将ptr所指向的member的地址赋给__mptr;首先看下typeof,是用于返回一个变量的类型,这是GCC编译器的一个扩展功能,也就是说typeof是编译器相关的。可以看出container_of宏,可以完美的通过结构体变量指针和结构体类型的到结构体的首地址。原创 2022-10-13 23:01:59 · 801 阅读 · 0 评论 -
Linux-进程调度相关的系统调用简介
Linux提供了一个系统调用族,用于管理与调度程序相关的参数。这些系统调用可以用来操作和处理进程优先级、调度策略及处理器绑定。并且这些系统调用都包涵在C库中,也可用man手册查看。原创 2022-10-08 23:22:21 · 1538 阅读 · 1 评论 -
Linux-进程调度简介
交互式进程:这些进程常常与用户进程交互。因此,需要很多的时间等待用户的输入。当接受到输入后,进程必须被很快唤醒,否则用户会发现系统反应迟钝。典型的交互式程序有:shell命令行、文本编辑程序及图形应用程序。批处理进程:这些进程不必与用户进行交互,因此经常在后台运行。实时进程:这些程序有很强的调度需要。这些进程绝不会被低优先级的程序阻塞。它们有一个短的响应时间,更重要的是,响应时间的变化应该很小。例如:从物理传感器上收集数据的程序。原创 2022-10-06 00:29:15 · 2059 阅读 · 0 评论 -
Linux-位图DECLARE_BITMAP宏
位图:用每一个bit来表示一个含义。比如你需要标记32个资源的占用情况,可以用一个int型变量(刚好32bit)来标记,bit位为0代表资源空闲,bit为1表示资源被占用,你通过位运算检查每个bit的值就知道对应资源的占用情况。原创 2022-10-02 11:43:45 · 1115 阅读 · 0 评论 -
Linux-进程简介
内核代码版本:2.6.11.1。原创 2022-09-28 22:02:24 · 733 阅读 · 2 评论 -
Linux-do_fork()函数及其他重要函数简介
内核版本2.6.11.1,每个内核版本都会有所差异。在代码中已添加注释所以就没更多的文字说明。原创 2022-09-23 11:15:45 · 883 阅读 · 1 评论 -
x86与x86-64数据格式与常用的汇编指令笔记
由于是从16位体系结构扩展成 32位的,Intel 用术语 “字(word)”表示16位数据类型。因此,称32位数为“双字(double words)”,称64位数为“四字(quad words )。标准 int 值存储为双字(32位)。指针(在此用 char *表示)存储为8字节的四宇,64 位机器木来就预期如此。x86-64 中.数据类型 1ong 实现为 64 位,允许表示的值范围较大。下图为C语言基本数据类型(x86-64):大多数GCC生成的汇编指令都有一个字符的后缀,表明操作数的大小。例:数据传原创 2022-06-19 11:57:24 · 2921 阅读 · 0 评论 -
Audio-PCM设备的创建
前言Linux内核版本:4.1.15主芯片:IMX6ULLcodec芯片:WM8960一、PCM编码PCM (Pulse Code Modulation) 是通过等时间隔(即采样率时钟周期)采样将模拟信号数字化的方法。PCM使用等间隔采样方法,将每次采样的模拟分量幅度表示为N位的数字分量(N = 量化深度),因此PCM方式每次采样的结果都是N bit字长的数据。CODEC 的本质是 ADC 和 DAC,那么采样率和采样位数就是衡量一款音频CODEC 最重要的指标。比如常见音频采样率有 8K、原创 2022-05-29 13:59:58 · 1382 阅读 · 0 评论 -
六、Audio-ALSA架构中的codec
一、codec简介处理器如果既想“听到”外界的声音,又想向外界传达自己的“心声”,那么就需要同时用到 DAC 和 ADC 这两款芯片。那是不是买两颗 DAC 和 ADC 芯片就行了呢?答案肯定是可以的,但是音频不单单是能出声、能听到就行。我们往往需要听到的声音动听、录进去的语音贴近真实、可以调节音效、对声音能够进行一些处理(需要 DSP 单元)、拥有统一的标准接口,方便开发等等。将这些针对声音的各种要求全部叠加到 DAC 和 ADC 芯片上,那么就会得到一个专门用于音频的芯片,也就是音频编解码芯片,英文名原创 2022-05-28 21:13:55 · 2588 阅读 · 1 评论 -
五、Audio-ALSA架构中的platform
一、Platform驱动的作用ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终通过CPU的数字音频接口(DA〉把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音频信号。在具体实现上,ASoC又把Platform驱动分为两个部分: snd_soc_platform_driver和snd_soc_dai_driver。其中,platform_driver负责管理音频数据,把音频数据通过dma或其他操作传送至原创 2022-05-27 21:29:43 · 852 阅读 · 0 评论 -
Audio-音频传输接口(I2S、PCM、PDM)
1、音频接口使用场景I2S和PCM(TDM)接口传输的数据是PCM编码格式的音频数据。PDM接口传输的数据是PDM编码格式的音频数据。2、I2S接口I2S(Inter-IC Sound)总线有时候也写作 IIS,I2S 是飞利浦公司提出的一种用于数字音频设备之间进行音频数据传输的总线。和 I2C、SPI 这些常见的通信协议一样,I2S 总线用于主控制器和音频 CODEC 芯片之间传输音频数据。因此,要想使用 I2S 协议,主控制器和音频 CODEC 都得支持 I2S 协议。I2S 接口需要 3原创 2022-05-26 16:04:09 · 31996 阅读 · 3 评论 -
四、Audio-ALSA框架中的machine驱动
machine简介ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和 Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容: Machine驱动负责处理机器特有的一些控件和音频事件(例如,当播放音频时,需要先行打开一个放大器)﹔单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工作ASoC的一切都从Machine驱动开始,包括声卡的注册,绑定Platf原创 2022-05-25 21:37:49 · 2395 阅读 · 0 评论 -
三、Audio-ALSA 中的platfrom、machine、codec
一、Linux ALSA 音频系统框架● ALSA COREalsa 核心层,向上提供逻辑设备(PCM/CTL/MIDI/TIMER/…)系统调用,向下驱动硬件设备(Machine/I2S/DMA/CODEC)● ASoC COREASoC:ALSA System on Chip,是建立在标准 ALSA 驱动上,为了更好支持嵌入系系统 和 应用于移动设备的音频 codec 的一套软件体系,它依赖于标准 ALSA 驱动框架。由三大部分组成,分别是 Machine、Platform、Codec。原创 2022-05-24 09:51:58 · 1115 阅读 · 1 评论 -
一、Audio-音频简介
一、音频简介音频是我们最常用到的功能,音频也是 linux 和安卓的重点应用场合。处理器要想“听到”外界的声音必须要把外界的声音转化为自己能够理解的“语言”,处理 器能理解的就是 0 和 1,也就是二进制数据。所以我们需要先把外界的声音转换为处理器能理 解的 0 和 1,在信号处理领域,外界的声音是模拟信号,处理器能理解的是数字信号,因此这 里就涉及到一个模拟信号转换为数字信号的过程,而完成这个功能的就是 ADC 芯片。同理,如果处理器要向外界传达自己的“心声”,也就是放音,那么就涉及到将处理器能理原创 2022-05-23 20:34:24 · 4085 阅读 · 0 评论 -
二、Audio-Linux ALSA整体框架
一、音频架构简介ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制.想了解更多关于alsa这一开源项目的信息和只是请查看一下网站:https://www.alsa-project.org/alsa-lib:在上图中可以看出ALSA对上曾提供a原创 2022-05-23 20:31:12 · 2053 阅读 · 1 评论 -
有线网络硬件接口简介
本篇文章的内容都是有线网络一、 嵌入式下的网络硬件接口嵌入式网络硬件分为两部分:MAC 和 PHY1、SOC 内部没有网络 MAC 外设SOC 与外部 MAC+PHY 芯片的连接如图:这种方案的优点就是让不支持网络的 SOC 能够另辟蹊径,实现网络功能,但是缺点就是网络效率不高,因为一般芯片内置的 MAC 会有网络加速引擎,比如网络专用 DMA,网络处理效率会很高。而且此类芯片网速都不快,基本就是 10/100M。另外,相比 PHY 芯片而言,此类芯片的成本也比较高,可选择比较少2、SO原创 2022-04-12 10:38:53 · 2614 阅读 · 0 评论 -
Linux-代码中如何提升文件权限?
Linux-代码中如何提升文件权限?1、代码中提升文件权限1、代码中提升文件权限在我们代码的运行中,比如想改我们当前系统用户的密码,那可不可以改呢?当然可以,但是密码记录在根目录下,这个目录下我们是没有权限去更改的,那为什么我们调用“passwd”能够更改成功呢?原因就是当我们调用passwd这个命令的时候,这个程序就临时拥有了文件拥有者属性,也就是root属性,此时我们也就可以更改了。如何判断程序是否有临时提升为文件拥有者权限的属性呢?如下图,还是以passwd为例:在这里我们发现我们一般原创 2021-10-16 11:27:24 · 676 阅读 · 2 评论 -
如何设置监听句柄为非阻塞模式?
1、设置监听句柄为非阻塞模式 flags = fcntl(sock, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(sock, F_SETFL, flags);原创 2021-10-03 09:54:51 · 290 阅读 · 6 评论 -
如何设置一个句柄为异步IO模式?
设置一个句柄为异步IO模式1、设置任何一个句柄为异步IO模式1、设置任何一个句柄为异步IO模式分为两步:1、把句柄绑定到当前进程//把sockfd句柄绑定到当前进程fcntl(sockfd, F_SETOWN, getpid())2、给句柄设置一个异步IO属性int on=1;ioctl(sockfd, FIOASYNC, &on)通过以上两步就可以打开一个句柄的异步IO模式。...原创 2021-10-03 09:44:59 · 260 阅读 · 0 评论 -
struct socket 简介
struct socketstruct socket状态socket操作函数集合struct file *filestruct sock *skstruct socket内核版本:2.6.2socket在内核中的变现形式,也就是我们通常所说的表示层的体现。struct socket { socket_state state; unsigned long flags; struct proto_ops *ops; struct fasync_struct *fasync_list;原创 2021-09-15 22:16:36 · 843 阅读 · 0 评论 -
Linux-USB驱动笔记(八)--Gadget Function驱动
Linux-USB驱动笔记(八)--Gadget Function驱动1、前言2、Gadget Function 驱动2.1、usb_function -- 配置的一个功能2.2、usb_request -- I/O请求2.3、usb_function_driver3、API函数1、前言在Linux-USB驱动笔记(四)–USB整体框架中有説到Gadget Function驱动,下面我们来具体看一下。Gadget Function就是指设备的功能,比如作为U盘,需要文件存储的功能,则需要File St原创 2021-09-13 22:14:45 · 2509 阅读 · 0 评论 -
Linux-USB驱动笔记(七)--设备控制器(UDC)驱动
@TOC1、前言在Linux-USB驱动笔记(四)–USB整体框架中有説到设备侧的设备控制器(UDC),下面我们来具体看一下。2、设备控制器(UDC)USB设备控制器(UDC)驱动指的是作为其他USB主机控制器的USB硬件设备上的底层控制器驱动。该硬件和驱动负责将一个USB设备依附于一个USB主机控制器上。UDC驱动位于/drivers/usb/gadget目录下。2.1、usb_gadget – USB从机设备struct usb_gadget { struct work_struct原创 2021-09-13 21:53:16 · 3692 阅读 · 0 评论 -
Linux-USB驱动笔记(五)--主机控制器驱动框架
Linux-USB驱动笔记(五)--主机控制器驱动框架1、前言2、主机控制器框架3、重要结构体3.1、usb_hcd -- 主机控制器驱动3.2、hc_driver -- 控制器操作函数3.3、ehci_hcd -- ECHI主机控制器4、API函数1、前言Linux-USB驱动笔记一Linux-USB驱动笔记二Linux-USB驱动笔记三Linux-USB驱动笔记(四)–USB整体框架2、主机控制器框架USB核心(USBD)是整个USB驱动的核心部分,一方面USBD对从USB主机控制器接收原创 2021-08-29 19:20:51 · 2191 阅读 · 0 评论 -
Linux-USB驱动笔记(四)--USB整体框架
Linux-USB驱动笔记(四)--协议解析1、前言2、 USB协议解析2.1、USB 描述符2.1.1、设备描述符2.1.2、配置描述符2.1.3、接口描述符2.1.4、端点描述符2.1.5、字符串描述符2.1.6、USB设备1、前言USB基础知识在前三篇笔记中。Linux-USB驱动笔记一Linux-USB驱动笔记二Linux-USB驱动笔记三2、 USB协议解析USB 协议中有很多的基础概念,我们来总结一下吧。之前在基础知识中,我们介绍过设备,配置,接口,端点等概念,它在Linux中有原创 2021-08-29 13:19:34 · 3014 阅读 · 0 评论 -
Linux-USB驱动笔记(三)
Linux-USB驱动笔记(三)1、前言2、USB接口类型3、USB枚举3.1、检测电压变化,报告Host3.2、Host发送Get_Status请求3.3、Host发送Set_Feature请求复位端口3.4、Hub建立设备和主机之间的信息通道3.5、 Host获取默认管道的最大包长度3.6、Host给设备分配一个地址3.7、Host获取设备的信息3.8、Host给设备挂载驱动3.9、设备驱动选择一个配置4、USB OTG4.1、OTG硬件结构4.2、OTG支持协议1、前言前两篇笔记地址如下:Lin原创 2021-08-29 12:16:06 · 1965 阅读 · 0 评论 -
Linux-USB驱动笔记(二)
Linux-USB驱动笔记(二)1、前言2、USB 拓扑结构3、USB的传输方式4、USB设备的逻辑组织1、前言这些笔记需要连着看,不然没有上下文感觉很难受,嘿嘿上一篇文章:Linux-USB驱动笔记(一)2、USB 拓扑结构USB 是主从结构的,也就是分为主机和从机两部分,一般主机叫做 Host,从机叫做 Device。主机就是提供 USB A 插座来连接外部的设备,比如电脑作为主机,对外提供 USB A 插座,我们可以通过 USB 线来连接一些 USB 设备,比如声卡、手机等。因此电脑带的原创 2021-08-29 11:58:22 · 1457 阅读 · 0 评论 -
Linux-USB驱动笔记(一)
这里写目录标题1、前言2、USB简介3、USB版本速率对比4、USB总线4.1、USB2.04.2、USB3.05、USB控制器类型1、前言USB的驱动非常的复杂,一下子去看源码也是一头雾水,下面记录下学习USB驱动的过程,后续也会有几篇笔记连续起来。2、USB简介USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB为解决即插即用需求而诞生,支持热插拔。USB协议版本有USB1.0、原创 2021-08-29 11:28:33 · 3052 阅读 · 3 评论 -
Linux中SPI驱动简介及其简单编写流程
Linux中SPI驱动简介及其简单编写流程1、SPI 驱动框架简介1.1、SPI 主机驱动1.1.1、申请 spi_master1.1.2、注册 spi_master1.2、SPI设备驱动1.3、spi_driver 注册示例2、SPI驱动的数据收发2.1、总结1、SPI 驱动框架简介SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口。不管是什么 SPI 设备, SPI 控制器部分的驱动都是一样,我们的重点就落在了种类繁多的 SPI 设备驱原创 2021-07-11 15:51:52 · 3072 阅读 · 1 评论 -
Linux中IIC驱动简介及其简单编写流程
Linux中IIC驱动简介及其简单编写流程1、Linux I2C 驱动框架简介1.1、I2C动框架下的几个重要成员1.1.1、I2C总线1.1.2、I2C驱动1.1.3、I2C设备1.1.4、I2C适配器1.1.5、小结2、IIC驱动简单编写流程2.1、例程框架1、Linux I2C 驱动框架简介Linux内核将 I2C 驱动分为两部分:①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。②、 I2C 设备驱动, I2C 设备驱动就是针对具体的原创 2021-07-11 11:28:47 · 3333 阅读 · 1 评论 -
Linux INPUT 子系统简介与编写流程
Linux INPUT 子系统简介与编写流程1、input简介2、生成的input驱动文件3、input_dev 结构体4、input 驱动编写流程4.1、申请 input_dev4.2、初始化 input_dev 的事件类型以及事件值4.3、注册到Linux内核4.4、释放input_dev4.5、注销 input设备4.6、input_dev 注册过程示例代码5、上报输入事件5.1、input_event 结构体5.2、上报流程1、input简介按键、鼠标、键盘、触摸屏等都属于输入(input)设原创 2021-07-10 21:33:48 · 786 阅读 · 2 评论 -
Linux中MISC驱动简介及其简单使用
Linux中MISC驱动简介及其简单使用1、MISC 设备驱动简介2、一般操作流程1、定义以及填充结构体2、注册MISC 设备3、卸载MISC 设备Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。正因为简单,所以它通常嵌套在platform 总线驱动中,配合总线驱动达到更复杂,多功能的效果。1、MISC 设备驱动简介MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。他可以夹杂到其它结构体当中,以丰富驱动的血肉。一般原创 2021-07-10 17:22:36 · 1439 阅读 · 2 评论 -
LINUX设备驱动模型之platform(平台)总线简介
@TOC1、什么是platform(平台)总线?/********************************************************/内核版本:4.1.15(含设备树)运行平台:IMX6ULL/********************************************************/相对于USB、PCI、I2C、SPI等物理总线来说,platform总线是一种虚拟、抽象出来的总线,实际中并不存在这样的总线。那为什么需要platform总线呢原创 2021-07-10 13:22:05 · 1650 阅读 · 1 评论 -
Linux中下半部的工作队列简介及其简单使用
Linux中下半部的工作队列简介及其简单使用1、简介2、使用流程1、定义并初始化2、调度工作队列3、参考事例如下1、简介工作队列是另外一种下半部执行方式,工作队列在进程上下文执行,工作队列将要推后的工作交给一个内核线程去执行,因为工作队列工作在进程上下文,因此工作队列允许睡眠或重新调度。因此如果你要推后的工作可以睡眠那么就可以选择工作队列,否则的话就只能选择软中断或 tasklet。Linux 内核使用 work_struct 结构体表示一个工作,在内核中的路径 include\linux\workq原创 2021-07-09 22:23:09 · 310 阅读 · 2 评论 -
Linux中下半部的tasklet简介及其简单使用
Linux中的上半部与下半部1、tasklet简介2、tasklet简单使用2.1、初始化tasklet2、调度 tasklet3、流程参考1、tasklet简介tasklet 是利用软中断来实现的另外一种下半部机制,Tasklets由tasklet_struct结构表示,每个结构体单独代表一个tasklet,在linux/interrupt.h中定义:struct tasklet_struct{ struct tasklet_struct *next; /* 下一个 tasklet */原创 2021-07-09 22:08:47 · 1293 阅读 · 0 评论 -
Linux内核中断简介及其简单使用
Linux内核中断简介及其简单使用1、前言2、中断的设备树相关信息3、中断使用流程1、获取中断号2、编写中断服务函数3、申请中断。4、释放中断1、前言在Linux驱动编写过程中,中断是非常频繁使用的功能。并且Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。2、中断的设备树相关信息①、 #interrupt-cells,指定中断源的信息 cells 个数②、 interrupt-controller,表示当前节点为中断控原创 2021-07-09 21:30:45 · 1174 阅读 · 3 评论 -
Linux内核定时器简介及其简单使用
内核定时器简介1、内核定时器简介2、关于定时器的API函数3、定时器使用流程1、内核定时器简介定时器是一个很常用的功能,需要周期性处理的工作都要用到定时器。 Linux 内核定时器采用系统时钟来实现。Linux 内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不需要做一大堆的寄存器初始化工作。在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此原创 2021-07-08 23:28:39 · 2499 阅读 · 1 评论 -
Linux中字符设备驱动框架的搭建
Linux中字符设备驱动框架的搭建1、字符驱动矿建的搭建2、总结流程为1、字符驱动矿建的搭建#include <linux/types.h>#include <linux/kernel.h>#include <linux/delay.h>#include <linux/ide.h>#include <linux/init.h>#include <linux/module.h>#include <linux/errn原创 2021-07-08 22:53:04 · 299 阅读 · 0 评论 -
Linux--Linux内核总线(bus)的意义及其作用
@TOC1、Linux内核中的总线作用在Linux内核中,总线属于核心层,是纯软件的东西。在Linux内核中总线左手牵着驱动右手牵着设备,总线的工作就是就是完成总线下的设备和驱动之间的匹配。也就是在左手中找到与右手相匹配的设备驱动,并完成他们之间的匹配。2、Linux内核中总线的表现形式Linux系统内核使用bus_type结构体表示总线,此结构体定义在文件include/linux/device.h,具体内容如下:struct bus_type { const char *name; c原创 2021-06-19 21:23:05 · 2273 阅读 · 0 评论