linux c
文章平均质量分 74
序冢--磊
这个作者很懒,什么都没留下…
展开
-
使用ebpf 监控mysqld 内核
我们使用ebpf 监控mysql的话有两个思路去做这件事情1、kprobe -> hook 掉tcp_sendmsg 和 tcp_recvmsg 一类的内核函数去分析网络协议2、uprobe -> hook 掉 mysqld 的api函数,然后在此基础上进行统计。原创 2023-01-24 13:51:00 · 1886 阅读 · 3 评论 -
ebpf 网络过滤器实践
ebpf 网络过滤器的实践原创 2022-12-18 23:13:21 · 999 阅读 · 0 评论 -
关于ebpf 的co-re
底层库依靠的是libbpfkernel代码include/uapi/linux/bpf.h解释了`CO-RE`的原理。clang有内置标记`__attribute__((preserve_access_index))`(等效于`__builtin_preserve_access_index`)。ebpf.c代码这样标记所有它需要访问的结构体。clang在对象ELF文件ebpf.o中为每个这样的访问生成一个`bpf_core_relo`。原创 2022-11-21 19:36:41 · 1299 阅读 · 2 评论 -
从linux 源码角度去解决一个hard link 问题
比较晚了,大概2个月没写c++了吧,最近一直又在写golang了,但是如果你要问我最喜欢的语言排行,那这个顺序肯定是c++ > php > golang > pythonphp尽管经常被黑,但是自己每个周吧,都会用php写写网站后台;毕竟工作久了,你会发现语言根本无所谓的,只是一个工具。技术也许真的只是个青春饭,但是当下还是在做;再就是兴趣,我从初中就讨厌语文,英语,喜欢数学;数学就是这样1+1 = 2;结果总是固定的,不像语文黑的说成白的,白的也可以说成黑的这就是我讨厌语文的原创 2022-05-12 23:33:18 · 442 阅读 · 0 评论 -
当cpu分析遇上bpf(上)
cpu很多时候承担着运行指令码的重要作用,在linux内核中承担着cpu调度、暴露系统调用、处理中断等功能。cpu调度器系统内核需要在不同程序之间共享cpu资源。cpu调度器,可以 通过多个状态展示出队列的运行状态。...原创 2022-04-17 21:58:58 · 713 阅读 · 0 评论 -
设计环境基础
取自<<汇编语言程序设计>>第一章节处理器指令操作系统最底层,所有计算机处理器都按照厂商在处理器芯片内部定义的二进制操作数据。这些预制的代码被称为指令码。不同操作类型的处理器有不同的指令码当计算机处理芯片运行的时候,他读取存储在内存中的指令码,每个指令码集合可能包含一个或者多个字节信息,这些字节信息指示处理器完成特定任务。每条指令码都是从内存读取的,指令码所需要的数据也是从内存中读取的。包含的 内存字节和包含处理器的使用数据字节没有区别。为了区分数据和指令码,要使原创 2022-03-30 18:02:44 · 1234 阅读 · 0 评论 -
深入理解linux内核的中断和信号
linux中断原创 2022-03-29 16:23:19 · 1319 阅读 · 0 评论 -
bpftrace 组件
bpftrace原创 2022-03-24 19:08:31 · 2393 阅读 · 0 评论 -
linux 性能分析的方法
linux 性能分析原创 2022-03-19 20:39:19 · 2911 阅读 · 0 评论 -
istio-proxy性能洞察之路---性能调研的终点、调优之路的出发点
最近配合公司落地 service mesh,整体架构采用了istio 的部署架构,但是最近对envoy的sidecar做了压力测试,sidecar的性能是十分的差说下istio-proxy是istio社区对envoy做了插件,包装成了istio-proxy,git目录是https://github.com/istio/proxy落地istio之后我们对istio-proxy性能进行了压测,每年技术大会演讲的envoy做sidecar在我们压测下,是那么单薄,显得差强人意,下面公布我们架构组原创 2021-11-18 21:07:25 · 2918 阅读 · 1 评论 -
linux内核设计和实现第三章节-----进程管理
前言:为什么要学习linux内核,随着ebpf的深入,对linux内核的熟悉程度,将会直接决定我们的kprobe的使用情况,尽管linux内核已经帮我们通过map定义了钩子参考文献:<<linux内核设计和实现>>参考网址:linux内核线程_huangweiqing80的博客-CSDN博客_内核线程3.1 进程进程一般包括:可执行程序的代码,像打开的文件、挂起的信号,内核内部处理数据,处理器状态,一个或者多个具有内存映射的内存地址空间以及一个或者多个原创 2021-11-14 23:51:11 · 1315 阅读 · 0 评论 -
优先队列学习
#include <stdio.h>#include <stdlib.h>#include <iostream>typedef struct key_value_struct KeyValue;struct key_value_struct { int _key; void *value; void (*freevalue)(void *);};#define PRIORITY_MAX 1#define PRIORIT.原创 2021-10-03 09:20:49 · 114 阅读 · 0 评论 -
cmake + vscode + docker 远程调试linux程序
1.安装docker首先下载dockerhttps://www.docker.com/get-started2.编写dockerfileFROM ubuntu:20.04ENV DEBIAN_FRONTEND noninteractive## Update cache and upgrade imageRUN apt-get -y update && apt-get -y upgrade && apt-get -y dist-upgrade#原创 2021-08-08 13:55:47 · 1002 阅读 · 0 评论 -
关于PCI驱动的读书笔记
Linux的pci设备首先要了解pci是什么,外围设备互联, Peripheral Component Interconnect,PCI外围设备互联外设的内核函数,PCI总线是当今广泛使用在桌面以及更大型的计算机上的外设总线,该总线是内核支持最好的总线。PCI接口PCI是替代ISA的,尽可能做到三个目标:1.性能好 2.跨平台 3.简化从平台的添加和删除PCI寻址PCI允许单个 系统有256个总线,每个 总线可支持32个设备,当然我们无需记住他的二进制地址,我们可以通过pci_dev来访原创 2021-07-25 16:32:10 · 558 阅读 · 0 评论 -
linux驱动中的中断
中断定时器中断原理定时器再硬件上也可以用作中断,定时器接收一个时钟输入,当时钟脉冲来时,当前计数加1,并和预先设置的计数比较,如果相等,证明计数周期满,产生定时器中断,并复位计数值中断是一个信号,当硬件需要产生处理器对它的关注就会产生中断如果想看到中断,我们需要注册中断处理程序,用request_irqfree_irq释放中断处理程序int request_irq(unsigned int irq, irq_handler_t handler, unsigned long ..原创 2021-07-11 17:13:57 · 371 阅读 · 0 评论 -
linux内核中的延迟和定时器
内核中的延迟和定时器1. 关于延时忙等待while(time_before(jiffies, j1)) cpu_relax();这种代码会占用大量内核cpu运行时间,是不好的方式超时等待有两个重要的api#include <linux/wait.h>long wait_event_timeout(wait_queue_head_t q, condition, long timeout);long wait_event_interrupt_timeou原创 2021-06-30 20:02:35 · 558 阅读 · 1 评论 -
jiffies 的使用
jiffies 的使用每一个技术点都是要靠自己对着书来一步步实践#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/types.h>#include <linux/cdev.h>#include <linux/fs.h>#include <linux/uaccess.h> /*原创 2021-06-25 15:10:46 · 797 阅读 · 0 评论 -
初识linux内核中的jiffies计数器
1.度量时间差赫兹是什么意思赫兹是国际的频率单位,是电磁波的性质,是德国物理学家‘海因里希·鲁道夫·赫兹’,是他首先证实了电磁波的存在。已经发布的linux系统一般是50~1200,常见的HZ值默认是1000,软件仿真器默认是24jiff是瞬间的意思使用jiffies计数器获取当前时间#include <linux/jiffies.h>unsigned long j, stamp_1, stamp_half, stamp_n; j = jiff..原创 2021-06-22 22:48:02 · 620 阅读 · 2 评论 -
tcp网络编程如何避免time wait
做一个简单的服务器程序,accept后立刻关闭套接字extern "C" {#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>}#include <iostream>#include <algorithm>#include <cstrin原创 2021-06-16 20:34:50 · 235 阅读 · 2 评论 -
提取不重复的整数
描述输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。保证输入的整数最后一位不是0。输入描述:输入一个int型整数输出描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数...原创 2021-06-10 18:30:37 · 128 阅读 · 0 评论 -
IO多路复用的技术内幕
前言多路复用的场景自始至终都是为了最大限度减少用户和内核态之间的切换,充分利用多核时代下的cpu,是对于编写高性能网络编程0阻塞IO的唯一途经,是IO阻塞的克星,我们的php和java底层都大量使用了该技术。借鉴书籍《linux设备驱动程序》《unix高级环境编程第三版》《unix网络编程卷1》《linux系统编程》《c++多线程服务端编程》《linux内核设计和实现》一、休眠是高性能网络编程的绊脚石1.驱动编程中,重要的可中断简单休眠函数//初始化等待队列init_waitqueu原创 2021-05-20 01:12:53 · 482 阅读 · 0 评论 -
深入理解linux内核的阻塞和非阻塞
深入理解linux内核的阻塞和非阻塞感悟这里还是要写下笔记,再次复习知识点,一遍遍的复习,一遍遍的加深,可能工作中用不到,精力有限也很难再去换一门语言去学习了,但是工作问题不大,这几天通过学习这个再巩固加深知识点吧!!linux 内核的阻塞和非阻塞操作在<linux/fs.h>中,记载着非阻塞标志位filp->f_flags的O_NONBLOCK,这个标志位还有一个别的名字叫做O_NDELAY标志位阻塞操作出现的场景1.调用read时候套接字缓冲区里没有数据可以读,或者小于co原创 2021-04-02 00:42:32 · 1085 阅读 · 0 评论 -
linux内核的休眠
linux内核的简单休眠本次学习资料,来自linux设备驱动程序第七章节高级字符串设备驱动第149页什么时候会发生睡眠当我们去对linux中一个不可读的描述符进行read调用,或者对一个缓冲区已经满了的套接字进行write的时候都会发生睡眠,也就是我们说的IO阻塞,linux进程会陷入休眠状态。关于休眠的简单介绍一个进程发生休眠会发生什么操作系统会把这个进程标记为休眠状态,从调度器的运行队列移走,只有发生一些情况,进程状态不再是休眠状态,才会被cpu调度。如何让一个进程安全的进入休眠?1.第原创 2021-03-18 00:33:08 · 887 阅读 · 0 评论 -
ubuntu20.04上搭建linux内核驱动调试环境
搭建linux内核驱动调试环境linux驱动开发调试的条件我用的是ubuntu20.04,这个基本不能用来调试内核的,这种发行版本一定会关闭调试选项,为了保证运行速度。关于linux内核第四章linux设备驱动的调试自己有了一个很长时间的思考,其实打开linux设备驱动的关键条件是要打开内核中的CONIFG_DEBUG_INFO选项。我用的是gdb,根据第四章的介绍,需要打开两个选项,CONFIG_DEBUG_INFO还有CONFIG_FRAME_POINTER选项。如何在ubuntu上编译lin原创 2021-03-02 00:25:29 · 2607 阅读 · 1 评论 -
关于内核中proc的学习
#linux内核5.8中proc编程的学习对着proc_fs.h的头文件,一点点学习看到头文件里第一个结构体,/proc 目录的操作结构体struct proc_ops { unsigned int proc_flags; int (*proc_open)(struct inode *, struct file *); ssize_t (*proc_read)(struct file *, char __user *, size_t, loff_原创 2021-01-24 14:49:52 · 2253 阅读 · 3 评论 -
linux驱动的调试技术读书笔记(上)
内核中的调试支持2.内核中的几个选项CONFIG_DEBUG_KERNEL这个选项仅仅是其他调试选项可用。我们应该打开这个选项,但是它本身不会打开所有的调试功能。CONFIG_DEBUG_SLAB这是一个十分重要的选项,打开了内核内存分配函数中的多个类型检查;打开检查后,就可检查许多内存溢出以及忘记初始化的错误。在将已经分配内存返回给调用者之前,内核将他的每个字节设置为0xa5,而在释放之后将他设置为0x6b。如果读者在自己的驱动程序中,或者在oops信息中查看到毒剂字符串,则可以轻松判断位置原创 2021-01-17 23:07:56 · 326 阅读 · 0 评论 -
自制linux字符串设备的实验总结
自制linux字符串设备的实验总结2020年马上过去了,一年年过得好快,有点想念师从陈哥的日子了,私下都叫他老陈,但是他总是让我们叫他大哥,哈哈哈其实一直当师傅2019年遇到了陈莉君,听了陈老师2019年慷慨激昂的linux内核人才培养计划,决定要学习linux内核,2020年由于疫情的原因未尝再见陈老师马上年末了,也对自己有一个交代,也对2020有一个交代,做一个linux字符串设备的学习总结吧前面的学习已经对linux字符串驱动设备的理论知识做出了学习了解,并且对实验现象做出了大胆的假设,现在就原创 2020-12-31 01:54:32 · 393 阅读 · 0 评论 -
初识linux设备---字符串设备的学习
一、如何查看计算机下面的所有设备ls -l /dev可以看到计算机下面所有的设备 c开头的是字符串设备b开头的是块设备二、主设备号和次设备号ls -l /dev 我们看到主设备号是 用户之后的第一列 次设备 是第二列主设备号由用户使用 次设备号由内核使用linux内核中有宏定义<linux/types.h>中主设备号是MAJOR宏次设备是MINOR宏三、分配和释放设备编号在建立字符串设备之前我们首要的工作是获得一个或者多个...原创 2020-12-25 00:15:28 · 502 阅读 · 0 评论 -
linux不能加载驱动模块的解决
这个周又开始看scull了,希望能在内核层面上做一些有趣的事情本来不想发这个csdn,但是还是坚持写下来记录下排查问题的过程吧今天make模块成功后,突然出现了ERROR: could not insert module main.ko: Operation not permitted天啊 这到底是什么原因,权限不足吗?自己sudo makesudo insmod main.ko发现还是这个问题,于是自己 sudo dmesg -cLinux dmesg命令用于显示开机信息。kerne原创 2020-12-20 22:19:32 · 5529 阅读 · 1 评论 -
你好linux内核-如何向linux内核添加一个hello模块
如何向linux内核中添加第一个helloword模块怀着激动的心情,彻夜难眠,向linux内核中添加了第一个hello_kernel模块,算是我对linux内核的第一次打招呼吧,你好kernel由于linux内核驱动中,第一章节并没有对如何加载内核有十分详细的说明,这里学习自网址https://blog.csdn.net/wait_for_taht_day5/article/details/50404572linux 内核官方下载地址https://www.kernel.org原创 2020-10-29 00:00:09 · 468 阅读 · 0 评论 -
进程间关系下
进程间的关系 下需要用一种方法知道哪一个进程组是前台进程,这样伪终端程序就知道将终端输入和终端产生的信号发送到何处。#include <unistd.h>pid_t tcgetpgrp(int fd);int tcsetpgrp(int fd, pid_t pgrpid);函数tcgetpgrp返回前台进程组的id,他和fd上打开终端相关联。给出控制tty的文件描述符,通过tcgetsid函数,应用程序能获得首进程的进程组id。#include <termio原创 2020-07-12 09:09:57 · 199 阅读 · 0 评论 -
第四章c++多线程系统编程精要
c++多线程系统编程精要学习多线程系统编程要面临两个思维转变:1.当前线程可能会被随时切换出去2.多线程中事件发生顺序不会再有全局的先后关系当线程被切换回来继续执行下一条语句的时候,全局数据可能已经被其他线程修改。例如在没有为指针p加锁的情况下,if(p && p->next){/**/}就有可能会 导致segfault,因为在逻辑与的前一个分支评估为true的那一刹那,p可能被其他线程设置为NULL或者被释放,后一个分支就访问了一个非法地址在单cpu系统中,.原创 2020-05-26 22:06:01 · 451 阅读 · 0 评论 -
一份错误的程序的思考和反思,关于多线程编程中的竞态问题
直接上代码#include <memory>#include <iostream>#include <string.h>#include <vector>#include <pthread.h>using namespace std;class MutexLock{public: MutexLock()...原创 2020-04-04 12:47:38 · 220 阅读 · 0 评论 -
模板内容学习杂记(一)
1.定义模板16.1.1 函数模板我们可以定义一个通用的函数模板,而不是为每个类型都定义一个新函数我们可以这么做:#include <memory>#include <cstring>template <typename T>int compire(const T &v1,const T &v2){ if(v1...原创 2020-02-29 22:32:13 · 150 阅读 · 0 评论 -
线程安全的对象生命管理 笔记
编写线程安全的类不是一个困难的事情,用同步原语保护内部状态就可,但是对象的生与死不能由对象资深拥有的mutex互斥器来保护。如何避免对象析构时候可能存在的race condition(竞态条件),是c++多线程编程的基本问题,可以借助boost库的shared_ptr和weak_ptr完美解决。这也是实现线程安全的Observer模式的必备技术当析构函数遇到多线程与其他面向对象的语言不通,...原创 2020-02-16 18:07:19 · 267 阅读 · 0 评论 -
排序学习(二)--------插入排序
1.普通的插入排序插入排序找插入位置直接插入的种类:顺序法找插入位置(直接插入)二分插入排序缩小增量,多遍插入排序----希尔排序顺序插入是在插入的时候就已经排好顺序了,存储的数组都是有顺序的不会是无序的下面我们看一下插入排序我写了一个简单的代码思路就是插入一个元素后将其余所有的元素后移#include<stdio.h>#define ...原创 2020-02-09 18:44:28 · 201 阅读 · 0 评论 -
排序学习笔记(一)
排序什么是排序?排序:将一组杂乱无章的数据按照一定规律有顺序的排列起来。即,无序序列排成一个个有序序列(由小到大或者由大到小的运算)排序方法分类:安存储介质分类:内部排序和外部排序按比较个数排序:串行排序 并行排序按主要操作:比较排序(插入排序)、交换排序、选择排序和归并排序和基数排序按辅助空间:原地排序(O(1)) 和 非原地排序按自然性:自然排序(有序会快...原创 2020-02-09 14:02:10 · 206 阅读 · 0 评论 -
php调试方法总结
这几天看完了php的虚拟机和词法解析,写下这篇日志来将php的调试方法做一个总结,像一些最简单的var_dump,die这种入门级调试技巧就不说了,这种var_dump die的方法在fpm上还好说,但是如果是守护进程就需要破坏现场,重启服务。写日志有的时候也很难命中进程现场的运行情况。如果我们运行了一个守护进程陷入了死循环或者阻塞希望知道这个程序的运行位置,或者希望知道程序里发生了什么...原创 2020-02-04 16:25:34 · 891 阅读 · 0 评论 -
Zend虚拟机部分的学习
Zend虚拟机部分的学习之前大体看了zend ast语法部分的解析,也用gdb大体看了zend语法树的运行结果,但是读完之后我会思考问题,就是语法全部挂到ast上,那么ast是如何变成一个个opcode然后组成op_array的呢,zend虚拟机又是怎么一个个执行这个opcode的呢?记得2年前,我面试有一些很资深的程序员就会问我,你了解op_array呢?但是当年没看过php源码,但是写...原创 2020-02-03 18:03:06 · 373 阅读 · 0 评论 -
zend抽象语法树AST流程解析
年底了空闲一些,开始看zend虚拟机,还有几天过年了,写下这篇学习笔记,简单的介绍一下我近期对zend虚拟机的学习我最近学习了zend虚拟机,首先了解到了一个东西re2c+bisonphp正是通过这个东西对php脚本进行的解析,这个我的初步了解是在php 胖子的tipi上http://www.php-internals.com/book/?p=chapt07/07-00-zend-...原创 2020-01-21 15:30:35 · 945 阅读 · 0 评论