自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

leo的博客

正在努力中。。。。。。。

  • 博客(87)
  • 收藏
  • 关注

原创 usb子系统大框架

稍微整理了下

2022-04-25 20:01:28 389

原创 regulator小风波---谁下了我的电

问题背景:第一版已经完成的情况,内核合入了一个drm的大patch,合入后,第一版的hdf出现亮屏后突然黑屏问题,且按power无法亮屏。问题必现 定位过程:通过几次复现,发现出现问题的时候会有这样的打印,几乎同时间,好的版本中没有红色部分打印[ 33.765684]vcc3v3_lcd0_n: disabling[ 33.765723] vcc3v3_lcd1_n: disabling[ 33.765772] pcie30_3v3: disabling此时示波器...

2022-03-31 00:30:03 2327 5

原创 Linux内核对进程信号处理流程

前辈分享的图,感觉画的特别好,非常清晰,收藏了

2022-03-25 15:45:52 272 1

原创 设备无法被正确枚举定位

现象:hdc无法使用定位:1.设备管理器中没有看到设备,提示无法识别usb设备根据现象初步分析是设备枚举失败了2.枚举失败的原因非常多,根据该项目背景,这次项目是因为同步最新代码所致,所以问题锁定在同步代码区间3.交叉测试:同一个内核+老的system ok同一个内核+新的system error根据交叉测试结果排除内核问题,问题聚焦在system4.查看hdc工作需要配置的很多节点,包括iProduct,iManufacturer 等,发现这些配置均ok5...

2022-01-05 11:06:09 2188

原创 我的心里一直有个操作系统梦

今天有一点小感悟,小记一下。工作已是快8年了,,从soc芯片原厂到方案商,从用linux到参与新的OpenHarmony 系统移植,一直在做与linux内核相关的工作,但是我的心里一直有个操作系统的梦,我一直想要写一个属于自己的操作系统。今天就做个开头吧,抽时间一点一点进行吧,加油...

2021-11-09 10:13:31 902 3

原创 充电流程汇总

111

2021-10-19 21:55:00 155

原创 dev下无法生成节点的分析思路和解决方法及原理

前言:本篇没有解决什么大问题,不神秘也不高深莫测,单纯记录,同时为其他碰到该问题的同仁提供思路,重点在于分析思路的整理,并使用流水帐的形式,试图讲清/dev下节点的生成原理1,背景为了调试方便,将之前直接编译进内核的驱动调整为module模式加载,即将驱动编译为.ko文件,通过insmod动态加载驱动。在未调整为module加载方式之前,系统启动后可以正常在dev下正常生成驱动节点 driver_test0,driver_test1将驱动编译为module后,在系统完全启动后,使用insmod 加载

2021-01-15 18:15:27 3560 1

原创 安卓内存的统计

DDR = totalmem + 预留内存 + 内核代码段(启动阶段的打印中可以看到)totalmem = free + used + lost (这三个数据在dumpsys meminfo 中可以看到)free = pss cached + kernel cached + free(/proc/meminfo中的free)used = pss used + kernel usedpss used(用户态使用内存) :在dumpsys meminfo信息中的pss oom adjust中可以看到细分

2020-08-06 00:21:21 239

原创 借助qemu使用gdb去跟踪和学习内核

这是一篇《使用qemu搭建linux内核开发环境详细教程》的续篇。需要合起来看 之前总结了一篇使用qemu搭建内核实验环境的文章,既然环境搭建起来了,那么就要用起来。跟踪内核代码,去实时看内核的走向,一直是一个不怎么容易的操作,要么缺乏硬件资源,要么缺乏软件环境,这里给出一种选择,使用qemu+gdb的方式,不依赖硬件,在我们自己的电脑上就可以完成这个过程。这里记录一下这...

2019-05-07 17:54:14 1756

原创 Sleep与delay 时间子系统案例2

有一个操作,发现在遥控器在遥控界面的时候在某个操作会出现很卡反应很慢的情况,但是其他的操作就不会。 拿到这个问题的时候会有点无法下手,但是静下心想一想应该想一个大概的方向出来: 1,遥控程序出现了问题,是不是哪里做了不应该的延时操作 2,查看下cpu的此时的占用我觉的应该先看cpu的占用,按照经验一般这种卡顿是cpu的性能受到影响 所以看了下cpu的占用,但是有个很奇怪的现象,有一...

2019-03-28 11:43:42 289

原创 一次奇怪的bug---对sysrq-trigger的虚拟化

背景:我们的系统做了虚拟化处理,系统存在多个init,每个init负责一个业务分支问题的产生:在某次操作的时候,上层应用中的一个进程会调用KillAllProcesses()接口,向节点/proc/sysrq-trigger写i,目的是kill掉当前系统中除了init进程外的其他子进程。static void KillAllProcesses() { android::base::Wri...

2019-03-26 11:51:11 477 2

原创 使用qemu搭建linux内核开发环境详细教程

目录一.安装交叉编译链(根据自己的需求去安装编译链,我这里安装的是32位)step1:下载编译链,执行命令:step2:解压源码step3:添加环境变量,使你的编译链全局可用step4:保存退出后使该变量生效:二,安装qemustep1:step2:step3:step4:step5:step6:三.下载内核step1:下载内...

2019-03-11 19:29:52 20616 13

原创 epoll

epoll标签(空格分隔): 多路复用epoll也是去查询drier中的poll回调函数

2018-02-18 22:30:36 249

原创 关于wait_event_timeout

关于wait_event_timeout标签(空格分隔): 等待队列http://bbs.chinaunix.net/thread-3615327-1-1.htmldo {                            &nbs

2018-02-18 22:28:54 2878

原创 杂七杂八

杂七杂八标签(空格分隔): 杂七杂八1.top的改善1.在内核线程中使用msleep的时候,内核top统计的时候会认为这种不可中断的线程仍然被占用,但实际上使用msleep是不会长时间占用cpu的。 使用可中断的msleep_interrupt,可以避免这个问题,可以使top时候的系统loading下降2.后台运行ctrl + z 进入后台 fg退出后台...

2018-02-18 22:27:00 631

原创 pr_xx打印级别的定义

标签(空格分隔): kernel的打印#define pr_warn pr_warning#define pr_notice(fmt, ...) \ printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)#define pr_info(fmt, ...) \ printk(KERN_INFO pr_fmt(fmt), ##__V...

2018-02-18 22:23:30 5624

原创 pr_debug和pr_dbg

(这节的前提是已经使能了printk)pr_debug和pr_dbg和其他的pr_xx的使用方法是不一样的。 其他诸如pr_info等更加高级别的pr_xx api只需要使能动态打印,同时使控制台的打印级别小于需要执行的pr_xx api即可 但是pr_debug不可以这样子,使能它需要更多的步骤 这是因为pr_debug的定义和其他pr_xx是不一样的#if defined...

2018-02-18 22:22:55 1741

转载 LINUX GPIO Kernel/User API

LINUX GPIO Kernel/User API标签(空格分隔): gpio子系统http://blog.csdn.net/yuan1125/article/details/46236689

2018-02-18 22:21:46 252

转载 device_tree

标签(空格分隔): device_treehttp://blog.csdn.net/lichengtongxiazai/article/category/2126587 http://21cnbao.blog.51cto.com/109393/1105647 http://www.embedu.org/Column/7506.html http://www.right.com.cn/...

2018-02-18 22:20:10 182

原创 driver使用dts

标签(空格分隔): device_treedriver使用dts的前提是driver已经是支持platform框架的driver,这样dts才可以发挥作用,因为dts和platform是配合工作的。step1:创建dts结构体static struct of_device_id xx_of_match[] = { {.compatible = "xx_tech,devi...

2018-02-18 22:18:28 1360

原创 c语言小知识

标签:c语言小知识取出一个数据中的第三个字节如何优雅的设置bit结构体强转指针和变量extern 的小风波if elif elsevolatile的作用小心翼翼的数组你真的会使用if吗if中的所谓真低级错误由互斥锁联想到程序设计不刷屏的打印while1中使用sleep时打印不输出退格的快捷键gettimeofday函数的使用ioctl拿不到值函数传递数组的...

2018-02-18 22:14:34 557

原创 GPIO子系统

http://blog.rongpmcu.com/gpiozi-xi-tong-he-pinctrlzi-xi-tong/#GPIO算是一种设备,有设备那我们就要对这个设备进行一个抽象,同时为了各种各样的GPIO设备会去抽象出一个gpio的核心层gpiolib.c,用于管理各种各种各样的gpio, (话外:感觉内核对于设备的管理最精髓的就是核心层总线和driver,device分开,devi...

2018-02-18 22:11:25 1237

原创 内核节拍

内核的节拍是选用一个时钟源作为滴答源,但是选择这个时钟源有个条件,就是这个时钟必须有计时功能,定时功能,硬件中断功能,即可以触发中断,这样才可以去产生tick。 软件上的tick正是在这个中断函数中实现的,当这个中断来临后,回去调用系统的evt->event_handler(evt);目前见到的有两种做法: 1:使用外置的定时器(一般在南桥) 2:使用cpu core内部的定时器 ...

2018-02-18 22:09:38 299

原创 HZ,jiffies,Tick

HZ:linux核心每隔固定周期会发出timer_interrupt,HZ是用来定义1秒内这个中断发生的次数; 如果HZ配置是1000的话,节拍就是1ms,即线程的调度颗粒是1ms 配置的地方 Kernel Features ---> Timer frequency (1000 Hz) ---> ...

2018-02-18 22:08:33 324

原创 arm timer

arm的timer是在core内的 因为Timer是per cpu的,所以占用per cpu私有的中断号,即是PPI,

2018-02-18 22:07:38 1311

原创 Sleep与delay

static inline void sleep(unsigned sec){ current->state = TASK_INTERRUPTIBLE; schedule_timeout(sec * HZ);}sleep,msleep,ssleep都是一开睡眠延时的方式来实现的,这种方式不占用cpu资源,他会使线程可以继续被调度 udelay,ndelay,mdel...

2018-02-18 22:06:53 641

原创 sleep的使用案例

有其他团队反应,一个四核的方案在应用跑起来的时候,发现cpu的“负载”很高,使用top命令发现有的内核进程百分比很高。其中[]框起来的是内核线程,其余是用户态线程NOTE:首先科普,所谓top命令测出的”负载”即百分比并不是真正某个线程或是进程占用cpu的程度,它的算法是去统计当前任务列表中的进程占用cpu的时间,然后去统计一下。 一般我们认为top就会反映真实的cpu的占用情况,其实并...

2018-02-18 22:06:05 465

原创 谁引导文件系统

参见boot flow中所说的之前一直有一个疑问,文件系统是谁引导的,是uoot还是kernel引导的?最后搞明白了,有一次在一个方案中为nand + nor的方案,是nor启动,但是启动后因为要使用dd工具去替换分区内容,结果发现没有norflash的分区表,所以很奇怪,最后发现是内核的norflash driver没有选中导致没有生成相应的mtdblock的节点,此时有一个问题,既...

2018-02-18 22:01:17 318

原创 脚本的引导

系统脚本的引导在etc/init.d/目录中,目录中有很多以S开头的脚本 其中有rcS和rcK这两个脚本,系统启动后会引导这两个脚本中的某一个,这个两个脚本中的某一个会去遍历执行所有以“S”开头的脚本for i in /etc/init.d/S??* ;do # Ignore dangling symlinks (if any). [ ! -f "$i" ] &...

2018-02-18 22:00:26 426

原创 中断子系统

在kernel发生中断后,会跳转到汇编代码entry-armv.S中__irq_svc处,进而调用handle_arch_irq,每个中断控制器的drivver会使用如下: handle_arch_irq = gic_handle_irq 将自己的中断入口处理函数赋值给这个指针,这里是gic的入口函数,从而进入GIC驱动,进行后续的中断处理http://blog.csdn.net/...

2018-02-18 21:57:32 256

原创 interrupt

http://www.cnblogs.com/pengdonglin137/p/6349209.html 基於tiny4412的Linux內核移植 — 实例学习中断背后的知识(1) http://www.cnblogs.com/pengdonglin137/p/6848851.html 基于设备树的TQ2440的中断(2) http://blog.csdn.net/tiantao2012/ar...

2018-02-18 21:56:44 480

原创 中断的上半部和下半部

参阅《linux内核设计与实现》 中断处理分为上半部和下半部 中断处理的上半部和下半部都是不允许出现睡眠和阻塞的。但是对于下半部,并不是一刀切,不同下半部的实现方式有的不允许睡眠和阻塞(软中断和tasklet),有的是可以的(工作队列) 上半部:一般中断的中断处理函数为上半部,需要立即执行且耗时少的操作(时间太长,且如果该中断的标志是IRQF_DISABLED的话,会禁掉所有本地中断,这个函...

2018-02-18 21:55:51 5761

原创 gic driver

在kernel发生中断后,会跳转到汇编代码entry-armv.S中__irq_svc处,进而调用handle_arch_irq,每个中断控制器的drivver会使用如下: handle_arch_irq = gic_handle_irq 将自己的中断入口处理函数赋值给这个指针,这里是gic的入口函数,从而进入GIC驱动,进行后续的中断处理32位arm的入口c函数/arch/arm/ker...

2018-02-18 21:54:23 394

原创 共享中断

http://blog.csdn.net/laviolette/article/details/51577604 共享中断关于共享中断,这里有个误区一定要澄清,这里所说的共享中断是一个软件层面的概念,并不是硬件层面的多个外设共享一个中断(即多个外设的中断线连接到同 一个中断控制器的接口上,典型的用法是gpio的中断控制) 这里的共享中断,是只多个中断处理函数可以共用一个中断号,即一个中断...

2018-02-18 21:52:37 989

原创 整个的一个外设映射关系以及phys_to_virt与io_remap

整个的一个外设映射关系以及phys_to_virt与io_remap的区别首先一定要有DDR和IO外设是同级设备的观念,其实他们只是地址总线上的不同区段的地址而已 首先我们会传入ddr的实际大小(通过内核参数mem=xx),此时会将整个DDR映射到内核的线性映射区中,在set_up的时候我们将这个线性映射区一分为2, 一部分用于内核自己用,用于支持正常内核运行所需要的内存空间,以及各种ma...

2018-02-18 21:48:27 611

原创 关于静态映射与动态映射io地址时虚拟地址的问题

关于静态映射与动态映射io地址时虚拟地址的问题:一直有个问题,当我们人为的去静态的分配好IO地址所对应的虚拟地址时,此时我们已经占用了一片虚拟地址空间,但是此时使用io_remap去动态映射时,会不会申请到的虚拟地址空间 会和我们已经占用的静态映射空间重叠,如果重叠,我们此时再去操作这个虚拟地址时就会出现很多问题。 针对这个问题, 对于arm平台: 首先需要去填充一个结构体,也就是静态...

2018-02-18 21:47:54 989

原创 IO_ADDRESS()的实现

上面我们说了如何去在系统中自己实现一个设置系统寄存器的一个方法,上面归根到底要进行物理地址到虚拟地址的映射 现在我们就说说IO_ADDRESS()的实现#define __REG32ALI(addr) (*((volatile unsigned long *)((addr) - ALI_REGS_PHYS_BASE + ALI_REGS_VIRT_BASE))#define read...

2018-02-18 21:47:18 4530

原创 有mmu和没有mmu的区别

#ifdef CONFIG_MMU#define IO_ADDRESS(x) (((x) & 0x000fffff) | (((x) >> 4) & 0x0ff00000) | IO_BASE)#else#define IO_ADDRESS(x) (x)#endif从上面的代码已经很清楚了,不带mmu的系统共就直接操作裸的寄存器 带mmu的系统就必...

2018-02-18 21:46:46 2057 2

原创 静态映射和动态映射

在linux中去操作系统寄存器时必须经过映射,即 1,静态映射IO__ADDRESS();//这只是一个工具,使用前必须先初始化静态映射表 2,动态映射ioremap(); 无论静态映射还是动态映射目的都是将外设地址映射到虚拟地址的空间(3G-4G)中分配给用作外设映射的虚拟地址空间(开启mmu后cpu看到的都是虚拟地址,访问外设时同样需要映射到虚拟地址空间) 一般写寄存器读寄存器时:...

2018-02-18 21:46:17 4735

转载 关于内存映射的一些疑问

http://www.cnblogs.com/hanyan225/archive/2010/10/25/1860730.html http://wenku.baidu.com/link?url=lpFmJHGfdAQlaEO6zsW6W_11hK7FuCGcuSn9rnJJHwaZIDK7oNi14KK4pQ1KMnfQRHNjPG3eJ85wwJ10-OMZ37fUG7C1B-kofVYewd...

2018-02-18 21:45:46 506

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除