- 博客(65)
- 资源 (2)
- 收藏
- 关注
原创 perf-火焰图
火焰图使用步骤:1)解压FlameGraph-master.zip2)将FlameGraph-master目录绝对路径写入fg.sh中的FG_DIR中;3)在火焰图中添加export语句,将UB_BINDIR设置为环境变量,如右图所示,设置为execl所在绝对目录;4)抓取execl进程运行时的火焰图:sudo ./fs.sh /home/uos/UnixBench/pgms/execl 35) 将生成的out_2481.svg文件放入浏览器查看;...
2021-07-28 21:14:26
296
原创 ftrace-统计函数时间
a)设置trace跟踪器echo function_graph > /sys/kernel/debug/tracing/current_tracer查看可用的跟踪器:cat /sys/kernel/debug/tracing/available_tracershwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nopb)设置最大跟踪深度,可以避免内部函数嵌套太多,设置为1时只跟踪函数本身echo 2
2021-07-28 21:06:27
593
原创 bpf-结合gdb打印结构体信息
1)5.904616 8824 8824 trace-bpfcc register_kprobe p=0xffff802775f4f0102)Sudo gdb vmlinux /proc/kcore(gdb) p *(struct kprobe*)0xffff802775f4f010$2 = {hlist = {next = 0x0, pprev = 0xffff000009a3a998 <kprobe_table+344>}, list = { next =
2021-07-28 20:57:31
216
原创 bpf-统计函数执行时间
#!/usr/bin/bpftraceBEGIN{printf("begin stat io pid=%d\n",$1);}kprobe:vfs_read/pid==$1/{@read_nsecs=nsecs;@read_nrs = @read_nrs + 1;}kretprobe:vfs_read/@read_nsecs !=0/{if (pid==$1){@total_read_nsecs = @total_read_nsecs + (nsecs - @read_nsec
2021-07-28 20:51:53
570
原创 bpf-查找回调函数
1)sudo trace-bpfcc -t 'submit_bio(struct bio *bio) "func=0x%lx",bio->bi_disk->queue->make_request_fn2)func=0xffff000008478e183)sudo cat /proc/kallsyms |grep ffff000008478e18
2021-07-28 20:51:21
90
原创 bpf-跟踪函数
通过bpf确认内存申请 1 #include<stdio.h> 2 #include<string.h> 3 int main(void) 4 { 5 int len = 1024*1024; 6 char *buf; 7 printf("pid=%d\n", getpid()); 8 getchar(); 9 malloc(len);
2021-07-28 20:46:02
222
原创 gdb调试-函数调用
1:代码 1 #include <string.h> 2 #include <stdio.h> 3 #include <fcntl.h> 4 5 int main(voi
2021-07-13 21:09:15
190
原创 gdb调试-修改变量控制流程
1:代码 1 #include <string.h> 2 3 void test3() 4 { 5 int which = 0; 6 7 char acBuf[12]; 8 if ( 0 == which) 9 memcpy(acBuf, "123456", 10); 10 else 11 strcpy(0, "abcdefg"); 12 } 13 14 void test2()
2021-07-13 20:57:53
193
原创 gdb调试-段错误
1:代码 1 #include <string.h> 2 3 void test3() 4 { 5 char acBuf[12]; 6 memcpy(acBuf, "123456", 10); 7 strcpy(0, "abcdefg"); 8 } 9 10 void test2() 11 { 12 test3(); 13 } 14 15 void test1() 16 { 17 test2();
2021-07-13 20:47:04
152
原创 symbol lookup error
qemu: symbol lookup error: /lib/x86_64-linux-gnu/libgnutls.so.30: undefined symbol: __gmpz_limbs_write解决方法:vi ~/.bashrc恢复默认source ~/.barsh重新开启一个终端
2020-08-03 20:41:47
685
原创 自己实现一个操作系统-序言
今年以来也看了一些操作系统的书,学习总结了一些,最终感觉还是很空泛,很多东西处于飘着的感觉,想起李志军老师说的:纸上得来终觉浅,绝知此事要躬行。所以打算自己实现一个迷你的操作系统,一步一步把学到的知识加以应用,夯实基础。在查阅相关的资料后,发现一个入门级的文档:http://wiki.0xffffff.orgm,感谢作者的分析.那就开始吧,希望在可以花一个月的业余时间完成这篇文档的内容。...
2020-07-15 22:26:41
150
原创 github使用
git config --global user.name "xianghu1994"git config --global user.name "1339026845@qq.com"mkdir testgit initgit clonegithub名字github密码
2020-07-06 19:54:50
69
原创 could not resolve ‘ftp....“
1:vi /etc/resolv.conf2: nameserver 8.8.8.8 nameserver 8.8.4.4
2020-07-01 22:10:37
317
原创 内核调试-目录
在系统的学习了前面的linux 0.11和linux 4.9以后,已经对整个操作系统有了大概的了解。现在缺乏的是更快的解决工作中遇到问题的能力。工欲善其事,必先利其器。接下来学习定位问题的工具和方法。1:环境搭建2:ftrance3:system tap4:内存检测5:死锁6:debug方法...
2020-05-06 15:31:58
102
原创 4.7 中断篇-知识点总结
同步机制:1:原子操作(atomic_t)保证指令以原子的方式执行,执行过程不会被打断2:自旋锁(spin_lock)禁止抢占,禁止睡眠:1)抢占/睡眠 调度进程可能也会申请该锁,导致死锁。详解:spin lock的自动禁止抢占的也就是说,A如果那到锁以后,内核的抢占暂时被禁止。然后它休眠了,切换到另一个进程B(注意,这不是抢占,是进程自己放弃CPU)。等到进程B想要获得这个锁时发...
2020-05-06 14:49:59
287
原创 4.6 中断篇-代码应用:实现一个可多线程同时删除,增加的链表
功能:实现一个多线程同时删除,增加的链表要点:同时使用锁,消息队列,定时器,原子操作#include<linux/init.h>#include<linux/module.h>#include<linux/list.h>#include<linux/semaphore.h>#include<linux/sched.h>#in...
2020-05-01 10:43:25
262
原创 4.5 中断篇-内核同步
并发执行原因1)中断2)内核抢占3)睡眠4)对称多处理器临界区:访问和操作共享数据的代码段保护临界区:1)原子操作2)禁止抢占3)串行的访问临界区(自旋锁,互斥锁)同步措施1:原子操作:对变量的修改,装载,存储必须原子进行,不能分割结构体:typedef struct{int count;}atomic_t为什么原子类型的的定义要把一个整行放入结构体中?1、防止原...
2020-04-30 09:41:40
99
1
原创 4.4 中断篇-实现一个中断处理
1:简述中断模块初始化过程1)调用流程do_irq handler_irq generic_handle_irq_desc desc->**handle_irq**2)handle_irq挂载我们以handle_edge_irq为例(边沿触发)2.1 :__irq_set_handle流程可以最终将handle_edge_irq挂载道了desc->handl...
2020-04-29 11:48:22
250
原创 4.3 中断篇-时间系统
1:时钟中断概念系统使用时钟中断促使进程的切换,以保证所有的进程共享cpu,是整个操作系统的脉搏1)基本时钟硬件可编程定时/计数器产生的输出脉冲送入cpu后就会引发一个中断请求,也就是时钟中断时钟中断的周期也就是脉冲信号的周期,我们叫滴答或者节拍(tick)2)RTC(real time clock)实时时钟作用:长时间存放系统时间,关机后也可以依靠主板的CMOS来维持系统计时3)...
2020-04-28 21:18:46
532
原创 4.2 中断篇-处理机制
1:中断基本机制中断服务程序都是在关中断的条件下执行的,以避免嵌套。但是中断是随机事件,如果关中断时间过长就会导致中断丢失,因此内核就需要尽快的处理完中断请求,将耗费时间的处理推迟处理。中断上半部:不可中断,中断服务程序中断下半部:可中断2:中断下半部通过do_softirq来处理添加1)soft_irq用作对下半部执行时间比较紧急的场合,在中断上下文执行2)tasklet中断...
2020-04-28 12:06:27
177
原创 4.1 中断篇-基础知识
1:概述简介中断是什么?中断是cpu对系统发生某个事件做出的一种反应为什么引入中断?支持CPU和设备间的并行操作中断控制模型中断软件架构图1:普通外设驱动代码2:硬件无关代码3:cpu体系架构相关代码4:中断控制器的驱动代码中断向量2:中断处理机制处理流程1)确定中断向量号2)通过IDTR寄存器找到IDT表的地址,再通过中断向量号找到相应的中断描述符3)通...
2020-04-28 10:21:22
365
原创 2.4 内存篇-实现内存映射mmap
1:代码实现mmap.c#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/errno.h>#include <linux/mm.h>#include <linux/vmalloc.h>...
2020-04-27 21:21:16
309
原创 2.3 内存篇-物理内存管理
1:内核空间划分低端内存:如图所示,将物理内存0-896M和kernel space线性映射内核空间虚拟内存和物理内存间的地址转化函数__pa(addr),返回addr的物理地址,addr-PAGE_OFFSET__va(addr),返回addr的虚拟地址,addr+PAGE_OFFSET高端内存:高于896M的内存,和虚拟内存的映射关系如下所示1)vmalloc2)持久映射...
2020-04-27 20:36:47
175
原创 2.2 内存篇-虚拟内存管理
1:虚拟内存管理机制地址映射机制:内核通过映射机制,将内存从磁盘映射到虚拟地址空间1:当进程执行时,发现访问的页没有映射到物理内存时,发出页请求,即请页机制。2:有空闲内存可分配就分配内存,这时用到的就是内存分配和回收机制3:同时把正在使用的页记录在页缓存中,这时就用到了页缓存和刷新机制4,5:如果此时没有空闲内存,那就需要交换机制腾出一部分内存6:交互机制中也需要用到交换缓存7:...
2020-04-27 17:42:48
304
原创 3.11 进程篇-总结
通信方式:1:无名管道特点:1)半双工2)端口无名3)只能用于有亲缘关系的进程函数:int pipe(int pipefd[2]);创建超过后会自动创建俩个文件描述符fd[0]和fd[1],fd[0]用来读,fd[1]用来写注意:1)已经明确指定为读端,则应该利用close函数关闭写段;相反亦然2)想管道中写入数据,管道会有一定的数据缓存区,如果没有读走,则会造成写段阻塞3...
2020-04-25 10:56:00
107
原创 3.10 进程篇-线程:用户线程
1:线程创建及传参#include<stdio.h>#include<pthread.h>#include<stdlib.h>#include<unistd.h>typedef struct A{ int a; float b;}A,*PA;void * func(void * n){ int i;// p...
2020-04-24 18:57:46
77
原创 3.9 进程篇-通信:两个进程通过共享内存交换数据
实现reader和writer两个进程,使它们通过共享内存交换数据。writer从标准输入读入字符串写入共享内存,reader把共享内存里的字符串打印到标准输出。reader和writer通过信号实现同步思路:a) reader进程将自己的PID写入共享内存的开头几个字节处,然后等待writer进程给自己发信号,收到信号就去读buf的内容并打印出来。b) writer进程将数据写入共享内存...
2020-04-23 21:54:10
2257
1
原创 3.8 进程篇-通信:司机与售票员问题
用信号模拟司机售票员问题:创建子进程代表售票员,父进程代表司机 ,同步过程如下:1 售票员捕捉SIGINT(代表开车),发SIGUSR1给司机,司机捕捉到该信号之后打印(“move to next station”)。2 售票员捕捉SIGQUIT(代表靠站),发SIGUSR2给司机,司机捕捉到该信号之后打印(“stop the bus”)。3 司机捕捉SIGTSTP(代表车到总站),发SIG...
2020-04-23 17:27:23
1822
原创 3.7 进程篇-通信:信号量
代码如下:sem.c#include "sem.h"//初始化信号量void sem_init(int sem_id,int value){ union semun sem; sem.val = value; if(semctl(sem_id,0,SETVAL,sem) < 0){ perror("semop"); exi...
2020-04-23 16:37:35
114
原创 3.6 进程篇-通信:共享内存
shm.h#ifndef __SHM_H__#define __SHM_H__#include<stdio.h>#include<string.h>#include<sys/ipc.h>#include<sys/shm.h>#include<unistd.h>#include<stdlib.h>#defi...
2020-04-23 11:22:27
108
原创 3.5 进程篇-通信:信号
概念:进程间的一种通信方式,异步函数:1)kill杀死传入的进程号的进程 kill(atoi(argv[1]),SIGKILL);2)raise给自己发信号#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<signal.h>#include&l...
2020-04-23 10:57:52
90
原创 3.4 进程篇-通信:管道
无名管道用与亲属间进程,半双工代码作用:实现~$ ls -l | grep “file”#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>int main(void){ int fd[2]; pid_t pid...
2020-04-23 10:09:05
64
原创 3.3 进程篇-API操作:进程扇/进程链
1:进程扇:父进程产生一系列子进程,每个子进程打印自己的PID然后退出。要求:父进程最后打印PID。代码实现:#include<stdio.h>#include<unistd.h>#include<stdlib.h>int main(void){ int i = 0; int ret = 0; pid_t pid; ...
2020-04-22 11:22:11
730
原创 3.1 进程篇-如何打印所有的进程信息
代码实现#include<linux/init.h>#include<linux/kernel.h>#include<linux/module.h>#include<linux/sched.h>#include<linux/init_task.h>#include<linux/mm_types.h>static...
2020-04-21 21:19:13
1178
原创 2.1 内存篇-如何找到存放hello world的物理地址
1:代码实现通过下面的vaddr_2_paddr函数即可完成虚拟地址到物理地址的转化,整体代码如下环境:ubuntu kernel-4.4#include<linux/kernel.h>#include<linux/init.h>#include<linux/module.h>#include<linux/mm.h>#include&l...
2020-04-21 10:45:26
702
原创 1.3 基础篇-内核链表使用实例
任务:使用内核链表将1,2,3,4,5,6,7,8,9,10,重新排列成1,3,5,7,9,10,8,6,4,2,即奇数升序偶数降序,并在屏幕上打印出来。代码:double_list.c#include"double_list.h"void init_list(my_plist *list){ //apply space *list = (my_plist)malloc(...
2020-04-19 11:53:47
120
原创 1.2 基础篇-内核链表功能简析
结构体:strcut list_head{ sttuct list_head *next,*prev;};初始化:#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name)stati...
2020-04-19 09:44:34
72
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人