0%

起因

好久没更新了,开更,也算是考完试了,终于有时间更新博客了,软考考砸了捏,呜呜呜。

git子模块

这个什么是意思呢?就是字面意思,首先,我们当前的git仓库是一个主模块,但是,我不可能一个主模块可以实现所有功能的啊,这个时候就像项目需要调用其他模块和代码一样。主模块有时候也需要子模块,然后调用子模块才能正常工作。

1
2
3
4
5
6
7
8
9
10
git submodule init
git submodule add url
#初始化或者添加子模块

git submodule update
git submodule foreach 'git pull origin master'
#更新子模块

git submodule deinit name
#删除子模块,注意力,如果使用git bash的话,还得修改.git中的一些东西。删除子模块,这个只是开始,然后还得删除.git中的module中的模块,删除外面的模块文件夹,修改.git/config中关于子模块的地址和状态,删除外面gitmodule中子模块的地址,然后才算是删完,此时提交是ok的,不会冲突,也不需要git pull
子模块提交和推送

下载子模块很简单,切换子模块就是进入子模块目录就ok了。注意了,如果修改了子模块想要推送的话。就得进入子模块中,才能进行提交和推送,此时,你得有管理员权限或者提交权限才可以哦,不然是无法更新子模块的,你在主模块中的提交是不包括子模块的。

git子模块的致命问题

首先呢,.git文件是不允许随意修改的,这个在提交的时候很多东西不会提交,只会上传那些操作和提交记录等,本地就有很多脚本和hook。但是还有一个gitmodule的文件,这里包含了子模块的名称和url。因为主模块不知道子模块要些什么东西,所以给了比较大的权限。所以,如果下载到有病毒的子模块,那么就可以在下载子模块去修改主模块的钩子和脚本,等某个操作执行完毕就触发hook,去执行恶意代码。

不过现在好像修复了,不过有些版本还是会有这个问题的。

github二级密码

现在登录github界面就可以看到要二级密码登录了。也就是2FA了,我感觉国内的gitee可能也要上这个,因为喜欢抄嘛。现在,我感觉是在观望github的二级密码怎么样。

[Git] 一次搞定:Github 2FA(Two-Factor Authentication/两因素认证) - 千千寰宇 - 博客园 (cnblogs.com)

可以根据如上操作,进行绑定,至于软件,随便找一个2FA的软件就ok了。

管理员删库保护

这个就很简答了,在仓库设置中添加删除保护就好了。

管理员fork删库保护

这个问题,我也是第一次遇到,就是我在公司进入gitee的企业版嘛,我fork了一个项目,我却发现不能删除了,这个让我非常吃惊!我删除这个fork的库,竟然也要管理员同意,看来是对库进行额外的保护。

总结

git确实厉害,已经离不开了,我想起来之前那个linux开源社区的大问题,有一个黑客Jia Tan,通过一个解压软件就实现了,入侵,它修改了脚本,让脚本在运行的时候,故意中断,这样就可以进入其他地方去工作了,因为脚本不想代码可以编译找出bug的,所以非常难以发现。所以,这些个开源软件,我只能说一定每一个后面都有后门,希望,这些bug早日修复,希望有更多人注意开源安全和网络安全。

网络结构
网络通信过程
VPN
ISO的分别作用
中继器 网络 集线器 路由器
信号寿命
总结

PCIe

PCI-E总线是一种通用的总线规格,它由Intel所提倡和推广,其最终的设计目的是为了取代现有 电脑系统 内部的总线 传输接口 ,这不只包括 显示接口 ,还囊括了 CPU 、PCI、HDD、Network等多种应用接口。

PCIe特点

首先就是差分信号,其次就是全双工,有点422的味道了,还有就是支持热插拔,对了pci也是支持热插拔的,高速,多个设备等。

即允许在同一时刻,同时进行发送和接收数据。如下图所示,设备A和设备B之间通过双向的Link相连接,每个Link支持1到32个通道(Lane)PCIe使用的是8b/10b的编码。

为了实现直流均衡。在高速串行通信中,8B/10B编码是一种经常用到的编码方式。而高速串行总线中,通常采用交流耦合方式,即在发送端(TX)串接电容,根据电容“隔直流,通交流”的特性,或者理想电容的阻抗公式:
电容阻抗公式

信号频率越高,电容阻抗越低。当数据位流中出现多个连续的1或0时,可以认为该时间段信号是直流的,电容的损耗变大,导致信号的幅度降低,直流信号被滤除,到最后无法识别是1还是0。而且接收端收到连续的1或0时,没有充分的定时信息,对接收端的解码带来了困难。其原理如下图所示:

8B/10B编码以字节为单位,将数据映射成10位宽度的数据(具体映射方式可查表),使得编码后的二进制数据流中1和0的数量基本保持一致,同时确保字节同步易于实现。

8B/10B编码基本原理_8b10b编码原理-CSDN博客

PCIe协议是一种端对端的互连协议,一个典型的PCIe系统框图如下:

与PCIe拓扑结构相关的其他术语如下:

  • 根复合体(Root Complex)
  • PCIe终端设备(PCIe Endpoint)
  • PCIe桥接器(PCIe bridge)

Root Complex我们简称为根复合体。根复合体将CPU和内存子系统(Memory)连接到由一个或多个PCIe或PCI设备组成的PCI Express交换结构。它是PCI反向树拓扑结构的“根”,代表CPU与其他设备进行通信。

PCIe endpoint就是PCIe的终端设备/PCIe终结点。PCIe终端设备可以直接与根设备进行连接,也可以通过Swith交换设备与根设备连接(交换设备类似于接口扩展功能)。

根据PCIe规范,在PCIe拓扑中可以有256个总线,每个总线上有32个设备,每个设备有8个功能。一个终节点最多可以支持8个功能,每个功能都有自己独立的配置空间。

例如:基于PCIe的非易失性内存(NVM)和基于PCIe的固态硬盘(SSD)是计算机系统中的两种终节点设备。

PCIe桥接器:桥接器可以将PCI设备的请求转换为PCIe x1规范的请求,并连接到计算机PCIe插槽上。工作流程如下:

主设备发送带有必要参数的请求到PCIe桥接器。

PCIe桥接器接收请求并进行协议转换,将PCI请求转换为适合PCIe接口的形式。

转换后的请求在PCIe接口上发起点对点传输。

请求在接口通道上进行传输,通过PCIe总线连接到目标设备。

通过这种方式,PCI设备能够利用PCIe插槽和接口连接到计算机系统,实现数据和控制的交换。

PCIe层级

PCIe体系结构包括应用层、事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。

PCIe接口版本

PCIe-x只是一个接口协议,如果大家都老老实实就好了,但是,这个接口而已嘛,想要干嘛就可以干嘛,只要两边对上引脚和协议就ok了。

PCIe协议版本

PCIE1.0/PCIE2.0/PCIE3.0/PCIE4.0/PCIE5.0

  • PCIe的向下兼容性体现在以下几个方面:PCIe具有向下兼容的特性,这意味着较新版本的PCIe插槽和设备可以与较旧版本的PCIe插槽和设备进行互操作。这种兼容性确保了新设备可以与旧设备一起使用,从而减少了升级和更换设备时的不便。

  • 插槽兼容性:较新版本的PCIe插槽通常可以容纳较旧版本的PCIe卡。例如,一个PCIe x16插槽通常可以容纳任何较小的PCIe卡,如PCIe x8、PCIe x4或PCIe x1。这意味着您可以将较旧的PCIe卡插入较新的插槽中,以实现互操作性。

  • 带宽适配:如果您将一个使用较少通道的PCIe卡插入一个具有更多通道的PCIe插槽中,系统会自动适配带宽。例如,将一个PCIe x1卡插入PCIe x16插槽中,系统会将该卡的带宽限制为PCIe x1的速度。这确保了卡与插槽之间的通信不会出现不匹配问题。

  • 协议兼容性:即使新版本的PCIe协议引入了一些新功能和特性,但它们通常会保持与旧版本的兼容性。这意味着使用旧版本PCIe设备的系统不会因为新版本PCIe插槽而出现兼容性问题。

  • 供电兼容性:PCIe插槽还需要向下兼容供电。较新的PCIe插槽可以为较旧版本的PCIe卡提供适当的电源。这确保了即使插槽能够提供更高的电源能力,也不会损坏较旧的卡。

  • PCIe的向下兼容性使得用户能够在升级或更换设备时更加灵活,无需担心新设备是否与旧设备兼容。这种特性有助于维持系统的稳定性和灵活性,同时节省了升级成本。

PCIe用途

显卡、固态硬盘(PCIe接口形式)、无线网卡、有线网卡、声卡、视频采集卡、PCIe转接M.2接口、PCIe转接USB接口、PCIe转接Tpye-C接口

PCIe自定义引脚和协议

因为,我们看到PCIe是有物理层的,所以,我们其实就可以单独使用物理层一个就可以了,什么意思就是,插口卡口是固定的,但是接的线是可以改动的,我不一定要按照它的协议进行设计,我也可以用我自己的接口引脚协议,只要两个设备统一引脚和接线协议就好了。

总结

PCIe是一个高级的协议和接口,它在iso层级中有4层使用方法,所以,它不但是硬件协议,还是软件协议,自然是只有高端的嵌入式设备或者高性能设备才有使用到的资格,但是,只是使用硬件协议,就是那些接口的话,啥地方都能用的。

起因

因为,我同事它对git不熟,所以,特意来找我来帮帮他解决问题,所以,我就去了,他要下载一个仓库代码,但是仓库的默认主分支不是他想要的,他想要的是一个xxxx&yyyy&zzzz的分支,所以,我然后直接

1
2
git branch -a
git checkout xxxx&yyyy&zzzz

问题来了,我确实看到了remote的 xxxx&yyyy&zzzz分支,但是,无法执行,它告诉我指令不存在。所以,一时间有点懵逼,我还特意使用

1
git clone -b xxxx&yyyy&zzzz https://.....

去下载特定分支,发现也失败了。我都懵了的时候,我尝试切换其他分支,成了,我就知道,是命令行输了呢。呜呜呜,竟然让GUI赢了一把。大家应该发现了问题了吧!没错就是&。

github管理 | 我要成为嵌入式高手(csmznbo.top)这是我上一期关于git的入门操作哦,有兴趣的可以看一下。

& | && ||

&:一旦shell指令识别到&就会把后面那些当成指令看待,所以,可以做一个测试,新建一个 ls&cat README.md 的文件夹。对这个文件夹执行ls,就会发现,它执行了cat操作了,注意力此时cat是占据当前进程的,所以,如果后面没有+文件的话,你的中断就会堵塞卡死。注意了,如果一个子线程,直接使用system没有+&,那么这个子线程就会堵死,但是不会影响其他线程哈哈哈。你懂我什么意思的,这确实是一个搞人的手段,尤其可以选择在md后面也加一个&。这样就是两个后台工作了。偷偷摸摸后台搞事情哦。

|:管道,就是前面数据给后面,注意力,文件夹和问价不能用|来命名,所以管道操作实现不了哦

&&:命令行的与操作,经典断路

||:命令行或操作,经典短路

解决&的方法就是+ “”双引号框起来就好了。

git仓库版本问题

我们可以把git粗略分为用户和系统两个部分,那些文件,代码,数据都是用户添加,属于用户层面,可以随意修改。但是.git文件夹里面就不行了,里面保存所有历史记录和操作,不能随意修改,如果只是本地无所谓的,但是要和云端同步的话,就麻烦了。

如果本地仓库没有远程仓库的所有历史记录,那么push就是失败,就是说提交的版本一定要大于而包含远程版本才能提交。所以,别人抢先push了,你记得得git pull之后才能提交,就是包含别人的版本。

如果要想修改提交的云端历史记录就没办法了。因为你修改之后,你是想要进行git pull之后才可以push的,此时就会强行修正过来,导致对历史提交修改全部被纠正。因为此时两个版本对不上,提交是错误的。

真的有不得不修改的数据,那就只能强行推送覆盖云端,但是这样会把别人的记录也可能覆盖了,这是一件非常不提倡的事情。而且非常危险。

git 版本和 git tag

这个git 版本就是一个时刻的仓库的切片,一些重要的版本级别的仓库,这些是可以选择进行版本设置,这样就快速保存可用的版本,也方便回溯,分别下载,方便使用等诸多好处。

tag就是标签,这个版本有啥,这个版本怎么样,都是可以打上标签的。

pr的评论和保护分支机制

我们可以在设置添加对分支的保护,添加管理员也不能违反,这样就可以杜绝直接本地就提交覆盖分支,而是只能通过pr来实现合并,在添加,评审人评论和同意才能合并方案,就可以有效防止恶意分支合并和覆盖。

git查看提交代码量和次数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#提交代码量
git log --author="csm@gmail.com" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
#added lines: 7572, removed lines: 675, total lines: 6897

#定期代码量检测
git log --author="csm@gmail.com" --since==2024-03-01 --until=2024-04-01 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
#added lines: 2456, removed lines: 609, total lines: 1847
#从2024-03-01到2024-04-01 作者csm@gmail.com的提交量,后面是awk语法

#提交具体详情
git log --author="csm@gmail.com" --pretty=format:"%H|%an|%ae|%s" | while read line; do
echo "$line"
done
# 对每一行做相应处理,例如提取commit hash、作者名、邮箱和提交信息
# %H 表示commit hash, %an 表示作者名, %ae 表示作者电子邮件,%s 表示提交消息摘要。

#提交次数
git log --author=csm@gmail.com --since="2024-03-01" --no-merges | grep -e 'commit [a-zA-Z0-9]*' | wc -l
#21
git冲突

总有些家伙啊,意见不合,就导致了冲突,常见了的文件缺失,内存冲突,版本问题带来的冲突,此时就要进行合并才行。这些都是需要手动解决的,此时就去到冲突的文件中手动删除冲突部分,它会贴心的告诉用<<<<<<和>>>>>>来告诉那些是当前的分支,那些是要合并的分支。跟冲突的人协商之后,进行选择性的删除和添加就解决冲突了,保存提交推送就好了。

总结

git是一个好东西呢,确实分布式系统,一开始上手都是有点懵逼的,充分理解git的工作原理和运行逻辑,处理方法,真的香啊,linus是真的伟人,真的牛人,linux系统+git系统,真的是令人敬佩。

起因

今天刷到一个视频。我们学习linux的时候就学到了一句话”一切皆是文件“,仔细看了一下他的看法和视频。确实很严谨。”一切皆是文件“是源于unix的,linux继承下来了,但是,不能这样理解。linus曾经解释过,一切皆字节流。我们实际使用一般都是使用api,所以,在api层面就该理解为,一切皆是文件描述符。

文件描述符
文件类型
字符设备
块设备
网络设备
总线设备

别好奇,搞驱动不只是字符,块,网络。还有平台和总线设备驱动。比如usb,spi,iic。这些你说他们是什么设备?都不一定的。这个是开用途的,usb可以网口啊,usb可以u盘啊,usb可以键盘鼠标啊!所以,这些平台设备和总线设备是另一种驱动,这些是给上面三种驱动一个总线驱动和驱动方法,这些一般都是厂商写好的,usb只能通过调用linux内核中的api来实现usb驱动的编写,因为,高度封装了,想得到usb配置符,只能靠内核哦!

总结

起因

我当时学这个文件io的时候,也是懵懵懂懂的,就知道,open read write close lseek fflush那些,其实也没明白是怎么回事。

数据流是指在计算机系统中,程序与文件之间进行数据交换的过程。当你在程序中执行文件操作,如读取、写入、修改等,这些操作都涉及到数据在程序和文件之间的传输,这个过程就是文件IO的数据流。

文件管理系统

自从学习了flash,我之前就好奇了,flash是可以作为一个管理空间,但是,对于一个文件来说,如果把数据存储在flash中,那么,如何进行精确的修改呢?这个flash肯定是要先刷新才能使用的啊,为什么好像使用这些文件io的时候,可以那么顺利呢?其实,如果是追加的话,其实还是可以理解的,就是通过系统去链接起来,调用系统的文件io就可以实现文件完整使用和读取,所以,哪怕文件不是连续地址,也可以实现文件追加。读就更容易了,写呢?如果在原有基础上写呢?所以,我就像这种情况肯定是要刷新flash的区块来实现的。恰好,我想起来了数据流的概念。

数据流

使用文件io的时候,就会到打开这个文件,同时把所有数据通过数据流的形式导出来,我们对着这个数据流进行修改。这个数据流,可以认为就是系统把这一段空间都读取出来了,我们对着这个字符串进行操作而已。

在Flash存储中,当你需要修改一个文件时,操作系统和文件系统会采取一些策略来确保不会影响到其他文件:

  1. 写入时复制(Copy-on-Write):在修改文件之前,系统会先将原始文件复制到另一个块,然后在新块上进行修改。这样,原始文件保持不变,新的修改内容存储在另一个块上。这种方法可以避免在修改过程中影响到其他文件。
  2. 垃圾回收(Garbage Collection):随着文件的修改和删除,Flash存储上可能会产生一些不再使用的空间。这些空间被称为垃圾。垃圾回收机制会定期运行,将这些垃圾空间整理并合并,以便于未来的文件存储和修改。
  3. 磨损平衡(Wear Leveling):Flash存储具有有限的写入次数,频繁写入同一块区域会导致磨损加速。为了避免这个问题,Flash存储控制器会实现磨损平衡策略,将写入操作分散到不同的块,以延长Flash存储的使用寿命。
  4. 日志结构(Log-Structured)文件系统:一些文件系统(如F2FS、Btrfs等)采用日志结构设计,将文件的元数据和实际数据分开存储。这种设计有助于减少对Flash存储的磨损,并提高文件系统的性能。

所以,我们不用担心回写导致flash错误的问题,这些都是通过文件管理系统区处理。

总结

数据流是一个非常迷糊的概念,只有使用open才会打开,使用close和fflush才会刷新保存,所以,如果在close和fflush之前电脑停电、蓝屏、死掉了等。哦吼,数据流就随着RAM一起没啦!此时就没了通过文件管理系统回写这个操作了。这个时候追悔莫及了,一无所有啦。