- 博客(512)
- 收藏
- 关注
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程
构建工具重要性不言而喻,它描述了整个工程的如何编译、连接,打包等规则,其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后输出我们想要的文件。建议大家去调试下源码,非常有意思,能看清楚所有的细节.本篇将编译工具中重要代码都加上了注解.具体gn是如何生成.ninja文件的,后续有篇幅详细介绍其语法及在鸿蒙中的使用.具体ninja是如何运行的,后续有篇幅详细介绍其语法及在鸿蒙中的使用.,调试时建议在这里打断点,顺瓜摸藤,跟踪相关函数的实现细节.
2025-04-03 22:31:07
768
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单
个人喜欢做一劳永逸的事,如果有试过手动去安装鸿蒙开发环境,下载源码,确保编译成功其实是件非常麻烦的事情, 在虚拟机和WSL2上都跑通之后,发现其中的坑不少,这些坑本身没有技术含量,知道了也就知道了,但它们却跟牛皮癣一样,遇到了就不容易好老复发真烦人. 如何防止得牛皮癣的最好办法不是去治疗牛皮癣,而是不得牛皮癣,打上牛皮癣的疫苗. 这是本篇存在的意义,让整个过程简单,舒适,一气呵成.脚本获取方式: 1.直接下载 2.本篇内容 ctrl+c/v。
2025-04-03 21:54:29
818
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程
编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。这个过程是整个程序构建的核心部分,也是最复杂的部分之一。汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。编译过程要经过:源文件 --> 预处理 --> 编译(cc1) --> 汇编器(as) --> 链接器(ld) --> 可执行文件(PE/ELF)main.o的内容为机器码,不能以文本形式方便的呈现,不过可以利用 objdump -S file 查看源码反汇编。
2025-04-03 21:06:02
609
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(重定位篇) | 与国际接轨
重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程。它是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位。1.静态重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位。也就是在生成可执行/共享目标文件的同时已完成地址的静态定位,它解决了可执行文件/共享目标文件的内部矛盾.
2025-04-03 20:20:08
730
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程
准备工作完成,开始了真正的分析. 因为命令输出内容太多,本篇做了精简,去除了干扰项.对这些命令还不行清楚的请翻看系列篇其他文章,此处不做介绍,阅读本篇需要一定的基础.本篇将通过一个完整的小工程来阐述ELF编译,链接过程,并分析.o和bin文件中各区,符号表之间的关系.从一个崭新的视角去看中间过程.看到 .c .h .o 就感觉特别的亲切 : ),项目很简单,但具有代表性,有全局变量/函数,区,再反查 18区,果然发了 main.c和part.c的数据都放在了这里.,多文件链接,和动态链接库的。
2025-04-03 15:51:57
599
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(ELF解析篇) | 内核加载
这俩宝贝长的很像,但仔细看中间参数是大S和小s,说到大S小s又有点意思了,这姐妹俩上了点年纪的码农都应该不陌生,据说是性格完全不同.个人喜欢大的,甜美安静,小的太聒噪,受不了,码农最需要安静了。在构建可执行程序时,链接器(linker)可能需要把一些独立的目标文件和库文件链接在一起,在这个过程中,链接器要解析各个文件中的相互引用,调整某些目标文件中的绝对引用,并重定位指令码。ELF,它实在是太重要了,内核加载的就是它,不说清楚它怎么去说清楚应用程序运行的过程呢.看到下面这一坨一坨的,除了。
2025-04-02 20:47:00
556
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main
在ELF规范中,所有符合ELF格式规范的都称为ELF文件,也称为目标文件,这两个名字是相同的,而经过编译但没有连接的文件则称为"可重定位文件 (relocatable file)“或"待重定位文件 (relocatable file)”.本文采用与此规范相同的命名方式,所以当提到可重定位文件时,一般可以理解为惯常所说的目标文件;,意思是这个 ELF 文件中,字符串表是一个普通的 Section,在这个 Section 中,存储了 ELF 文件中使用到的所有的字符串。看了这么久还记得开头的C代码的样子吗?
2025-04-02 17:28:26
698
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南
因为代码量很大,加上网速,gitee仓库本身原因第一种方式存在失败概率,浪费时间,这种没技术含量的折腾没啥意义,本篇采用直接站点下载方式,请对照着前往下载。本篇主要采用 windows + docker 方式编译鸿蒙. 记录编译鸿蒙的过程,以备后续不用再去一大堆无效的误导式软文中搜寻芝麻大点有用的信息,那样真挺费时费心力.要有编译环境,编译环境是个很头痛的事情,自己装太麻烦,也容易出错,但 docker真的很香,官方也帮我们解决了这个问题。设置路径成功后,可查看下当前设置信息。目录下,并创建好两个空目录,
2025-04-02 15:27:22
901
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行
从栈中弹出赋给寄存器.才真正完成了内核栈到用户栈的切换.回到了user.source()继续运行.本篇有相当的难度,涉及用户栈和内核栈的两轮切换,CPU四次换栈,寄存器改值,将围绕下图来说明.注意这里还不是真正的切换上下文,只是改变内核栈中现有的数据.这些数据将还原给寄存器.系统调用号长这样,是不是看到一些很熟悉的函数.有了上面的铺垫,就不难理解这个函数的作用.指向的是用户栈的位置.一旦。
2025-04-02 13:32:39
282
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(信号生产篇) | 注意结构体的名字和作用.
信号思想来自Unix,它老人家已经五十多岁了,但很有活力,许多方面几乎没发生大的变化.信号可以由内核产生,也可以由用户进程产生,并由内核传送给特定的进程或线程(组),若这个进程定义了自己的信号处理程序,则调用这个程序去处理信号,否则则执行默认的程序或者忽略.不可靠信号: 也称为非实时信号,不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值取值区间为1~31;信号分为两大类:可靠信号与不可靠信号,前32种信号为不可靠信号,后32种为可靠信号。对于信号0有特殊的应用。
2025-04-01 22:15:45
657
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(进程回收篇) | 进程关系链
一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。如果一个进程已经终止,但是它的父进程尚未调用wait或waitpid对它进行清理,这时的进程状态称为僵尸(Zombie)进程,即 Z 进程.任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了. 不正常情况下就需要手动waitpid清理了.一个进程的自然消亡过程如下。
2025-04-01 20:19:31
509
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(特殊进程篇)
了0号进程.为什么一定要先设置当前进程,因为fork需要一个父进程,而此时系统处于启动阶段,并没有当前进程. 是的,您没有看错.进程是操作系统为方便管理资源而衍生出来的概念,系统并不是非要进程,任务才能运行的. 开机阶段就是啥都没有,默认跑在svc模式下,默认起始地址。2号进程为内核态的老祖宗,是内核创建的首个进程,源码过程如下,省略了不相干的代码.是内核设置的第一个当前进程.有了它,就可以fork, fork, fork!都是由硬件上电后规定的. 进程,线程都是跑起来后慢慢赋予的意义.
2025-04-01 16:53:18
552
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(Fork篇) | 一次调用,两次返回
fork函数的特点概括起来就是“调用一次,返回两次”,在父进程中调用一次,在父进程和子进程中各返回一次。从上图可以看出,一开始是一个控制流程,调用fork之后发生了分叉,变成两个控制流程,这也就是“fork”(分叉)这个名字的由来了。
2025-04-01 15:10:48
679
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(中断管理篇)
中断概念很多,比如中断控制器,中断源,中断向量,中断共享,中断处理程序等等.本篇做一次整理.先了解透概念才好理解中断过程.用海公公打比方说明白中断各个概念.可前往查看.此字段标识相应的中断是边缘触发的还是电平触发的。看这种代码因为涉及硬件部分,需要对照 ARM中断控制器 gic_v2.pdf 文档看.可前往地址下载查看.用自下而上的方式,从中断源头纯汇编代码往上跟踪代码细节.说清楚保存和恢复中断现场。,剖析鸿蒙内核实现中断的过程,很像设计模式中的观察者模式.函数,到消费中断函数的。例如:时钟节拍处理函数。
2025-04-01 15:04:31
942
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(中断概念篇)
中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。如图:外设可以在没有CPU介入的情况下完成一定的工作,但某些情况下也需要CPU为其执行一定的工作。通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务,而当外设需要CPU时,将通过产生中断信号使CPU立即中断当前任务来响应中断请求。
2025-03-31 22:18:10
839
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射
中断概念很多,比如中断控制器,中断源,中断向量,中断共享,中断处理程序等等.本篇做一次整理.先了解透概念才好理解中断过程.用海公公打比方说明白中断各个概念.来看,不然100%懵逼.结合看就秒懂,代码都已经注释,不再做解释,注解中提到的 翻看287行 是指源码的第287行,请对照注解源码看理解会更透彻.在中断环境下,从当前线程切换到目标线程,这种方式也称为硬切换.它们通常由硬件产生或是软件发生异常时的被动式切换.哪些情况下会出现硬切换呢?,剖析鸿蒙内核实现中断的过程,很像设计模式中的观察者模式.
2025-03-31 20:21:59
601
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务
ARM有7种工作模式,到了进程层面只需要考虑内核模式和用户模式两种,对应到任务会有内核态栈空间和用户态栈空间.内核模式的任务只有内核态的栈空间,用户模式任务二者都有.栈空间是在初始化一个任务时就分配指定好的.以下是两种栈空间的初始化过程.为了精练省去了部分代码,留下了核心部分.才恍然大悟,因为三级流水线的原因,LR和PC寄存器之间是差了一条指令的,LR指向了处于译码阶段指令,而PC指向了取指阶段的指令,所以此处做了两次LR入栈,其实是保存了未执行的译码指令地址,确保执行不会丢失一条指令.
2025-03-31 17:29:29
294
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(汇编汇总篇)
鸿蒙内核源码分析系列篇至少已经有五篇涉及到了汇编,请自行翻看,但还是远远不够,要写十五篇,彻底摸透,现在才刚刚开始,本篇先整理鸿蒙内核所有汇编文件和大概说明文件的作用,后续一块一块来剥,不把这些汇编剥个精光不罢休.(unit processing )的意思,单个CPU,虽然没mp的复杂,但文件也很大 500行汇编,一小节讲不完,需要单独的一篇专讲。直接点击可以查看注解源码,有些站点会把链接去除,没办法,可直接去各大站点搜"鸿蒙内核源码分析",找到源码注解.两个函数的汇编现实,有点复杂,后续单独说明.
2025-03-31 15:46:54
900
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(异常接管篇) | 社会很单纯,复杂的是人
osExceptUndefInstrHdl:@出现未定义的指令处理#else#endif。
2025-03-31 13:32:11
518
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(寄存器篇) | 宇宙最忙存储器
未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。除用户模式外,其余6种工作模式都属于特权模式。
2025-03-30 21:43:33
762
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(系统调用篇) | 开发者永远的口头禅
这意味着处理器模式会更改为超级用户模式,CPSR 会保存到超级用户模式 SPSR,并且执行会跳转到 SVC 向量(请参阅《开发指南》中的第 6 章 处理处理器异常)。在此版本的 RVCT 中,SWI 指令反汇编为 SVC,并提供注释以指明这是以前的 SWI。看不太懂的没关系,这里我们只需要记住:系统调用号存放在r7寄存器,参数存放在r0,r1,r2寄存器中,返回值最终会存放在寄存器r0中。全称是 SuperVisor Call,完成工作模式的切换.不管之前是7个模式中的哪个模式,统一都切到。
2025-03-30 20:17:21
652
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(工作模式篇) | CPU的七种工作模式
未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。除用户模式外,其余6种工作模式都属于特权模式。
2025-03-30 19:08:36
1010
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(时间管理篇) | 谁是内核基本时间单位
当Tick为100时,则1 000 000 000/100 = 10000000 ,即一个tick内可产生1千万个CPU周期.CPU就是用这1千万个周期去执行指令的.对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。指令不同,所需的机器周期数也不同。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。,这是固定不变的,由硬件晶振的频率决定的.
2025-03-28 21:51:06
568
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(原子操作篇) | 谁在为原子操作保驾护航
然而同一内存区域的数据可能同时被多个任务访问,如果在修改数据的过程中被其他任务打断,就会造成该操作的执行结果无法预知。由此实现的原子操作能确保对同一数据的“读取-修改-写入”操作在它的执行期间不会被打断,即操作的原子性。看过自旋锁篇的应该对LDREX和STREX指令不陌生的,自旋锁的本质就是对某个变量的原子操作,而且一定要通过汇编代码实现,也就是说。关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。标志寄存器为0时,退出循环,原子操作结束。
2025-03-28 20:43:16
637
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(消息队列篇) | 进程间如何异步传递大数据
任务能够从队列里面读取消息,当队列中的消息为空时,挂起读取任务;当队列中有新消息时,挂起的读取任务被唤醒并处理新消息。任务也能够往队列里写入消息,当队列已经写满消息时,挂起写入任务;当队列中有空闲消息节点时,挂起的写入任务被唤醒并写入消息。如果将读队列和写队列的超时时间设置为0,则不会挂起任务,接口会直接返回,这就是非阻塞模式。队列接收来自任务或中断的不固定长度消息,并根据不同的接口确定传递的消息是否存放在队列空间中。创建一个队列,两个任务。任务1调用写队列接口发送消息,任务2通过读队列接口接收消息。
2025-03-28 17:25:00
728
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环
一样的, 以JAVA举例,对内核来说 new thread中的run() 函数 和 main() 并没有区别. 都是一个线程(任务)的执行入口. 注意在系列篇中反复的说任务就是线程,线程就是任务,它们是一个东西在不同层面上的描述.对应用层说线程,对内核层说任务. 有多少个线程就会有多少个入口,它们统一接受调度算法的调度, 调度算法只认优先级的高低,不会管你是main() 还是 run() 而区别对待.指令是稳定的,但指令序列是变化的,只有这样计算机才能够实现用计算来解决一切问题这个目标。
2025-03-28 15:00:29
688
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(定时器篇) | 哪个任务的优先级最高
软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器。当经过设定的Tick数后,会触发用户自定义的回调函数。
2025-03-28 13:37:58
867
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案
先看官方对事件的描述.事件(Event)是一种任务间通信的机制,可用于任务间的同步。多任务环境下,任务之间往往需要同步操作,一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。一对多同步模型:一个任务等待多个事件的触发。可以是任意一个事件发生时唤醒任务处理事件,也可以是几个事件都发生后才唤醒任务处理事件。多对多同步模型:多个任务等待多个事件的触发。
2025-03-27 22:02:13
772
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(信号量篇) | 谁在负责解决任务的同步
测试任务Example_TaskEntry创建一个信号量,锁任务调度,创建两个任务Example_SemTask1、Example_SemTask2,Example_SemTask2优先级高于Example_SemTask1,两个任务中申请同一信号量,解锁任务调度后两任务阻塞,测试任务Example_TaskEntry释放信号量。Example_SemTask2得到信号量,被调度,然后任务休眠20Tick,Example_SemTask2延迟,Example_SemTask1被唤醒。
2025-03-27 20:20:44
795
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽
信号思想来自Unix,在发展了50年之后,许多方面都没有发生太大的变化.信号可以由内核产生,也可以由用户进程产生,并由内核传送给特定的进程或线程(组),若这个进程注册/安装了自己的信号处理程序,则内核会调用这个函数去处理信号,否则则执行默认的函数或者忽略.信号分为两大类:可靠信号与不可靠信号,前32种信号为不可靠信号,后32种为可靠信号。文件消息队列隐约感觉鸿蒙的分布式通讯,跨屏之类的功能是靠它实现的,分布式的代码还没研究,尚不清楚,如果有了解的请告知.后续要重点研究下跨应用通讯的技术实现.
2025-03-27 17:24:57
572
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(互斥锁篇) | 互斥锁比自旋锁丰满多了
图中是内核有关模块对互斥锁初始化,有文件,有内存,用消息队列等等,使用面非常的广.其实在给内核源码加注的过程中,会看到大量的自旋锁和互斥锁,它们的存在有序的保证了内核和应用程序的正常运行.是非常基础和重要的功能.
2025-03-27 15:06:44
270
原创 【OpenHarmony 5.0】鸿蒙内核源码分析——(自旋锁篇)
自旋锁的设计理念是它仅会被持有非常短的时间,锁只能被一个任务持有,而且持有自旋锁的CPU是不可以进入睡眠模式的,因为其他的CPU在等待锁,为了防止死锁上下文交换也是不允许的,是禁止发生调度的.顾名思义,是一把自动旋转的锁,这很像厕所里的锁,进入前标记是绿色可用的,进入格子间后,手一带,里面的锁转个圈,外面标记变成了红色表示在使用,外面的只能等待.这是形象的比喻,但实际也是如此.上面的指令意味着,读取寄存器Ry指向的4字节内存值,将其保存到Rx寄存器中,同时标记对Ry指向内存区域的独占访问。
2025-03-27 13:28:54
934
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(并发并行篇) | 听过无数遍的两个概念
通俗好理解的比喻就是高速单行道,单行道指的是CPU的核数,跑的车就是线程(任务),进程就是管理车的公司,一个公司可以有很多台车.并发和并行跟CPU的核数有关.车道上同时只能跑一辆车,但因为指挥系统很牛,够快,在毫秒级内就能换车跑,人根本感知不到切换.所以外部的感知会是同时在进行,实现了微观上的串行,宏观上的并行.每次Tick的到来,处理函数会去扫描这两个链表,看有没有定时器超时的任务需要执行,有则立即执行定时任务,定时任务是所有任务中优先级最高的,0号优先级,在系列篇中有专门讲定时器任务,可自行翻看.
2025-03-26 21:52:19
997
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源
的关系,进程可以有多个任务但一个任务不能同属于多个进程. 任务就是线程,是CPU的调度单元.线程的概念在 鸿蒙内核源码分析(总目录) 中的线程篇中有详细的介绍,可自行翻看. 任务是作为一种资源被进程管理的,进程为任务提供内存支持,提供文件支持,提供设备支持.若进程的调度策略为SCHED_RR(抢占式),且存在同一优先级的另一个进程处于就绪态,则该进程的时间片消耗光之后,该进程由运行态转为就绪态,另一个同优先级的进程由就绪态转为运行态。从系统的角度看,进程是资源管理单元。
2025-03-26 20:17:23
803
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(汇编传参篇) | 如何传递复杂的参数
因为寄存器数量有限,所以只能通过这种方式来传递大的参数,想想也只能在main函数栈中保存大部分参数,同时又必须确保数据的连续性,好像也只能用这种办法了,一部分通过寄存器传,一部分通过拷贝的方式倒是挺有意思的.
2025-03-26 17:00:04
661
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班
这哥俩也是成对出现的,这是函数调用的必备装备,作用是保存和恢复调用者的现场,例如 main -> fp, fp要保存main的栈帧范围和指令位置, lr保存的是main函数执行到哪个指令的位置, r11的作用是指向main的栈顶位置,如此fp执行完后return回main的时候,先mov pc,lr, PC寄存器的值一变, 表示执行的代码就变了,又回到了main的指令和栈帧继续未完成的事业.当然要,add sp, sp, #8 就是释放栈空间. 是一对的,减了又加回去,空间就归还了.
2025-03-26 15:20:36
998
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(线程概念篇) | 是谁在不断的折腾CPU
互斥量(taskMux,futex)能解决这个问题,办事前先拿锁,拿到了锁的爽了,没有拿到的就需要排队,在lockList上排队,注意lockList是个双向链表,它是内核最重要的结构体,开篇就提过,没印象的看 (双向链表篇),上面挂都是等锁进房间的西门大官人.这是互斥量的原理,解决任务间资源紧张的竞争性问题.是简单的先来后到(FIFO)吗?公司的资源是有限的,CPU自己也是公司的资源,除了它还有其他的设备,比如做作业用的黑板,用户A,B,C都可能用到,狼多肉少,咋搞?
2025-03-26 13:34:09
909
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的
第三: push {r11, lr} 和 pop {r11, lr} 也是成对出现的,主要是用于函数调用,例如 A -> B, B要保存A的栈帧范围和指令位置, lr保存是是A函数执行到哪个指令的位置, r11干了fp的工作,其实就是指向 A的栈顶位置,如此B执行完后return回A的时候,先mov pc,lr 内核就知道改执行A的哪条指令了,同时又知道了A的栈顶位置.第一: 上面的代码和鸿蒙内核用栈方式一样,都采用了递减满栈的方式, 什么是递减满栈?这是以上为汇编代码的分析,追问两个问题。
2025-03-25 22:02:00
859
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(物理内存篇) | 怎么管理物理内存
鸿蒙是面向未来设计的系统,高瞻远瞩,格局远大,设计精良, 海量知识点, 对内核源码加上中文注解已有三个多月,越深入精读内核源码,越能感受到设计者的精巧用心,创新突破, 向开发者致敬. 可以毫不夸张的说鸿蒙内核源码可作为大学C语言,数据结构,操作系统,汇编语言 四门课程的教学项目.如此宝库,不深入研究实在是暴殄天物,于心不忍.张三来了要7斤猪肉,怎么办?物理内存是一整头猪,已经切成了1斤1斤的了,但是还都连在一起,每一斤上都贴了个标号, 而且老板只按 1斤(2^0), 2斤(2^1), 4斤(2。
2025-03-25 20:29:38
680
原创 【OpenHarmony 5.0】鸿蒙内核源码分析(内存规则篇) | 内存管理到底在管什么
这是整个紫荆城的全貌图,里面的内核虚拟空间是主人专用的,里面放的是主人的资料,数据,奴才永远进不去,kernel heap 也是给主人专用的动态内存空间,管理奴才和日常运作开销很多时候需要动态申请内存,这个是专门用来提供给主人使用的。奴才之间是不能随意勾连,登门问客的,防止一块搞政变. 他们都有属于自己的活动空间,而且活动空间还巨大巨大,大到奴才们觉得整个紫荆城都是他们家的,给你这么大空间你干活才有动力,奴才们是铆足了劲一个个尽情的表演各种剧本,有玩电子商务的,有玩游戏的,有搞直播的等等。
2025-03-25 16:17:48
670
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人