自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 调度总结-思维导图

2021-07-13 21:13:36 194

原创 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

原创 gbd调试-命令

2021-07-13 20:36:59 112

原创 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.2 进程篇-API操作:创建/使用 等待/退出

wait

2020-04-22 11:29:55 257 1

原创 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

perf脚本-火焰图.zip

perf脚本-火焰图.zip

2021-07-28

dram_fileview.rar

可以通过该工具,查看物理地址中的内容,具体操作步骤查看博客:2.1 内存篇-如何找到存放hello world的物理地址

2020-04-21

空空如也

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

TA关注的人

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