y909334873

个性签名:Hello astroturfers

  • 2024-05-20
  • 回复了主题帖: 有没有大佬能帮忙内推实习

    你这个项目经验最好着重写一下你在里面负责什么,侧重点在什么上,你简历上描述好多都太笼统,就是这些技能放在工作几年的工程师身上我感觉也算不错的了。按理来说应该也会有回复,可能也跟你还在大三,还有你投的公司可能也有比较多的筛选也有关系

  • 2024-05-10
  • 回复了主题帖: 论坛在悄悄的努力,改变你看到了吗?

    都没怎么注意,你这么一说现在这些点赞,赞赏三连这些图标是这次更新的,还是以前就改版过了,以前点赞加精图标比较单薄

  • 2024-04-19
  • 回复了主题帖: 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》 - 第三章 内核调试与优化

    iysheng 发表于 2024-4-19 09:55 你的 gcc 版本是书中指定的么? 没看到有指定的版本,只有看到建议4.9.2以上

  • 2024-04-18
  • 发表了主题帖: 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》 - 第三章 内核调试与优化

    如果说前几章还是纸上谈兵,那么或许的几个章节就更多设计具体的实际操作和模拟了。首先但然后是编译了,针对编译其实有着不同的优化等级,需要根据自己的需求确定优化的级别,不同的优化级别可能会影响到你实际的使用,甚至达不到你本身代码可以达到的业务逻辑。所以有时候就会出现明明我这边业务逻辑都是对的,实际却去了意想不到的地方。         编译完之后当然就是运行测试了,搭建测试环境是最玄学的事情了,有时候按部就班一下子就能完成,有的却坎坎坷坷走不完,qemu虚拟机+debian平台;然而不幸的我就中招了。 1、不管你有没有装,咱安装一堆工具sudo apt-get install qemu libncurses5-dev gcc-aarch64-linux-gnu build-essential git bison flex libssl-dev qemu-system-arm 2、qemu-system-aarch64 --version 查看了版本发现是装的4.2.0,而我的是2.11.1   3、git clone https://e.coding.net/benshushu/runninglinuxkernel_5.0/runninglinuxkernel_5.0.git 拉库切分支一气呵成。   4、./run_debian_arm64.sh build_kernel 编译内核,开心的日子到此为止   鲜红的报错在此,然后就前前后后折腾了快两周,查看的软件版本都是当前最新的支持版本aarch64-linux-gnu-gcc也重新安装了。但就是不支持,网上找了也没找到合适的,看了进度比较快的maskmoo 他比较顺利也没有遇到类似的问题。我的是Ubuntu18,是不是支持的版本低了,还是qemu-system-aarch64版本里的缘故,还在尝试解决中,导致后续的几个章节都只能看看流程而不能实操验证,有解决方向的朋友也希望不吝赐教。     环境卡住了,就先往下看看ftrace,trace跟踪器方便用于快速定位问题,在发生某些问题的时候可以尽快定位上下文。 后续perf工具的使用,没法再虚拟机实验,就直接在本地进行了安装    perf list:   后续对具体的性能测试,生成svg图这些就没有继续跑了,还是得抓紧解决环境问题,同时后续的宕机测试也需要,加油去干  

  • 2024-04-16
  • 回复了主题帖: 阅读打卡终点站:安全漏洞分析——《奔跑吧Linux内核2:调试与案例分析》

    1.请简述高速侧信道攻击的原理。 >> 侧信道攻击(side-channel attack)是密码学中常见的暴力攻击技术。它是针对加密电子设备在运行过程中的时间消耗、功率消耗或电磁辐射之类的侧信道信息泄露而对加密设备进行攻击的方法;而高速侧信道则是计算机高速缓存和物理内存不同的访问延时来做侧信道攻击。根据访问时间来判断对应的位是0还是1。 2.在CPU熔断漏洞攻击中,攻击者在用户态访问内核空间时会发生异常,攻击者进程会被终止,这样导致后续无法进行侧信道攻击,那么如何解决这个问题? >> 我们可以在攻击者进程中设置异常处理信号。当发生异常时调用该信号的回调函数,从而抑制异常导致的攻击过程的失败。 3.请简述熔断漏洞攻击的原理和过程。 >>CPU熔断漏洞巧妙地利用了现代处理器中乱序执行的副作用进行侧信道攻击,破坏了基于地址空间隔离的安全机制,使得用户态程序可以读出内核空间的数据,包括个人私有数据和密码等。 过程:1、定义一个信号,用于在程序访问非法地址时,内核发送该信号并执行对应回调而不是发生段错误 2、定义一个可以安全访问的数组用于将对应高速缓存数据冲刷掉。3、访问需要攻击的访问地址触发异常进异常处理程序,但是由于乱序执行,cpu预加载了后续指令,导致CPU将攻击地址内容读出4、通过测了比对,按照高速缓存步长来遍历定义的可以安全访问的数组,测量访问时间反推相应位数的值。

  • 回复了主题帖: 关于单片机串口通信的问题

    短接自发自收看看                                   

  • 回复了主题帖: 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》- 分析 oops 错误

    maskmoo 发表于 2024-4-15 22:34 没有遇到,默认环境也会有问题吗   不清楚,现在还是不行,也重新拉了一下单独看一下软件安装都正常版本也没有可更新版本了。通过这个拉的库git clone https://e.coding.net/benshushu/runninglinuxkernel_5.0/ runninglinuxkernel_5.0.git  

  • 2024-04-15
  • 回复了主题帖: 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》- 分析 oops 错误

      ./run_debian_arm64.sh build_kernel,有没有遇到过这个报错说是不支持-fpatchable-function-entry=2,查看aarch64-linux-gnu-gcc版本和target是这样。  

  • 2024-04-10
  • 回复了主题帖: STM32F103单使用串口收发时,收不到数据,SR寄存器的LBD,FE置位,NE没有置位

    首先短接你板子的rx,tx看自发自收有没有问题,如果正常,多半硬件没有问题,很可能就是时钟时序什么有问题;在正常连接,不停的切换上位机工具波特率,看看数值有变化,有变化的话,很可能就是配置的时钟这些有问题了,如果有逻辑分析仪或者示波器,能接一下信号看一下,板子外发的数据波形大概就能看出来来里串口的相关配置,然后在看一下你的输入波形,看看有没有异常。然后你这个测试轮询不太确定有没有问题,可以直接参考库里的轮询接口修改后者直接调用相关接口试试

  • 2024-04-08
  • 回复了主题帖: 阅读打卡第五站:基于ARM64解决宕机难题——《奔跑吧Linux内核2:调试与案例分析》

    1.假设函数调用关系为main()->func1()->func2(),请画出ARM64架构的函数栈的布局。 >>   2.在ARM64架构中,子函数的栈空间的FP指向哪里? >>指向父函数(上一级)栈空间的FP; 3.在ARM64架构的calltrace日志里,如何推导出函数的名称? >>通过寄存器现场反推函数名称,首先确定发生崩溃的栈空间FP,然后根据LR在其高8字节地址的,推算地址,后又由于LR存放子函数返回下一条指令,rd 出LR之后减去4字节,推算上一级函数调用该函数PC值,通过dis来推算函数名称 ,依此来恢复推算各级函数名称及调用

  • 2024-04-07
  • 回复了主题帖: 阅读打卡第四站:基于x86_64解决宕机难题——《奔跑吧Linux内核2:调试与案例分析》

    1.请简述Kdump的工作原理。 >>生产内核崩溃会快速启动Kexec,切换到捕获内核来对生产内核崩溃数据进行收集转储 2.在x84_64架构里函数参数是如何传递的? >>当函数中数的数量小于或等于6的时候,使用通用寄存器来传递函数的参数。当函数中参数的数量大于 6 的时候,采用栈空间来传递函数的参数 3.假设函数调用关系为main()→func1()→func2(),请画出x84_64架构的函数栈的布局图。  

  • 2024-04-01
  • 回复了主题帖: 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》- 中断管理

    hellokitty_bean 发表于 2024-4-1 09:57 想请教楼主:Linux内核(第2版)卷2,那么是不是应该有卷1? 只要看到内核,就有惧怕的感觉 点赞楼主 ... 有卷1的,讲基础架构,内存分配管理等等的                                                                                                    

  • 2024-03-31
  • 发表了主题帖: 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》 - 第二章 中断管理

            这是收到书的第三周啦,脱离周末的加班,终于有时间更新啦。第二章中断管理,毕竟之前MCU经常是裸机大法好,所以看完这章的时候还是有种熟悉感,一种异曲同工之妙。粗看了了一下章节,就看到了硬件中断号和linux中断号的映射,让我想起来之前面试问过很多次的中断号序号类型和范围这个问题,不知道朋友有没有也被问过哈哈。        废话不多说,开始正题,还是一如既往的先看章节问题,带着问题去学习,有着目的的去探寻总归是能让自己有深入进去的兴趣的。中断管理其实对我们性能和业务都有很关键的用处,以前在我的学习了解中,我理解的中断流程,可能就是中断触发由配置的中断源通过触发方式触发,通过中断管理,判断优先级,最终运行注册中断服务程序,退出中断,清除相应的中断位等待下一次触发这样一个比较笼统的过程。这样的理解当然没有什么太大的问题,不过这个章节较为详细的讲解这每一步流程,有些细节上的问题可能我们在使用过程中会习惯性的已经规避,但是其实并不知为什么要这样做,而这一章也许就能给这类问题找到一个答案。         第一个小节讲的就是大家都比较熟悉的中断相关的一些背景知识,比如中断状态、中断方式、硬件中断号等等;以及中断控制器的流程,GIC检测中断流程,在这一过程中中断源,仲裁单元,cpu各个时刻的状态以及流程机制等,想了解具体的可以详细看看这一部分,以下是GIC-400芯片手册的时序图:           第二三小节就是讲解的怎么来实现你获得中断后去做你想做的事情,首先你想要做的事情我们称为中断注册函数,我们可以了解到中断注册接口request_irq() 或者比较新的request_threaded_irq(),看到里面的参数就能知道需要注意的事情。比如thread_fn参数,就可以想到中断的优先级具有高优先级任务变得不那么实时,所以有了中断线程化,从而来避免这一问题,但是另外一方面也要注意不是每一个中断都可以线程化,比如时钟中断。在看IRQ,这里实际指的是软件中断号而不是硬件中断号。所以这里我们就要看看上一小节讲到的硬件中断和linux映射,简单可以总结成简,通过中断控制器来实现两者的映射,在以往的ARM7/ARM9的SoC中,通常只有一个全局中断状态寄存器,每位管理一个外设中断,直接映射硬件中断号到Linux内核的IRQ号。后续的发展过程中SoC通常有多个中断控制器所以在Linux3.1引入了irq_domain管理框架,该框架支持多个中断控制器,支持设备树机制。         第四小节底层中断处理,描述了首先ARM处理器检测到IRQ后自动做的事情即硬件保存相应的硬件处理,中断向量表,IRQ处理,栈框、保存和恢复中断上下文,这种其实大概了解我感觉就可以了,也办法描述,想了解的直接看原文或者资料会更好,注意一下发生在用户和内核不同端的问题;第五小节即高层中断处理,描述了在各个阶段实际的中断处理,handle_arch_irq函数,_handle_domain_irq()、irq_find_mapping()、generic_handle_irq()、irq_exit()等一系列进入查找,处理退出等。上面提到了映射,高低电平触发;上下沿触发都是硬件中断,像定时器中断这些还没有具体描述,所以第六小节就讲到了软中断;另外Linux内核开发者不希望用户再扩充新的软中断类型,如有需要,建议使用tasklet机制;通过枚举来声明已经定义好的软中断,以NR_SOFTIRQS结尾表示最多软中断个数。 要触发软中断,有两个接口函数,分别是raise_softirq()和raise_softirq_irqoff(),唯一的区别在于是否主动关闭本地中 断,因此raise_softirq_irqoff()函数允许在进程上下文中调用。同时触发点的位置也有所区别:触发点在中断上下文中,只需要设置软中断在本地CPU__softirq_pending中的对应位即可。如果in_interrupt()为0,那么说明现在运行在进程上下文中,需要调用wakeup_softirqd()函数唤醒ksoftirqd内核线程来处理。这类的注意项其实点点有很多,可能在不注意的情况下会造成未知的错误,也是调试过程中问题可以参考的一些点。’         最后一节描述了我之前不是很熟悉工作队列 ,总结来说分为几点: 1、工作队列初始化:在系统启动时,会通过workqueue_init_early ()函数来初始化系统默认的几个工作队列。以下是工作队列的初始化流程图;     2、创建工作队列:创建工作队列的接口很多,但是需要注意给相应CPU创建队列时最大work数,工作队列的类型等等; 3、添加和调度:向队列中添加一个work,首先要通过宏INIT_WORK()初始化一个work,通常建议使用默认工作队列,初始化完一个work后,就可以调用schedule_work()函数来把work 挂入系统的默认工作队列中。,把work加入工作队列是在关闭本地中断的情况下进行的。 4、处理work: 针对不同的work工作线程不同。对于BOUND类型的工作队列,每个CPU会创建一个专门的工作线程。对于UNBOUND类型的工作队列,每一个worker_pool会创建一个专门的工作线程。 5、取消一个work: 在关闭设备节点、出现一些错误或者设备要进入suspend状态时,驱动通常需要取消一个已经调度的work。工作队列机制提供了一个取消work的cancel_work_sync()函数接口。但是需要注意的是会等待该work执行完毕才会执行操作。 最后是工作队列跟调度器的交互,CMWQ机制会动态地调整一个工作线程池中工作线程的执行情况,不会因为某一个work回调函数执行了阻塞操作而影响到整个工作线程池中其他work的执行。假设某个work的回调函数func()中执行了睡眠操作,如调用 wait_event_interruptible()函数去睡眠,在wait_event_interruptible ()函数中会设置当前进程的stateTASK_INTERRUPTIBLE,然后执行schedule()函数切换进程。书中也具体的描述了实现原理和方式。         以上就是第二章的学习,说是学习,其实更多是书中内容的整理总结,有些具体的实现讲解,书中会有更具体的描述,而且有些我在理解的过程中也是是是而非,雨里雾里,所以也不太好描述过于具体,整体大致看完之后,回头再细细看,但我的想法更倾向于知道一些细节原理,而不纠结于具体代码细节,更多的知道会引起什么问题,然后出现相关问题的时候能有这方面的考虑。然后在具体对比这样。就这样           

  • 2024-03-27
  • 回复了主题帖: 阅读打卡第三站: 内核调试与性能优化——《奔跑吧Linux内核2:调试与案例分析》

    1.使用GCC的O0优化选项来编译内核有什么优势? >>  用“O0”优化等级编译的内核进行单步调试不会出现变量优化和鼠标光标乱跳等问题;也会保留更多的调试信息;但是也会导致内核运行性能下降,所以我们一般在方便单步调试内核使用该优化选项;   2、什么是加载地址、运行地址和链接地址? >>  加载地址:存储代码的物理地址。如ARM64处理器上电复位后是从0x0地址开始取第一条指令的,所以通常这个地方存放代码最开始的部分,如异常向量表的处理。 运行地址:指程序运行时的地址。 链接地址:在编译链接时指定的地址,编程人员设想将来程序要运行的地址。程序中所有标号的地址在链接后便确定了,不管程序在哪里运行都不会改变。使用aarch64-linux-gnu-objdump(objdump)工具进行反汇编查看的就是链接地址   3.什么是位置无关的汇编指令?什么是位置有关的汇编指令? >> 位置无关代码:从字面意思看,该指令的执行是与内存地址无关的;无论运行地址和链接地址相等或者不相等,该指令都能正常运行。在汇编语言中,像BL、B、MOV指令属于位置无关指令,不 管程序装载在哪个位置,它们都能正确地运行,它们的地址域是基于PC值的相对偏移寻址,相当于[pc+offset]。 位置有关代码:从字面意思看,该指令的执行是与内存地址有关的,和当前PC值无关。ARM汇编里面通过绝对跳转修改PC值为当前链接地址的值。  

  • 2024-03-18
  • 回复了主题帖: 阅读打卡第二站:中断管理——《奔跑吧Linux内核2:调试与案例分析》

    1.发生硬件中断后,ARM64处理器做了哪些事情? >>> 检测到中断源后,会将对应中断标记为pending;仲裁单元会确定目标CPU,CPU选择最高优先级中断送给对应接口,CPU接口判断是否可以发给CPU,给 CPU发送中断请求,CPU进入中断异常后进入对应中断服务程序,完成后发送结束中断,完成此次工作。中间还涉及中断现场的保存和返回等; 这个我看到更简洁的描述是中断屏蔽判断是否是有效中断,获取中断向量,保存现场;根据向量跳转中断服务程序,执行完后中断返回中断前现场。   2.硬件中断号和Linux内核的IRQ号是如何映射的? >>> 简单来说,通过中断控制器来实现两者的映射,在以往的ARM7/ARM9的SoC中,通常只有一个全局中断状态寄存器,每位管理一个外设中断,直接映射硬件中断号到Linux内核的IRQ号。后续的发展过程中SoC通常有多个中断控制器所以在Linux3.1引入了irq_domain管理框架,该框架支持多个中断控制器,支持设备树机制;   3.一个硬件中断发生后,Linux内核如何响应并处理该中断? >>> 在对应中断向量表前 ARM处理器会先自动完成一下操作:处理器的状态保存在对应的异常等级的SPSR_ELx中。返回地址保存在对应的异常等级的ELR_ELx中。PSTATE寄存器里的DAIF域都设置为1,相当于把调试异常、系统错误(SError)、IRQ以及FIQ都关闭了。PSTATE寄存器是ARM v8里新增的寄存器。 如果是同步异常,那么究竟什么原因导致的呢?具体要看ESR_ELx。设置栈指针,指向对应异常等级里的栈。迁移处理器等级到对应的异常等级,然后跳转到异常向量表里执行;根据向量表进行相应的跳转;根据IRQ发生在内核还是用户模式(EL0/EL1),在中断服务程序前后都会又相应的保存和恢复中断上下文; 感觉      

  • 回复了主题帖: 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》 - 第一章 并发与同步

    Jacktang 发表于 2024-3-18 07:47 为什么自旋锁的临界区不能睡眠(不考虑RT-Linux的情况)? 看来还需要读读这本书 自旋锁的临界区中主动睡眠以让出CPU,这样可能导致其他持锁的阻塞,导致并发的一个死锁的bug.RT-Linux不考虑这个我专门查了一下,是因为RT-Linux有优先级继承,睡眠等待锁机制来避免死锁和优先级反转问题。其他也有一些也有类似的支持。

  • 2024-03-17
  • 发表了主题帖: 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》 - 第一章 并发与同步

           对于一个linux的初学者来做说,在看到这本书的时候是比较吃力的,在读这本卷二的同时,也第一本卷一开始同步的读了起来,所以后续在文章或者一些点上的理解可能并不是很准确甚至有可能有问题,也欢迎指出。另外很高兴参加这次的书籍的试用,其实对我来做可能更好的能有一个力来促使我去坚持读完这本书,来避免我给找些理由来拖延这件事情,还是感谢论坛和作者。         那么现在开始我读第一章的一些感受,一开始我看目录的时候,我感觉这一章应该预计很快的时间,毕竟谁又没有频繁接触使用并发和同步呢?但是正如一碗蛋炒饭都炒不好又怎么能算一个好厨子呢?章节的结构正如卷1一致的风格,以高频面试问题开头,提供了设计这个章节的各种问题,我大概看了这些问题,然后在看后续的小节,看到找到一个问题的答案,然后在继续找下一个问题的过程中还是蛮能激发我的阅读乐趣的,看完整个章节之后,在回头看看这些问题,全部掌握了也就算入门了这个知识点了。但是不结合实际的使用,也总会有纸上谈兵的感觉。但是看这本书的目的,能在后续遇到相关的问题的时候能有这方面的考虑,我感觉就是值得的。         章节1-并发与同步,从原子操作->自旋锁->信号量->RCU,有熟悉的原子操作,信号量、互斥锁,也有相对陌生的操作,看着一小节的讲解描述,就能感觉到并发同步一个个的局限和优化,有的可以功能上看似一致,但是在某些场景里会更建议使用其中一种,因为它可以更快,更省资源,当然它也就有了自身局限性。比如原子操作开销小,但是它用于临界区的数据变量 位等简单数据结构。比如自旋锁又有着特定的发展,MCS锁、排队自旋锁等等。信号量和互斥锁,以前其实还蛮经常会用到,使用的过程中老感觉两者有一定的相似性,但是只知道在这个场景下应该用信号量,那个场景下应该使用互斥锁这种惯性使用方法。书中这么讲到“既然互斥锁类似于count值等于1的信号量,为什么内核社区要重新开发互斥锁,而不是复用信号量的机制呢?”,这是因为互斥锁相对于信号量要简单轻便一些。在锁争用激烈的测试场景下,互斥锁比信号量执行速度更快,可扩展性更好。当然互斥锁的优化方案也移植到读写信号量中了。其中互斥锁中实现乐观自旋等待机制,乐观自旋等待如其名当发现锁持有者正在临界区执行并且没有其他优先级高的进程要调度时,当前进程坚信锁持有者会很快离开临界区并释放锁,因此与其睡眠等待,不如乐观地自旋等待,以减少睡眠唤醒的开销。还特地去搜索一下,乐观锁和悲观锁也是如其名乐观锁乐观的把情况都想成好的,也有之对应的悲观锁把所有的都想成坏的,所以一个会阻塞修改拿锁,一个相信你不会修改。下面的书中的图表更直观理解互斥锁在各个阶段的状态,能反映在临界区,睡眠乐观自旋等待的各个状态。   后面提到的读写锁,完成了信号量没有区分临界区读写属性的这一问题,通过区分读写属性,读属性并不会完成修改,所以允许多个读属性线程并发进入,而写属性还是依旧只能单一线程进入,同时也不能读写进程同时进入。其实从整个章节来看,是一种由浅入深或者更准确的讲是从原材料讲到半成品再到各种各样的成品,原子操作跟内存屏障就像原材料,自旋锁就像是半成品,后续的信号量互斥锁,读写锁就像是各种成品。最后一节的RCU更像一个物尽其用的特制品一般.RCU机制的原理可以概括为RCU记录了所有指向共享数据的指针的使用者,当要修改共享数据时,首先创建一个副本,在副本中修改。所有读者线程离开读者临界区之后,指针指向修改后的副本,并且删除旧数据。简单来说大家读者完之后再更新数据。针对于读写进程,读进程没有或者只有很小的同步开销,所以摒弃了原子操作和内存屏障,把同步的工作交给写线程。下面提供一下书中关于锁机制的使用场景和特点,也欢迎补充。   锁 机 制 特点 使用规则 原 子 操 作 使用处理器的原子指令,开销 小 临界区中的数据是变量、位等简单的数据结 构 内 存 屏 障 使用处理器内存屏障指令或GCC 的屏障指令 读写指令时序的调整 自 旋 锁 自旋等待 中断上下文,短期持有锁,不可递归,临界 区不可睡眠 信 号 量 可睡眠的锁 可长时间持有锁 读 写 信 号 量 可睡眠的锁,多个读者可以同 时持有锁,同一时刻只能有一 个写者,读者和写者不能同时 存在 程序员界定出临界区后读/写属性才有用 互 斥 锁 可睡眠的互斥锁,比信号量快 速和简洁,实现自旋等待机制 同一时刻只有一个线程可以持有互斥锁,由 锁持有者负责解锁,即在同一个上下文中解 锁,不能递归持有锁,不适合内核和用户空 间复杂的同步场景 RCU 读者持有锁没有开销,多个读 者和写者可以同时共存,写者 必须等待所有读者离开临界区 后才能销毁相关数据 受保护资源必须通过指针访问,如链表等   阅读这一章节的过程中,其实第一遍大概在第二天已经初步看完了,但是每次反复看都有新的收获和学习点,可能在后续的过程中还是会时不时的翻看这一部分,同时建议在读的时候也可以借助一些类似chatgpt的工具,能更快的理解,也能搜索一些相关的名词和术语,同时如果可以的话还是要先看看作者的卷一,章节中有些名词或者知识都在卷1中有所说明,这样或许更能循序渐进,水到渠成。针对于上文提到的信号量,读写锁,RCU书中有更详细的说明和讲解,配合程序框图和一些案例图示能更方便的理解,也因为自己也是一个初学者,防止对曲解意思,就不在这个上面多多赘述,有兴趣的同学可以拜读原文。希望自己能每周坚持更新新的章节阅读,   最后看一下章节开始的问题,看看能够答出几个吧?也许你也需要读读这本书了 1、在ARM64处理器中,如何实现独占访问内存? 2、请举例说明内核使用内存屏障的场景? 3、为什么自旋锁的临界区不能睡眠(不考虑RT-Linux的情况)? 4、Linux内核中经典自旋锁的实现有什么缺点?为什么自旋锁临界区不允许抢占? 5、请阐述原子操作、自旋锁、信号量、互斥锁以及RCU的特点和使用规则。在KSM中扫描某个VMA以寻找有效的匿名页面时,假设此VMA恰巧被其他CPU销毁了,会不会有问题呢? 6、在mm/rmap.c文件中的page_get_anon_vma()函数中,为什么要使用rcu_read_lock()函数?什么时候注册RCU回调函数呢?在mm/oom_kill.c的select_bad_process()函数中,为什么要 使用rcu_read_lock()函数?什么时候注册RCU回调函数呢?        

  • 2024-03-12
  • 回复了主题帖: GD32F 遇到串口发送数据偶发性卡死问题

    GD32没用过,按理说你这个波特率800字节没有压力,我看你这个代码单字节去放一次缓冲区,这个是否就是这个逻辑,可以测一下这一部分写的大概时间,看看是不是本身这部分耗时就超过预期,而且这写数据之后再去清理和初始化的中断是读相关的中断?建议出现卡死的时候,读取一下串口相关寄存器,看看是否有一些异常,实在不行可以找一下厂家FAE看看

  • 2024-03-11
  • 回复了主题帖: 阅读打卡第一站:并发与同步—— 《奔跑吧Linux内核2:调试与案例分析》

    1.在ARM64处理器中,如何实现独占访问内存?  Linux内核提供了多种并发访问的保护机制,如原子操作、自旋锁、信号量、互斥锁、读写锁、RCU等,另一方面是否也可以分为内存屏障、内存锁定、内存顺序约束等。     2.atomic_cmpxchg()和atomic_xchg()分别表示什么含义? atomic_cmpxchg(ptr, old, new):原子地比较ptr的值是否与old的值相等,若相等,则把new的值设置到ptr地址中,返回old的值;有一个类似的函数atomic_try_cmpxchg(ptr, old, new),两者区别在于返回值,一个返回旧值,一个返回比较结果; atomic_xchg(ptr, new):原子地把new的值设置到ptr地址中并返回ptr的原值。   在ARM64中,CAS指令包含了加载-获取和存储-释放指令,它们的作用是什么? CAS即比较和交换,加载-获取指令用于读取内存位置的当前值,而存储-释放指令用于将新值写入内存位置。cas指令会有不同的屏障属性1、隐含了加载-获取内存屏障原语。2、隐含了存储-释放内存屏障原语。3、同时隐含了加载-获取和存储-释放内存屏障原语。4、不隐含内存屏障原语。加载-获取和存储-释放指令保证了并发的保护机制,避免竞争条件出现          

  • 2024-03-07
  • 回复了主题帖: 快来对对联呀,我搞不定了

    人言信则日月明

统计信息

已有88人来访过

  • 芯积分:377
  • 好友:4
  • 主题:28
  • 回复:686

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言