Linux
文章平均质量分 66
SweeNeil
这个作者很懒,什么都没留下…
展开
-
Linux内核内存检测工具KASan
一、简介KASan,全称Kernel Address Sanitizer,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。KASan 集成在 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护和发展。本文简要介绍 KASan 的原理及使用方法。二、原理与使用2.1 KASan原理KASan利用额外的内存标记可用内存的状态,这部分额外的内存被称作shadow memory(影子区)。在我们Linux内核中有page结构体(页描述符),用来标识物理原创 2020-12-01 09:48:36 · 6668 阅读 · 3 评论 -
进程与MMU、TLB之间的疑问
background在Linux中,进程操作的都是虚拟地址,而MMU是进行虚拟地址与物理地址的转化,TLB用于加快虚拟地址(线性地址)的转换~ 每个进程都有自己对应的页表,不同进程相同的虚拟地址映射的大概率不是相同的物理地址,同时不同进程不同的虚拟地址可能映射到相同的物理地址上。本文的疑问就是针对进程有不同的页表,那么MMU与TLB到底是怎么根据虚拟地址找到物理地址的呢,是不是MMU和TLB需要知道进程的信息呢,带着这些疑问来进行探究~疑问1 MMU、TLB是否需要知道进程信息?转换后援缓冲器T原创 2020-05-17 10:49:27 · 1944 阅读 · 0 评论 -
linux perf工具测试程序cpu cache刷回实验
一、perf安装进入自己编译的内核,一般目录是:/usr/src/linux-x.x.x/tools/perf编译安装之后,即可使用makemake installperf的使用可以查看本文参考文献1,下面介绍一下perf工具中与cache相关的内容sudo perf list cache可以看到与刷回有关的事件是:LLC-stores下面结合一个程序,来了解perf对于应用程序cacheline刷回事件的追踪~二、测试程序测试程序结合参考文献2、3进行.原创 2020-05-15 20:32:55 · 1108 阅读 · 0 评论 -
Linux C语言根据文件描述符fd获得文件绝对路径(文件名)
一、代码示例示例代码首先根据文件名获取文件描述符,然后根据文件描述符获得文件绝对路径(文件名),如果已知文件描述符fd,可直接通过下面两条代码获得文件绝对路径(文件名):snprintf(buf,sizeof(buf), "/proc/self/fd/%d", abs_fd);readlink(buf,obj_file,SIZE);obj_file 就为文件绝对路径,完整代码示...原创 2019-11-21 19:52:18 · 8899 阅读 · 0 评论 -
持久性内存编程——内存分配使用举例
前面有了两篇讲解内存分配的博文:持久性内存编程——事务性动态内存分配:https://blog.csdn.net/SweeNeil/article/details/90547136持久性内存编程——原子分配动态内存:https://blog.csdn.net/SweeNeil/article/details/90444432其实写得都有点简单,没有一个比较简单具体的案例,下面就把具体的...原创 2019-05-25 19:39:11 · 808 阅读 · 0 评论 -
持久性内存编程——事务性动态内存分配
pmemobj库包含一个从头开始实现的内存分配器,它在设计时考虑了持久性内存。它有两套独立的API:非事务和事务。本文讲解持久化内存的事务性的动态内存分配,原文来自:http://pmem.io/2015/06/17/tx-alloc.html目录事务分配事务分配看下面一段现在的易失性内存分配:struct rectangle { int a; int b;};...翻译 2019-05-25 15:30:34 · 820 阅读 · 0 评论 -
Linux使用 ftrace 来跟踪内核函数调用
本文参考了一些博客,然后在自己的主机(Ubuntu 18.04)上进行了测试在Linux内核文档中有关于ftrace的介绍:https://www.kernel.org/doc/Documentation/trace/ftrace.txtftrace是一个Linux内部跟踪器,主要是帮助系统的开发人员和设计人员了解到内核中发生了的事情。它可用于调试或分析在用户空间之外发生的延迟和性...转载 2019-05-09 16:45:51 · 7477 阅读 · 1 评论 -
理解Linux的进程,线程相关的各类ID:PID,LWP,TID,TGID
最近实验室遇到了一个关于PID的问题,让我也跟着学习一下,查看了一下相关资料,找到一篇关于Linux进程和线程的各种ID的介绍,所以转载了过来。作者:wipan来源:cnblogs地址:https://www.cnblogs.com/wipan/p/9488318.html在Linux的top和ps命令中,默认看到最多的是pid (process ID),也许你也能看到lwp (thr...转载 2019-05-09 10:07:52 · 3346 阅读 · 0 评论 -
NUMA的Linux工具:numactl
作者:qccz123456来源:CSDN原文:https://blog.csdn.net/qccz123456/article/details/81979819一、NUMA简介NUMA(Non-Uniform Memory Access)字面直译为“非一致性内存访问”,对于Linux内核来说最早出现在2.6.7版本上。这种特性对于当下大内存+多CPU为潮流的X86平台来说确实会有不...转载 2019-05-08 14:07:13 · 11994 阅读 · 0 评论 -
linux内核引导参数解析及添加
1. 环境ubuntu16.04Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux2. 查看当前linux内核的启动参数cat /proc/cmdline笔者的输出内容如下:BOOT_IMAGE=/boot/vml...转载 2019-04-01 16:12:31 · 1287 阅读 · 1 评论 -
持久性内存编程——类型
在之前的所有关于持久化内存编程的文章中,代码片段和示例都有持久指针(pmemoid),没有任何类型信息——它们是简单的C结构。在pmem库开发的早期,开发者发现使用类似的东西非常容易出错,而且通常很困难。他们在用类型安全容器封装pmemoids时付出了相当大的努力,最终结果可以与C++11中的SydDypTr等进行比较,之后的所有内容将只使用类型安全特性。目录布局声明类型化持久指针...翻译 2019-05-22 14:36:56 · 802 阅读 · 0 评论 -
持久性内存编程——原子分配动态内存
pmemobj库提供了非事务原子API可以实现更优化的内存管理。防故障原子分配这个API与大多数程序员在处理内存时使用的API不同。首先,函数要么分配给指针,要么释放指针。目标指针的修改是以原子方式完成的,这样它总是有效的——它要么指向一个有效的初始化内存块,要么指向一个OID_NULL。函数/宏还强制开发者在已知状态下创建对象,方法是将它们归零(pobj_znew,pobj_zalloc...翻译 2019-05-22 16:25:34 · 609 阅读 · 0 评论 -
持久化内存编程——使用pmemobj库访问持久化内存
前面提到了持久化内存编程的启程资料:https://blog.csdn.net/SweeNeil/article/details/90293313在持久化内存开发工具中,提供了各种各样的库,这些在pmem的github介绍以及pmem.io中都有提到,下面就直接把github上面的直接拿出来:上面描述了各个库的说明,在其中,看到libpmemobj提供的功能还算全面,所以就使用li...翻译 2019-05-17 19:32:07 · 3064 阅读 · 0 评论 -
持久性内存编程——事务
在之前一直用的持久化内存,现在感觉有一种说不出的怪怪的感觉,之后都改为持久性内存。前面介绍了访问持久性内存的方式,其中抛出了一些在持久性内存上编程的要点,接下来就翻译pmem.io上的第二个编程指导——事务。原文来自:http://pmem.io/2015/06/15/transactions.html目录生命周期事务操作条件事务块示例通过前一部分的介绍(https...翻译 2019-05-18 15:28:06 · 908 阅读 · 0 评论 -
Linux上安装memkind库
memkind:https://github.com/memkind/memkindjemalloc:https://github.com/jemalloc/jemalloc/releasesmemkind简介memkind库是一个构建在jemalloc之上的用户可扩展堆管理器,它可以控制内存特性和各种内存之间的堆分区。这类内存由已应用于虚拟地址范围的操作系统内存策略定义。me...转载 2019-05-28 20:19:00 · 1071 阅读 · 0 评论 -
Linux中jemalloc的安装与使用
一、安装下载地址:https://github.com/jemalloc/jemalloc/releases目前最新版本为jemalloc-5.2.0下载之后解压文件:下面正式开始安装~step 1:./autogen.shstep 2:makestep 3:sudo make install如果这一步没有超级权限的话会有如下问...原创 2019-07-04 20:46:15 · 20808 阅读 · 0 评论 -
Linux模块编程使用内核未导出的函数
转自:https://blog.csdn.net/jasonLee_lijiaqi/article/details/83089569作者:jasonLee_lijiaqi一般我们在编写内核模块时,可以直接使用内核中使用EXPORT_SYMBOL或者EXPORT_SYMBOL_GPL导出的函数,没有导出的内核函数不能直接使用。否则会报错未定义:WARNING:"do_sys_open"...转载 2019-08-13 21:04:00 · 1546 阅读 · 0 评论 -
Ubuntu18.04编译内核后开机报错:Couldn't find suitable memory target
解决方案:在编译内核安装模块时使用如下命令:sudo make INSTALL_MOD_STRIP=1 modules_install其他一切照旧,编译安装完后,重启切换到新编译的内核后就不会遇到上述问题了~解决方案及可能原因来自:https://blog.csdn.net/ogl_90kg/article/details/82595999...转载 2019-09-19 14:09:50 · 1316 阅读 · 1 评论 -
Linux中文件信息查看
在linux中,查看文件信息主要有三个命令:1)ls命令 - list directory contents2)file命令 -determine file type3)stat命令 - display file or file system status本文针对这三大命令描述使用方式,以及查看各种文件信息需要的详细命令。这三个命令的具体使用都可以通过 --help来...原创 2019-03-26 18:20:17 · 22074 阅读 · 0 评论 -
Linux insmod加载(驱动)模块时传递参数
在应用程序中,我们可以给main函数传递参数,而在加载驱动模块时,我们也可以使用module_param()来传递参数;一、应用程序main函数传参例如如下应用程序段:int main(int argc,char *argv[ ]){ printf("argv[0] %s\n",argv[0]); printf("argv[1] %s\n",argv[1]); p...转载 2019-03-26 11:04:15 · 4939 阅读 · 2 评论 -
Linux添加系统调用详解
今晚有点不在状态,就来总结一下在Linux中添加一个系统调用吧,示例平台Ubuntu 1604 64位,内核版本linux-4.4.4欢迎大家评论交流,题主从linux-2.6一直到linux-4.15的内核都添加过系统调用,各个大版本之间添加系统调用还是有一定区别。现在以linux-4.4.4添加系统调用为例进行一下记录~关于内核的下载与编译可以参考博文:https://blog.c...原创 2018-11-13 20:20:17 · 3212 阅读 · 0 评论 -
Linux当前使用的libc版本下载
在开发过程中可能会需要了解到我们调用的库函数中的内容和信息,但是我们又没办法直接从电脑中找到源码,那么就需要我们从官方下载源码来进行学习和了解。一、查看本机Libc版本如何知道自己所需的libc的源码呢,可以先查看自己所使用设备使用的libc的版本1、Ubuntu1)可以执行libc.so.6来获取信息,需带路径,不知libc.so.6在那个文件中,可以执行find / -name...原创 2018-11-05 10:23:33 · 10016 阅读 · 1 评论 -
Linux页描述符
系统中的每个物理页面都有一个与之关联的结构页面,以跟踪我们目前使用该页面的内容。 请注意,我们无法跟踪哪些任务正在使用页面,但如果它是页面缓存页面,则rmap结构可以告诉我们谁正在映射它。struct页面中的对象以双字块组织,以便允许我们在struct page的部分上使用原子双字操作。 这目前仅供竹节使用,但这种安排允许在flags / mapping和lru list指针上使用原子双字操作...原创 2018-11-10 21:02:49 · 1098 阅读 · 0 评论 -
Linux环境下段错误的产生原因及调试方法小结
转自https://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。借此机会系统学习了一下,这里对Linux环境下...转载 2018-11-10 10:16:17 · 2556 阅读 · 0 评论 -
mmap匿名映射
一、原理mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进...原创 2018-11-02 21:51:50 · 13564 阅读 · 0 评论 -
使用Source Insight查看内核源码
一、打开Source Insight软件二、新建工程添加工程目录在上方菜单栏中选择Project-》new Project的选项,填写工程名称,和存储位置,如下图所示。比如我要看linux-3.10的内核,我就命名为Linux-3.10,同时将存储地址直接设置为我源码所在的目录下。下图直接点确定即可三、添加内容上图中确认之后,出现下图所示的内容,左边方框为想要查看的...原创 2018-11-03 11:11:09 · 7002 阅读 · 2 评论 -
Ubuntu编译Linux内核并设置开机选择内核版本
写在前面:tar.xz解压命令:tar vxJf linux-x.x.tar.xz本文主要讲解内核的编译流程以及grub选项的设置,有什么问题欢迎评论讨论交流。下面为编译内核流程,由于最近项目需要Ubuntu1204,因此以Ubuntu1204为例,其他版本使用同样的操作,题主在1604上也使用的同样的操作:一、下载需要的内核https://mirrors.edge.kerne...原创 2018-11-03 11:45:27 · 15686 阅读 · 1 评论 -
linux truncate函数分析
linux truncate函数分析一、基础知识1.依赖头文件#include<unistd.h>#include<sys/types.h> 2.函数定义:int truncate(const char *path,off_t length);int ftruncate(int fd,off_t length); truncate()...原创 2018-10-09 21:02:20 · 5456 阅读 · 1 评论 -
Linux内核模块间函数正确调用方法
转自:http://blog.csdn.net/xhz1234/article/details/44278137 Copyright 徐洪志(MacroSAN). All rights reserved.模块之间发生调用关系是常有的事情,下面以两个模块A、B,B使用A模块提供的函数为例,讲解正确使用的方法。模块A中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL将要...转载 2018-11-13 20:46:21 · 2915 阅读 · 0 评论 -
Linux下的解压命令
转自:https://www.cnblogs.com/midiyu/p/7875462.htmlLinux下常见的压缩包格式有5种:zip tar.gz tar.bz2 tar.xz tar.Z其中tar是种打包格式,gz和bz2等后缀才是指代压缩方式:gzip和bzip21、filename.zip的解压:unzip filename.zip2、filename.tar.g...转载 2019-03-18 20:20:45 · 188 阅读 · 0 评论 -
Ubuntu安装ssh并开启root远程登录权限
Ubuntu安装ssh命令:sudo apt-get install openssh-server安装完成后,默认服务已开启~如果没开启,可以使用如下命令开启ssh服务:sudo service sshd startssh服务启动后,默认远端用户是无法通过root进行连接的,所以还需要修改ssh配置文件,允许远程root连接。在修改配置文件前,确认是否设置root密码,...原创 2019-03-18 20:10:46 · 1423 阅读 · 0 评论 -
Linux中多个.c文件编译为一个模块.ko
例如现在有三个文件:exp.cexps.cexp.h这是目前做实验的代码,其中exps中是工具函数,其内容被exp.c调用,exp.h是exps.c文件中函数的声明以及一些结构体的定义。下面介绍将exp.c与exps.c编译为一个模块ex.ko,以及在这个过程中遇到的一系列问题。由于exps.c中是一些工具函数,所以在exps.c中不需要module_init、module...原创 2019-03-14 22:10:23 · 4692 阅读 · 2 评论 -
Ubuntu设置默认内核启动版本
最近做实验要一直使用4.15.0的内核,但是系统自动给更新了内核版本,所以准备通过设置grub的方式设置默认启动内核。首先我先查看了电脑中的所有内核版本,如下:我想启动4.15.0版本的内核。1、打开配置文件vi /etc/default/grub2、修改配置将 GRUB_DEFAULT=0 修改为想要启动的内核名,我最开始是修改为:GRUB_DEFAULT="...原创 2019-02-26 16:22:50 · 13079 阅读 · 2 评论 -
Linux使用DEBUG宏代替printf打印信息进行程序调试
在程序开头添加如下DEBUG宏:#define __DEBUG__ #ifdef __DEBUG__ #define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"/n", __LINE__, ##__VA_ARGS__) #else #define DEBUG(form...转载 2019-03-01 16:46:32 · 1658 阅读 · 0 评论 -
Linux驱动编程模板
一个linux驱动编程模板,用于以后编程需要,模板由三部分组成,一是驱动模板程序,二是Makefile文件,三是驱动模板测试程序。1、linux驱动编程模板#include <linux/errno.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/sla...原创 2019-02-18 20:43:08 · 1280 阅读 · 0 评论 -
深入剖析Linux动态库在内存的装载
这是之前写的一个总结,现在回过头来看还是有一些收获,可以自己写一个动态库来进行测试,本文是以我自己写的动态库来进行测试的,使用工具readelf。 .so文件是elf格式文件中的一种,它遵循elf格式的相关规则,在对so文件进行内存装载时我们先学习一下elf格式中的相关内容(这里只是做基础的介绍,较为详细的内容可以参考《ELF文件格式分析》,也可以查阅网络资料,不过大多数网络资料都是从这里...原创 2018-12-19 10:55:01 · 10072 阅读 · 7 评论 -
linux共享内存相关博文
1、共享内存实现原理https://blog.csdn.net/al_xin/article/details/38602093文中主要介绍mmap()系统调用及系统V共享内存API的原理及应用 2、一张图深度解析Linux共享内存的内核实现https://blog.csdn.net/sailor_8318/article/details/39484747文中主要介绍了共享内...原创 2018-12-05 18:38:10 · 397 阅读 · 0 评论 -
Linux中的随机数
一、概念随机数都是由随机数生成器(Random Number Generator)生成的。1.真随机数 TRUE Random Number真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。根据百科上的定义可以看到,真随机数是依赖于物理随机数生成器的。使用较多的就是电子元件...原创 2018-10-16 11:39:45 · 5234 阅读 · 0 评论