自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

落尘纷扰的专栏

在现实中守护程序员内心的一方净土

  • 博客(93)
  • 收藏
  • 关注

原创 ubuntu 18.04 touchpad right-click not enabled

1, install gnome-tweak-toolsudo apt-get install gnome-tweak-tool2. open gnome tweak tool. Then in ‘Keyboard & Mouse’ -> ‘Mouse Click Emulation’, there are 3 options, select “Area”.3. done....

2020-02-22 23:51:52 451

原创 使用CSDN-markdown

1111jp1e8CgYjJ4zf0KhAe8QTR25SFOyWGshdxeqq1esijXleGGAT-Sr0LeFQTvBkeMSRfqNx32mm8oiqLyaoaV5R+1111

2019-01-29 08:25:41 441 1

原创 tcmalloc的使用问题

tcmalloc能用作内存池,优化malloc和线程分配内存的效率。它是gperftools的一员,gperftools还提供了heap-checker,heap-profiler和cpu-profiler三个工具。源码下载:https://github.com/gperftools/gperftools编译完后就可以使用tcmalloc库了:-ltcmalloc-ltcmalloc_m...

2018-10-03 15:26:07 2935

原创 exit() 和 _exit() 的区别

exit()和_exit()的效果都是让程序退出执行,而_exit()用来“尽快”退出。atexit()先说一下atexit()函数。我们可以用atexit()注册一个或多个函数退出清理函数(或者on_exit()但这个函数不建议用),这些清理函数按照注册时的反顺序,在exit()或main函数return时被调用。#include <stdlib.h>int a...

2018-06-24 22:58:55 1216

原创 stdout行缓冲和stderr无缓冲的含义

stdout和stderr有人说stdio是带缓冲的,stderr是不带缓冲的,这并不是指fd=1和fd=2这两个设备文件,这两个设备是字符设备,本身没有缓存。并且你看一个进程的1和2两个fd指向的其实是同一个终端设备文件:[root@ubuntu]arm-code:$ ls -l /proc/8669/fd/total 0lrwx------ 1 root root 64 4月...

2018-06-24 22:57:25 2511

转载 leap smear是什么

用来解决润秒突变时可能会造成的系统运行异常。对时间同步也有一定参考意义。 原文:https://googleblog.blogspot.com/2011/09/time-technology-and-leaping-seconds.htmlGoogle’s Site Reliability team is responsible for keeping Google’s services a...

2018-06-24 22:54:55 771

原创 Linux内核中负责回写脏页的线程

内核版本 3.0 和 3.4.35 (不同内核版本的回写机制不同哦~)Linux内核里负责回写脏页的线程称为flusher线程,它们以“flush-”+“设备名”来命名,例如”[flush-8:64]”(这里设备名是指用设备号拼接的字符串)。在BDI(即backing device info)模块初始化(default_bdi_init())时会创建”[sync_supers]”和”[bd...

2018-05-08 23:25:04 2182

转载 __attribute__((context())属性理解

原文:http://blog.chinaunix.net/uid-14528823-id-4284946.html另外还有一篇补充:内核工具 – Sparse 简介看spinlock的实现代码中,会发现有如下的实现:void __lockfunc _raw_spin_lock(raw_spinlock_t *lock) __acquires(lock);void __lockfunc...

2018-05-05 23:53:07 2105

原创 指针、数组、数组指针、函数指针

1.数组和指针的大小对于指针,无论它指向何种类型(int、char或是结构体等类型),指针自身总是占用4个字节(32位的long型大小),因为指针和它指向的内容是分离开的,指针本身只保存实际内容的地址,因此其大小就是系统地址范围的大小。 对于数组,其本身就是用在存放实际内容的,因此它的大小就是这个数组实际需要的内存大小,例如数组 short score[6]; 就是定义了一个包含6个shor...

2018-05-02 18:56:44 326

转载 为什么最小帧长度是64字节

我们来看一下,假设A检测到网络是空闲的,开始发数据包,尽力传输,当数据包还没有到达B时,B也监测到网络是空闲的,开始发数据包,这时就会发生碰撞,B首先发现发生碰撞,开始发送碰撞信号,所谓碰撞信号,就是连续的01010101或者10101010,十六进制就是55或AA。这个碰撞信号会返回到A,如果碰撞信号到达A时,A还没有发完这个数据包,A就知道这个数据包发生了错误,就会重传这个数据包。但如果碰撞信...

2018-05-02 18:54:25 5324 2

转载 Linux IO的buffer cache和page cache合并的原因

我先大概解释一下,这里“buffer cache”中的buffer指的是以前块设备层中用来缓存磁盘内容的结构,一个buffer大小就是磁盘中一个block的大小。这里“page cache”指的是文件系统层用于缓存读写内容的cache,因为这一层在设备层之上,因此和内核其他地方一样,以page为单位来管理。 我们看到free命令打印中,有的版本cached和buffers是分开的,有的版本是“c...

2018-04-30 19:17:48 2890

原创 Linux内核中的内存屏障

编译器有时会对代码做一些优化,例如尝试在保证程序执行正确的前提下修改指令顺序或优化ldr/str指令,让程序执行地更快。但是编译器毕竟不能完全猜透人的心思,有时候它做的优化会导致程序运行不符我们的预期。因此,内核中提供了一些额外的函数,可以插在某段代码里,告诉编译器不要在这里做指令优化。这些函数分为两种:内存屏障:rmb(), wmb(), mb(),可以防止硬件上的指令重排。除了编译器,...

2018-04-30 19:07:16 4015

原创 offsetof 和 container_of 的用途

offsetof() 和 container_of() 两个宏定义在Linux内核中很常见。我们在应用程序编程时可能也需要用到,因此可以把这两个宏定义copy过来。offsetof(type, member)用来求结构体type中的member成员在type中的偏移, 其定义如下:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE ...

2018-04-24 19:21:06 608

原创 Linux中的字符串和字节序列处理函数

花了两天的时间总结了Linux编程时的字符串操作函数和字节序列操作函数,以便后续查阅。这些函数大都不会去检查传入的参数是否为NULL,因此在使用之前要自己做检查,否则后果你懂的。一个基本知识点: 字符串处理中,如strcpy,字符串都是以’\0’来判断结束的。 字节序列处理中,如memcpy,操作内存字节,不在乎’\0’或其他字符。下列函数基本都包含在头文件string.h中,如果...

2018-04-24 19:19:01 615

原创 Linux内核中的page migration和compaction机制简介

我们知道buddy容易产生内存碎片,内核中可以通过给页面设置迁移类型以及compaction机制来预防和处理内存碎片。内存页主要有下面三种类型: 1.可移动的(movable)。用户态申请。 2.可回收的(reclaimable)。文件系统的cache。 3.不可移动(unmovable)。内核申请用。可移动的页面,顾名思义就是在被分配之后,还可以改变在物理内存中的位置。只要更新一下...

2018-04-06 18:31:55 4861

原创 Linux内核中的skb_queue_splice_tail_init函数

skb_queue_splice_tail_init()函数用于将链表a连接到链表b上,形成一个新的链表b,并将原来a的头变成空链表。其实现如下:/** * skb_queue_splice_tail - join two skb lists and reinitialise the emptied list * @list: the new list to add * @...

2018-04-06 13:26:00 1749

原创 用户程序函数调用过程中的参数传递方式

在C语言中,在调用一个函数func()时,如果func()接受不超过4个的参数,则调用者直接将实参从左到右依次赋值给r0, r1, r2, r3寄存器(如果是指针则传入地址),然后调用func()。进入func()函数后,func()将自己的栈紧接着caller的栈顶向下扩展,从r0, r1, r2, r3寄存器中拿参数,然后开始做事。而如果func()有超过4个参数,例如:int f...

2018-03-29 20:32:47 2627

原创 看盘古系统杂记

看视频 盘古:阿里云飞天分布式存储系统实践 过程中记的乱七八糟的东西。仅是个人笔记供以后查阅,没有参考价值,各位看官还是各自散去~分布式和集群的区别: 分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在一起,实现同一业务。 分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。 分布式的每一个节点,都完成不同的业务,一个节点垮了,哪这个业务就不可访问了。...

2018-03-10 21:26:05 1152

原创 Linux内核中的锁

1. 为什么要保证原子性处理器分两种:cisc(复杂指令集,可以直接在内存上进行操作,如x86,一条汇编指令可以原子的完整读内存、计算、写内存)和rics(精简指令集,所有操作都必须是在CPU内部进行。所以你想给内存某个变量做加法,你要先用load指令把内存load到CPU的寄存器、再执行add,再执行store把结果放到内存中)。因此a++这句话在rics上并不是原子的,必须翻译成一个r...

2018-03-07 00:05:34 6471

原创 Linux内存管理 —— DMA和一致性缓存

1. 出现内存不一致的原因CPU写内存的时候有两种方式: 1. write through: CPU直接写内存,不经过cache。 2. write back: CPU只写到cache中。cache的硬件使用LRU算法将cache里面的内容替换到内存。通常是这种方式。DMA可以完成从内存到外设直接进行数据搬移。但DMA不能访问CPU的cache,CPU在读内存的时候,如果cache命中...

2018-03-06 18:34:30 26884 6

原创 Linux内存管理 —— 文件系统缓存和匿名页的交换

1. swap的含义在Linux里swap有两个意思: 1. 动词:交换。内存和磁盘的颠簸行为。 2. 名词:硬盘的swap分区。没有文件背景的页面,即匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件交换,但可以通过硬盘上划分额外的swap交换分区或使用交换文件进行交换。即上面wap作为名词的意思。Swap分区可以将不活跃的页交换到硬盘...

2018-03-06 18:27:22 16737 3

转载 CPU是如何访问到内存的?--MMU最基本原理

本文转载于:http://mp.weixin.qq.com/s/SdsT6Is0VG84WlzcAkNCJA Linuxer微信公众号假设页表只有一级对于一个有MMU的CPU而言,MMU开启后,CPU是这样寻址的:CPU任何时候,一切时候,发出的地址都是虚拟地址,这个虚拟地址发给MMU后,MMU通过页表来在页表里面查出来这个虚拟地址对应的物理地址是什么,从而去访问外面的内存条。MMU里面...

2018-03-06 18:04:23 9283

原创 Linux内存管理 —— 进程的虚拟地址空间和VSS

1. 进程虚拟地址空间进程的虚拟地址空间记录在其task_struct结构的指针成员mm中(struct mm_struct),这是用户态进程才有的,里面包含pgd、代码段、堆、栈地址等信息。(kernel不需要mm,因为kernel不需要引用动态库,内核线程有自己的栈空间,虚拟地址映射关系也是全局可见的,注意vmalloc和kmap产生的映射是由内核中的全局变量swapper_pg_dir和...

2018-03-06 17:47:07 1478

原创 Linux内存管理 —— 内核态和用户态的内存分配方式

1. 使用buddy系统管理ZONE我的这两篇文章buddy系统和slab分配器已经分析过buddy和slab的原理和源码,因此一些细节不再赘述。所有zone都是通过buddy系统管理的,buddy system由Harry Markowitz在1963年提出。buddy的工作方式我就不说了,简单来说buddy就是用来管理内存的使用情况:一个页被申请了,别人就不能申请了。通过/proc/b...

2018-03-06 17:36:04 14893

原创 Linux内存管理 —— 为buddy做准备:MMU, TLB, ZONE

本文都是假设系统是32位,页大小为4KB,基于ARM架构(不过和体系结构相关的内容不多)。1. 了解MMU在启用MMU的Linux内核中,CPU是通过虚拟地址来访问物理内存的。MMU(Memory Management Unit),即内存管理单元,它集成在CPU中,负责虚拟地址到物理地址的映射,以及物理地址的访问,并提供内存访问权限检查机制,以达到内存保护的作用(ARM里面的MPU(M...

2018-03-06 17:12:32 2233 1

转载 EEPROM和flash的区别

原文地址: http://blog.csdn.net/yuanlulu/article/details/6163106之前对各种存储器一直不太清楚,今天总结一下。存储器分为两大类:ram和rom。ram就不讲了,今天主要讨论rom。rom最初不能编程,出厂什么内容就永远什么内容,不灵活。后来出现了prom,可以自己写入一次,要是写错了,只能换一片,自认倒霉。人类文明不断进步,终于出

2018-01-24 23:52:23 492

原创 同步、异步、阻塞、非阻塞,以及IO模型的理解

同步和异步同步 就是你知道你什么时候在做什么,做完一件事情再做下一件事情,因此主动权在自己手里。比如通过等待或轮询,你在某个时间点总是知道结果是怎样的(有数据还是没数据等)。 异步 就是你不知道什么时候会发生什么。比如你注册了多个回调函数,你不知道什么时候会被调用以及被调用的是哪一个回调函数。阻塞和非阻塞阻塞:一个调用过程必须完成才返回。对于IO操作,如果IO没有准备好,读取或...

2018-01-24 19:48:32 3966

原创 Linux下修改文件属性 —— chattr和lsattr命令介绍

1. 介绍chattr可用于修改Linux文件系统上的文件属性。例如,使用chattr将某个文件设置为’i’属性(不可修改),则即使在root用户下给文件chmod成777模式,也是无法修改、删除和重命名的。可借助这个命令对某些文件进行锁定。chattr可作用于文件或目录。相应的,lsattr命令用于打印文件的属性。2. chattr命令2.1 选项-R 递归地作用

2018-01-22 10:36:46 13656

原创 Linux中的SysRq魔术键

1. SysRq介绍我第一次接触到SysRq是由于硬件同事调试时突然发现串口打印了HELP信息,还以为软件出问题了,我就去了解了一下SysRq。而我真正用上SysRq是为了破解一个禁止了所有命令的系统……(很有帮助哈哈)。SysRq是Linux提供的一个“Magic System Request Key”,它可以在系统出现故障的时候协助恢复和调试系统。只要你的虚拟终端或串口还可以接收键盘输

2018-01-16 23:56:56 17040

转载 Linux协议栈——compare_ether_addr_64bits函数分析

从陈老哥的博文中,获得一种新体验。在学习kernel代码的时候,不仅要注重其内在的流程和架构,也可以多多关注一下代码的实现细节,从小的地方去学习编程之道。今天以一个小函数compare_ether_addr_64bits,作为一个尝试。static inline unsigned compare_ether_addr_64bits(const u8 addr1[6+2],

2017-12-29 23:35:28 1183

原创 PPPoE收发包过程分析

路由器中的LAN/WAN口都是通过以太网(ether)设备来收发包的,而在WAN口进行了PPPoE拨号后,ifconfig会发现多出一个ppp0,这个设备是干什么用的呢? 实际上,这个设备是内核的ppp模块为方便pppoe等协议收发包用的,有了这个设备,你就可以将路由表改一改,将发往WAN口的数据包从ppp0(而不是eth1)发出去,内核协议栈会按照PPP协议相关的设置将这个包发

2017-12-29 23:26:39 3451

原创 Linux编程——终止线程的正常方式及取消点

问题背景: 在使用pthread_cancel和pthread_join退出一个线程时,线程本身会立即停止运行代码并退出吗?如果在你试图退出一个线程时,该线程中还有未释放的资源,这时应该怎么处理呢?在cancel一个线程时,线程体可能并不会立即退出,这就会出现两个问题:在调用cancel之后,如果线程体仍在运行,就会导致pthread_join()阻塞,进而使调用pthread_joi...

2017-11-30 12:33:21 11099

原创 字节序 —— 大端与小端

尾端(endianness)这一词由Danny Cohen引入计算机科学,Cohen注意到计算机体系结构依照字节寻址和整型数定义之间在通信系统的关系,被划分为两个阵营。例如,一个32位的整数会占据4个字节,这样会有两种合理的方式来定义整数和各个字节之间的关系:有些计算机先从低位字节开始存放,有些则先从高位字节开始存放,Cohen将它们分别称为“小端(little-endian)”和“

2017-11-30 00:19:33 2349

原创 GCC的built-in方法之 —— 原子操作

如果要在多线程中对同一个整型变量进行加减操作,我们知道可以通过加锁的方式保证线程同步,但仅对这一个变量加锁,是不是大材小用了?有没有类似于Linux内核中的atomic_inc()/atomic_dec()方法从指令的层面上实现操作变量的原子性?答案是,有的。GCC提供了一系列内置函数,来完成对一些简单的数据操作的同步。type __sync_fetch_and_add (type *ptr, ty

2017-11-27 20:38:14 3163

原创 串口工具minicom的使用方法

minicom是一个用在Linux操作系统中的串口通讯工具,本文将介绍其用法。安装minicom:下载源码包,解压,正常的安装流程即可: ./configure make make install配置串口:如果是在虚拟机中安装的Linux,则需要先绑定串口设备,以配置VMWare为例: 虚拟机关闭的情况下,“你的虚拟机” -> settings -> Hardware -> Add… ->

2017-10-15 22:28:53 7352

原创 标准库是如何发起系统调用的

应用程序在发起某个系统调用时,是先调用标准库中的同名函数,标准库再根据不同体系结构来选择特定的方式陷入内核。以socket库函数为例(以下均为uClibc中的实现),来说明标准库是如何一步步解析系统调用名并进入内核的:socket系统调用号:#define __NR_socket (4000 + 183)socket()函数的实现就是下面的函数:_syscall3(int, socket, int,

2017-10-15 22:10:00 1030

原创 Linux内核中的kobject和kset介绍

本文会围绕kobject、ktype和kset三个概念进行介绍。kobject在内核中应用最多的就是设备驱动模型————总线、设备、驱动、类的管理都使用了kobject,但是kobject并不只为设备驱动模型服务,它是内核中的通用对象模型,用来为内核中各部分的对象管理提供统一视图,其实现在内核的lib/目录下。

2017-09-17 21:28:03 7782 1

原创 Linux字符设备驱动

1. Linux设备类型Linux内核中的设备可分为三类:字符设备、块设备和网络设备。 字符设备(Character device):适合面向字符的数据交换,因其数据传输量较低。对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流。他不具备缓冲区,所以对这种设备的读写是实时的,如终端、磁带机、串口、键盘等。 块设备(Block device):是一种具有一定结构的随机存取设备,对这

2017-08-27 18:36:35 2474

原创 I2C总线传输协议

I2C总线支持设备之间的短距离通信,它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计并用于自己的芯片上,一开始只允许100kHz、7-bit标准地址。1992年,I2C的第一个公共规范发行,增加了400kHz的快速模式以及10-bit扩展地址。在I2C的基础上,1995年Intel提出了“System Managemen

2017-08-20 19:50:10 54481 16

转载 AHB和APB总线的比较

AMBA片上总线AMBA 2.0规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。AHB简介AHB主要用于高性能模块(如CPU、DMA和D

2017-08-17 18:44:50 17994 3

空空如也

空空如也

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

TA关注的人

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