- 博客(18)
- 收藏
- 关注
原创 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
原创 剑指 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关注的人