- 博客(52)
- 资源 (1)
- 收藏
- 关注
原创 当内核有内存泄漏的时候
内存泄露是一个很容易出现的问题,尤其是对于测试不太充分的代码。怎么判断出现内存泄露了呢?很简单,就跑一些简单的测试,等待足够长时间即可。内存总有耗尽的时候,这时候内核会触发OOM,根据oom_score选择一个进程杀掉。这种时候,多半是有问题了。或者在某个进程运行的时候,看观察空闲内存部分,一直下降多半是有问题了。这就确定有内存泄露了,可能是用户态进程泄露,也可能是内核泄露。现在确定了内核泄露的方法,接下来怎么找到泄漏点呢,下面会介绍几种调试的方法。
2023-11-30 20:43:52
1571
原创 当我们在谈论色温调节的时候,我们在谈论什么
总述前段时间在一个项目里,做了一个色温调节的东西。发现这部分的资料有点少,所幸研究了一段时间,记录一下,免得后面又忘记了。色温调节是上层发出,最终由显卡驱动处理的一个事件。桌面一般都是采用redshift 调节色温,到xserver,xserver进行一些自己的处理,转由libdrm用drm ioctl陷入内核drm模块,最终到实际的显卡驱动。redshift这边没怎么研究过,本文就先从xserver讲起吧。涉及到具体的显卡驱动,就用radeon驱动为例。xserver用户可以直接用xrand命令调
2021-06-25 10:14:59
940
1
原创 如何在系统挂起流程中玩出白屏问题
我们的这次实验的目标是:能在s3唤醒时候玩出一个白屏。为啥不搞个panic出来?panic出现和修好都比较容易,不好玩。显示异常才好玩呢,没日志只有现象,hiahiahia~好了知己知彼才能百战百胜,先看看s3的简单流程。s3的流程s3主要分为两个部分:suspend和resume。s3的入口在suspend_enter,基本流程下面这样的:上图大概是大家能见到系统挂起流程图中最简单的一个了吧。然而在非arm x86这种使用广泛的架构,这其中看似简单的每一步都可能暗藏杀机。不管是系统挂起还是系统休
2021-03-27 16:24:40
531
原创 linux EC驱动书写指南
驱动书写指南系列会提供另一个角度的驱动分析,linux内核把各驱动共同的部分抽象出来,做在一起称为框架。就比如说文件系统,linux内核定义好了文件系统中最通用的打开文件、读写文件等公共接口,但是并没有实现函数。这些定义好的接口,可以认为是框架。等到了真正的文件系统实现的时候 ,才会填充这些open、read等函数。对于实现文件系统的程序员来说,就是填充框架外的其他内容,一般都是和硬件相关性比较大。power supply core介绍在本文中,主要介绍怎么注册自己的ec驱动。ec驱动的框架部分,pow
2021-03-16 16:33:22
1609
原创 bootdevice驱动分析
最近在一些项目里接触到了hw笔记本+linux,hw在笔记本上自己做了一个linux内核原本没有驱动——bootdevice。研究了一下发现,这好像是从安卓的内核里面扣过来的,不清楚是安卓内核本身就有还是hw自己做的。github上找到一个hw安卓内核分析了一下,感觉还挺有意思的,分享一下。bootdevice驱动写的非常加单,是用来记录启动设备的驱动,这是驱动的说明Support multiple bootdevice, eMMC or UFS,这毕竟是安卓的内核,启动设备仅支持emmc和ufs的识别,
2021-03-16 11:14:00
2228
原创 Linux显卡驱动亮度调节功能书写指南.md
综述最近在一些项目中,接触了一些嵌入式领域的常用显卡。这类显卡一般都是不提供亮度调节等功能的,因此这部分需要自己实现。这也是第一次从头实现背光这一套,还比较简单的,记录一下。一般来讲,内核驱动的通用套路是,内核把公共的部分抽象出来做好,和设备相关的部分就需要各设备驱动自己做。这也就是我们常说的驱动框架,背光设备的话,肯定是套drm驱动里面的东西。背光设备初始化,一定是在显卡初始化里面做的,初始化好的的背光设备,会在/sys/class/backlight/XXX,上层调用这个接口,驱动处理相关的事件。
2021-03-04 14:59:35
876
1
原创 oland显卡HDMI热插拔问题分析
描述机缘巧合之下,在4.19内核里发现了radeon驱动一个很神奇的问题,插拔hdmi线时候,先拔出一半等10s左右再全部拔出。这时候,在sys下读到的hdmi连接状态还是connected。这个感觉还是很神奇的。切到amdgpu之后,也有这个问题,研究看看。状态确认显示器的连接状态,可以通过两个位置看xrandr和/sys/class/drm/card0-HDMI-A-1/status。Screen 0: minimum 320 x 200, current 3840 x 1080, maxim
2021-02-22 16:37:51
3257
11
原创 中断再探
前面简单介绍中断初始化和注册的基本流程,这里接上文留下来的两部分内容,中断处理和中断调试技巧。从内核开发的角度来讲说,前文是科普帮组理解我在讲什么,本文是纯干货。基本上可以帮助我修复了我遇到90%的中断错误。中断处理众所周知,中断处理统一入口是do_IRQ函数,经过一层层调用真正到处理函数。今天的分享主要集中在滴啊用 do_IRQ之前操作。CPU检测到有中断发生,然后调用handle_int...
2019-09-25 21:23:18
366
原创 中断初探
中断初探最近几个月调了很多中断的bug,啃了很久的源码。整理了一些东西,大佬们笑纳。离开了架构谈中断都是不深刻的,大佬们肯定玩腻了X86了,今天就以龙芯内核(龙芯官网即可获得:git://cgit.loongnix.org/kernel/linux-3.10.git)为例简单介绍一下哈。中断在内核中的生命周期主要分为三个部分:初始化,注册和中断处理,剩余的所有事情都是硬件完成的。这部分打算分享...
2019-08-09 20:29:22
656
原创 Create VM base on KVM
EnvironmenthostsOS: OpenSuSE Leap 42.1Desktop: GNOMEguestOS: OpenSuSE Leap 42.1Desktop: GNOMEIntroduce of KVMKernel-based Virtual Machine (KVM) is a virtualization infrastructure for the Linux ke
2017-01-12 14:11:03
608
原创 When move one file to USB drive remindy too large file
BlahGood evening! It’s been a long time since last time I write a blog. Igot some news –got a intern job! That ‘s first time, I been so excited, then I forgot to write a blog. Good new is I always writ
2017-01-05 20:09:04
748
原创 集群的理解
来suse实习了一个多星期了,这期间主要就是在理解集群涉及的概念以及搭建简单的集群环境。这是第一次接触集群,很多概念还是没有完全理解,感觉就是看了很多单个的知识点,但是不能连珠成线。先来简单说说。集群的分类集群是由多个计算机组成的一个系统,其中这每一个计算机被称为节点,节点之间通过局域网或者其他方式连接起来,彼此配合完成一个或者多个任务。从宏观上来讲,这个系统相当于一个计算机 。一般集群有以下三个分
2016-07-21 15:34:59
9269
原创 如何在配置kdump
说明1、作者使用的操作系统是cenos 7 2、在百度上查了很多资料,都没什么用 3、本文只是讲了开启kdump服务,后面还会讲怎么分析core文件什么是kdump? kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。
2016-06-15 21:24:51
12650
原创 Linux路径名查找
对于文件系统的大部分操作(open、stat、unlink等等)都要涉及多多少少的路径解析。路劲解析是根据路径名(name string)得到对应的dentry对象,通过路径行走的方式。本文就来介绍路径行走。路径行走解释 路径是由一个开始字符(根目录、当前工作目录或者fd指向的目录),和一串其他的文件名组成的,path中的每一个文件名用/分割开。名称查找(Name Lookup)就是希望根据已知的
2016-05-11 16:12:11
3428
原创 APUE阅读笔记(九)——进程关系
说明:1、此章较为简单,但是概念很多,记忆比较困难进程组 进程组是一个或者多个进程的集合,每一个进程组有一个唯一的进程组ID,进程组ID也就是组长进程的PID。同一组进程可以接受来自同一个终端的信号。 一个进程组从创建开始到最后一个进程结束这段时间被称为进程组的生命周期。会话 会话是一个或者多个进程组的几个,一个用户登陆一个终端创建一个会话,在用户登陆期间,创建的所有进程属于同一个会话,而完成同
2016-04-27 10:09:25
499
原创 APUE阅读笔记(十)——信号
说明:1、信号真的看的很模糊 2、但是还是要坚持看概念 产生信号的进程是异步随机的,信号产生了以后我们常常对信号做以下三种操作:1、捕捉信号 我们可以在程序里用signal函数设置一个信号的操作方式,如果要捕捉这个信号,signal函数的第二个参数设置位一个返回值位void,参数是int的函数指针,这样就相当于通知内核,如果该信号产生了,调用这个函数进行处理。 SIGKILL和SIGSTOP信
2016-04-27 09:35:35
781
原创 操作系统还原真相阅读笔记(一)——答疑解惑
说明1、本书真是好书 2、想到再补充一、为什么库函数可以调用系统调用 之前看APUE的时候看到的,exit(库函数)实现实际上还是调用了系统调用sys_exit。按照常理来说,标准C库函数应该具有可移植性,为什么就能调用UNIX系统专用的系统调用呢?C语言编译器也是通用的啊,比如说这个exit函数我在VC下编译能不能通过呢? 这个问题其实一句话就大概解释清楚了,那就是C语言编译器提供库函数有一
2016-04-25 20:37:11
4641
原创 阅读Linux0.11——main.c
目录:1、前言 1、main.c功能描述 2、main.c代码分析一、前言 这个前言的目的就是解释清楚理解main运行的一些基本的概念。如下:1、Linux0.11也是有CPU负载均衡的的 很神奇吧,最开始Linus已经考虑了CPU负载均衡这一点了,先别急着惊叹,我来跟你说说是怎么一回事。 基本上现在的linux里,都有0号进程,进程调度的时候,如果检测到就绪队列为空,就会一直执行0号进程
2016-04-19 11:57:13
2669
原创 APUE阅读笔记(八)——进程控制
说明:1、为什么写的第一篇阅读笔记就是八呢?因为之前看apue并没有写读书笔记,一直看到第八章,也就是标题中的这一章,才发现,不写是不行的,因为当我自己大量的接受新知识的时候,会遗忘的很厉害,也就是传说中的前学后忘。 2、之前差的那些章节,准备回过头再看一遍,然后写点笔记 3、这是一个笔记,笔记中尽可能详细的记录了我的理解,可能跟你的理解不一样,欢迎赐教。目录:1、进程ID 2、fork和vf
2016-04-18 12:59:03
860
原创 阅读Linux0.11——head.s
最近经过反馈,博主得知了自己在输出自己的知识方面做的非常不好。经过认真的反思,好吧主要是思考别人是怎么做的,以及结合我的特点,得出如下结论: 1、认为每一个听众或者读者都是零基础,要直白的讲出想要讲给别人的知识。虽然这句话听起来像是废话,但是挺不容易的。举个栗子,拿Linux来说,我接触这个已经三四年时间,很多知识我觉得是很理所当然的,比如讲编程的时候我没必要一字一句讲的清清楚楚。解释一些API的
2016-03-23 16:13:26
924
原创 阅读linux0.11——boot
linux0.11boot主要分为三个部分,分别在三个程序里面实现,bootsect.s、head.s和setup.s。下面我们简单来分析分析这三个文件。一、bootsect.s这个程序是最先被执行的,根据linus的解释说,这个程序会被BIOS启动例程(bios-startup routines)加载到内存的0x7c00处(不明白为什么都是加载在这个位置,于渊的《一个操作系统的实现》也是说这么说的
2016-03-16 18:04:46
1110
原创 汇编学习笔记(一)
这只是我学习汇编时候为了防止自己忘记的笔记系列,所以可能没什么条理性,基本上算是0基础开始吧,如果你也要学习,希望对你有帮助(目前会极其没有条理,后来会整理发出来)。 之前写kiwi系列(现在还没有写好,自己的惰性真是可怕……)的时候有想过要学习一下汇编,后来觉得没什么必要搁置了。今天乱逛的时候在知乎上看到的,顿时汗颜。 我不相信,一个人用纯手工一条条指令去雕琢他的程序,用手指感受计算机的呼吸时
2016-03-01 12:24:39
924
原创 2016新年快乐
首先说一点别的,当我正在写这个博文的时候,键盘声响起来的时候,血脉逆袭激情澎湃,这个感觉是很美妙的。 又是新的一年开始了,去年基本没什么要回顾的,抓住了几个机会,自愿与不自愿放弃了几个选择,所幸并无大碍。按照惯例,写一点感悟和几个新年愿望。说道感悟,这是很难写的一个东西,因为要先自己整理好并且找一个切入口。在说之前先贴一首比较喜欢的诗。唐寅的桃花庵歌。桃花坞里桃花庵,桃花庵下桃花仙。桃花仙人种桃树
2016-02-26 16:26:55
411
原创 当我们谈论开机的时候我们在谈论什么(三)——段页式存储
本文谈论的PC都是基于X86架构,本文谈论的实现段页式存储都是基于32位操作系统。首先说一点题外话:我在写这篇文章的时候并没有实现我想要的段页式存储。本来规划的是写一个段页式存储的,后来觉得这样我后边每一个程序都要分一个段,填充一个选择子、一个描述符(这些都是程序员手动实现的,不理解原理,没有关系,后边我会讲一点原理的部分,以及我实现的并不是我想要的段页式存储)。本文主要讲这几个内容: 1、段页式
2015-12-18 22:25:21
1331
原创 闲话战国
你喜欢喝粥吗。 我这有一个比白粥还要圆融的故事,讲给你听。 你喜欢喝酒吗。 我这还有一个比烈酒还要辛辣的故事,也讲给你听。 今天要说的这个故事名字叫做,养人。讲战国肯定要说一点周王朝,武王姬发灭暴纣,建立周王朝,为了和后边被诸侯拥立的太子宜臼所建立的东周区别开,我们常常成姬发建立的周王朝为西周。西周统治差不多经历了270多年,亡在了周幽王姬宫涅的手里,这个人我相信你一定熟悉,很有名的烽火戏诸
2015-12-16 16:48:53
694
原创 当我们谈论开机的时候我们在谈论些什么(三)——特权级(未完成)
注:本文所有说到特权级大小的地方都是指的数字。本文阐述了两部分内容: 1、一致代码段和非一致代码段 2、怎么设置特权级特权级这部分比较绕,说起来并没有很多东西,但是需要整理整理。一、一致代码段和非一致代码段代码段分为一致代码段和和非一致代码段(只有代码段才区分这个,数据段并不区分)。一般我们认识一个新事物需要搞懂两个问题:为什么和怎么做。所以本文会解释为什么做这个区分,和怎么区分的。 做出这个
2015-12-07 21:36:52
730
原创 当我们谈论开机的时候我们都在谈论什么(二)——保护模式
本文所谈论到的cpu是Intel的x86体系架构的cpu,作者才疏学浅,其他体系的暂不讨论。读者可以未经作者允许随意转载,但请注明出处并且保证文章的完整性本文主要谈一下几个方面: 1、保护模式和实模式是个什么鬼 2、怎么由保护模式进入实模式 3、实模式跳转到保护模式的示例代码在讲之前照例讲几句闲话: 1、实模式是操作系统之源,没有它,操作系统就是无本之木、无水之源 2、现在操作系统的书很少
2015-12-05 11:48:29
965
原创 bochs使用手册
对于每一个尝试自己写计算机开机引导甚至是一个操作系统的人来说bochs是一个很好用的工具,强大的调试功能以及自带的制作虚拟盘的工具都是亮点。 和大多数人一样,初次接触这个工具难免会比较生疏,所以要把很常用的命令记录下来,以便查看。 本手册不定期更新。1、如何运行自己的扇区引导1)、自己写好的扇区引导用nasm编译成.bin为后缀的纯二进制文件。(nasm是一个很强大的编译工具,他可以直接把汇编源
2015-11-25 21:49:51
3079
原创 bochs安装及配置
之前自己写了一个扇区引导,写好了以后可能激动难耐,顺手就dd进了一个盘。然后linux的分区就找不到了。修复grub以后还是起不来,没办法,只能忍痛重装系统了(真是一样的教训)。所以,以后这种东西还是要在一个模拟器里边玩比较妥当,不然每次写好了还要开关机而且要冒着一系列风险。说到了这里,一阵肉痛。我的系统啊。 言归正传,ubuntu下可以用命令行来安装bochs,(sudo apt-get ins
2015-11-24 20:03:51
6030
原创 当我们谈开机的时候我们在谈论些什么
本文主要解决了以下几个问题: 1、当你按下电源键以后都发生了什么? 2、Linux kernel初始化都在初始化什么? 3、init进程何时创建? 注:本文所有的的内核代码都是来自于kernel3.14.54,读者可以未经作者允许随意转载,但请保证文章的完整性。第一部分:当你按下电源的时候,你的计算机都做了什么。 当你按下电源的时候,你的内存,寄存器都是空的(材质都是易失性存储,断电后数据
2015-11-13 17:09:54
770
原创 写自己的内核模块——获取一个进程的物理地址
首先,根据一个虚拟地址是可以得到物理地址的,这个内核模块是可以做到的。 大概就以下这几步: 1、得到当前进程的task_struct结构体(类似于current宏的实现) 2、得到进程的mm_struct结构体 3、搞一个虚拟地址(一个变量的地址或者一个函数的地址) 4、先得到pgd,然后根据pgd找到pud,根据pud找到pte,当当当当,你得到了该变量(或者函数)所在页面的页表表项地址
2015-11-07 15:14:56
2955
2
原创 进程的一生——请求调页篇
本文主要解答了三个问题: 1、 注:本文所有的的内核代码都是来自于kernel3.14.54,读者可以未经作者允许随意转载,但请保证文章的完整性。 内存管理部分的内容繁杂没有接构型,为了好理解一些,我准备从进程着手来简单的讲解这一部分。在do_fork函数中,新创建的子进程会调用函数dopy_mm复制父进程的内存管理等部分,在分析这个函数之前,还要说一下几个结构体: 1、mm_struct结
2015-11-07 12:14:28
2232
原创 内核同步机制的一些见解(未完成)
本文主要回答三个问题: 1、为什么要内核同步 2、内核同步有哪些策略 3、Liunx内核同步的代码实现 先来说说内核抢占,这时一个很重要的概念。内核抢占通俗来讲,的那个一个内核进程在运行的时候,是否允许另外一个内核进程进行抢占。内核抢占减少了用户程序的分派延时,提供了更好地人机交互。但是有的进程要求在持续运行直到结束,所以系统也提供了这样的接口,代码如下:#define preempt_di
2015-10-28 20:55:30
664
原创 schedule函数浅析
现代用户对操作系统的要求越来越“苛刻“,进程相应时间尽可能的快,系统的吞吐量要尽可能的多等等。这些要求在表面上看起来是互相矛盾的,所以现代操作系统提出了进程的概念,随之而来的就是进程调度。进程调度就是调度程序根据一定的准则,在就绪队列里边选择一个进程来执行。所以调度算法是调度程序讨论的核心点,不一样的内核版本调度算法以及一些机制可能是不同的,但是基本上一些大的方面是没有改变的,我看的内核版本是3.1
2015-10-28 18:41:05
7053
转载 ps aux命令显示的状态列中的状态(转)
D 不可中断 Uninterruptible sleep (usually IO) R 正在运行,或在队列中的进程 S 处于休眠状态 T 停止或被追踪 Z 僵尸进程 W 进入内存交换(从内核2.6开始无效) X 死掉的进程< 高优先级N 低优先级L 有些页被锁进内存s
2015-10-16 13:34:45
657
原创 我看task_struct结构体和do_fork函数
先来看看task_struct结构体。 众所周知,task_struct结构体是用来描述进程的结构体,进程需要记录的信息都在其中,下面我们来看看其中的具体项目。结构体存储在linux/sched.h中。 具体的字段有volatile long state; void *stack;...struct task_struct __rcu *real_parent;struct task_s
2015-10-15 17:32:39
1390
原创 ubuntu下设置一个wifi热点
我使用的是ap-hotspot,比较简单,命令行一共就三四步的样子。先来提一下配置的方法,然后讲我遇到的问题。 第一步:安装hoseapd和ap-hotspot。sudo apt-get updatesudo apt-get install postapdsudo apt-get install ap-hotspot第二步:配置ap-hotspotsudo ap-hotspot configu
2015-10-11 11:25:47
1760
原创 ubuntu中孤儿进程的父进程pid并不是1??
刚刚写了一个孤儿进程,顺手打印了他的ppid,居然发现不是1,什么鬼??!!! 因为在发现这个结果之前这个进程已经跑了很多遍了,新fork的进程都没有退出,以为是因为这个原因所以结果跟我想的一样。 然后sudo reboot,接着运行发现运行结果孤儿进程的ppid并不是1,ps aux发现这个代替了init进程来接管孤儿进程的进程名字叫做init–user,重启了几回都是这
2015-09-22 21:58:22
3588
1
原创 mycd命令
今天写了自己的ls命令,完了以后突发奇想,想写一个自己的cd命令,查了以下还真的有函数来实现修改当前的工作目录,chdir函数。下面根据man手册给出这个函数的详细解释信息。 函数描述:改变工作路径 函数头文件和定义:#include#include <stdlib.h>#include <string.h>#include <unistd.h>char * cd_get_p
2015-09-22 20:38:58
1208
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人