linux内核的一些事
文章平均质量分 86
wenshizhang
这个作者很懒,什么都没留下…
展开
-
当我们在谈论色温调节的时候,我们在谈论什么
总述前段时间在一个项目里,做了一个色温调节的东西。发现这部分的资料有点少,所幸研究了一段时间,记录一下,免得后面又忘记了。色温调节是上层发出,最终由显卡驱动处理的一个事件。桌面一般都是采用redshift 调节色温,到xserver,xserver进行一些自己的处理,转由libdrm用drm ioctl陷入内核drm模块,最终到实际的显卡驱动。redshift这边没怎么研究过,本文就先从xserver讲起吧。涉及到具体的显卡驱动,就用radeon驱动为例。xserver用户可以直接用xrand命令调原创 2021-06-25 10:14:59 · 834 阅读 · 1 评论 -
如何在系统挂起流程中玩出白屏问题
我们的这次实验的目标是:能在s3唤醒时候玩出一个白屏。为啥不搞个panic出来?panic出现和修好都比较容易,不好玩。显示异常才好玩呢,没日志只有现象,hiahiahia~好了知己知彼才能百战百胜,先看看s3的简单流程。s3的流程s3主要分为两个部分:suspend和resume。s3的入口在suspend_enter,基本流程下面这样的:上图大概是大家能见到系统挂起流程图中最简单的一个了吧。然而在非arm x86这种使用广泛的架构,这其中看似简单的每一步都可能暗藏杀机。不管是系统挂起还是系统休原创 2021-03-27 16:24:40 · 449 阅读 · 0 评论 -
linux EC驱动书写指南
驱动书写指南系列会提供另一个角度的驱动分析,linux内核把各驱动共同的部分抽象出来,做在一起称为框架。就比如说文件系统,linux内核定义好了文件系统中最通用的打开文件、读写文件等公共接口,但是并没有实现函数。这些定义好的接口,可以认为是框架。等到了真正的文件系统实现的时候 ,才会填充这些open、read等函数。对于实现文件系统的程序员来说,就是填充框架外的其他内容,一般都是和硬件相关性比较大。power supply core介绍在本文中,主要介绍怎么注册自己的ec驱动。ec驱动的框架部分,pow原创 2021-03-16 16:33:22 · 1457 阅读 · 0 评论 -
bootdevice驱动分析
最近在一些项目里接触到了hw笔记本+linux,hw在笔记本上自己做了一个linux内核原本没有驱动——bootdevice。研究了一下发现,这好像是从安卓的内核里面扣过来的,不清楚是安卓内核本身就有还是hw自己做的。github上找到一个hw安卓内核分析了一下,感觉还挺有意思的,分享一下。bootdevice驱动写的非常加单,是用来记录启动设备的驱动,这是驱动的说明Support multiple bootdevice, eMMC or UFS,这毕竟是安卓的内核,启动设备仅支持emmc和ufs的识别,原创 2021-03-16 11:14:00 · 2090 阅读 · 0 评论 -
Linux显卡驱动亮度调节功能书写指南.md
综述最近在一些项目中,接触了一些嵌入式领域的常用显卡。这类显卡一般都是不提供亮度调节等功能的,因此这部分需要自己实现。这也是第一次从头实现背光这一套,还比较简单的,记录一下。一般来讲,内核驱动的通用套路是,内核把公共的部分抽象出来做好,和设备相关的部分就需要各设备驱动自己做。这也就是我们常说的驱动框架,背光设备的话,肯定是套drm驱动里面的东西。背光设备初始化,一定是在显卡初始化里面做的,初始化好的的背光设备,会在/sys/class/backlight/XXX,上层调用这个接口,驱动处理相关的事件。原创 2021-03-04 14:59:35 · 776 阅读 · 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 · 2975 阅读 · 11 评论 -
如何在配置kdump
说明1、作者使用的操作系统是cenos 7 2、在百度上查了很多资料,都没什么用 3、本文只是讲了开启kdump服务,后面还会讲怎么分析core文件什么是kdump? kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。原创 2016-06-15 21:24:51 · 12485 阅读 · 0 评论 -
Linux路径名查找
对于文件系统的大部分操作(open、stat、unlink等等)都要涉及多多少少的路径解析。路劲解析是根据路径名(name string)得到对应的dentry对象,通过路径行走的方式。本文就来介绍路径行走。路径行走解释 路径是由一个开始字符(根目录、当前工作目录或者fd指向的目录),和一串其他的文件名组成的,path中的每一个文件名用/分割开。名称查找(Name Lookup)就是希望根据已知的原创 2016-05-11 16:12:11 · 3329 阅读 · 0 评论 -
阅读Linux0.11——head.s
最近经过反馈,博主得知了自己在输出自己的知识方面做的非常不好。经过认真的反思,好吧主要是思考别人是怎么做的,以及结合我的特点,得出如下结论: 1、认为每一个听众或者读者都是零基础,要直白的讲出想要讲给别人的知识。虽然这句话听起来像是废话,但是挺不容易的。举个栗子,拿Linux来说,我接触这个已经三四年时间,很多知识我觉得是很理所当然的,比如讲编程的时候我没必要一字一句讲的清清楚楚。解释一些API的原创 2016-03-23 16:13:26 · 890 阅读 · 0 评论 -
阅读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 · 1070 阅读 · 0 评论 -
当我们谈论开机的时候我们在谈论些什么(三)——特权级(未完成)
注:本文所有说到特权级大小的地方都是指的数字。本文阐述了两部分内容: 1、一致代码段和非一致代码段 2、怎么设置特权级特权级这部分比较绕,说起来并没有很多东西,但是需要整理整理。一、一致代码段和非一致代码段代码段分为一致代码段和和非一致代码段(只有代码段才区分这个,数据段并不区分)。一般我们认识一个新事物需要搞懂两个问题:为什么和怎么做。所以本文会解释为什么做这个区分,和怎么区分的。 做出这个原创 2015-12-07 21:36:52 · 689 阅读 · 0 评论 -
当我们谈论开机的时候我们在谈论什么(三)——段页式存储
本文谈论的PC都是基于X86架构,本文谈论的实现段页式存储都是基于32位操作系统。首先说一点题外话:我在写这篇文章的时候并没有实现我想要的段页式存储。本来规划的是写一个段页式存储的,后来觉得这样我后边每一个程序都要分一个段,填充一个选择子、一个描述符(这些都是程序员手动实现的,不理解原理,没有关系,后边我会讲一点原理的部分,以及我实现的并不是我想要的段页式存储)。本文主要讲这几个内容: 1、段页式原创 2015-12-18 22:25:21 · 1296 阅读 · 0 评论 -
bochs使用手册
对于每一个尝试自己写计算机开机引导甚至是一个操作系统的人来说bochs是一个很好用的工具,强大的调试功能以及自带的制作虚拟盘的工具都是亮点。 和大多数人一样,初次接触这个工具难免会比较生疏,所以要把很常用的命令记录下来,以便查看。 本手册不定期更新。1、如何运行自己的扇区引导1)、自己写好的扇区引导用nasm编译成.bin为后缀的纯二进制文件。(nasm是一个很强大的编译工具,他可以直接把汇编源原创 2015-11-25 21:49:51 · 3004 阅读 · 0 评论 -
我看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 · 1350 阅读 · 0 评论 -
当我们谈开机的时候我们在谈论些什么
本文主要解决了以下几个问题: 1、当你按下电源键以后都发生了什么? 2、Linux kernel初始化都在初始化什么? 3、init进程何时创建? 注:本文所有的的内核代码都是来自于kernel3.14.54,读者可以未经作者允许随意转载,但请保证文章的完整性。第一部分:当你按下电源的时候,你的计算机都做了什么。 当你按下电源的时候,你的内存,寄存器都是空的(材质都是易失性存储,断电后数据原创 2015-11-13 17:09:54 · 721 阅读 · 0 评论 -
schedule函数浅析
现代用户对操作系统的要求越来越“苛刻“,进程相应时间尽可能的快,系统的吞吐量要尽可能的多等等。这些要求在表面上看起来是互相矛盾的,所以现代操作系统提出了进程的概念,随之而来的就是进程调度。进程调度就是调度程序根据一定的准则,在就绪队列里边选择一个进程来执行。所以调度算法是调度程序讨论的核心点,不一样的内核版本调度算法以及一些机制可能是不同的,但是基本上一些大的方面是没有改变的,我看的内核版本是3.1原创 2015-10-28 18:41:05 · 6972 阅读 · 0 评论 -
内核同步机制的一些见解(未完成)
本文主要回答三个问题: 1、为什么要内核同步 2、内核同步有哪些策略 3、Liunx内核同步的代码实现 先来说说内核抢占,这时一个很重要的概念。内核抢占通俗来讲,的那个一个内核进程在运行的时候,是否允许另外一个内核进程进行抢占。内核抢占减少了用户程序的分派延时,提供了更好地人机交互。但是有的进程要求在持续运行直到结束,所以系统也提供了这样的接口,代码如下:#define preempt_di原创 2015-10-28 20:55:30 · 635 阅读 · 0 评论 -
写自己的内核模块——获取一个进程的物理地址
首先,根据一个虚拟地址是可以得到物理地址的,这个内核模块是可以做到的。 大概就以下这几步: 1、得到当前进程的task_struct结构体(类似于current宏的实现) 2、得到进程的mm_struct结构体 3、搞一个虚拟地址(一个变量的地址或者一个函数的地址) 4、先得到pgd,然后根据pgd找到pud,根据pud找到pte,当当当当,你得到了该变量(或者函数)所在页面的页表表项地址原创 2015-11-07 15:14:56 · 2860 阅读 · 2 评论 -
进程的一生——请求调页篇
本文主要解答了三个问题: 1、 注:本文所有的的内核代码都是来自于kernel3.14.54,读者可以未经作者允许随意转载,但请保证文章的完整性。 内存管理部分的内容繁杂没有接构型,为了好理解一些,我准备从进程着手来简单的讲解这一部分。在do_fork函数中,新创建的子进程会调用函数dopy_mm复制父进程的内存管理等部分,在分析这个函数之前,还要说一下几个结构体: 1、mm_struct结原创 2015-11-07 12:14:28 · 2163 阅读 · 0 评论