随笔分类 -  RK3399-Linux内核驱动开发

Kprobe实现原理
摘要:通过前面有章调试方法概述的简单介绍,kprobe其实就是将某个要检测的指令备份,再替换成int3(x86)或者未定义指令(arm)来触发异常,再调用对应体系的异常处理函数来执行我们自定义的hook,执行完我们自定义的hook,再将备份的指令放回原来的位置继续往下执行,下面我们就来看下linux内核版 阅读全文
posted @ 2022-05-01 23:44 lzd626 阅读(299) 评论(0) 推荐(0) 编辑
可执行文件的格式
摘要:可执行文件格式 Bin flash上的需要直接运行的只能是raw binary格式的文件,BIN是将elf文件中的代码段,数据段,还有一些自定义的段抽取出来做成的一个内存的镜像,可以被CPU 运行的二进制文件。比如uboot Elf executable and link format,文件里面包含 阅读全文
posted @ 2022-04-26 21:56 lzd626 阅读(419) 评论(0) 推荐(0) 编辑
进程间通信基本概念
摘要:进程间通信 每个进程的地址空间都是独立的,所以要通信,就要通过内核实现 管道 匿名管道:比如dmesg | grep ov13850命令中的|就是一个管道;也可通过int pipe(int fd[2])系统调用创建两个读写的文件描述符,通过fork创建子进程,会复制文件描述符,直接在各自进程读写,就 阅读全文
posted @ 2022-04-18 21:49 lzd626 阅读(46) 评论(0) 推荐(0) 编辑
浅析v4l2架构
摘要:V4l2架构 sensor层 通过下面设备树我可以看到ov13850出图需要的硬件支撑sensor,mipi,isp,数据流从下至上 sensor作为i2c1的子节点,向上绑定mipi接口 通过kernel\drivers\media\i2c\ov13850.c注册驱动 在ov13850_probe 阅读全文
posted @ 2022-04-14 21:28 lzd626 阅读(1312) 评论(0) 推荐(1) 编辑
浅析系统调用
摘要:系统调用 系统调用框架 系统调用的参数传递,由用户态进入了内核态,所以既不能使用用户态的堆栈也不能直接使用内核态堆栈;所以系统调用的参数被写入CPU的寄存器;在进入内核态调用系统调用服务例程之前,通过使用SAVE_ALL宏把这些寄存器的值保存在内核态堆栈中:eax保存徐通调用号和返回值;ebx,ec 阅读全文
posted @ 2022-04-06 19:04 lzd626 阅读(67) 评论(0) 推荐(0) 编辑
spi总线解析
摘要:spi总线 时序 spi_master SPI 主机驱动的核心就是申请 spi_master,然后初始化 spi_master(被赋值的tranfer函数,对于不同soc,寄存器不一样,这个就是soc厂商的驱动开发实现的),通过平台总线match上之后,执行probe--最后调用 spi_bitba 阅读全文
posted @ 2022-03-10 20:28 lzd626 阅读(446) 评论(0) 推荐(0) 编辑
mmu浅析
摘要:MMU 功能 访问控制;虚拟地址(页)到物理地址(页框)的转换 转换过程 页由Frame Index(页框索引:与物理页框进行映射)和位p(present 存在位:本页的映射是否有效;映射无效,Frame Index部分为X,该位为0;映射有效则该位为1;虚拟地址=页号和偏移;物理地址=页框首地址+ 阅读全文
posted @ 2022-03-08 22:21 lzd626 阅读(65) 评论(0) 推荐(0) 编辑
网络驱动模型
摘要:网络基础 五层模型 物理层:负责把两台计算机连起来,然后在计算机之间传送0,1这样的电信号。 链路层:负责给这些0,1制定传送的规则,然后另一方再按照相应的规则来进行解读,比如以太网协议;通过mac地址来在计算机之间传输数据,在同一子网中,当主机A连着多台主机,想给主机B发数据包(包含了接收者的ma 阅读全文
posted @ 2022-03-08 22:11 lzd626 阅读(59) 评论(0) 推荐(0) 编辑
嵌入式开发常用调试方法
摘要:调试方法 printk 可在打印的字符串前加上等级 cat /proc/sys/kernel/printk能看到当前的等级信息,可修改为8 内核封装了printk的宏,自定义其打印格式,比如加上设备名称 DEBUG_LL和EARLY_PRINTK;为了在内核初始化控制台驱动driver/tty/se 阅读全文
posted @ 2022-03-08 22:08 lzd626 阅读(496) 评论(0) 推荐(0) 编辑
并发与竞争&负载均衡
摘要:并发与竞争 概念 概念:多个执行单元并行执行时,如果对共享资源发起访问就容易引起竟态 竟态条件:核与核的进程之间,核与核的中断之间,核中断与核进程之间,核内进程之间,核内进程与中断 编译乱序:打开编译器优化后,汇编码并没有严格按照代码的逻辑顺序 执行乱序:执行也不一定按汇编码顺序,缓存命中率高的访存 阅读全文
posted @ 2022-03-08 22:07 lzd626 阅读(52) 评论(0) 推荐(0) 编辑
进程管理
摘要:进程管理 进程概述 thread_info:保存了特定体系结构的汇编代码段需要访问的那部分进程的数据,放在内核栈顶,其中嵌入指向task_struct的指针,arm64架构通过current宏直接得到task_struct得到thread_info的地址,可以看出是直接存在sp_el0寄存器中的 再 阅读全文
posted @ 2022-03-08 22:03 lzd626 阅读(61) 评论(0) 推荐(0) 编辑
内存管理
摘要:内存管理 物理内存 struct pglist_data:在NUMA中内存访问速度一致的部分称为一个节点 struct zone:ZONE_DMA:0-16MB的页框,直接映射到内核空间; ZONE_NORMAL:16-896MB之间的内存页框,常规页框,直接映射到内核的地址空间; ZONE_HIG 阅读全文
posted @ 2022-03-08 22:02 lzd626 阅读(75) 评论(0) 推荐(0) 编辑
中断系统详解
摘要:中断 中断向量 在arm-linux中,中断号是gic区分不同中断的标志,中断向量是cpu区分不同中断类的标志 IRQ 硬件中断:由外设产生,将下一条要执行的指令的地址压入栈作为中断服务程序的返回地址 向量中断:直接跳转到预先提供的中断服务程序(比如stm32就时给每个中断提供了向量),多核的话由分 阅读全文
posted @ 2022-03-08 22:00 lzd626 阅读(272) 评论(0) 推荐(0) 编辑
mmc子系统浅析
摘要:MMC总线 用mmc子系统统一管理mmc(比如emmc),sd(比如sd卡),sdio(强调接口,另一端可是蓝牙,wifi等)等设备 核心层 /dricer/mmc/core.c将sd卡,mmc卡的共性抽象出来,特性则由struct mmc_bus_ops类型的mmc_sd_ops和mmc_ops和 阅读全文
posted @ 2022-03-08 21:56 lzd626 阅读(220) 评论(0) 推荐(0) 编辑
usb驱动概述
摘要:usb总线 描述符 设备/配置/接口/端点描述符;usb设备驱动是指接口驱动,即一个接口对应一个驱动 通信格式 USB总线上传输的数据是以包为基本单位的,一个包被分为不同的域,根据不同类型的包所包含的域是不一样的。不同的包有一个共同点,都要以同步域开始,紧跟着一个包标识符PID,最终以包结束符EOP 阅读全文
posted @ 2022-03-08 21:54 lzd626 阅读(531) 评论(0) 推荐(0) 编辑
总线,设备,驱动模型架构与paltfrom平台总线
摘要:驱动通用架构 注册总线 bus_register:bus_type_private的初始化,在这条总线目录下创建/bus/busname,/device, /driver 目录,初始化这条总线上的设备链表:struct klist klist_devices;初始化这条总线上的驱动链表:struct 阅读全文
posted @ 2022-03-08 21:50 lzd626 阅读(108) 评论(0) 推荐(0) 编辑
字符设备驱动
摘要:字符设备 注册设备号 每个设备都有设备号,主设备号用来区分驱动,从设备号用来区分具体设备;内核维护着一个以主设备号为key的全局哈希表,数据部分就是对应的驱动程序指针或同类驱动程序组成的数组的指针 动态:int alloc_chrdev_region(dev_t*dev, unsigned base 阅读全文
posted @ 2022-03-08 21:44 lzd626 阅读(83) 评论(0) 推荐(0) 编辑
uboot启动流程
摘要:Uboot启动流程 功能 Uboot一般有环境变量操作,内存操作,信息查询,网络操作 ,EMMC 和 SD 卡操作,FAT 格式文件系统操作,EXT 格式文件系统操作,系统引导等功能。 裸机启动 RK3399上电后,会从0xffff0000获取romcode并运行;先读取SDRAM(DDR)初始化代 阅读全文
posted @ 2022-03-08 21:41 lzd626 阅读(677) 评论(0) 推荐(0) 编辑
IIC驱动开发及调试
摘要:根据前篇iic驱动基本概念,可以做一个简单的总结 i2c-core postcore_initcall(i2c_init)->bus_register(&i2c_bus_type);i2c_add_driver(&dummy_driver);实现设备与驱动匹配检测的match,probe,remov 阅读全文
posted @ 2022-03-07 23:35 lzd626 阅读(295) 评论(0) 推荐(0) 编辑
IIC驱动基本概念
摘要:启动信号:scl为高,sda从高往低跳变 结束信号:scl为高,sda从低往高跳变 数据信号:scl为高,sda电平保持稳定,这个即为一位数据;scl为低,sda才能改变电平 空闲信号:scl,sda都为高,即释放总线 驱动框架: 总线驱动: I2C总线驱动就是 SOC的I2C 控制器驱动,也叫做I 阅读全文
posted @ 2021-10-23 22:04 lzd626 阅读(313) 评论(0) 推荐(0) 编辑




点击右上角即可分享
微信分享提示