WythePlus
这个作者很懒,什么都没留下…
展开
-
Linux内核的I2C读写寄存器
在日常I2C设备驱动开发过程,经常要对设备进行一些简单寄存器读写,可以利用以下函数进行封装。原创 2023-09-15 10:42:54 · 745 阅读 · 0 评论 -
Linux驱动I2C设备驱动
I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接集成电路(IC)之间进行数据传输。它由两根线组成:时钟线(SCL)和数据线(SDA)。I2C设备则是指使用I2C协议进行通信的各种外部硬件设备。I2C设备可以是各种芯片、传感器、存储器、扩展模块等。这些设备通过I2C总线与主控制器或其他设备进行连接,并通过发送和接收数据来实现通信和交互。每个I2C设备都有一个唯一的7位或10位地址,用于在总线上识别它。原创 2023-08-25 14:14:06 · 214 阅读 · 0 评论 -
Linux内核自旋锁应用
spin_lock、spin_lock_bh、spin_lock_irq和spin_lock_irqsave 都是用于实现自旋锁的函数。它们在不同的上下文环境中使用,具有不同的中断屏蔽级别和上下文切换机制。单核的话,只有发生中断会使任务被抢占,那么可以进入临界区之前先关中断,但是对多核CPU光关中断就不够了,因为对当前CPU关了中断只能使得当前CPU不会运行其它要进入临界区的程序,但其它CPU还是可能执行进入临界区的程序。原创 2023-08-11 10:03:22 · 243 阅读 · 0 评论 -
Linux内核中的UVC(USB Video Class)驱动
V4L2(Video for Linux 2)是Linux内核中的视频设备驱动框架,而UVC(USB Video Class)是一种使用USB接口的摄像头设备通信协议。在Linux内核中,V4L2和UVC之间存在以下关系:1. V4L2支持多种视频设备:V4L2是一个通用的视频设备驱动框架,它旨在支持各种类型的视频设备,包括USB摄像头、摄像头传感器、摄像头接口等。这样,V4L2可以在内核中集成不同类型的摄像头驱动程序。原创 2023-08-02 12:12:08 · 1990 阅读 · 0 评论 -
Linux内核自旋锁使用场景
spin_lock、spin_lock_bh、spin_lock_irq和spin_lock_irqsave都是在内核中用于同步访问共享资源的锁。它们在不同的上下文中使用,并具有一些区别。原创 2023-07-27 15:57:15 · 394 阅读 · 0 评论 -
等待队列原理
使用等待队里,通常我们会以wait_event wait_event_interruptible两个宏来令当前进程阻塞,下面来分析一下他们阻塞过程。主动放弃CPU,选择一个优先级更加高的进程运行,开始阻塞。当需要唤醒等待队列时,内核给我们以下几组宏。把等待队列放入等待队列链表中。原创 2023-07-26 14:08:39 · 55 阅读 · 0 评论 -
内核input子系统分析
Linux内核的输入子系统分为三层,分别为事件处理层、核心层、驱动层通常是输入设备驱动,如触摸屏TP、按键驱动等;接收到底层中断时,主动上报数据,将底层的硬件输入转化为统一事件形式,想输入核心(Input Core)汇报。是由Linux内核发布时已经写好的,它承上启下为驱动层提供输入设备注册与操作接口,如:input_register_device;通知事件处理层对事件进行处理;在/Proc下产生相应的设备信息。原创 2023-07-20 17:16:41 · 106 阅读 · 0 评论 -
工作与工作队列使用
struct work_struct是 Linux 内核中用于表示工作项(work item)的结构体,在 Linux 内核中,工作项是一项需要被异步执行的任务。通过创建一个 struct work_struct 对象,并将其添加到工作队列中,可以使得内核在适当的时机执行该工作项的回调函数。原创 2023-07-19 14:19:43 · 143 阅读 · 0 评论 -
insmod加载模块流程
insmod是Linux系统中用于加载内核模块的工具,Android中谷歌通过编写自己的命令解释器来实现bash,源码的位置在system\core\init\builtins.cpp命令行解释器的映射表,对应的函数是do_insmod函数对insmod 传参进行解释,有时候需要再insmod的时候传递一些参数,open打开ko文件,调用系统调用__NR_finit_module陷入内核。原创 2023-07-19 14:02:33 · 497 阅读 · 0 评论 -
Linux内核VFS的open
open系统调用定义在内核源码目录fs/open.c里面参数:dfd 文件描述符filename 文件具体路径名字flags打开文件标志位,方式mode 权限控制位。原创 2023-07-13 10:26:41 · 140 阅读 · 0 评论 -
linux kernel read write file 读写文件
最后强调一点: 如果能在linux native/app 层读写文件,尽量不要在Kernel 中去做这样的工作。通常我们只会在linux native/app 层 读写文件,但可能有一些非常特别的情况下,我们需要直接。因为这个可能带来安全性的问题,以及可能因为新增代码而影响Kernel稳定性。注意的是您在使用read_file & write_file 之前需要。在read_file & write_file 完成之后,需要。一定要成对的出现,不然将直接导致Kernel Crash.原创 2016-03-28 13:41:37 · 6970 阅读 · 0 评论 -
Linux的执行elf可执行文件流程
execve族系统调用用于运行一个新的进程,并且替换当前进程的内存映像(代码,数据,栈)为新进程的内存映像。这个系统调用会在指定的进程空间内加载一个新的程序,同时将参数和环境变量传递给新程序。execve族的调用可以让用户免于开发自己的shell或者cli程序,用现有的程序交互式地对系统进行操作,甚至可以在shell中启动其他进程。由以上代码可知,execve族系统调用主要是通过elf加载器解释加载到内存,再通过修改arm的pc sp指针,使得该elf可执行文件得以运行。原创 2023-07-05 15:41:10 · 576 阅读 · 0 评论 -
Linux内核的uevent机制
Linux内核的uevent机制是一种事件通知机制,用于在设备状态发生变化时通知用户空间。uevent代表"用户事件",它允许设备驱动程序和其他内核子系统在设备插入、移除、配置或其他相关事件发生时发送消息给用户空间。当一个设备插入到系统中时,内核会生成一个uevent并发送给用户空间的udev守护进程。udev进程负责接收uevent消息,并根据消息的内容进行设备管理和配置。udev可以根据设备的属性信息,为设备创建设备节点文件、加载驱动程序、设置设备权限等。原创 2023-06-30 10:55:49 · 1337 阅读 · 0 评论 -
Linux内核的proc文件系统
在proc文件系统中,每个进程都会在/proc目录下创建一个以进程ID命名的子目录,该目录中包含了关于该进程的各种信息,比如进程的运行状态、资源占用情况和相关的文件描述符等。此外,/proc目录下还会有其他类似的文件和目录,比如系统的硬件信息、内存使用情况等。可以看到,CPU使用了统一编址的,外设映射在物理地址上,例如System RAM就是物理内存System RAM映射在40370000-4037007f上,其中一组gpio寄存器映射物理地址40370000-4037007f上。原创 2023-06-29 09:32:10 · 124 阅读 · 0 评论 -
Linux内核启动流程
首先看到内核的编译链接lds脚本,以ARM为例,我们可以在kernel里面arch\arm\kernel找到该文件。vmlinux.lds.S是一个文件名,通常指的是 Linux 内核源代码中的链接脚本文件。链接脚本文件(Linker Script)是用于指导链接器(Linker)在链接可执行文件或库时如何排列和组织不同的代码和数据段。vmlinux.lds.S文件在 Linux 内核的构建过程中使用,它定义了链接器所需的内核段布局和链接规则。具体而言,vmlinux.lds.S文件是以汇编语言原创 2023-06-28 13:52:43 · 292 阅读 · 0 评论 -
Linux fork的内核实现
新进程被称为子进程,原始进程被称为父进程。子进程获得父进程的副本,但是它具有自己的进程ID和内存地址空间。在子进程中,fork将返回0,而在父进程中,fork将返回子进程的进程ID。Linux系统没有明确区分线程和进程区别,是通过clone_flags来区分,是否要共享父进程地址空间,全局变量,虚拟内存等;通过copy_process来复制父进程的信息,包括打开文件,信号,内存地址空间,全局变量等;1,该进程为内核进程,内核进程不需要管理用户空间的虚拟地址空间,故为NULL。下面分析系统调用的实现。原创 2023-06-28 09:59:45 · 128 阅读 · 0 评论 -
Linux驱动中断注册流程
当硬件设备有可用的中断时,此函数将调用对应的线程处理程序,以处理中断请求。在处理中断时,可以使用常用的函数如irq_to_desc()、irq_get_irq_data()来获取相关的irq_desc结构体指针。其中,irq是要请求的中断号,handler是传统的中断处理函数,thread_fn是线程化处理函数,irqflags指定中断请求标志,devname是设备名,dev_id是设备ID。注册中断服务函数,中断线程化的线程创建,使能中断,proc目录下面irq的文件创建。中断线程化内核线程的创建。原创 2023-06-27 09:50:55 · 319 阅读 · 0 评论 -
Linux内核Input输入子系统浅解
Linux输入设备总类繁杂,常见的包括有按键、键盘、触摸屏、鼠标、摇杆等等,他们本身就是字符设备,而linux内核将这些设备的共同性抽象出来,简化驱动开发建立了一个input子系统。子系统共分为三层,如图1所示。图1 input输入子系统 驱动层和硬件相关,直接捕捉和获取硬件设备的数据信息等(包括触摸屏被按下、按下位置、转载 2016-07-01 16:03:37 · 5374 阅读 · 1 评论 -
Linux的USB-Serial 代码跟踪
我们在Linux dev目录看到的ttyUSB*一系列的终端,这些读写在Linux底层是如何处理的呢?首先看USB serial 核心层,kernel\drivers\usb\serial\usb-serial.c文件里面实现static void __exit usb_serial_exit(void){usb_serial_console_exit();原创 2016-03-30 14:01:28 · 4250 阅读 · 0 评论