自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 树莓派5移植rt-patch

笔者想用树莓派5做运动控制器,但是原生linux的实时性比较差,为了达到硬实时,需要移植rt-patch。

2024-03-03 23:46:32 766

原创 perf采火焰图

Perf的全名是performance Event,通过perf,程序可以利用PMU、tracepoint获取内核的性能信息。Perf可以分析的事件非常多,可以分析hardware event,如cpu-cycle、instructions、cache-misses、branch-misses等;可以分析software event,如page-faults、context-switches等,也可以通过software event来采集火焰图,另一种就是tracepoint event。

2023-09-10 11:43:21 171 1

原创 kprobe源码分析

kprobe 是一种动态调试机制,用于debugging,动态跟踪,性能分析,动态修改内核行为等,2004年由IBM发布,是名为Dprobes工具集的底层实现机制[1][2],2005年合入Linux kernel。probe的含义是像一个探针,可以不修改分析对象源码的情况下,获取Kernel的运行时信息。kprobe的实现原理是把指定地址(探测点)的指令替换成一个可以让cpu进入debug模式的指令,使执行路径暂停,跳转到probe 处理函数后收集、修改信息,再跳转回来继续执行。

2023-09-10 11:41:16 161 2

原创 ARM64栈结构浅析

SP指针在进入函数的时候一次性偏移了64字节,之后再也没有移动过SP指针,所以答案是否定的,个人推测是编译的时候编译器先扫了一遍代码,如果有定义局部变量的地方就提到前面去,如果有依赖后面的变量(例如int e = b + c),不能直接确定其值的情况,编译器会拆分成多个指令。在编译阶段就已经确定了b的地址,运行的时候可以说和b这个名字再没关系,符号表保存的是函数等(动态链接可能有变量名?1、写程序的时候,有的编译器支持在代码块中间定义一个局部变量,那么SP指针会在定义的时候再进行偏移吗?

2023-05-08 01:07:06 381

原创 ARM64汇编指令

ARM64中栈空间以16字节(128bit)作为一个存储单元,而stp和ldp指令可以同时操作两个寄存器,所以出入栈一般用stp和ldp指令实现。调用ret指令会把lr寄存器的值放在PC寄存器里,从而跳转回下一条指令。ARM64有34个寄存器,包括31个通用寄存器、SP、PC、CPSR。放在寄存器lr(x30)中,再跳转到ffff000008dc566c。注意:PC寄存器的值不能直接改写,但可以用ret指令间接改写。负载将寄存器lr(x30)的值放入PC寄存器。用于寄存器和内存之间传数据。

2023-05-08 01:05:23 1636

原创 Linux经典自旋锁

3、"eor %w1, %w2, %w0, lsr #16"为什么能去除lockval的next域。STR是将寄存器中的数字载入内存。格式如下:STR{条件} 源寄存器,<存储器地址>2、大小端模式不同,为什么TICKET_SHIFT能写死为16。LDR是将内存的数据加载到寄存器中,或是载入立即数。1、为什么同时用了ROR和LSR,貌似用一个就够了。4、“发送本地事件,避免在独占加载前忘记解锁”在寄存器之间移动数据,或者向寄存器中写立即数。4、CBZ和CBNZ。

2023-03-16 23:52:56 179

原创 Linux主线程与子线程关系

Linux主线程退出后父子关系

2023-02-03 22:42:32 273

原创 Linux调度时机(抢占&调度)

Linux内核调度时机

2023-01-08 23:56:49 1076

原创 Linux内存反向映射

Linux内存反向映射

2023-01-02 18:48:04 378

原创 剑指 Offer 13. 机器人的运动范围

回溯法,做的时候对 递归的结束条件 想不出,1、觉得一个节点的上下左右遍历一定要满足一定顺序,不然会丢项。2、终止条件为一个点不满足数位之和<=K,之后它的上下左右都不访问了,上右不看没毛病,那左下呢,怕后来给漏了,换个顺序测试了一下,都通过了测试,这个现象的本质还没弄懂……#include <vector>#include <iostream>using namespace std;//剑指 Offer 13. 机器人的运动范围class Solution {.

2020-12-08 16:10:42 56

原创 剑指 Offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径#include <vector>#include <iostream>using namespace std;//剑指 Offer 12. 矩阵中的路径class Solution {public: bool exist(vector<vector<char>>& board, string word) { //初始化visited矩阵 vector<vect

2020-12-08 14:45:52 44

原创 剑指 Offer 11. 旋转数组的最小数字

总结一下,大方向是使用二分法,首先分两种情况未旋转(如{1 2 3 4 5})和旋转(如{3 4 5 1 2}),然后旋转的情况里面要特别注意特殊情况和>=(<=)的情况; >=(<=)就是说中间值和两边之一一样,比较好处理。特殊情况为{(10 10 10 1 10)}因为和{( 10 1 10 10 10)}分不清,也就是二分的中间和两边相等,这种情况不会出现在二分的过程中,只会出现在一开始的情形里。所以判断到这种情况后,只能采用简单排序。```cpp```cpp#.

2020-12-07 22:21:14 57

原创 剑指 Offer 04. 二维数组中的查找

剑指 Offer 04. 二维数组中的查找一道“简单”的题搞了我好半天#include <vector>using namespace std;//剑指 Offer 04. 二维数组中的查找class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if ((matrix.size() == 0) ||

2020-10-29 00:32:25 50

原创 LeetCode 3. 无重复字符的最长子串

这种类型题第一次做,还是花了比较长的时间的,一共写了两三个版本才写出比较快的方法1、最后的方法:44ms左右,使用滑动窗口,创建左右两个“指针”,一个哈希表保存<字母,字母在字符创中的索引>,如果后面发现有重复了,就把重复的字母之前都删除掉,改变这个字母的哈希表的值,改变左指针位置。好的测试案例有:“abcbacbb”,“dvdf”,“”,“vdsdf”#include <list>#include <algorithm>#include <set>

2020-10-21 14:45:30 47

原创 LeetCode 98. 验证二叉搜索树

1.第一种方法是使用递归,我没有写,题解里有2.第二种方法是使用堆栈,开始我忽略了这种情况只做了相邻的判断,怎么把这个顶点和上面所有顶点都比较呢,递归是把上届下届都作为入口参数,堆栈的中序遍历有一个性质:二叉搜索树的中序遍历是递增的,用这个性质就可以判断了,这里还有个坑,就是比较初始值得给一个很小很小的,int的范围是(-2147483648~2147483647),占用4个字节,有一个输入是[-2147483648]; long和int本质是一样的,所以要用long long,再就没啥了class.

2020-10-19 14:44:20 75

原创 leetcode 96. 不同的二叉搜索树

第一次尝试: //递归超时了int F(int n) { if (n == 0) { return 1; } else if (n == 1) { return 1; } else { int res = 0; for (int i = 1; i < n+1; i++) { res += F(i - 1) * F(n - i); //pri.

2020-10-19 11:27:17 70

原创 19. 删除链表的倒数第N个节点

简单记录/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next

2020-10-18 21:11:49 89 2

原创 LeetCode 1462. 课程安排 IV

LeetCode 1462. 课程安排 IVidea:BFS+setdata:20201014#include <vector>#include <list>#include <algorithm>#include <set>#include <queue>using namespace std;/*******************///LeetCode 1462. 课程安排 IV //看了T101402LC例程后我的程序

2020-10-14 21:38:03 158

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除