- 博客(59)
- 收藏
- 关注
原创 route命令详解
Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table)。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或
2022-05-03 18:12:10
411
原创 Linux iptables命令详解
iptables 是 Linux 防火墙系统的重要组成部分,iptables 的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者由该设备转发、路由时,都可以使用 iptables 进行控制。与大多数的Linux软件一样,这个包过滤防火墙是免费的。iptables简介*iptables基础*规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源
2022-05-02 10:07:32
1090
原创 ifconfig中lo、eth0、br0、wlan0接口
在 实体机上 ifconfig 命令用于 显示或配置网络设备(网络接口卡) 或修改。概述lo 回环接口lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0一般回环接口的ip v4地址为:127.0.0.1,子网掩码:255.255.255.0从配置可以看出,lo的mask仅为8bit,也就是说,只要127开头,任何网络主机号都可以,也就是说环回接口可以理解为一个网络号。验证一下,ping 127.0.0.1 127.0.
2022-04-10 12:08:59
828
原创 网桥、交换机、路由器等的区别
概述集线器集线器的主要功能是对接受到的信号进行再生整形放大,以扩大网络的传输距离,主要工作在 OSI 参考模型的第一层也就是物理层。集线器实际就是一种多端口的中继器。集线器一般有4、8、16、24、32等数量的RJ45接口,通过这些接口,集线器便能为相应数量的电脑完成“中继”功能(将已经衰减得不完整的信号经过整理,重新产生出完整的信号再继续传送)。由于它在网络中处于一种“中心”位置,因此集线器也叫做“Hub”。集线器的工作原理很简单,比如有一个具备8个端口的集线器,共连接了8台电脑。集线器处于网络的
2022-04-10 09:07:00
250
原创 vlan配置实现
简述VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接通信,从而将广播报文限制在一个VLAN内。本节代码主要实现vlan功能配置,将端口1、5、8划分到一个vlan下(其中,1端口通过转接板连接PC端),然后通过ping 的方式测试vlan功能,当然也可使用抓包的方法测试vlan功能。本节代码提供SDK,调用时可以传参。参数封装为结构体,对于参数较多的可以使用结构体来
2022-03-20 17:28:59
269
原创 Docker镜像下载、启动、配置
最近在做移远AG550Q-CN车规级5G模组开发,需要对固件包做签名操作,SecBoot Docker镜像提供了签名工具运行的所有依赖环境。执行步骤镜像下载:sudo docker pull registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot_v2安装Docker:sudo apt-get install docker.io启动Docker:(假设签名工具所在目录为~/ag550/ql_sa515m_nork_mro_SecBoot
2022-02-06 11:21:15
1210
原创 linux内核的配置机制及其编译过程
配置系统的基本结构Linux内核的配置系统由三个部分组成,分别是:1、Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则;2、配置文件(config.in(2.4内核,2.6内核)):给用户提供配置选择的功能;3、配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuco
2022-01-23 11:26:32
163
原创 设备驱动基本框架
1)首先应用调用Open(“dev/xxx”,O_REWR)打开设备文件后,会得到此设备文件的属性,知道属性中的“设备类型”和“主设备号”。2)然后VFS层通过“设备类型”(如字符设备类型)去内核中的“chrdev”这个数组。在通过应用得到的“主设备号”以此为索引从内核的"chrdev"数组中知道相应的“file_operation”结构。这个结构是驱动程序“register_chrdev”注册到内核的,这样索引找到它。这个结构中有相应的一些成员函数(如read,write等),这些成员函数就对应硬件的读
2022-01-09 19:20:37
623
原创 ioctl 函数详解
*概述*类 UNIX 操作系统将所有设备都看成文件每个设备都对应一个文件,在内核中也有一个相应的索引结点对文件操作的系统调用也适用于对设备文件的操作,例如 open()设备文件逻辑空间是一个线性空间ioctl是iocontrol的缩写,就是IO控制。ioctl 是设备驱动程序中对设备的 I/O 通道进行管理的函数,简言之就是对设备的一些特性进行管理,例如传感器的数据采集、串口波特率等等。*适用范围*行为上简单来说,如果你在写驱动程序时候,碰到一些IO操作,在逻辑上不能归类到read,不能归类
2022-01-09 16:27:51
1203
原创 SPI总线和设备驱动
*软件架构*在内核的SPI驱动的软件架构中,进行了合理的分层和抽象,如下图所示:*SPI控制器驱动程序*SPI控制器不用关心设备的具体功能,它只负责把上层协议驱动准备好的数据按SPI总线的时序要求发送给SPI设备,同时把从设备收到的数据返回给上层的协议驱动,因此,内核把SPI控制器的驱动程序独立出来。SPI控制器驱动负责控制具体的控制器硬件,诸如DMA和中断操作等等,因为多个上层的协议驱动可能会通过控制器请求数据传输操作,所以,SPI控制器驱动同时也要负责对这些请求进行队列管理,保证先进先出的原则。
2022-01-03 16:46:03
291
原创 spidev.c文件
设备驱动是在core之上的模块,向上给应用程序提供file_operations接口,应用程序可以通过设备节点访问驱动程序,向下通过core向控制器模块发送数据,控制器模块将数据发送到物理总线上。spidev.c是一个典型的设备驱动程序,前面提到在linux中,一般都会采用设备驱动和控制器驱动分离的思想,两者通过一个core进行关联,目的是最大程度保证代码的可移植性,我们以应用程序调用为主线,详细分析spi驱动的数据流流向。SPI主控制器驱动,也就是SPI总线驱动,既然总线有了,根据Linux设备驱动模
2022-01-02 17:48:52
547
原创 git使用浅析
集中式与分布式的区别除了git还有svn、cvs这样的版本控制系统,它们的区别在于一个是分布式一个是集中式集中式就是svn和csv这样的版本控制系统,分布式是git区别在于集中式的版本控制系统每次在写代码时都需要从服务器中拉取一份下来,并且如果服务器丢失了,那么所有的就都丢失了,你本机客户端仅保存当前的版本信息,换句话说,集中式就是把代码放在一个服务器上集中管理,你的所有回滚等操作都需要服务器的支持。分布式的区别在于,每个人的电脑都是服务器,当你从主仓库拉取一份代码下来后,你的电脑就是服务器,无需担
2021-11-17 20:08:36
346
原创 C++构造函数
在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。我们通过成员函数 setname()、setage()、setscore() 分别为成员变量 name、age、score 赋值,这样做虽然有效,但显得有点麻烦。有了构造函数,我们就可以简化这项工作,在创建对象的同时为成员变量赋值。class Student{public: Student(char *n
2021-11-07 21:13:15
456
原创 顺序栈和链栈(C语言)
简述栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出LIFO(Last In First Out)或先进后出FILO(First In Last Out)线性表。栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。栈底(Bottom):是固定端,又称为表头。空栈:当表中没有元素时称为空栈。一般将插入和删除操作称为入栈和出栈。顺序栈和链栈栈是一种线性表,所以栈也有线性表的两种存储结构(顺序存储结构和链式存储结构)。栈的顺序存
2021-10-17 17:50:08
2302
原创 双向链表(C语言)
双向链表就是链表方向是双方向的,也就是双向链表中的每一个节点有两个指针,一个指针用来指向上一个节点(前驱),另一个指针用指向下一个节点(后继)。本文主要是对双向链表的基本操作,主要包括双向链表的创建,插入节点,删除节点,还有输出节点的数据等。结点的构造typedef struct node{ int data; struct node *prev; struct node *next;}Node,*pNode;基本操作双向链表的创建双向链表的创建同样像单链表一样
2021-10-17 15:42:46
257
原创 链表解析(C语言)
链式存储:用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散的分布在内存中的任意位置上的。链表中结点的逻辑顺序和物理顺序不一定相同。非循环单链表链表链表的种类很多,有单链表、双链表、循环链表、非循环链表;在此,我们以非循环单链表为例,来讲链表的创建、求长度、排序、插入和排序。链表包含以下特征:(1).由n个结点离散分配;(2).每个结点通过指针连接(3)每一个结点由一个前驱结点和一个后驱结点
2021-10-10 11:48:28
170
原创 coredump解析
coredump简述什么是coredump我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下会产生一个叫做core的文件。通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成的一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等
2021-10-01 11:10:34
287
原创 使用&和wait让你的脚本并行执行
概述我们知道shell中的命令都是串行执行的,如果想要充分利用服务器的资源,就需要些小技巧了。假定业务上多个业务逻辑没有先后关系,每个脚本的执行时间也很长 ,推荐并行执行。如果我们把这些脚本放到一个调用脚本里呢? 执行的时候去调用这个调用脚本,事实上linux会根据脚本中的顺序 串行去调用这些脚本,还不如自己在服务器上一个个的执行快呢,最起码手工逐个调用脚本还是并行的。使用&和wait在每个进程中使用&符号进行让脚本在后台运行,无需等待当前进程结束。为了确保每个进程都执行完成,最
2021-10-01 10:54:37
354
原创 函数调用过程栈变化
进程内存区域当进程被加载到内存时,会被分成很多段代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写,如果发生写操作则会提示segmentation fault数据段:保存初始化的全局变量和静态变量,可读可写不可执行BSS:未初始化的全局变量和静态变量堆(Heap):动态分配内存,向地址增大的方向增长,可读可写可执行栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方向增长,可读可写可执行环境/参数段(environment/argumentss
2021-10-01 09:30:06
1345
1
原创 多线程的同步
同步与互斥的概念现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。在多任务操作系统中,同时运行的多个任务可能:都需要访问/使用同一种资源;多个任务之间有依赖关系,某个任务的运行依赖于另一个任务。同步是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。互斥是指散步在不同任务之
2021-09-25 18:10:26
171
原创 linux下passwd和shadow文件解析
passwd命令passwd 命令的基本格式如下:[root@localhost ~]#passwd [选项] 用户名选项:-S:查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用;-l:暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 “!”,使密码失效。仅 root 用户可用;-u:解锁用户,和 -l 选项相对应,也是只能 root 用户使用;–stdin:可以将通过管道符输出的数据作为用户的密码。主要在批
2021-09-25 10:05:06
1942
原创 pthread解析
POSIX.1 指定了一组接口(函数、头文件),用于线程编程,通常称为 POSIX 线程或 Pthread。一个进程可以包含多个线程,所有线程都执行相同的程序。这些线程共享相同的全局内存(数据段和堆段),但是每个线程都有自己的栈(自动变量)。常用函数线程 ID进程中的每个线程都有一个唯一的线程标识符(存储在 pthread_t 类型中)。该标识符返回给 pthread_create的调用者,线程可以使用 pthread_self获得其自己的线程标识符。线程 ID 仅在一个进程中保证是唯一的(在所有接
2021-09-21 11:23:21
285
原创 C语言中函数指针和回调函数
函数指针函数指针:指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。首先来看一个函数指针的例子:实例#include <stdio.h>#in
2021-09-19 16:05:06
385
原创 C和C++之间库的互相调用
C++调用C的静态库/动态库C++调用C的函数比较简单,直接使用extern “C” {}告诉编译器用C的规则去编译C代码就可以了。extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。ext
2021-09-19 14:34:37
281
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人