瓯江畔
这个作者很懒,什么都没留下…
展开
-
LMKD、kswapd和oom killer的先后作用顺序
OOM Killer的作用是终止一些进程以释放足够的内存,从而避免系统完全崩溃。在选择要终止的进程时,OOM Killer会考虑进程的优先级、是否为守护进程等因素。综上,kswapd、LMK和OOM的先后作用顺序大致为:首先由kswapd回收页框,然后LMK根据策略选择进程进行终止,最后在必要时由OOM Killer终止进程以释放内存。LMK的作用是更精细地管理内存,选择一些不重要的进程进行终止,以释放更多的内存。当系统内存不足时,kswapd会根据一定的算法选择一些不常用的页面进行回收,以释放内存。原创 2024-01-10 11:23:48 · 317 阅读 · 2 评论 -
常用gdb调试命令
step s 执行下一条语句,若该语句为函数调用,则进入函数内的第一条语句。next n 执行下一条语句,不会进入函数内部执行。thread apply all bt 打印所有线程的调用栈。info threads 查看当前进程的所有线程。set var name=v 设置变量的值。bt 10 打印tid=10的线程调用栈。t 10 切换到tid=10的线程。info reg 查看当前的寄存器值。原创 2023-10-14 18:23:38 · 245 阅读 · 0 评论 -
Binder 驱动全面剖析
Binder系列原创 2023-10-14 17:45:50 · 88 阅读 · 0 评论 -
size_t与ssize_t区分 kernel v6.1定义
在32位系统中,size_t和unsigned int的长度相同,都是4个字节;在64位系统中,size_t和unsigned long long的长度相同,都是8个字节。而ssize_t的长度则与int相同,在32位和64位系统中都是4个字节。其中,size_t通常用于表示内存大小、数组长度等非负整数,而ssize_t则通常用于表示函数返回值、文件读写等有可能出现负数的情况。需要注意的是,在使用size_t和ssize_t时,应该避免将其与其他类型进行混合运算,以免出现意外的错误。原创 2023-10-13 17:20:48 · 210 阅读 · 0 评论 -
Android中 dma-buf 和 ION
dma-buf 最初的原型为 shrbuf,由 Marek Szyprowski (Samsung)于2011年8月2日首次提出,他实现了 “Buffer Sharing” 的概念验证(Proof-of-Concept),并在三星平台的 V4L2 驱动中实现了 camera 与 display 的 buffer 共享问题。原创 2023-09-28 11:25:12 · 525 阅读 · 0 评论 -
2023 亲测好用版VScode配置文件
【代码】2023 亲测好用版VScode配置文件。原创 2023-09-19 10:30:26 · 195 阅读 · 0 评论 -
Valgrind 介绍和使用
Linux 下内存泄漏检测工具首选必须是 Valgrindhttps://valgrind.org/downloads/ 最新版本 Valgrind 3.21.0Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具原创 2023-09-01 22:06:42 · 296 阅读 · 0 评论 -
内存压缩算法——LZ4
LZ4 是由 Yann Collet 开发的一种追求极致压缩与解压速度的压缩算法,Yann Collet 还开发了另外一个近年大热的 zstd 压缩算法。zstd 现在属于 Facebook 的开源项目。在当前的安卓和苹果操作系统中,内存压缩技术就使用的是lz4算法,及时压缩手机内存以带来更多的内存空间。本质上是时间换空间。原创 2023-08-30 17:58:05 · 646 阅读 · 0 评论 -
空指针赋值
指针的范围,那就相对来说容易了,对于在32位x86计算机上运行的windows xp sp2来说,就是从。首先解答第一个问题,在windows核心编程第四版的windows的内存结构一章中,表13-1有提到。为了保障“无论何时”这个条件,需要人为划分一个空指针的区域,固有上面。如果还有其他的值,你们这些表示空指针的值都是什么?所处的是进程的私有区间。除了NULL表示空指针,是否还有其他的值也是空指针?相关的,windows xp sp2的分配粒度是。有了上面的解答后,第二个问题就很容易解答了。原创 2023-08-22 20:25:27 · 311 阅读 · 0 评论 -
空指针防护
假设 有语句int a=10;那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的地址是0x1000;那么内存0x1000单元中存放了数据10,每次我们访问a的时候,实际上都是访问的0x1000单元中的10当编译器遇到语句int *p时,它也会在内存中给指针变量p分配一个内存单元,假设这个单元在内存的编址为0x1003;此时,0x1003中的值是不确定的,(因为我们没有给指针赋值),当编译器遇到了p = &a时,就会在0x1003单元中保存0x1000。原创 2023-08-22 20:13:44 · 106 阅读 · 0 评论 -
Vim学习(四)——命令使用技巧
打开文本默认模式,按**【ESC】**重新进入:搜索匹配关键字。原创 2023-08-22 19:24:55 · 452 阅读 · 0 评论 -
Vim学习(三)—— Git Repo Gerrit
三者各自作用:git:版本管理库,在git库中没有中心服务器的概念,真正的分布式。repo:repo就是多个git库的管理工具。如果是多个git库同时管理,可以使用repo。当然使用gerrit,就必须用repo。repo是Google开发的用于管理Android版本库的一个工具,repo是使用Python对git进行了一定的封装,并不是用于取代git,它简化了对多个Git版本库的管理。用repo管理的版本库都需要使用git命令来进行操作。gerrit:提交审核代码,图形化的界面,简单的操作。原创 2023-08-12 15:00:38 · 422 阅读 · 0 评论 -
虚拟内存 ——内存管理的妙招
磁盘 和 内存 都是用于计算机存储,但是内存是利用电流来实现存储,而磁盘是利用磁效应来实现存储,并且,从存储容量来看, 内存是高速高价,而磁盘则是低速廉价。在计算机这个系统中,与低速高容量的磁盘进行协同作业。虚拟内存是指来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,。原创 2023-08-10 18:57:19 · 100 阅读 · 0 评论 -
驱动开发——嵌入式(驱动)软开基础(十)
如果VA < 32M,则需要使用PID来转换为MVA(VA | (PID原创 2023-05-28 23:45:00 · 1022 阅读 · 1 评论 -
驱动开发——嵌入式(驱动)软开基础(九)
就是新建一个文件(inode),这个文件专门用来指向别的文件(类似Windows中的快捷方式),若移动或删除原文件,则相应的软链接不可用。虚拟内存是内存管理的一种技术,使得应用程序认为自己拥有连续的内存空间,而实际上它对应的物理内存是不连续的,甚至还有一部分对应着外部磁盘存储器,在需要时再进行数据交换。:采用资源的有序分配,将所有资源进行编号,紧缺的资源采用 比较大的编号,一个进程只有获得较小编号的资源才可以申请较大编号的资源。:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉。原创 2023-05-27 23:45:00 · 736 阅读 · 0 评论 -
驱动开发——嵌入式(驱动)软开基础(八)
如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。例如,第二个队列的时间片要比第一个队列的时间片长一倍,第i + 1个队列的时间片要比第i个队列的时间片长一倍。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。原创 2023-05-26 23:45:00 · 680 阅读 · 0 评论 -
驱动开发——嵌入式(驱动)软开基础(七)
(2)vmalloc分配连续的虚拟地址,但物理地址不一定连续。分配时实际分配了物理内存,不过这个物理内存页面是在公共的页表进行了映射,并没有在本进程的页表进行映射,当访问这段内存时,触发do_page_fault异常(缺页中断)才完成页表的同步工作。(2)中断服务程序使用的是自旋锁,原因是中断服务程序处于中断上下文,中断上下文是不参与调度的,也就没有保护现场与恢复现场,一旦睡眠就回不来了。(2)中断服务程序中不能有阻塞操作,因为中断期间是完全占用CPU的,不存在内核调度,中断被阻塞住,其他进程将无法推进。原创 2023-05-24 18:42:19 · 1004 阅读 · 0 评论 -
网络编程——嵌入式(驱动)软开基础(六)
(3)第三次握手:客户端收到确认报文后,检查ack是否为x+1,ACK是否为1,是则发送确认报文(将标志位ACK置1,ack=y+1,序列号seq=x+1),此时操作系统为该TCP连接分配TCP缓存和变量。(2)而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接受数据,而自己未必将所有数据都发送完了,所以服务器可以立即关闭,也可以发送一些数据后再关闭,所以服务器的确认报文(ACK=1)和连接释放报文(FIN=1,ACK=1)一般分开发送,因此形成四次握手。原创 2023-05-22 23:45:00 · 390 阅读 · 0 评论 -
网络编程——嵌入式(驱动)软开基础(五)
如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;(3)epoll相关的系统调用有:epoll_creat、epoll_ctl、epoll_wait/epoll_pwait(可屏蔽特定信号),分别用来创建一个epoll文件描述符、添加/删除/修改需要侦听的文件描述符及事件、接收被侦听描述符的IO事件。建立连接和确认、重传、窗口、拥塞控制机制都会消耗大量时间;原创 2023-05-18 23:45:00 · 290 阅读 · 0 评论 -
进程与线程——嵌入式(驱动)软开基础(四)
包括浅度睡眠跟深度睡眠。(2)一个进程个拥有多个线程,线程可以访问其所属进程地址空间和系统资源(数据段、已经打开的文件、I/O设备等),同时也拥有自己的堆栈。答案:每当子进程退出,父进程都会收到SIGCHLD信号,故可在父进程中设置SIGCHLD信号的捕获函数,在捕获函数中回收子进程。(2)线程崩溃的本质就是内存出错,若出错的内存没有被其他线程访问,则不会导致其他线程出错,也就不会导致进程崩溃。(1)僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个。原创 2023-05-12 23:45:00 · 589 阅读 · 0 评论 -
I/O——嵌入式(驱动)软开基础(三)
(2)波特率判断:将本机波特率分别设置为2400、4800、9600、19200、38600、57600、115200,每个波特率定时1.5秒,对收到的ASCII码进行分析,将小于等于127的认为是正常的字符,将大于127的认为是乱码,当正常字符数目大于等于10倍乱码数目则认为当前波特率为正确波特率,并终止往后搜索。,是对电气特性的规定,作用于数据传输通路,但它并不包含对数据的处理方式。: 采用负逻辑传输,规定-5V ~ -15V等于逻辑“1”,+5V ~ + 15V为逻辑“0”,噪声容限为2V。原创 2023-05-11 23:45:00 · 599 阅读 · 0 评论 -
寄存器与存储器——嵌入式(驱动)软开基础(二)
后来 Intel 在此基础上注册了奔腾品牌,将x86 一直优化迭代更新,有了奔腾1,奔腾2, 奔腾3,等等,以及现在的新品牌。这样一来,处理器在读取缓存中的数据前,会先从内存中读取数据到缓存,保存缓存和内存中数据的一致性。强制转换数据不需要调整字节内容,因为1、2、4字节数据的存储方式一样。(1)ROM是只读存储器,速度较慢,不能直接与CPU进行交互,断电后数据不丢失,一般用来保存断电不丢失的程序。(1)SRAM:静态的随机存储器,加电情况下,不需要刷新,数据不会丢失,CPU的缓存就是SRAM。原创 2023-05-10 23:45:00 · 529 阅读 · 0 评论 -
ARM处理器与中断——嵌入式(驱动)软开基础(一)
嵌入式软开基础系列一,用于笔试面试,原理回顾等。原创 2023-05-10 11:34:00 · 498 阅读 · 0 评论