自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程的信号量和互斥量

线程的信号量和进程的类似,维护一个sem_t类型(本质是一个int类型的)的信号量,不同线程通过判断信号量的值,来决定是否进行继续运行,从而控制线程运行的先后顺序。比如信号量初始化成0,线程1调用sem_wait阻塞住,等待线程2调用sem_post将限号量增加之后,线程1被唤醒,从而实现线程1、2执行的顺序。线程1先被创建,但是阻塞在信号量上,线程2后被创建,被运行后将信号量增加,然后线程1识别到信号量大于零,才执行后面的步骤。sem_init用于初始化信号量的初始值和作用范围。互斥量用完了之后要释放。

2023-02-12 17:49:28 403 1

原创 Unix信号处理函数及简单代码示例

信号集一般和struct sigaction配合使用,比如使用sigaction捕获信号的时候,希望把其他的好几个信号阻塞,等被捕获的信号处理完了之后,再恢复其他信号的处理,就可以使用信号集的处理函数来指定哪些信号被阻塞。signal可以注册信号处理函数,但是一致性比较差,现在推荐使用sigaction。sigfillset所有的信号都加入到信号集当中。sigismember判断一个信号是否在信号集中。sigaddset把某一个信号加入到信号集当中。sigdelset把某一个信号从信号集中删除。

2023-01-29 13:56:32 601

原创 unix进程控制及进程环境--自APUE

僵尸进程一个进程退出后,内核会回收进程的资源,但是会留下一个僵尸进程的数据结构,保留了进程的ID、进程的状态等信息,这些信息被父进程通过wait函数获取后被释放,如果一个子进程退出后,父进程没有wait这些信息,那么这个子进程就变成了僵尸进程。父进程通过wait收集子进程的退出信息子进程退出时,内核会向父进程发送SIGCHILD,父进程处理该信号的时候通过wait获取退出信息让进程被进程1接管,进程1会wait每一个退出的子进程孤儿进程。

2023-01-15 11:11:53 667

原创 标准IO库整理--自APUE

文件IO围绕文件描述符,标准IO围绕流,1)流是标准IO函数的参数,文件描述符是系统调用的参数;2)文件流封装了描述符的功能;3)流包含了读和写的缓冲标准IO提供缓冲,是为了减少read和write的调用次数(系统调用),这里的缓存指的是用户态的缓存,在用户态缓存满了之后才回去掉read或write函数进行磁盘IO,但是其实read和write也不是没有缓存,比如内核处理write的时候也只是把数据丢到输出队列等待磁盘IO,并不能保证立即写到磁盘中。

2023-01-03 16:27:25 463

原创 unix下时间相关的函数

这个函数的作用是获取当前时刻对应的时间戳和时区,时间戳是相对1970年以来的秒+微秒数。time函数返回1970-01-01 00:00:00 +0000时刻以来的秒数。

2023-01-02 11:24:39 482

原创 文件IO简述-总结自APUE

文件系统是什么?用于管理存储设备的系统,存储设备是分块的,通过块号/扇区号访问,文件可以分布在多个不同的扇区中,这种访问方式不适合人为直接访问,所以出现了文件系统,用于将对扇区的访问转化成对目录和文件名的访问。不同文件系统的差异:不同文件系统对扇区的管理策略不同,比如坏块管理、碎片管理根文件系统是一种特殊的文件系统,它特殊在:1)提供了根目录;2)…

2023-01-01 11:40:03 620

原创 根文件系统原理简述

文件系统是什么?用于管理存储设备的系统,存储设备是分块的,通过块号/扇区号访问,文件可以分布在多个不同的扇区中,这种访问方式不适合人为直接访问,所以出现了文件系统,用于将对扇区的访问转化成对目录和文件名的访问。不同文件系统的差异:不同文件系统对扇区的管理策略不同,比如坏块管理、碎片管理根文件系统是一种特殊的文件系统,它特殊在:1)提供了根目录;2)…

2022-12-10 21:25:32 534

原创 S5PV210中的SD卡启动详解

来源:朱有鹏老师的嵌入式课程笔记内存一般指的是RAM(random access memory,随机访问存储器),外存一般指ROM(read only memory,只读存储器),前者可以访问任意字节,掉电后丢失数据,后者以块为单位进行访问(比如已512字节为一个块,如果要读取第80字节数据,需要将整个512字节都读出来),掉电后数据不丢失。磁存储,读写速度慢,可靠性低。广泛使用在桌面电脑,嵌入式设备几乎没有在用Flash存储即闪存计数,是当前存储技术发展的主流,利用电学原理存储1、0,无需磁存储设备的磁头

2022-09-11 21:04:15 2188

原创 S5PV210中的定时器

定时器是SoC的一个外设,通过内部计数器的数值×时钟周期,实现定时,一旦到达指定时间,就会触发定时器中断,CPU将执行定时器的中断ISR。计数器的工作依赖时钟系统,时钟源为PSYS域的低频时钟分支APB(65M)分频之后的结果。定时器对于CPU的意义在于,单核CPU在程序间切换依赖定时器的触发。定时器有一个寄存器TCNT,计时开始时,将计数值写入TCNT,每隔时钟周期,由硬件自动完成计数值-1,直到计数值为0,触发定时器中断。

2022-09-09 21:32:11 658

原创 组播和广播的知识点梳理

组播的优点:组播的缺点:任源组播指的是组播的接收方不关注组播的发送方是什么地址,只要发来的,我都接收。接收方对发送方的身份敏感,只有在指定列表中的发送方发出的报文,接收方才接收。现在特定源组播用的比较多广播地址对应的MAC地址固定是全f,组播地址也有其对应的MAC地址,只是这个地址不固定,和组播地址有关系。步骤:由于组播地址范围是224.0.0.0-239.255.255.255,一共有228个地址,MAC地址只取后23位,因此每25=32个组播IP地址,共享一个组播MAC地址步骤:由于IPv6组播地址前1

2022-07-05 22:32:22 2065

原创 ARP报文头部格式和请求流程

格式说明:在以太网中发送ARP请求的时候,以太头的源MAC地址为本地MAC,目的MAC地址为全f;ARP中的源MAC为本地MAC,源IP是本机的IP,目的MAC为0,目的IP为请求的IP地址A主机向请求B主机MAC地址时,会先判断A、B是否属同一网段,分别采用不同的方式发送ARP请求。如果AB属于同网段,但是A到B没有直连的路由,那么A也会走跨网段的流程,将数据包发送给网关处理。...

2022-06-29 16:22:53 6084

原创 nfs配置两台主机之间的文件映射

假设主机192.168.10.1要访问192.168.10.137的/home目录,配置步骤如下:

2022-06-27 11:09:23 605

原创 CPU的异常处理

什么是异常?正常流程之外的流程都叫做异常,中断是异常的一种。现场保护:中断发生的时候,CPU需要记录当前程序的上下文,然后再去处理异常,以便异常处理完成后,返回到原先的程序当中去。硬中断就是硬件产生的中断,软中断是一条会汇编指令,只要一执行,就会产生软中断。所有CPU都有异常向量表,用于处理异常,是硬件决定的。详细来说,出现异常时,CPU转跳到异常处理表,这个行为是硬件决定的,至于异常向量表里面具体的实现动作,是软件定义的。异常发生的时候,CPU自动把PC寄存器转跳到异常向量处理处理异常。如图所示,异常向量

2022-06-24 22:58:13 1350

原创 Linux定时任务

作用:在指定时刻执行一次任务batch作用:系统空闲了的时候再执行命令,空闲的含义是CPU的任务负载小于0.8,任务负载通过uptme命令查看。batch就是用at实现的crontab作用:系统定时任务作用:cron服务自动去读取系统定时任务配置文件,适用一些全局生效的任务crond服务读取的配置文件包括:...

2022-06-20 16:51:54 68

原创 shell变量学习笔记

shell命令行的编辑shell的变量功能变量的显示变量的赋值环境变量变量和环境变量不是一个概念,父进程的变量子进程不能使用,父进程的环境变量子进程可以使用。常见的环境变量变量名描述HOME用户的根目录HISTSIZE历史命令最大数目MAIL邮件相关PATH可执行文件查找的路径LANG语系RANDOM0~32767之间的随机数,随机数生成器/dev/random 0~9之间随机数:declare -i number=$RA

2022-06-11 10:02:48 461

原创 分段、分页、页表、快表学习笔记

为了解决内存碎片问题,通过将进程内存分割成不连续的片段,散布在内存的不同位置。分段认为程序由大小不同的段组成,根据段对程序进行切分,不同的段存放在内存不同位置,比如代码段、data段、堆段、栈段分别保存在内存地某一位置。分页根据进程内存长度(如4K)进行分割,将进程分割成大小相同的多个分页,分布在内存不同的位置。首先linux记录了进程的段表,内容是每一个分段的编号、起始物理地址(段基址)、段限长。然后逻辑地址分成两部分,第一部分是段编号,第二部分是段内位移。地址转换的流程为:首先将内存分成固定大小的若干页

2022-06-07 21:07:56 2589

原创 操作系统内存管理学习笔记

计算机所有的设备和CPU通信都需要经过内存,内存管理的目标包括:cache是一种存储速度比内存快,容量比内存小得多的存储收器。利用cache可以解决快速CPU和慢速内存间矛盾,CPU首先从cache中读取数据,cache miss之后再从内存中读取。cache可以分为三级,前两级集成在CPU核内部,三级缓存位于主板上,由多核共享。内存正确的分配和回收从安全隔离角度考虑,禁止进程访问内核内存空间和其他进程内存空间。操作系统一般不干预CPU对内存的访问,因此这一块功能一般由硬件实现,比如基址寄存器和限长寄存器,

2022-06-05 22:45:16 237

原创 gdb的简单使用

程序带调试信息的编译程序必须以gcc -g的参数进行编译,否则无法使用gdb给程序输入运行参数相当于是argv[n]调试运行中的程序调试coredump文件调试多进程如果是运行中的进程,我们能分别获取到父、子进程的pid,通过attach到不同的pid上,可以分别对父子进程调试...

2022-06-03 09:55:19 528

原创 Linux压缩/解压命令梳理

文章目录常见的压缩格式gzip,zcat,zmore,zless,zgrepbzip2,bzcat,bzmore,bzless,bzgrepxz,xzcat,xzmore,xzless,xzgreptar常见的压缩格式以下扩展名没有实际意义,仅便于识别用了什么压缩程序*.z compress程序压缩文件*.zip zip*.gz gzip*.bz2 bzip2*.xz xz*.tar tar打包*.tar.gz tar打包并用gzip压缩*.tar.bz2 tar打包并用bzip2压缩

2022-05-29 19:00:35 277

原创 c语言字符串和数值之间的转换函数

文章目录字符串转数值数值转字符串字符串转数值#include <stdlib.h>/* 字符串转int */int atoi(const char *nptr);/* 字符串转long */long atol(const char *nptr);/* 字符串转longlong */long long atoll(const char *nptr);/* atoll的废弃名称 */long long atoq(const char *nptr);/* 字符串转浮点数 */d

2022-05-28 21:32:06 107

原创 popt简单使用

文章目录概述简单实例参数解析使用popt自带的参数/选项说明概述popt是linux下的用于进程的命令行解析接口。简单的popt使用涉及以下数据结构和函数:struct poptOptionstruct poptOption { const char * longName ; /* 选项的长名称,可以是NULL */ char shortName ; /* 选项的短名称,可以是'\0' */ int argInfo ; /* 参数类型

2022-05-28 08:41:22 2672

原创 DPDK关键技术学习笔记

文章目录cache预取技术技术1.cache提升性能原理2.硬件预取和软件预取3.DPDK中的cache预取cache一致性1.cache line对齐2.cache一致性问题的由来3.cache一致性协议4.DPDK保证cache一致性TLB和大页内存技术DDIO技术NUMA技术cache预取技术技术1.cache提升性能原理cache对于大多数程序员是透明的,cache之所以对性能有提升,主要体现在:时间局部性:程序即将使用的数据,和当前的正在使用的数据有重叠,比如for循环中会重复使用相同的

2022-05-22 17:10:29 1066

原创 DHCP知识点梳理

什么是DHCP服务器提供服务的基本要素:IP地址子网掩码DNS服务器路由器的IP地址DHCP,动态主机配置协议,用于主机获取基本要素及其他配置。DHCP最初是针对IPv4设计的,IPv6使用DHCPv6,同时IPv6自己本身支持自动获取配置,可以通过和DHCPv6结合来实现自动配置。DHCP客户端使用68端口,服务端使用67端口。DHCP组成部分地址管理:用于IP地址的动态配置配置数据交付:包括DHCP协议的消息格式和状态机三种DHCP地址分配策略自动分配:自动给DHC

2022-05-02 20:30:43 1345

原创 免费ARP和地址冲突检测

免费ARP免费ARP的定义:主机发送ARP请求自己的地址,ARP报文中的源IP地址和目的IP都是自己,以太网报文中的源MAC是自己,目的MAC是全f,广播出去免费ARP的使用场景:通常网口刚启动的时候发送。免费ARP的作用:确定是否有别人也使用了相同的IP,如果存在那么别的主机会应答这个免费ARP,同时本机会报错针对网卡替换,IP不变的场景,用于刷新其他主机的ARP表项地址冲突检测地址冲突检测ACD和免费ARP有一点点不同。ACD包括ARP探测报文和ARP通告报文。ARP探测报文:用于

2022-04-21 21:39:41 1948

原创 socket地址和字符串的转换

inet_ntoa和inet_aton仅适用IPV4地址#include <arpa/inet.h>char *inet_ntoa(struct in_addr in);//二进制转点分十进制int inet_aton(const char *str, struct in_addr *in);//点分十进制转二进制inet_ntop和inet_ptonipv4和ipv6都能用#include <arpa/inet.h>const char *inet_ntop

2022-04-06 18:56:06 569

原创 Unix域socketpair函数使用

socketpair函数用于创建两个已经连接好的Unix域的socket,仅用于Unix域通讯,这两个socket对应的sockaddr_un.sun_path是空的,可用于同一个进程或父子进程之间的通信。它和pipe管道类似,区别在于,管道是半双工的,而这两个sockfd是全双工的,即每个sockfd既可以读也可以写。简单实例如下:#include <sys/socket.h>#include <stdio.h>#include <string.h>#inclu

2022-03-27 21:42:52 190

原创 socket广播报文收发简单梳理

文章目录概述服务端代码客户端代码概述socket默认不支持发送广播报文,通过SO_BROADCAST选项的设置,开启广播发送功能。简单总结一下广播报文收发的规律:客户端socket开启SO_BROADCAST选项后才能发送广播报文,否则调用sendto会报错服务端无需开启SO_BROADCAST服务端bind单播地址时,不接受客户端的广播数据,仅接受目的地址为单播地址的报文服务端bind广播地址时,接收客户端的广播数据服务端bind通用地址INADDR_ANY时,既能够接收客户端的单播报文,

2022-03-26 20:33:19 5082

原创 使用if_nameindex获取网口索引和名称

在linux中,每个网口都有唯一的名字和正值索引,索引号从1开始(并不是0),linux提供了4个接口用于索引和名称之间的映射,定义如下:#include <net/if.h>unsigned int if_nametoindex(const char *ifname);作用:网口名称映射成网口索引返回值:成功返回索引,失败返回0char *if_indextoname(unsigned int ifindex, char *ifname);作用:网口索引映射成名称返回值:成功返回

2022-03-26 14:40:05 428

原创 Unix域编程流程简单梳理

文章目录Unix域编程作用Unix域编程流程Unix域编程的地址格式Unix编程注意事项Unix编程简单示例客户端实例服务端实例Unix域编程作用Unix域编程用于同一台主机内部的进程之间的客户端/服务端通信,使用和网络socket编程相同的API。Unix域编程既可以使用SOCK_STREAM类型的socket,也可以使用SOCK_DGRAM类型的socket,二者使用的接口稍微不同。Unix域编程的优势包括:效率高,比使用TCPsocket编程效率高一倍。可以实现在同一主机的不同进程之间传递描

2022-03-19 22:25:36 3011

原创 Socket读写函数的梳理

文章目录概述read和writereadv和writevreadn和writensend和recvsendto和recvfrom函数sendmsg和recvmsg辅助数据概述针对socket的读写,可以使用通用的文件描述符的读写函数,包括:read和writereadv和writevreadn和writen尽管可以使用上述函数对套接字描述符操作,但是建议使用功能更全的为socket设计的数据传输函数,这些函数包括:send和recvsendto和recvfromsendmsg和rec

2022-03-19 16:10:00 675 1

原创 socket选项梳理

文章目录概述getsockopt和setsockoptleve和optname说明通用套接字选项SO_BROADCASTSO_DEBUGSO_DONTROUTESO_ERRORSO_KEEPALIVESO_LINGERSO_OOBINLINESO_RECVBUF和SO_SNDBUFSO_RCVLOWAT和SO_SNDLOWATSO_RCVTIMEO和SO_SNDTIMEOSO_REUSEADDRSO_TYPEIPv4套接字选项IP_OPTIONSIP_RECVSDTADDRIP_RECVIFIP_TOSIP

2022-03-19 16:08:12 953

原创 Linux文件系统权限相关命令

Linux文件系统的目录树结构目录树的特点目录树的起始为根目录/不仅能使用本地分区的文件系统,还可以使用网络上的文件系统,例如使用Network File System(NFS)服务器挂载特定目录目录树的文件名是独一无二的Linux常见的权限相关文件/etc/passwd 账号信息/etc/shadow 个人密码/etc/group 用户组信息Linux文件权限标志说明-rw-------. 1 root root 1652 Mar 5 2021 anaco

2022-03-19 15:59:50 655

原创 三种socket超时方法

文章目录概述通过alarm定时器实现通过select实现通过SO_RCVTIMEO和SO_SNDTIMEO实现概述socket超时有三种处理办法:使用alarm定时器,设置一定的超时时间,通过产生SIGALRM中断信号实现socket的超时中断。利用select函数的超时功能,阻塞在select的调用上代替阻塞在read或write函数上使用SO_RCVTIMEO和SO_SNDTIMEO的socket选项通过alarm定时器实现alarm的超时时间不能大于connect自身的超时时间多

2022-03-17 22:29:14 5385

原创 IPv4和IPv6的互操作性

概述在IPv4到IPv6发展的过度阶段,必然出现v4和v6主机之间互操作的问题,下面从机制层面讨论互操作的可能性,并假设主机之间网络路由已经打通。IPv4客户端访问IPv6服务端IPv4客户端访问IPv6服务端指的是服务端是双栈主机,客户端是纯v4主机。假设服务端在v6地址上起了一个服务,客户端通过DNS获取服务器的A记录,通过v4地址访问服务端该端口的服务,服务端收到v4报文后,内核发现目的端口绑定本机的一个v6套接字,于是会把源v4地址转换成v4映射v6的地址(将v4地址往前补齐,变成v6地址)

2022-03-05 13:16:40 8248

原创 getaddrinfo

getaddrinfogethostbyname和gethostbyaddr这两个函数仅支持IPv4。getaddrinfo支持名字到地址以及服务到端口的转换,同时支持IPv4和IPv6。getaddrinfo使用通用套接字结构sockaddr,隐藏了具体协议的实现。getaddrinfo函数原型如下:#include <netdb.h>int getaddrinfo(const char *hostname, const char *service, co

2022-03-02 22:06:10 1791

原创 端口服务转换

文章目录/etc/services文件struct serventsetserventgetserventendserventgetservbynamegetservbyport/etc/services文件/etc/services用于记录网络服务和端口号、协议号之间的映射关系,每一行表示一种网络服务,由服务名称、端口号/协议、别名三个字段组成。文件内容如下所示:http 80/tcp www www-http # WorldWideWeb HTTPh

2022-02-28 21:57:46 539

原创 名字与地址转换

文章目录概述gethostbynamegethostbyname流程/etc/nsswitch.conf先files后dns验证先dns后files验证gethostname实例gethostbyaddrgethostbyaddr实例概述我们通常使用主机名而不是数值地址来访问主机,主机名可以是简单的名字,也可以是全限定域名。unix提供了gethostbyname实现主机名到地址之间的转换,gethostbyaddr实现地址到主机名之间的转换。gethostbyname实现主机名到地址之间的转换,仅

2022-02-27 22:20:43 495

原创 hosts文件及其数据结构

hosts文件hosts文件记录了主机名/域名,IP地址和别名之间的映射关系:#IP地址 主机名/域名 别名1.1.1.1 testhostname testhostalias1 testhostalias22.2.2.2 testhostname testhostalias3 testhostalias43.3.3.3 www.baidu.com testhostalias5 testhostalias6一个主机名可以对应多个IP地址,不同IP地址要另起一行一个主机名可以对

2022-02-27 16:44:53 1554

原创 dpdk bond口学习笔记

概述DPDK支持网卡的bond,通过调用rte_eth_bond_create创建bond口,bond口id和常规dpdk口id不会重复。bond口和普通dpdk口通过统一的API实现网卡的初始化、报文的收发等操作。bond口创建的一般流程:创建slave口slave口配置网卡队列、网口启动创建bond口bond口添加slave口bond口配置网卡队列、网口启动通过bond口id进行收发包rte_eth_bond_create调用rte_eth_bond_create创建bond网口

2022-02-26 16:27:56 3877

原创 DPDK定时器学习笔记

定时器的启动流程调用rte_timer_subsystem_init初始化定时器子系统调用rte_timer_init初始化定时器结构体调用rte_timer_reset设定定时器的类型、周期、回调函数等调用rte_timer_manage检查已经超时的定时器,并触发相应的回调函数调用rte_timer_stop定时定时器rte_timerrte_timer是dpdk中定时器结构体,用于描述一个定时器。struct rte_timer{ uint64_t expire;

2022-02-26 07:11:51 1721

空空如也

空空如也

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

TA关注的人

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