Linux 初始化过程,会依次建立如下页表映射:
1. 恒等映射:页表基地址 idmap_pg_dir;
2. 粗粒度内核镜像映射:即上篇博文里的“第二次建立页表映射”,页表基地址 init_pg_dir;
3.fixmap 映射:页表基地址为 init_pg_dir, 待 paging_init 之后为 swapper_pg_end;
4. 细粒度内核镜像映射:页表基地址为 swapper_pg_dir;
5. 线性映射:页表基地址为 swapper_pg_dir;
6. 用户空间页表映射:页表基地址 task->mm->pgd;
上篇已经解析了 1 和 2 映射,这篇解析fixmap 映射。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910 ...
一、虚拟内存如果你是电子相关专业的,肯定在大学里捣鼓过单片机。单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。另外,单片机的 CPU 是直接操作内存的「物理地址」
在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立刻崩溃。
操作系统是如何解决这个问题呢?
这里关键的问题是这两个程序都引用了绝对物理地址,而这正是我们最需要避免的。
我们可以把进程所使用的地址「隔离」开来,即让操作系统为每个进程分配独立的一套「虚拟地址」,人人都有,大家自己玩自己的地址就行,互不干涉。但是有个前提每个进程都不能访问物理地址,至于虚拟地址最终怎么落到物理内存里,对进程来说是透明的,操作系统已经把这些都安排的明明白白了。
操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。
如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不 ...
一、OneMore的诞生在公司其他事业部有一个工具包bsptools集成了一些常用的工具,咨询了作者不开源。同时设计的UI界面因为偏重于实用,界面设计也较为复古
受到此软件的启发,有了制作一款高度自定义的集成工具的想法,OneMore由此诞生。下图为软件登录界面
二、框架设计OneMore使用了pyqt6+fluent-widgets(https://github.com/zhiyiYo/PyQt-Fluent-Widgets/tree/PyQt6)进行开发,以侧边导航栏为分类,以新建标签页的形式来呈现每个工具的功能。将工具所需要的变量以可视化的方法交由使用人员配置进行。
app/common: 存放通用的一些接口app/resource: 存放资源文件,包括图标,背景图片,语言翻译文件等等app/view/mtk_subinterface: 存放侧边导航栏MTK的工具集app/view/qcom_subinterface: 存放侧边导航栏高通的工具集app/view/ui : 设计为QT desig ...
一、晶体管原理晶体管几乎改变了整个世界,一切以半导体为基础的电子元器件都离不开晶体管。令人惊讶的是,首个可运行晶体管于1947年12月23日面世,距今已有70多年!晶体管或许是人们发明的最具革命性的元器件之一。它的出现为集成电路、微处理器以及计算机内存的产生奠定了基础。制作晶体管的主要材料为硅,硅原子外层有四个电子,处于不稳定状态。为了保持稳定,硅原子会和其他的硅原子相结合,从而形成8个电子的稳定结构。为了增强硅的导电性,需要对硅进行掺杂,当往硅里掺入拥有5个电子的磷元素时,此时会多出来一个可自由移动的电子,这种半导体被称为N型半导体。如果我们往里面掺入拥有3个电子的硼元素时,当与硅结合时,会缺少一个电子,从而形成了一个空穴。它的电子可以通过移动来填充整个空穴,这种半导体被称为P型半导体。现在我们分别使用磷元素和硼元素对硅进行掺杂,这样就形成了一个PN结。一开始,N型半导体的边界会有一些自由电子流向P型半导体,并填充里面的空穴,这会导致P型半导体的边界带少量的负电,而N型半导体的边界则会带少量的正电,从而产生内建电场。内建电场会阻止电子继续迁移,所以就会在中间形成耗尽层。如果我们在P ...
Linux Kernel
未读
特别提醒:本文章所有涉及的代码均可在linux-5.15处查看源码。
一、内核中关于中断控制器的几个概念在介绍中断控制器的注册前先介绍内核中关于中断控制器几个知识点:
1.1 IRQCHIP_DECLARE用于实现中断控制器的of_device_id结构,该数据结构会在__irqchip_of_table内核代码段。这段代码的作用就是创建一个结构体,名为 __#table_of_table,table是传入的参数,从OF_DECLARE_2定义看,也就是irqchip,所以最后的结构体名为__irqchip_of_table
123456789101112#define IRQCHIP_DECLARE(name, compat, fn) OF_DECLARE_2(irqchip, name, compat, fn)#define OF_DECLARE_2(table, name, compat, fn) \ _OF_DECLARE(table, name, compat, fn, of_init_fn_2)#define _OF_DECLARE(table, name, com ...
一、Armv8-A地址翻译Armv8-A使用一个虚拟内存系统,其中代码所使用的地址(虚拟地址)被转换为内存系统所使用的物理地址。此转换由被称为内存管理单元(MMU)的处理器的一部分执行。Arm体系结构中的mmu使用存储在内存中的转换表将虚拟地址转换为物理地址。MMU将在必要时自动读取翻译表,此过程被称为表行走。MMU的一个重要功能是使系统能够运行多个任务,作为在自己的私有虚拟内存空间中的独立程序运行。它们不需要了解系统的物理内存映射,即硬件所使用的地址,或了解可能同时执行的其他程序。您可以为每个程序使用相同的虚拟内存地址空间。您还可以使用连续的虚拟内存映射,即使物理内存是碎片化的。此虚拟地址空间与系统中内存的实际物理映射分开。您可以编写、编译和链接应用程序,以在虚拟内存空间中运行。单个系统中的不同处理器和设备可能具有不同的虚拟和物理地址映射。特权软件,如操作系统,通过编程使MMU在这两个内存视图之间进行转换,如下图所示。要做到这一点,虚拟内存系统中的硬件必须提供地址转换,这是由处理器发出的虚拟地址到主内存中的物理地址的转换。
虚拟地址是您在内存中放置代码时以及编译器和链接器所使用的 ...
ARMv8体系架构
未读严格来说,中断是说软件执行流程的东西,但是,在arm术语中,统称为异常。异常是需要特权软件(异常处理程序)执行某些操作以确保系统顺利运行的条件或系统事件。每种异常类型都有一个异常处理程序。一旦处理完异常,特权软件就会让内核准备好恢复它在处理异常之前所做的任何事情。下面介绍了几种异常:
Interrupt 一般有两种,分为irq和fiq。fiq的优先级高于IRQ,这两种异常通常都与内核上的输入引脚相关。假设中断未被禁用,外部硬件断言了一个中断请求并在当前指令完成执行时触发相应的异常类型(irq or fiq),fiq和irq对core来说都是物理信号,当被断言时,如果内核当前已启用,则会发生相应的异常。在几乎所有系统上,各种中断源都使用中断控制器连接。中断控制器对中断进行仲裁并确定其优先级,进而提供串行化的单个中断信号,然后将其连接到内核的FIQ或IRQ信号。由于IRQ和FIQ中断的发生在任何时间,与内核正在执行的软件没有直接关系,因此它们被归类为异步异常 。
Abort 在指令获取失败(指令中止)或数据访问失败(数据中止)时生成中止。它可来源于内存访问错误时的外部内存系统(可能 ...
问题现象售后出现一台无法开机的机器,现象是卡白米
问题分析set_frame 0x00后没有ackset_frame 0x03后没有ack
同时kernel启动3s后,stick驱动一直反复打印日志,从3s到34s之间几乎全部是stick驱动读写的报错日志
34s的时候发现misc分区没有挂载,init发起了reboot的指令
而misc分区没有挂载的原因就是cpu一直被stick占用,导致mountFstab无法挂载分区。检查读写函数,发现如下异常这是一个嵌套循环,也就是100*10=1000次的反复调用spinlock的接口获取和释放锁。
问题原因此问题的原因在于spinlock的频繁获取和释放,导致CPU被占用,性能下降导致无法开机。
下面总结一下自旋锁被频繁申请释放的风险和问题:在Linux内核中,自旋锁(spinlock)是一种用于保护共享资源的锁机制,主要用于短时间的锁定操作,不会引起线程调度。频繁地启用(enable)和禁用(disable)自旋锁可能带来以下风险和问题:
性能开销:每次获取和释放自旋锁都会涉及内存屏障和CPU指令,以确保内存操作的顺序性和锁 ...
一、问题背景https://wayawbott0.f.mioffice.cn/sheets/shtk4qr1GSkUjvozmsj0OWi0tGe测试版本:V816.0.24.8.26.UGUCNXM稳定版挂测MTBF报出大量的空指针引用的报错
二、问题分析2.1 dump解析使用离线解析工具linux ramdump parser解析dump,打开dmesg_tz.txt
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051[51222.768793][T13540] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000038[51222.768825][T13540] Mem abort info:[51222.768836][T13540] ESR = 0x96000007[51222.768848][T13540] EC = 0 ...
一、问题现象老化测试时出现黑屏现象,9/12:今天已经确认的现象
使用9-11的版本 72台机器出现27 个黑屏,其中25个为USB问题引起的dump(2个是电量低关机),通过LOG分析是在老化45次重启测试的时候出问题(45次重启1个半小时),9-11版本带了高通的等待probe完成 wait_for_device_probe
出现黑屏的问题是使用33瓦的充电器出现问题,5V2A 的充电器没有问题(上海没有出现黑屏的原因就是因为使用的是5V2A)
老化充电100的原因也和充电器有关,使用33瓦的时候设置了停充概率有复冲的情况已经找到原因,今天给出解决方式
9/13 验证结果:使用0912的版本验证50PCS,出现1带黑屏,原因是低电量关机,电量在正常范围(60~80之间),出现adb 端口没有0912 临时版本修改项
解决方案将在报错的函数前加空指针return出去和加log–吴超
修改了老化电量管控节点问题—曾祥源
9/14 验证结果:验证老化黑屏的2个版本工厂端:加一个判断获取到的设备只是否为空—–24/50 黑屏上海:报错的 ...