自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 linux kernel同步技术

内核在随时响应各种中断、异常、内核抢占、进程睡眠等事件,所以内核并不是严格的按照顺序执行的,而是采用交错的方式。交错执行意味着对资源有竞争,譬如进程A正在使用资源1的时候,因为发生某些事件导致程序切换到进程B执行,进行B也需要使用资源1,这时候进程A、B就同时竞争资源1。若没有同步机制,进程B等待进程A对资源1的释放,那么进程B将会改写资源1的数据,再切回进程A时,资源1就不是进程A想要的值了。

2022-09-22 23:02:22 263 1

原创 在32位机器上实现64位数的除法

在32位机器上不能直接进行64位数据的除法,比如a或b是64位的数据的时候,要计算a/b,不能直接data=a/b;这样的计算,编译器会报错,缺少相关的指令。这就需要我们单独去实现64位数据的除法函数。在32位机器上实现64位数据除法的方式有很多,主体思想就是分解成32位的数据去进行除法或者进行移位计算,一个数往右移一位等于该数除以2,往右移两位等于该数除以4,也就是移位n次等于除去2^(n-1)。...

2022-07-24 22:21:05 2850

原创 SPI总线介绍

SPI总线概述SPI(Serial Peripheral interface),串行外围设备接口。是一种高速的,全双工,同步的通信总线。优点支持全双工通信通信简单数据传输速率快缺点没有指定的流控制,没有应答机制确认是否接收到数据,所以和IIC总线协议比较在数据可靠性上有一定的缺陷。SPI总线特点采用主-从模式(Master-Slave)的控制方式SPI规定了两个SPI设备之间通信必须由主设备Mater来控制次设备Slave。一个Master设备可以通过提供时钟Clock和对S

2022-05-21 15:38:26 1794

原创 MDIO总线简单介绍

MDIOMDIO,全称Management Data Input/Output,管理数据的进出,同时也被称为SMI (Serial Management Interface) 和 MIIM(Media Independent Interface Management),是以太协议中,MAC用来管理PHY的管理总线协议。协议标准MDIO接口由两个信号实现:MDIO 接口时钟(MDC):由MAC设备驱动到PHY的时钟。MDIO数据与MDC时钟同步,在MDC上升沿有效。MDIO 数据:双向,用于MAC读

2021-12-30 10:54:28 11871

原创 I2C协议的简单介绍

I2C协议I2C协议有两根信号线,一根时钟线SCL,一根信号线SDA。主要用于I2C master设备和I2C slave设备之间的通信,一个master设备下面可以挂接很多个slave设备,为了能让master设备能够准确找到slave设备,每个slave设备都要有自己的slaveaddr,同个master设备下的slave设备的slaveaddr不能出现一样的情况。协议规定slaveaddr为7个bit或者10个bit,市场上常见的器件都是设计成7个bit。数据有效性SDA数据线是用来传输数据的

2021-12-16 15:17:40 2313

原创 linux kernel的中断编程

上一篇文章介绍了linux kernel中的中断系统,这边文章简单介绍在内核中如何使用中断编程。首先编写中断程序需要注意的事项中断处理函数中不能睡眠,也不能调用执行了睡眠动作的函数当中断处理函数有部分代码进入临界区时,使用自旋锁,而不是使用互斥锁,因为获取互斥锁获取不到的时候,会进入睡眠状态。中断处理函数不能与用户空间交换数据必须尽快执行中断处理程序。为了确保这一点,最好将实现分为两部分,上半部分和下半部分。处理程序的上半部分将尽快完成工作,稍后再完成下半部分工作,这可以通过 softirq 或

2021-11-01 11:02:19 141

原创 linux kernel中的中断系统

在linux中,中断信号会将CPU转移到其它任务上。其它任务一般被称为中断处理程序或者中断服务程序。中断来的时候会发生什么中断往往由硬件设备的电子信号产生,并被引导到中断控制器上。将中断来的时候,内核将完成下列事情:接收到中断后,中断控制器向处理器发送信号。处理器检测到该信号并中断其当前的任务以处理中断。然后处理器可以通知操作系统发生了中断,操作系统可以适当地处理中断。不同的设备使用与每个中断相关联的唯一值与不同的中断相关联。这样操作系统能够区分中断并知道是哪个硬件设备引起了这样的中断。同时

2021-10-28 17:28:40 332

原创 linux kernel中的sysfs

介绍操作系统将虚拟内存分为内核空间和用户空间。内核空间严格保留用于运行内核、内核扩展和大多数设备驱动程序。相比之下,用户空间是所有用户模式应用程序工作的内存区域,必要时可以换出该内存。用户空间和内核空间之间的通信有多种方式,sysfs就是其中的一种。Linux中的sysfssysfs 和proc一样是虚拟文件系统。Sysfs 中的文件包含有关设备和驱动程序的信息。Sysfs 中的某些文件甚至是可写的,用于配置和控制连接到系统的设备。Sysfs 始终挂载在 /sys 上。Sysfs 中的目录包含设备的

2021-10-21 14:00:27 663

原创 小白学linux——主从设备号

介绍如果我们为面向字节的操作编写驱动程序,那么我们将它们称为字符驱动程序。由于大多数设备都是面向字节的,因此大多数设备驱动程序都是字符设备驱动程序。例如,串行驱动程序、音频驱动程序、视频驱动程序、相机驱动程序和基本I/O驱动程序。事实上,所有既不是存储设备驱动程序也不是网络设备驱动程序的设备驱动程序都是某种类型的字符驱动程序。应用程序如何与硬件设备通信?applications -> device file or device Node -> Majaor and Minor Number

2021-07-22 17:25:17 1102

原创 小白学Linux——等待队列(waitqueue)

#等待队列介绍当你编写Linux驱动程序、模块或内核程序时,某些进程会为了某些事件等待或休眠。在Linux中有多种处理睡眠和唤醒的方法,每种方法都适合不同的需求。等待队列(Waitqueue)也是处理这种情况的方法之一。每当进程必须等待事件(例如数据到达或进程终止)时,它就应该进入睡眠状态。休眠会导致当前进程暂停执行,从而释放处理器给其它进程使用。一段时间后,进程等待的资源就绪之后,该进程会被唤醒。等待队列是内核提供的一种实现等待的机制。顾名思义,等待队列是等待事件的进程列表。换句话说,等待队列用于在

2021-07-21 17:38:24 1513

原创 小白学linux——工作队列(workqueue)

工作队列工作队列在linux2.6版本中被引入,类似于linux2.4中的“task queue”(任务队列)。工作队列机制允许内核函数延迟执行,也就是你将一个即将要执行的函数放进工作队列中,工作队列机制中的工作线程会在一定时间之后执行该函数。虽然有点像可延迟函数,但是他们还是有一些区别。最主要的区别在于可延迟函数在中断上下文中运行,而工作队列中的函数在进程上下文中执行。在进程上下文中运行是可以执行阻塞函数(例如,需要访问磁盘上数据块的函数)。可延迟函数和工作队列中的函数都不能访问进程的用户模式地址空间

2021-07-19 10:11:58 1570

原创 linux kernel中的completion

概述completions是Linux内核中轻量级的同步机制,使用它完成内核中不同线程之间的同步,允许一个线程告诉另一个线程工作已经完成。接口包含内核头文件<include/completion.h>创建一个completion可以使用DECLARE_COMPLETION(my_completion);也可以使用struct completion my_completion;init_completion(&my_completion);等待completion

2021-06-11 17:17:03 298

原创 如何编写一个linux内核模块

概述内核模块是运行在内核空间的,区别于应用程序运行在用户空间,大多数内核模块是完成对硬件设备或者总线的驱动,文件名后缀为.ko,本篇文章记录一下该如何编写一个简单的内核模块并让其能在Linux系统中运行。环境首先需要有一个可用的Linux系统,因为我们大部分的电脑都是装的windown系统,所以需要在电脑上装一个虚拟机,在安装linux系统例如Ubuntu或者Centos等成熟的Linux发行版,假如是win10系统,也可以使用系统内置的Ubuntu系统。本文采用的环境是在虚拟机中安装了Ubuntu

2021-06-10 09:53:38 1326

原创 .pid是什么文件

概述有时有必要保存Linux进程的进程标识号(PID)。在本教程中,我们将介绍一种使用.pid文件存储PID的常用方法,以及一个使用方法的示例。什么是.pid文件很多时候,应用程序会将PID写入文件以便于访问,特别是守护进程。它只是一个仅包含进程的PID文本文件。没有特定的规则创建或使用。这仅仅是一个简单有用的约定。下面从创建.pid文件的简单例子开始介绍.pid文件创建.pid文件我们可以在脚本中创建.pid文件的一种方法是将$$的输出传递到文件中:~$ echo $$ > mypro

2021-05-28 18:26:06 4901

原创 计数排序算法(C语言实现)

概述计数排序与其它排序并不一样,其它排序是基于比较进行排序,而计数排序是通过计算一个集合中元素出现的次数来确定集合的排序。计数排序只适用于整型或者那些可以用整型来表示的数据集合,因为计数排序需要利用数组的索引来记录元素出现的次数。例如,如果整数n出现m次,那么m将存储到数组索引为n的位置上。这要求我们需要知道集合中最大的整数值,便于为数组分配足够的空间。计数排序属于稳定排序,顺便说一下排序算法稳定性的定义,两个相同的元素的相对位置不发生变化,则该算法具有稳定性。算法分解获取最大值,申请临时的连续

2021-05-21 12:27:38 1101

原创 tcpdump使用说明书

概述tcpdump是linux系统下强大的网络抓包工具,它可以对网络包进行筛选过滤,打印出来或者保存至文件中。熟练使用tcpdump,可以帮助初学者学习网络协议,开发者排查网络问题。命令参数-A 以ASCII码的形式打印报文内容-c 要抓取报文的个数,当抓取到该数目的报文后,tcpdump进程则会终止,假如没有带这个参数,只有接收到终止信号,tcpdump才会终止,即可以输入ctrl+c终止进程-C 若是将抓取到的报文内容保存至文件中,该参数用于指定文件的大小,当文件超过该值之后,tc

2021-05-19 11:50:06 192

原创 进程间通信之消息队列

定义消息队列本质是消息的链接表,存储在内核中,由消息队列标识符标识。消息队列有两种版本,一种是system V4版本,一种是POSIX IPC版本。消息队列顾名思义,当一个进程需要向另一个进程传递消息时,则将需要传递的数据存放在特定的队列中,另一个进程则从该队列中取出即可。原理与管道类视,只是两者的实现方式不同,函数接口不同。队列ID是消息队列的核心变量,消息队列通过队列ID来识别,该将消息存放在哪个队列,从哪个队列中读取消息。数据结构system V版本相关的数据结构 struct msq

2021-05-14 14:37:02 316

原创 进程间通信之管道

定义管道是最古老的IPC方法,进程之间通过读写管道的fd进行通信。性质只有当所有的写入端fd都已经关闭,且管道中的数据都已经被读出,这时对读取端fd调用read函数才会返回0,也就是读到了EOF标识。当所有的读取端fd都已经关闭,再向该管道写入数据时,写操作会失败,errno全局变量置为EPIPE,与此同时内核会向写入进程发送一个SIGPIPE的信号。当所有的读取端fd和写入端fd都关闭以后,管道才能被销毁。管道本质是一片内存区域,写入端通过fd[1]将数据写入这片内存,读取端通过fd[0]

2021-05-10 11:37:22 159

原创 归并排序算法(C语言实现)

归并排序的步骤:1.将序列分成左右两部分2.排序左序列,排序右序列3.合并两个有序的序列需要申请额外的空间放临时的有序序列#include<stdio.h>#include<string.h>#include<stdlib.h>void merge(char *str,char *tmpstr,int start,int mid,int end){ int i=start,j=mid+1,k=start; while(i!=mid+

2021-03-01 10:46:55 4242

原创 快速排序算法(C语言实现)

快速排序分三大步骤:1.分:选择一个分割值并将数据按此分为左右两部分2.治:分别在两部分用递归方式调用上述的分步骤,继续划分3.合:对分割的部分排序直至完成#include <stdio.h>#include <stdlib.h>#include <string.h>int partion(char *s,int start,int end){ //随机选取分割值 int key = s[start]; int temp;

2021-02-25 14:59:20 4124 1

原创 图解git工作原理

git 是一个能处理各种大小项目的开源版本控制系统,本文想通过两张图来简单说明git的工作原理从上图可以知道git分四个部分来记录文件状态working directory:工作区,开发者直接修改的本地代码树staging area:暂存区,用于临时保存开发者的改动repository:本地仓库,安全存放数据的位置,这里有开发者提交所有版本的数据。其中HEAD指向最新放入仓库的版本以上三个区域又是存储在我们各自工作的本地PC上,git通过.git/目录下的文件进行记录管理remote

2021-01-22 12:05:45 2476

原创 移植iperf3遇到的问题

版本:iperf-3.0.11运行机器:armv71.出现编译问题报error: undefined reference to '__gnu_mcount_nc'main.c:62: error: undefined reference to '__gnu_mcount_nc'main.c:124: error: undefined reference to '__gnu_mcount_nc'main.c:131: error: undefined reference to '__gnu_m

2021-01-14 17:37:42 1023

原创 Linux编程之fork()

Fork()创建一个子进程 创建失败返回负值 同时会有不同的错误码(errno),EAGAIN(系统进程个数限制)、ENOMEM(申请内存失败)、ENOSYS(系统平台不支持)。 创建成功将会返回两个值 =0;子进程的返回值,说明当前程序在子进程运行 >0; 父进程的返回值,说明当前程序在父进程运行,返回值为生成子进程的PID值Wait()父进程阻塞等待子进程的状态变化,通常和fork一起使用.简例:#include &l...

2020-12-08 14:22:45 119

原创 Gerrit原理介绍

代码审查可以在代码上库前避免很多问题,或是一些低级问题或是设计上的问题,我们熟知的开源项目git,linux都在坚持代码审查,源代码不能私自修改提交项目代码,而是需要将patch邮件发送给对应的负责人,负责人审查通过后才会合并,而Gerrit是一款基于web界面用于代码审查的工具。一款好的工具首先是能够提供完整功能,更重要是围绕这个功能提供一套方便快捷,效率高的使用方式。Gerrit就是这样一款好的工具,它提供了代码审查的功能,同时又方便于开发人员,审查人员和项目管理者的合作。Gerrit部署在代码服务

2020-11-25 18:29:33 1436

原创 SecureCRT python 脚本

记录编写CRT的python脚本遇到的问题向CRT的脚本传递参数的两种方式一种是命令行的方式/path/CRT.exe <filename>.py /ARG arguments //这样就会将参数argument传递给脚本二种是按钮方式创建按钮时,指定要执行的脚本,和填入需要传递的接受脚本传递的参数,crt.Arguments [0]而不是crt.Arguments(0)写成crt.Argument(0)执行脚本时会报错:TypeError Error:'Se..

2020-10-16 18:19:26 2091

原创 学习SSH协议

协议客户端IP:192.168.150.10服务器IP:192.168.150.1框架:传输阶段建立连接:客户端发起tcp连接请求,三次握手建立连接版本协商:客户端向服务器发送自己的版本号,服务器向客户端回复自己的版本号并发送本端支持的公钥算法/加密算法等列表,协商出两边都支持的版本,当前主要都是sshv2密钥协商:客户端回复本端支持的公钥算法列表,加密算法列表,消息验证码算法列表(MAC),压缩算法列表两端通过DH算法协商出会话密钥和会话ID..

2020-10-14 16:47:43 224 1

原创 linux内核中的container_of

在内核代码中,经常见到container_of函数,它是一个宏定义,定义在include\linux\kernel.h文件中/*** Container_of - cast a member of a structure out to the containing structure(将一个结构体的成员包含到指定的结构体中)* @ptr:...

2020-02-13 10:53:22 385

原创 图解大小端模式

大端模式:数据的高字节存储在内存的低位地址上,低字节存储在内存的高位地址上【高低低高大】例如,十六进制数0x123456789abcef00在内存段【0,7】中的分布小端模式:数据的高字节存储在内存的高位地址上,低字节存储在内存的低位地址上【高高低低小】例如,十六进制数0x123456789abcef00在内存段【0,7】中的分布为什么会存在大端和小端这两种不同...

2020-02-11 21:31:57 770

空空如也

空空如也

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

TA关注的人

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