自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 资源 (1)
  • 收藏
  • 关注

原创 std::atomic和内存序的相关东西

这里讲的很充分了,留着以后肯定用得到。

2023-07-05 21:49:52 81

原创 cmake学习笔记

set(变量 值)-->set(OpenCV_DIRD:/lib/opencv-4.1.1/build)find_package(OpenCV REQUIRED)-->去OpenCV_DIR找OpenCVConfig.cmake或OpenCVModule.cmake(?是这个吗),然后include这些cmakefile,这些cmakefile中定义了OpenCV的Include_dirs、库目录等变量.include_directories(some_dir),设置包含库目录ta.

2021-11-25 10:37:28 2417

原创 按照c++标准,set, map的键值是不可以修改的

如题,即find()或begin()得到的iterator,都是constant,不可修改的。c++17中加了一个新接口,extract,大体用法就是把节点从红黑树上摘下,然后修改,再放回去。思路上跟现在的先删掉,再重新构造,再插入是一样的,只是内存利用方面进行了优化,就是右值move这些操作了。...

2021-10-19 17:30:46 430

原创 结构体内存对齐原则

以前专门学习过结构体内存对齐相关知识,现在看又一头雾水,总结下吧设x为编译器指定大小和自身大小的最小值就三个原则:结构体变量的起始地址能够被其最宽的成员大小整除 结构体每个成员相对于起始地址的偏移能够被x整除,如果不能则在前一个成员后面补充字节 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节...

2021-10-19 15:51:38 120

原创 stl equal_range的比较器这样用

stl equal_range的比较器不是我以为的那样,看过源码,查了别人的资料才了解我以为equal_range的比较器一定是[](val a, val b){return a == b;}, 实际上,它跟sort的比较器是一样的。是[](val a, val b){return a < b;}(假如升序排列的话)。看源码,先二分找到一个it, 此it符合如下条件:!_Pre(*it, val) && !Pre(val, *it),翻译成汉语的话就是,*it == val,

2021-10-04 22:00:51 99

原创 adc采样到的数据转换为浮点电压值

数据寄存器是16位的,采到的数据实际上是(0-基准电压)之间的一个值。所以,这个数的算法是这样的,假设基准电压是v,寄存器里的数的实际值是x,存储的uint16值位y,则x=v*y/2^16

2021-07-09 17:46:35 1361

原创 mcu之adc工作模式

是从这里获取的知识——对STM32 ADC单次转换模式 连续转换模式 扫描模式的理解_kiti1013的专栏-CSDN博客总结一下。不开启扫描模式的情况下,adc启动后:1.在单次模式下,只采样第一个通道,然后停止,等待adc下次启动再重复此动作2.在连续模式下,循环采样第一个通道在开启扫描模式的情况下,adc启动后:1.在单次模式下,依次采样四个通道,然后停止,等待adc下次启动再重复此动作2.在连续模式下,依次循环采样四个通道...

2021-07-09 11:11:19 1196 1

原创 c++ 含有template项目的编译

含有template项目的编译比较特殊。因为template不会显式编译为.o文件(至少在makefile中是不必为template定义生成目标文件语句的)。含有template的项目

2021-06-10 23:20:59 164

原创 linux进程调度相关rq,sched_class,sched_entity

这部分一直搞不清楚,捋一下。sched_class即调度器,是具体调度策略的实现。调度策略有#define SCHED_NORMAL 0#define SCHED_FIFO 1#define SCHED_RR 2#define SCHED_BATCH 3/* SCHED_ISO: reserved but not implemented yet */#define SCHED_IDLE 5这些策略中,normal,batch用于普通进程,fifo,rr用于实时进程,idle

2021-05-17 00:21:16 365

原创 linux堆管理相关

面试的时候被问道malloc的大致过程,以及多线程中,线程中的堆栈是否是私有的。这两个问题都答的比较含糊,盖因我本来就没搞明白……现在的答案是——1.malloc分配时,先拿到对应线程(非多线程情景下为main arena)的堆管理结构malloc_state(arena),在里面找合适的空闲chunk,找到了就返回给caller,没找到的话—— a.caller为main thread。main thread的堆就在进程空间的heap区,此区的管理结构即为main arena(是...

2021-05-16 11:26:33 76

原创 64位linux内核空间布局图

拿别人的,来自这里——https://blog.csdn.net/younger_china/article/details/16829687

2021-05-12 03:51:05 267

原创 linux动态链接库之懒加载

这个玩意理论跟实际不太一致,搞了半天,终于发现我的demo中并没有懒加载,而是一开始就调用ld.so把重定位后的地址填进.got.plt里了。所以导致我各种怀疑自己,各种gdb,objdump,readelf都跟理论不相符。这下拿到铁证了,不用纠结了。懒加载的逻辑代码在,但是没有执行。比如我写的这个demo//hello.h#ifndef __HELLO__#define __HELLO__void hello(const char *);void byebye();#endif

2021-05-11 09:51:13 574 3

原创 linux文件映射mmap

read/write和mmap都可操作文件,read/write系统调用首先将磁盘上的文件内容加载到内核空间,从内核空间再到用户空间。而mmap直接在用户空间建立到磁盘文件的映射,不需要经过内核缓存。这是mmap高效之处。这里有详细信息——https://blog.csdn.net/chenpuo/article/details/80658874mmap需要为被映射的区域建立一个vm_area_struct。而vm_area_struct,copy别人的说法——“linux内核使用vm_area_str

2021-05-09 13:34:21 138

原创 linux调试基础

movl $0x123,%eax(立即寻址,$表示立即数,%表示寄存器)movl 0x123,%eax(直接寻址,这是0x123表示的是一个地址)movl (%ebx),%eax(间接寻址,这时(%ebx)中的值表示内存中的一个地址,可以认为相当于%ebx是指针p,而(%ebx)是*p,这句就是 %eax=*p)movl 4(%ebx),%edx(变址寻址,在间接寻址的基础上再加4个单位,就是%edx=*(p+4))...

2021-05-08 23:51:32 112

原创 linux内核之container_of

semaphore的释放操作代码如下static noinline void __sched __up(struct semaphore *sem){ //拿到sem等待链表中的第一个节点,对应的semaphore_waiter,线程描述符存放在那个里面 struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list, struct semaphore_waiter, list); /

2021-05-07 13:52:57 66

原创 linux内核之barrier

spinlock的源码里有preeemp_disable(); preemp_disable()大致做了两件事,thread_info.preemp_count++;barrier(); thread_info.preemp_count是线程抢占标志,非0时表示此线程不能被抢占,barrier()即内存屏障,使线程中barrier()之后的代码不会先于barrier()之前执行(编译器优化,cpu乱序执行),barrier()还有假定内存内容全部变动的功能,这样每个cpu都要刷新cache和regs里面的变

2021-05-07 13:37:28 156

原创 linux内核之进程调度

"linux 中所有进程组成一个树状结构,所有进程(除PID为1的进程)都存在其父级进程,父进程很可能需要了解当前进程的退出情况,退出码,以及一些统计信息,以方便父进程做一些特殊的处理,这是必要的.所以,所有退出的进程会向父进程发送一个信号SIGCHLD,然后留下一个 task_struct 空壳,成为一个僵尸进程,等待其父进程做最后的处理."——pid=1的进程为所有进程之创建源头。——https://zhuanlan.zhihu.com/p/363783778这篇文章很好...

2021-05-05 21:42:36 84

原创 linux进程之内核态

我是这样理解的——进程(32位)的地址空间分为用户空间(低3g)和内核空间(高1g),用户空间放的是与当前进程相关的代码与数据,而内核空间是所有进程共享的,具体布局如何尚未深究,总之,每个进程都在内核空间有一个对应的栈,某进程发起系统调用时,在内核空间运行时用的就是与其对应的那个栈。栈的结构是个union,如下union thread_union{ struct thread_info thread_info; unsigned long stack[THREAD_SIZE/size

2021-05-05 14:41:03 563

原创 linux内核之等待队列

等待队列还是弄的不太明白,线有点乱……把知道的记录下吧。wait_queue确实是双向链表。有一个表头,加后面的链表体,就像火车头拖着后面的车厢。不同的是这个车头还跟最后一节车厢连在一起形成一个闭环。这就是双向链表了。结构如下/* * A single wait-queue entry structure: */struct wait_queue_entry { unsigned int flags; void *private;//指向task_struct,就是进程pcb了

2021-05-04 19:37:58 113

原创 网络编程select之FD_ISSET

这个宏的用法很死板,就是这样if(FD_ISSET(...)){ ...}因为我这样用了就判断失灵if(!FD_ISSET(...)){ ...}//或者bool flag=FD_ISSET(...);应该是宏展开的问题吧.浪费了好长时间了,select总是返回1,害的我用上了netstat各种排查,最后万万没想到祸根在FD_ISSET......

2021-05-03 12:11:10 1945 1

原创 网络编程之select的数据结构fd_set

网上很多资料,大部分写的不准确,看过源码才知道/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */#define __NFDBITS (8 * (int) sizeof (__fd_mask))#define __FD_ELT(d) ((d) / __NFDBITS)#define __FD_MASK(d) ((__fd_mask) (1UL << ((d) % __NFDBITS)))/* fd_set f

2021-05-03 09:44:46 350

原创 linux下多线程第一个坑

又回到了ubuntu,环境配置自然费了点功夫,然后写个多线程一堆error,解决到最后就剩undefined reference to "pthread_create",于是百度,是没有链接libpthread.so。长期以来,从来没有为这种问题费过神,这在windows下自然有visual studio帮我搞定了。最后,解决方法就是 -pthreadg++ -std=c++11 -o test thread_pool.h primer.h primer.cpp -lpthread...

2021-04-29 10:47:35 54

原创 模板编程之转发引用(forwarding reference)

大意就是,在模板编程时,模板参数(T&&)既能匹配左值又能匹配右值,以前也叫做万能引用(universal reference)。这个规则应该只适用于模板函数,也就是在发生类型推导(type deduction)的时候会按这个规则来,普通函数不行的,例如下面的就不行void f(int &&i);int main(){ int a=0; f(a); //会报错,说左值不能绑定到右值 return 0;}用法如下templa

2021-04-20 13:54:57 620

原创 模板编程之包展开

关于包展开那三个点的用法,今天有了一点领悟,总的来说,三个点在哪个后面,展开的对象就是哪个。就目前所见到的情况而言,参数包都是用在initial_list里面的,不是随便哪里都能展开的。像下面这个就不能展开template<class T> T func(T t) { return t;}template<class T,class... U>void g(T t, U... u) { func(u)... ;//你以为可以直接展开成func(a),func(b)

2021-04-20 11:21:18 123

原创 模板元编程之bubblesort

代码如下//bubble sorttemplate<int i,int j>void sub_bubblesort(int *data) { //swap the biggist of i ints to the last slot /*for (int m = 0; m < i - 1; ++m) { if (data[m] > data[m + 1]) std::swap(data[m], data[m + 1]); }*/ if (data[j] &g

2021-04-19 13:46:45 83

原创 模板元编程之模板的参数是模板之理解

这样一个模板类:template<template<typename T> class M, class N> class TestClass{public: static const int i=0;};在实例化时,M、N需要分别为模板(不是模板的实例),和一个类(即一个实例),如下:template<class T> class TorTestClass {};int main(){ TestClass<TorTestClass

2021-04-19 10:48:50 65

原创 esp,ebp,push,pop

看完就忘系列……记一下……在内存中,栈和堆分别从高地址和低地址相向生长,理论上是为了空间的有效利用,因为栈用的少了,堆就可以用的多点,反之亦然(当然如果两个碰头了怎么办?谁知道……)栈从高地址向低地址生长,栈(帧)顶esp浮动,而栈(帧)底ebp固定。在进行push操作时,先esp=esp-8;再data->(esp)。在函数调用时,先将调用者帧底(ebp)压栈,然后建立新的帧,即将当前帧顶(esp)赋予帧底(ebp)(mov %esp,%ebp;)...

2021-04-14 10:49:24 408

原创 c++ delete不能作用于栈上的对象

c++ primer Exercise 13.28,兴冲冲地写出了一个支持深拷贝的二叉树,测试却在destructor那里一直出bug。这是我的树class TreeNode {public: TreeNode(string val = "", int cnt = 0) :value(val), count(cnt), left(nullptr), right(nullptr) {}; TreeNode(const TreeNode &node) :value(node.value),

2020-11-26 17:08:18 966

原创 jna 给c库传复杂结构体数组指针

如题,我已经能传基本数据结构数组的指针了,但是复杂结构体的操作起来是不一样的,于是又经过半天的研究,试错,最后找到了这样的方法。c库中的函数struct Obj{ int n; double d;}DLL_EXPORT void test(int n,Obj *obj);//n数组长度,obj数组指针java中这样弄Obj.ByReference ob=new Obj.ByReference();Obj[] oc=(Obj[])ob.toArray(2);//这样o

2020-10-27 10:28:00 1400

原创 今天的坑来自c++的long

想不到你是4字节的long(java中是8字节),那跟int有什么区别呢?区别可能在这里吧,int 是整数类,包括short int,long int,long long int(c++11),而我们平时写的int,编译器将其默认翻译为long int.ok,我就打算这么认为了...

2020-10-24 14:16:45 51

原创 jna,c++接口映射

研究了两天,读了好些博客,终于把问题解决了问题是:c++库里有这样的复杂结构体,以及处理//c.h//点typedef struct{ int x; int y;}POINT;//轮廓typedef struct{ int num_of_points; //点数 POINT *pPoint; //POINT数组指针}CONTOUR;//轮廓集合typedef struct{ int num_of_contours;

2020-10-23 10:55:14 285

原创 cin.clear()的demo为什么出问题的原因

cin.clear()可将cin的iostate重置为goodbit,然后可再接受输入正常工作,然而下面这个demo是行不通的#include <iostream> using namespace std; int main() { int a; while(1) { cin>>a; if(!c

2020-09-23 11:50:46 139

原创 jna 调用c++ dll 返回复杂结构体

经过折腾,确定,在java中定义同样的结构体,如c++中struct Location { int nums; int arr[10];//数组的传递。不能用int *,因为jna的IntByReference.getValue()只能返回一个值};在java中的定义为public static class Location extends Structure{ public int nums; public int[] arr=new

2020-09-07 14:55:02 1823

原创 2020-09-02

检测内存泄漏,在程序退出点之前加这句:_CrtDumpMemoryLeaks();检测到泄漏的块后,在程序进入点之后第一句加:_CrtSetBreakAlloc(154);程序在申请泄漏块的时候会自动断点,看调用堆栈就能定位了...

2020-09-02 17:06:58 42

原创 2020-09-02

这行代码会产生内存泄漏,but why?int* p = new int[0];大小为0啊

2020-09-02 16:38:18 97

原创 2020-08-28

今天把算法封装到dll里面,返回的是一个自定义的结构体struct Location { int nums; int *roi_IDs;//进入或离开的roi ID};实际就是一个动态数组。先用的vector<int> 放的这个数组,然后在最后直接return {(int)rois.size(),rois.data()};rois.data是一个指针没错,debug时也看到这个指针传递的地址没问题,在dll和exe里面都是一样的(当然一样了,在一个地址空间)。然而到了调

2020-08-28 14:21:27 55

原创 2020-08-21

这几天踩过得坑,记录一下1.vscode编译的dll,不像vs那样带符号库lib,在使用时,只需要头文件就行了(why?)2.java命令行编译方法:javac -classpath ..\lib\jna-3.0.9.jar -encoding UTF-8 App.java,其中,"-encoding UTF-8"是指定.java文件的编码方式,因为javac默认认为.java文件是ansi编码的3.java命令行运行方法:java -classpath ..\lib\jna-3.0.9.jar

2020-08-21 09:32:50 191

虚拟蜜罐软件Honeyd(v1.0)简介、安装与使用文档.pdf

著名蜜罐系统honeyd(v1.0)的安装、使用文档

2011-03-18

空空如也

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

TA关注的人

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