- 博客(646)
- 资源 (32)
- 收藏
- 关注
原创 B样条曲线-核心思想和简要概述
也就是你画了个弧线(贝塞尔曲线和B样条曲线的目标都是平滑曲线),这个弧线上有不少的控制点,你拖一下控制点这个曲线就会发生变化。B样条曲线上的控制点就是这个意思,它和贝塞尔曲线的控制点的区别就是这个控制点影响的范围不一样,它一般只影响它周边的很小范围的曲线的形状。B样条呢就是在这些控制点之间构建曲线,也就是N个控制点对应的N-1个段,每段一个曲线。考虑到已经忘了啥是B样条曲线了,晚上还是查了一下,看了几个之后,我倒是弄明白了,但是这些文章都都是用公式描述的不清不楚,所以这里给个简要直观的介绍吧。
2024-05-15 10:49:46 252
原创 sudo 授权问题
sudo 表示 “superuser do”,它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而,大部分时候我们用它来提权运行命令,以替代直接使用 root 用户的操作。sudo 命令与安全策略配合使用,安全策略可以通过文件 /etc/sudoers 来配置。其安全策略具有高度可拓展性,支持插件扩展。默认情况下 /etc/sudoers 是不能被任何人直接编辑的,因为它的权限是 440,虽然也可以对其赋予写权限后再编辑,但推荐使用 visudo 命令编辑该文件。
2024-01-23 11:07:56 1133
转载 Linux下ARM64内核空间分布及页表查询
在调试程序的时候,特别是内核模块时,涉及到某些内存地址的测试,如查看某个地址的值是否发生变化等,如果能够知道各进程的地址分布,特别是虚拟地址和物理地址之间的映射关系,可能有助于我们的程序调试。为此,我们找了网上关于内核地址空间的相关内容。本文开发了一个内核模块用于解决上述问题,但是,本文提出的模块可用于查询内核空间及用户程序空间虚拟地址分布及属性,以及查询对应虚拟地址的物理地址,但只适用于linux-5.5以下arm64版本,在linux-5.10内核布局空间已发生较大变化。对应的github地址。
2023-11-23 15:57:12 638
转载 初识ARM处理器
一般来说再采购Arm嵌入式板卡的时候会涉及核心板和开发板。如何区分呢?核心板:CPU + 内存 + FLASH + 电源 + IO接口 等等开发板:SD卡 + 网口 + HDMI + 串口 + USB 等等开发板有时也被叫做 底板。购买商家提供的开发板会比较贵,一般前期测试会使用,后期只是购买核心板,然后自行开发底板(开发板)。
2023-11-09 17:27:03 889
转载 [保姆级教程] 如何在 Linux Kernel (V5.17.7) 中添加一个系统调用(System call)
最近在学习 《linux Kernel Development》,本书用的linux kernel 是v2.6 版本的。看完”系统调用“一节后,想尝试添加一个系统调用,然后重编一个kernel。经过几个小时的尝试,实现了这个小功能,其中也遇到了不少坑,本文主要是记录分享下如何在Linux Kernel (V5.17.7) 中添加一个系统调用(System call)。
2023-11-08 00:42:46 440
转载 Linux kernel 分析之一:内核镜像/映像
只知道把它往/boot/下一放,往boot loader的配置文件(例如grub的menu.lst)中写上相关信息,机子就顺利启动了。于是,我查看了相关资料,最直接的资料来自于arch/i386/boot/下的Makefile。我们的出发点是在CPU加电的一刹那,系统处于16位实地址模式下,终点是内核开始运行start_kernel(),系统处于32位页式寻址的保护模式下。(尽管与用户态程序相比,还要多操心不少事,包括对硬件的直接操作,内核态各种数据结构的初始化,对页表的操作等等)。
2023-11-02 10:49:09 537
转载 编译出错,出现 vfs_read[******.ko] undefined !
()的定义为ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos),其中,参数__user 表示buf是用户态指针,在内核中是无法使用,因此需要设置使用环境,如下(也就是说,你想直接使用vfs_read这个一句话是不行的,它要用一个代码块才能满足从文件里面读取一些字节的需求,而这个代码块主要是解决__user *buf的使用的问题。count:读的字节数,返回值是成功返回字节数,失败返回负值;
2023-10-19 18:33:56 767 1
转载 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
1. 获取内核版本文章出处:周婷 ,软件工程师 2006 年 2 月 9 日Linux内核从 2.4版本 到 2.6版本在可装载模块机制、设备模型、一些核心 API 等方面发生较大改变。即便是当前的5.10版本的内核,其内核可装载模块的编写、编译和使用仍基本延续2.6版本内核可装载模块的方式。鉴于此,可以通过linux内核从2.4版本到2.6版本的可装载模块的编译、使用等的前后对比来进一步了解linux内核可装载模块的一些技术细节。
2023-10-18 11:46:39 149
原创 编译linux内核模块时的make -C M= modules的参数说明
注释:这个是编译linux核外模块必备的makefile中的核心语句,相当于先跳转到-C 指定的内核目录,然后执行这个目录下的makefile M=XXX modules(这个有点不好理解,一般都是在某个目录下执行makefile就行了,这里是执行makefile M=XXX modules),相当于在当前系统内核根目录下执行make M= XXX modules 进行XXX目录下的模块的编译,编译成xx.ko.这样你的modules就可以在任何其他位置,而不用必须在内核文件下面了。
2023-10-16 17:30:50 1450 1
转载 linux内核日志输出之kmsg和dmesg
proc/kmsg是专门输出内核信息的地方,为了能够方便的在 user space 读取 Kernel log,Kernel driver 里面将ring buffer映射到了 /proc 目录下的文件节点 /proc/kmsg。printk()打出的信息往往以 <0>…由于 Kernel log buffer 循环缓冲区只有一个读指针,所以当一个程序在读 buffer 的时候会不断的移动 buffer 的读指针,这样当有多个程序读取 buffer 的时候每个程序得到的log都不是完整的。
2023-10-16 16:55:47 2357
原创 Makefile中诸多等号“:=, =, ?=和+=”的区别
在Makefile语法中,时不时会见到各种“=”号的赋值语句,除了常见的“=”和“:=”,还有“?=”等,那么这些赋值等号分别表示什么含义呢?
2023-09-15 21:58:08 569
转载 C/C++中如何稳定地每隔5ms执行某个函数?
链接:https://www.zhihu.com/question/536739862/answer/2524011929。
2023-09-06 11:45:37 1330
转载 【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)
编译驱动一般采用的是将驱动编译成模块(.ko 文件),然后加载到内核,这其中就用到了 make modules 命令。
2023-09-05 20:29:05 1532
转载 FFmpeg 解码内存泄漏汇总,sws_getContext函数无法释放问题
av_packet_alloc 中并没有调用 av_init_packet , 但av_packet_alloc 中调用了 av_packet_unref ,而 av_packet_unref 内部才调用 av_init_packet (老版本的 ffmpeg 中 av_packet_alloc 是直接调用 av_init_packet )av_read_frame有内存泄漏风险,av_read_frame 每次循环后必须执行av_packet_unref(pkt)进行释放。内存释放要按顺序进行释放。
2023-07-06 16:12:59 1386
转载 git submodule 使用教程
使用git submodule将多个仓库关联起来的方式,类似C中的指针,引入其他仓库作为开发仓库的一个模块。
2023-06-10 06:19:43 4391
转载 I/O控制器及控制方式
CPU向I/O模块发出读写指令,CPU会从状态寄存器中读取I/O设备的状态,如果是忙碌状态就继续轮询检查状态,如果是已就绪,就代表I/O设备已经准备好,可以从中读取数据到CPU寄存器中,读到CPU后,CPU还要往存储器(内存)中写入数据,写完后再执行下一套指令。由于CPU无法直接控制I/O设备的机械部件,因此I/O设备还要有个电子部件作为CPU和I/O设备机械部件之间的“中介”,用于实现CPU对设备的控制,这个电子部件就是I/O控制器,又称为设备控制器。CPU和I/O设备的并行性进一步提升。
2023-06-06 15:43:17 2752
转载 数据驱动的基本原理是什么?
知识是基于信息之间的联系,总结出来的规律和方法论,主要用于回答为什么(why)和怎么做(how)的问题,在企业里的应用包括。
2023-06-02 09:32:54 1110
转载 类成员函数当回调函数的方法
普通的C++成员函数都隐含了一个“this”指针参数,当在类的非静态成员函数中访问类的非静态成员时,C++编译器通过传递一个指向对象本身的指针给其成员函数,从而能够访问类的数据成员。也就是说,即使你没有写上this指针,编译器在编译的时候自动加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。在创建线程调用回调函数时,传入类对象的指针(比如this指针)作为参数,并在回调函数中把void*强制转换为类的指针(MyClass*),就能使用该指针调用类的成员函数。
2023-05-18 15:06:44 1215
转载 图解协程原理
协程(Coroutines),是 Kotlin「最神奇」的特性,没有之一。本文会以图解 + 动画的形式解释 Kotlin 协程的原理。看完本文后,你会发现,原来协程也没有那么难。本文要求读者有一定的 Kotlin 基础。
2023-05-06 10:23:55 789
转载 ip rule,ip route,iptables 三者之间的关系
通过简单示例阐述ip rule,ip route,iptables 三者之间的关系
2023-03-31 17:28:28 1063
原创 交叉编译linux内核并使用qemu运行
在x86_64架构的电脑上采用交叉编译的方式对程序进行编译,并部署到arm板子上运行是我们经常会遇到的,对于依赖关系不怎么复杂的程序,直接使用gcc-arm交叉编译工具,在x86_64电脑上(安装交叉编译工具链)即可编译,编译时指定gcc的版本和相关库的路径。但是对于复杂的程序,特别是依赖大量外部库的程序,使用这种方式就不太可行了。这里还是考虑弄一个较小的arm虚拟机来跑,然后在虚拟机里面把待编译代码放进去进行编译。相对于vbox和VMware这类虚拟机,qemu显然更轻量,更简单。
2023-03-19 01:57:14 3119 1
转载 netstat命令Local Address解释
Local Address(127.0.0.1:9600) 代表只有第一个网卡(lo,只能处理目标地址是127.0.0.1或者Localhost的网络包),可以接收请求端口9600的数据包。Local Address定义了传入的连接请求(即tcp SYN数据包)将被哪个网卡接收(因为电脑上一般都有eth0和lo至少2个网卡)。Local Address (0.0.0.0:8600)代表任意一个网卡,都可以接收请求端口8600的数据包。即 B到端口8600、8024的网络是通的,到端口9600网络不通。
2023-02-28 21:25:55 1843
原创 [ERR_PACKAGE_PATH_NOT_EXPORTED]: No ‘exports‘ #相关问题解决方案
这两天在用springboot+vue进行一个系统整合时,后台程序没问题,前端用HBuilder-X导入工程功成后,执行运行--运行到终端--npm run serve时报错“package路径没有导出”,具体地是vuex这个包的问题。经过多次查找,发现可以在该工程的根目录下(含有package.json文件)运行npm update,如果还是不行就执行npm audit fix --force来解决版本混乱问题。
2023-01-15 15:27:18 2866
原创 解决CMake时的Find_Package失败问题
今天在编译组内代码时遇到了Find_package问题,具体来说就是找不到redis的库及相关头文件。针对上述问题,我们查找并安装了class_loader的开发库,上述问题就解决了。也就是继续执行cmake,又出现了问题,找不到hiredis库使用前面的方法,发现安装hiredis的开发库之后,仍然报错。然后使用whereis查找hiredis对应的头文件和库。分别在/usr/include/hiredis下面和/usr/lib/x86_64-linux-gnu下面。然后重新执行cmake,成功。
2023-01-03 14:55:58 12441
转载 WARNING: modpost: missing MODULE_LICENSE()以及内核模块无法验证
missing MODULE_LICENSE()以及内核模块无法验证的解决方法
2022-12-09 20:11:20 4112
转载 Linux内核模块使用浮点float double运算的方法
最近我们有一个需求,需要把用户态的浮点数运算全部放到内核态运行,以提高运行速度,移植的过程中发现问题没有这么简单,然后我们抽丝剥茧,揭开 Linux 对浮点float double处理的原理。
2022-12-09 06:21:07 4338
转载 进程和线程ID
其实,每个进程内的线程库生成的线程,应该算是用户态的线程,只有这些线程映射到操作系统内核所认识的线程,才能被调度。这个时候,映射到操作系统内核能识别的线程的时候,操作系统的对应线程也会有一个线程ID,这个ID在整个操作系统空间是唯一的。而在一个进程内的线程需要和另一个进程内的线程通信的时候(操作系统级别的进程间通信)才会用到,因为需要标识唯一的一个线程。如果我们使用posix线程库pthread创建线程,那每个线程的ID是谁生成的呢?另外,主线程(main)获取的进程ID==线程ID,而子线程就会不同。
2022-12-02 16:58:01 242
转载 linux 内核中 memcpy 和 memmove 函数的区别和实现
memcpy 和memmove都是把 src 指向的对象中的 size 个字符拷贝到 dest 所指向的对象中,返回指向结果对象的指针。但这两个函数在处理内存区域重叠的方式不同。
2022-11-25 11:07:55 1085
转载 Posix共享内存
1. 概述共享内存是可用IPC机制中最快的,2. mmap、munmap和msync函数mmapmmap函数把一个文件或一个Posix共享内存对象映射到调用进程的地址空间,使用该函数有三个目的:使用普通文件以提供内存映射IO使用特殊文件以提供匿名内存映射使用Posix共享内存对象以提供Posix共享内存区通常设为NULL,让内核自己决定起始地址它从被映射文件fd开头起第offset个字节处开始算,offset通常设为0,MAP_SHARED进程间共享内存需要使用MAP_SHARED。
2022-11-25 10:51:57 895 1
转载 使用互斥锁mutex进行进程间同步的说明和示例
进程间同步可以使用互斥量mutex(互斥锁)、信号量和文件锁。这里面的重要函数是pthread_mutex_init(),它负责进行互斥锁的初始化,只有初始化之后才能使用它进行加锁、解锁。这里需要说明的是,mutex不仅可以用于进程间的同步,还可以用于线程间的同步,默认情况下是线程间同步。如果要用于进程间同步,则需要在pthread_mutex_init初始化之前,修改其属性为进程间共享。pthread_mutexattr_t mattr 类型就是用于定义mutex锁的属性的。
2022-11-24 17:32:04 1586 1
sensorPluginTest0916.zip
2020-09-16
数据库存储树结构ClosureTableCateogryStore-master.zip
2020-02-27
storage_ws_jin0906.tar.gz
2019-09-06
开源内存数据库的调研与分析.doc
2019-08-30
fastdb-arm.tar.gz
2019-08-23
ubuntu 16.04 opencv auto installation
2019-03-27
自然语言处理实践者指南Practitioner's guide to NLP part I
2019-01-15
Python code for Artificial Intelligence: Foundations of Computational Agents
2019-01-15
百页教程学机器学习the hundred page machine learning book pdf原版
2019-01-02
冰点下载器--百度文库豆丁网免费下载
2018-12-26
vcForPython27解决安装pycrypto报错vcvarsall.bat找不到问题
2018-06-01
手机app脱壳虚拟机镜像
2018-06-01
jd-gui1.4+dex2jar2.0+apkdb+apktool apk反编译套装
2018-05-31
win7 基于spring boot+elasticsearch+Redis+mysql+mybatis进行搜索引擎web开发--爬取IThome热评
2018-04-27
windows下redis管理工具treeNMS
2018-04-24
《C和指针》pdf高清版和《C陷阱和缺陷》以及源代码
2018-04-12
ROS的插件库pluginLIB机制讲解
2018-04-11
51CTO 机器人操作系统ROS精品课程PPT
2018-03-06
SSM框架——使用MyBatis Generator自动创建代码
2017-09-21
metronic 4.7.5 最完整版,共318M,文件中有链接
2017-09-06
quick4j IDEA进行javaweb开发的快速框架 maven+Spring+SpringMVC+shiro +myhatis
2017-09-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人