规则,就是用来打破的(底层技术)
文章平均质量分 62
你有麻烦我有钱赚
从零开始,循序渐进
展开
-
浅析错误:software IO TLB: coherent allocation failed for device
问题背景:i2c controller 在 probe 的时候,使用 dma_alloc_coherent 申请一块可持续使用的 dma 传输 buffer。平台使用 DRAM 大小为 6GB,未出现错误。平台 DRAM 大小从 6GB 扩展到 8GB,dma_alloc_coherent 报错:"software IO TLB: coherent allocation failed for device"。调查结果:简单的原因是,当设定dma_set_mask(&pdev-&g..原创 2021-05-10 15:08:54 · 958 阅读 · 0 评论 -
*(unsigned int *)(a) = (v)
问:*(unsigned int *)(a) = (v) 的作用是什么?答:地址a之后的sizeof(unsigned int)个字节的内存赋值为v。更改指针类型,就是更改指针所能操作的内存单位长度,(unsigned int *)(a)意思就是只能操作a指向的4个字节的长度内存。...原创 2021-02-24 14:55:36 · 3823 阅读 · 1 评论 -
关于 device tree
1.status = "okay",没有status 属性会解析,如果有,必须是"okay" 或者 "ok"才会解析。参考__of_device_is_available函数原创 2021-01-16 10:40:41 · 146 阅读 · 0 评论 -
系统调用的过程
1.用户层可调用的系统调用接口函数中内嵌了一段汇编代码,调用了0x80号中断,并将一些参数保存在eax等寄存器中2.CPU去IDT表格中查找0x80号中断对应的中断处理程序system_call(硬件行为),system_all所在的内存段的CPL置为0,而DPL置为33.CPU检查当前代码段的CPL和system_call的DPL,由于当前代码段CPL=3且system_call的DPL也特意被设置为了3,所以可以调用。4.在系统调用函数system_call中,先从eax寄存器中获取到了系统调用号原创 2020-09-15 14:24:35 · 801 阅读 · 0 评论 -
最原始基本的CPU函数调用过程概念
assume cs:codecode segment start: mov ax,1 mov cx,3 call s mov bx,ax mov ax,4c00h int 21h s: add ax,ax loop s retcode endsend start1.CPU将call s 指令的机器码读入,IP 指向 call s之后的指令 mov bx,ax,然后CPU执行call s指令,将当前IP值(指令 mov bx,ax的地址)压栈,并.原创 2020-09-11 16:25:04 · 411 阅读 · 0 评论 -
内存只是磁盘中虚拟内存空间的的缓存
问题是什么,你才能找答案:程序放入内存,形成进程,分配段,形成段表,分配页,形成页表。(思考问题:1.磁盘在整个过程起到什么作用)先分段:程序的bss等段,映射到0~4G的虚拟内存段中(建段表)。在分页:虚拟内存的每个段映射到物理内存的页框(建页表)。使用内存。...原创 2020-05-12 16:03:07 · 354 阅读 · 0 评论 -
【计算机科学速成课】[40集全/精校] - Crash Course Computer Science
【计算机科学速成课】[40集全/精校] - Crash Course Computer Science好的事物永远不会消失,这个视频对理解计算机底层很有帮助。原创 2020-04-06 11:41:46 · 951 阅读 · 0 评论 -
解析C程序的内部机制(转)
1.几条汇编指令_bl_add_sub_ldm_stm⑥ADD/SUB 加法/减法举例1:add r0,r1,#4 效果为r0=r1+4;举例2:sub r0,r1,#4 效果为r0=r1-4;举例3:sub r0,r1,r2效果为r0=r1-r2;⑦BL (Brarch and L...转载 2020-04-04 21:12:38 · 308 阅读 · 0 评论 -
C语言在ARM中函数调用时,栈是如何变化的?(转)
做系统分析的话你肯定遇到过一些crash, oops等棘手问题,一般大家都会用 gdb, objdump 或者 addr2line等工具分析 pc 位置来定位出错的地方。但是这些分析工具背后的本质原理就不见得理解深刻了,而且有的时候面对一系列 backtrace 或者 stack 日志处于懵逼的状态。今天和大家一起看下面对 crash 日志的时候,如何利用 stack 来分析其变化的来龙去脉。...转载 2020-04-04 20:58:29 · 650 阅读 · 0 评论 -
Linux内核地址空间的内存分布及分配(转)
虚拟地址空间0~3G用于应用层虚拟地址空间3~4G用于内核层内核又将3~4G的虚拟地址空间,划分为如下几个部分:896MB又可以细分为ZONE_DMA和ZONE_NORMAL区域。低端内存(ZONE_DMA):3G-3G+16M 用于DMA __pa线性映射普通内存(ZONE_NORMAL):3G+16M-3G+896M __pa线性映射 (若物理内存<896M,则...转载 2020-02-11 16:44:59 · 540 阅读 · 0 评论 -
物理内存低于4g如何内存管理(使用分页机制):
每个进程都拥有4G(2的32次方)的虚拟地址空间。在实际编程过程中,指针中存放的地址也都是32位的线性地址(虚拟地址),经过页目录、页表等分页机制变换以后可以得到真正的物理地址,而这个物理地址也是32位的。对于32位的CPU来说没有任何问题,因为它的地址总线是32位的,寻址空间也就是2的32次方(4G)。那么问题就出来了:CPU的寻址空间是2的32次方(4G),程序要访问的物理地址(线性地址经过分...原创 2020-02-11 16:33:25 · 371 阅读 · 0 评论 -
ioremap的使用
void __iomem *base_gpio;base_gpio = ioremap(0x11000000, 0xf); //从0x11000000映射 0xf 个字节readl(base_gpio); //读寄存器的值writel(0xff, base_gpio); //往0x11000000写0xffiounmap(base_gpio); //释放映射...原创 2019-11-19 14:07:13 · 589 阅读 · 0 评论 -
MTK 平台 CABC 背光控制机制
转载自:LABC and CABC-MTK Platformmtk 平台 cabc 背光控制方式转载 2017-06-06 09:29:01 · 14269 阅读 · 0 评论 -
一种 c++ 线程池模型
这个库据说是从腾讯系公司流传的,不得而知。每天写业务逻辑,没有对逻辑之外的架构进行深入理解,闲下来还是得整理,不然怎么成为架构师呢?下面是类图:(类图和流程图画在了一起有点乱)CWorkThread 是继承自 CThreadBase 的线程类,在这个类里面 treadcallback 线程回调里只要实现业务逻辑即可。 模型严格意义上不是个线程池,实际在用的时候是当做多线程处理多个客...原创 2018-09-18 15:56:10 · 551 阅读 · 0 评论 -
C++线程池原理及创建
本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关。另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量。文章的最后,我们给出一个简单示例程序,通过该示例程序,我们会发现,通过该线程池框架执行多线程任务是多么的简单。为什么需要线程池 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服...转载 2018-09-18 21:47:07 · 501 阅读 · 0 评论 -
时态的重建--适合理工直男的钟平老师逻辑英语学习笔记
先讲一对时态:现在完成时和过去时。这个我以前一直用不好,特别是口语,速度快了不过脑子就讲错了。以前我就记有没有“了”,如果有就用完成时,没有就用过去时。然而大错特错,比如我昨晚看过那个电影了和我看过那个电影了,都有“了”,这特么就蒙蔽了。其实关键点在于你所表达的动作是时间段还是具体的时间点,如果有具体的时间点就用过去时,时间段的话就用完成时。比如“我昨晚看过那个电影了”和“我看过那个电影了”...原创 2018-11-05 20:57:40 · 4028 阅读 · 0 评论 -
Linux 总线、设备、驱动模型的探究
文章转载自:https://mp.weixin.qq.com/s?__biz=MzIxMjE1MzU4OA%3D%3D&mid=2648918733&idx=1&sn=27e9c64b03c6dab26400f9613c514769&scene=45#wechat_redirect设备驱动模型的需求总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子...转载 2019-01-06 20:27:14 · 657 阅读 · 0 评论 -
linux 驱动设备和 dts 匹配过程
linux 设备驱动文件在与 dts 中的设备板级硬件信息匹配的关键字是 compatible 属性。即比较驱动文件中 of_device_id 结构体元素的 .compatible 成员变量和 dts 文件中 node 中 compatible 属性两个字符串。Rationale:linux 启动从 lk jump 到 kernel 之后 函数调用的深度比较深所以图比较长,...原创 2019-01-07 23:13:08 · 8065 阅读 · 0 评论 -
BUG: scheduling while atomic 分析 and 为什么中断不能睡眠
遇到一个BUG: scheduling while atomic: kworker/0:2/370/0x00000002;看了这篇文章BUG: scheduling while atomic 分析,是因为在原子操作上下文或者中断上下文进行了调度引起的。先看下为什么会打印出这句:schedule() -> __schedule() -> schedule_debug()s...原创 2019-07-17 17:14:28 · 3884 阅读 · 0 评论 -
适合理工直男的钟平老师逻辑英语学习笔记
一切的一切都只是套路! ——鲁迅核心公式:En: (状语1) 主(定语1) 谓(状语2) (宾)(定语2) (状语1)Ch: (状语1) (定语1)主 (状语2)谓 (定语2)(宾) (状语1)主谓宾的位置是不变的,变化的是将修饰主语和宾语的定语提到前面,将修饰谓语的状语提到谓语之前。状语1是指一些被分开的状语,比如 at last week,b...原创 2018-08-21 23:06:41 · 33003 阅读 · 4 评论 -
同步 IO 、异步 IO、阻塞、非阻塞的区别
同步对应异步,阻塞对应非阻塞,两对概念的根本区别在于:所修饰的对象不同。阻塞和非阻塞是指进程访问的数据尚未准备就绪,进程是否要等待,还是直接返回。同步异步是指访问数据的机制。同步是指主动请求并等待 IO 操作完毕的方式,当数据就绪后在读写的时候必须阻塞。异步则是在主动请求数据后开始其他任务随后等待 IO 操作完毕的通知,进程在进行数据读写时不阻塞。拿书上举的例子来说明。你在逛商...原创 2018-07-22 23:07:56 · 204 阅读 · 0 评论 -
[ Linux ][ C++ ] 多用户连接 c/s 模型
看了 socket 编程基本知识之后,一般简单的例子是创建一个客户端一个服务器端,用来接收回复消息。但一般都是一对一的 C/S 模型,那么想要多个客户端去连接,该怎么做呢?原创 2017-09-17 18:28:42 · 414 阅读 · 0 评论 -
Linux中select IO复用机制
Linux中select IO复用机制转载 2017-09-14 23:56:34 · 2123 阅读 · 0 评论 -
mtk led子系统概略
前几天老大让我改一下 led 灯的效果,从闪烁模式改成呼吸模式。原创 2017-09-14 23:51:44 · 1111 阅读 · 0 评论 -
linux notify 通知在TP中的应用
通过对tp中代码的分析来解读一下notifier 内核通知链如何应用。原创 2017-06-07 21:15:02 · 1165 阅读 · 0 评论 -
理解 linux 工作队列
对 linux 工作队列的理解原创 2017-06-05 21:29:17 · 2436 阅读 · 0 评论 -
adb 命令更新
android adb命令原创 2017-05-17 21:34:59 · 719 阅读 · 0 评论 -
MTK TP input子系统笔记
MTK TP input子系统原创 2017-05-17 14:30:17 · 1249 阅读 · 0 评论 -
MTK lcm 驱动加载流程 android M
一直有一种强迫症,不把整个流程屡清楚就是蓝瘦香菇。做项目读博客多了,也就慢慢地搞清楚了。安卓系统从power键按下释放,到lcm驱动显示,整个驱动的加载流程as follows:lk阶段,还是先执行main.c (vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\kernel)其中执行 platform_init(ven原创 2017-04-07 11:52:03 · 3675 阅读 · 0 评论 -
TCP 状态转移示意
原创 2018-03-16 15:12:54 · 203 阅读 · 0 评论 -
pymongo 密码登陆问题
之前开发环境 mongodb 是不加密的,但是为了安全现在加了密。加密之后, python 脚本验证就出了错,老是报 pymongo.errors.OperationFailure: command SON([('authenticate', 1), ('user', u'root'), ('nonce', u'd241d9ac68d60c23'), ('key', u'faf58ba5fa...原创 2018-07-30 19:31:52 · 5003 阅读 · 0 评论 -
linux 不常用命令收集
查看每个目录所占磁盘空间 du -sh ./解释:du 命令用来查看目录或文件所占用磁盘空间的大小选项: -h:以人类可读的方式显示 -a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小 -s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小 -c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和...原创 2018-07-28 15:19:52 · 165 阅读 · 0 评论 -
swig c++ python
最近帮运营用 python 做实时提取玩家数据的脚本。鉴于已有后台的 lua 和 c++ 的 api 相互调用是使用 swig,python 也就直接使用 swig 了。swig 的官网和中文官网:swig 官网 swig 中文网上写的比较好的博客也有:好的博客先说下代码流程://test.cpp#include <iostream>#include "test.h"using ...原创 2018-04-15 18:40:00 · 634 阅读 · 0 评论 -
C++ 拷贝构造函数
仅当准备用按值传递的方式传递类对象时,才需要拷贝构造函数。就是说按值传递的时候,会调用到拷贝构造函数。验证:#include <iostream>using namespace std;class HowMany{static int countObject;public:HowMany(){ countObject++; cout<...原创 2018-03-25 23:39:56 · 140 阅读 · 0 评论 -
服务器 Reactor 模式
并发性不是太高服务器程序使用这个模式基本就可以满足。 主线程只负责监听文件描述上是否有事件,如果有就立即将该事件通知到工作线程。读写数据、接受新的连接以及处理客户端的消息都在工作线程。 工作流: 1)主线程往 epoll 内核事件表中注册 socket 上的读就绪事件 2)主线程调用 epoll_wait 等待 socket 上有数据可读 3)当 socket 上有数据可读时, ep...原创 2018-03-19 21:37:47 · 386 阅读 · 0 评论 -
gdb 调试日志
如果用 c++ 作为服务端的编程语言的话,gdb 调试还是要掌握的,可以说是非常方便。gdb 调试的教程网上非常多,而且肥肠详细,只写一下自己遇到的难找的问题。假如 运行程序是 test ,异常的 core 文件是 core.2018gdb testcore core.2018一般情况下整个工程包括多文件,设置指定文件的断点b test.c:2017就是在 test.c 的第2017行设置断点调试...原创 2018-03-06 17:27:32 · 2073 阅读 · 0 评论 -
关于检测客户端是否断开连接
做了五个月的游戏服务端,发现游戏的后端比其他的要求更高。游戏服务端在运行过程中需要保证连接的实时性,所以要判断客户端连接的实时性,在博客里搜索大概就是三种方案:1.setsockopt 设置 SO_KEEPALIVEint flag = 1;setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,&flag,sizeof(flag));但这个...原创 2018-03-06 15:08:17 · 1532 阅读 · 2 评论 -
MTK lcm 背光流程
mtk背光流程原创 2017-04-07 21:08:29 · 5902 阅读 · 4 评论