当前位置: 首页 > news >正文

ARM uboot 的移植2-从三星官方 uboot 开始移植

一、inand 驱动问题的解决

在这里插入图片描述

1、先从现象出发定位问题

(1) 解决问题的第一步,是定位问题。所谓定位问题,就是找到源代码当中导致这个问题的那一句或者那几句代码。有时候解决这个问题需要修改的代码和直接导致这个问题的代码是不同的。我们这里说的定位问题指的是,定位到出问题的代码处,也就是运行了这一句代码时发生了这个错误。

(2) 定位了问题之后,实际修改程序解决问题不一定改的是这一句代码。但是肯定和这一句代码有关联,我们要通过自己分析来找到这种关联,从而从定位的错误点找到真正需要修改的点,然后去修改他。

(3) 实战方法:从打印出来的错误信息中挑选一个关键词,然后去源代码中搜索这个关键字,通过这种搜索的方法定位问题。通过搜索将问题定位在 drivers/mmc/mmc.c 的 818 行。

(4) 然后就是解决问题了。

在这里插入图片描述


2、网络搜索解决方案

(1) 初步的解决方案是自己先浏览一遍这个问题点周边代码的上下文。通过浏览代码上下文,发现这个函数是在读取 SD/iNand 的 ext_csd 寄存器的值。通过浏览代码,结合出错地方,可以判断出:从卡端读取 ext_csd 寄存器是成功的,并且从读取结果中拿到了卡的版本号信息。然后代码对版本号进行了判断,并且如果版本号大于 5 就会报错,并且函数错误退出。这就是问题所在。

(2) 问题就是:我们使用的 iNand 卡的版本号大于 5,而 uboot 代码本身不处理版本号大于 5 的卡,因此出错了。

(3) 怎么解决?第一可能,换卡;第二可能,软件修复。

(4)网络搜索错误关键字,然后逐个去查阅,看看哪个可以给我们提供解决问题的思路和方法。http://blog.csdn.net/wang_shuai_ww/article/details/22308853


3、尝试修改代码解决问题

(1) 解决方法就是修改 uboot 中的代码,把判断的 5 改成更大的数字。譬如 8,然后跳过这个错误。

在这里插入图片描述
现象:
在这里插入图片描述


4、推测和实验验证(SD卡和iNand的区别)

(1) 当前板子上有一个 iNand 接在 SD0 上,有一个外置 SD 卡接在 SD2 上。那 uboot 中初始化的这个是 iNand 而不是 SD 卡。也就是说,uboot 中实际用的是 SD0, 而不是SD2.

在这里插入图片描述

在这里插入图片描述

现象:

在这里插入图片描述


完整的现象截图:

在这里插入图片描述
在这里插入图片描述


(2) 大家可以尝试,使用外置 SD 卡时,这个版本号的问题不会出现。从这里可以推测出,SD 卡和 iNand 的区别,至少从一个角度可以看出:SD 卡版本低,iNand 的版本比较高。


二、一些小问题的修补

1、控制台串口更换为串口 0

(1) uboot 中默认使用串口 2 来做控制台输入输出的。

(2) SOC 中一共有 4 个串口(串口 0、1、2、3),开发板 X210 上用 DB9 接口引出了 2 个串口,分别是串口 2 和串口 0.(靠边的是串口 2,靠里那个是串口 0)。

(3) 三星公司推荐使用串口 2 来作为调试串口,所以在三星移植的 uboot 和内核版本中都是以串口 2 默认为控制台串口的。

(4) 有时候项目需要将调试串口修改为另外的串口(譬如串口 0),这时候需要修改 uboot 的代码,做移植让 uboot 工作在串口 0 的控制台下。

(5) uboot 中真正去硬件初始化串口控制器的代码在 lowlevel_init.S 中的 uart_asm_init 中,其中初始化串口的寄存器用 ELFIN_UART_CONSOLE_BASE 宏作为串口 n 的寄存器的基地址,结合偏移量对寄存器进行寻址初始化。所以 uart_asm_init 中到底初始化的是串口几(从 0 到 3)?取决于 ELFIN_UART_CONSOLE_BASE 宏。这个宏的值又由 CONFIG_SERIALn(n 是从 1 到 4)来决定。

在这里插入图片描述

在这里插入图片描述


(6) 同步代码、编译烧录运行,发现串口线插在串口 2 上,控制台上只打印:SD checksum error.(这个是内部 iROM 打印出来的,内部 iNand 校验失败的信息);然后将串口线改插到串口 0 上,启动,所有的信息出现。实验成功。

在这里插入图片描述


2、修改默认网络地址设置

(1) 修改配置头文件 smdkv210single.h 中的 CONFIG_IPADDR 等宏,则可以修改 uboot 的默认环境变量。

在这里插入图片描述

修改后:

在这里插入图片描述

在这里插入图片描述


(2) 更改完成后,如果环境变量还是原来的,正常。因为原来 uboot 执行过 saveenv,因此环境变量已经被保存到 iNand 中的 ENV 分区中去了。uboot 启动后校验时 iNand 的 ENV 分区中的环境变量是正确的,因此会优先加载。我们在 uboot 源代码中修改的只是默认的环境变量。

在这里插入图片描述

解决方案是擦除掉 iNand 中的那一份环境变量,然后迫使 uboot 启动时,使用 uboot 代码中自带的默认的这一份环境变量,就可以看到了。

(3) 可以使用 mmc write 0 30000000 11# 32(表示将 DDR 的 0x30000000 开头的一段内存中的内容,写入 iNand 中的第 17 个扇区开始的 32 个扇区内,写入长度是 32 个扇区长度(16KB))

在这里插入图片描述


3、修改行提示符

(1)
在这里插入图片描述

在这里插入图片描述


三、网卡驱动移植1

1、网卡芯片与开发板的连接方式

(1) SoC 的 SROM bank, 和网卡芯片的 CS 引脚( SROM 就是 SRAM/ROM)。

SoC 的 SROMController, 其实就是 SoC 提供的 对外总线式连接 SRAM/ROM 的接口。如果 SoC 要外部外接一些 SRAM/ROM 类的存储芯片(或者伪装成 SROM 接口的芯片,譬如网卡芯片),就要通过 SROM Controller 来连接。网卡接在 SROM 中的好处就是,网卡芯片好像一个存储芯片一样,被扩展在 SoC 的一个地址空间中,主机 SoC 可以直接用一个地址来访问网卡芯片的内部寄存器。

在这里插入图片描述


(2) 网卡芯片内部寄存器使用相对地址访问。网卡芯片内部很多寄存器有一个地址,这个地址是从 00 开始的,但是实际上,我们 SoC 不能用 0 地址去访问这个网卡的芯片内部寄存器。SoC 访问网卡芯片 00 寄存器时的地址,应该是:起始地址+ 00。 这里的起始地址就是网卡芯片对应接在 SROM bankn 中的 bankn 对应的基地址。

在这里插入图片描述

《DM9000AEP.pdf》


(3) 主机 SoC 上网,其实就是通过操控网卡芯片内部的寄存器、缓冲区等资源来上网的。也就是说,其实 SoC 是通过网卡芯片来间接上网的。

(4) 总结:网卡芯片实际上也是一种总线式连接方式。优势是 SoC 内部不需要内置网卡控制器,所有的 SFR 全都在外部网卡芯片中,而且还可以通过地址直接访问(IO与内存统一编址),不用像 Nand/SD 接口一样使用时序来访问。


2、原理图浏览

在这里插入图片描述

《x210bv3s.pdf》


(1) 210 的 SROM 控制器允许 8/16bit 的接口,我们实际使用的是 16 位接口。
在这里插入图片描述


(2) 网线有 8 根线,但是实际只有 4 根有效通信线,另外 4 根都是 GND,用来抗干扰的。4 根通信线中负责发送的有 2 根(Tx- 和 Tx+),负责接收的有 2 根(Rx+ 和 Rx-)。因为网线上传输的是差分信号。

在这里插入图片描述


(3) 网卡芯片有个 CS 引脚,(CS 就是 chip select,片选信号,主机向 CS 发送有效信号,则从机芯片工作;主机向 CS 发送无效信号,则从机芯片不工作。),这个引脚要接主机 SoC 的片选信号引脚,主机 S5PV210 的每一个 SROM bank 中有一个片选信号CSn (n=0-5),从原理图可以看出,我们 X210 上将 DM9000 的 CS 引脚接到了 CSn1上,对应 SROM bank1(推断出 DM9000 的总线地址基地址是 0x88000000)。

在这里插入图片描述


(4) DM9000 的 CMD 引脚,接到了 S5PV210 的 ADDR2 引脚上。DM9000 为了减少芯片引脚数,数据线和地址线是复用的(DATA0 到 DATA15,这 16 根线是有时候做数据线传输数据,有时候做地址线传输地址的。什么时候做什么用,就由 CMD 引脚决定。)通过查询数据手册知道:当 CMD 为高电平时,对应传输是DATA,当 CMD 为低电平时,对应传输为 INDEX(offset,寄存器地址)
在这里插入图片描述


在这里插入图片描述


注明:这些引脚上的电平变化都是控制器自动的,不需要程序员手工干预。程序员所需要做的,就是在配置寄存器值时充分考虑到硬件电路的接法,然后给相应寄存器配置正确的数值即可。


四、网卡驱动移植2

1、网卡驱动文件介绍

(1) uboot 中本来就提供了很多网卡芯片的驱动程序,在 uboot/drivers/net/dm9000x.c 和dm9000x.h。

这个驱动来自于 linux kernel 源代码。所以我们 uboot 中是移植而不是编写。
在这里插入图片描述


(2) 要想彻底看懂这个驱动,必须对 linux 的驱动模型中网络设备驱动有一定的理解才可以。因为我们还没学驱动,因此这个源代码就不用看了。

(3) 这个驱动是 linux 内核中做好的,根本不用动,可以在 uboot 中直接使用的。而且因为 linux 驱动设计的很合理(数据和代码是分开的,这里驱动主要是代码,数据是由硬件开发板中的接法决定的,数据由一定的数据结构来提供。),所以驱动本身具有可移植性。这个就决定了我们移植 DM9000 驱动时,这个驱动文件 dm9000x.c 和 dm9000x.h 不用动,要动的是数据。


2、网卡移植的关键:初始化

(1) uboot 在第二阶段 init_sequences 中进行了一系列的初始化,其中就有网卡芯片的初始化。这个初始化就是关键,在这里的初始化中,只要将网卡芯片正确的初始化了,则网卡芯片就能工作(意思是网卡驱动 dm9000x.c 和 dm9000x.h 依赖于这里的初始化而工作)。

在这里插入图片描述


(2) 网卡初始化代码地方在:

start_armbootinit_sequenceboard_initdm9000_pre_init		这个函数就是移植的关键

(3) dm9000_pre_init 函数主要功能就是初始化 DM9000 网卡。这个初始化过程和我们开发板上 DM9000 网卡芯片的硬件连接方式有关。必须要结合开发板原理图来分析,然后决定这个函数怎么编程。

(4) 原来的代码是三星的工程师根据三星的开发板 SMDKV210 的硬件接法来写的程序,我们要根据自己的开发板的硬件接法去修改这个程序,让网卡在我们的开发板上能工作。

(5) #define DM9000_16BIT_DATA 这个宏用来表示 DM9000 工作在 16 位总线模式下。根据上节课的硬件原理图的分析,可以看到我们开发板上 DM9000 确实工作在 16 位模式下。

在这里插入图片描述

在这里插入图片描述


(6) 从三星版本的代码中可以看出,它操作的是 bit20-bit23 ,对照数据手册中寄存器定义,可以看出三星的开发板 DM9000 是接在 Bank5 上的。而我们接在 bank1 上的,因此我们需要操作的 bit 位是 bit4-bit7。

在这里插入图片描述

在这里插入图片描述


(7) 总结:三个寄存器的修改。主要是三星的开发板DM9000接在bank5,我们接在了bank1上,因此要做一些修改。

在这里插入图片描述


3、基地址的配置等

(1) 之前说过,驱动分为2部分:代码和数据。代码不用动,数据要修改。

在这里插入图片描述


(2) CONFIG_DM9000_BASE 是 DM9000 网卡通过 SROM bank 映射到 SoC 中地址空间中的地址。这个地址的值,取决于硬件接到了哪个 bank,这个 bank 的基地址是 SoC 自己定义好的。譬如我们这里接到了 bank1 上,bank1 的基地址是 0x88000000.

在这里插入图片描述


(3) DM9000_IO 表示访问芯片 IO 的基地址,直接就是 CONFIG_DM9000_BASE;DM9000_DATA 表示我们访问数据时的基地址,因为 DM9000 芯片的 CMD 引脚接到了 ADDR2,因此这里要 +4(0b100,对应 ADDR2)。

在这里插入图片描述


在这里插入图片描述

开发板实践,ping 命令成功:

在这里插入图片描述


实际上,只要我们的 CONFIG_DM9000_BASE 和 DM9000_DATA 在 SROMC Bank1 的地址范围内,而且区分好 CPU 地址总线的 ADDR2 (第二根地址线)的为 0 和为 1 的两种情况,都是能够正常使用网络通信的。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

想了解更详细的 DM9000 的信息,可以浏览:链接地址


五、网卡驱动如何工作

1、网卡移植代码实践

(1) 经过实践,网卡驱动移植成功。

(2) 其实还可以做一些实验。譬如说,对网卡驱动初始化部分寄存器的设置,还有网卡 CONFIG_DM9000_BASE 也可以配成 0x88000000 再去试一试。


2、linux 系统中网卡驱动的典型工作方式简介

(1) 在 linux 系统中,网卡算是一个设备,这个设备驱动工作后,会生成一个设备名叫ethn(n 是0、1、2、····)(无线网卡名字一般叫 wlan0、wlan1····)。然后 linux 系统用一些专用命令来操作网卡,譬如 ifconfig 命令。

(2) linux 下的应用程序如何使用网卡驱动来进行网络通信?最通用的方法就是 socket 接口。linux 系统中有一系列的 API 和库函数,提供了一个 socket 编程接口,linux 下的应用程序都是通过 socket 来实现上网的,socket 内部就是间接调用的网卡驱动实现网络通信的。

(3) linux 设计是非常完备的,应用层和驱动层是严格分离的。也就是说,写网络编程应用层的人根本不用管驱动,只要会用 socket 接口即可;写底层驱动的人根本不用管应用层,只要面向 linux 的网络驱动框架模型即可。


3、uboot 中网卡驱动的工作方式简介

(1) 一定要记住:uboot 本身是一个裸机程序,是一个整体,没有分层。所以 uboot 中根本没有驱动和应用的概念。

(2) 按照逻辑来说,ping 这样的命令实现的代码,就是网络应用的应用程序,像dm9000x.c 和 dm9000x.h 这样的代码属于驱动程序。

所以在 uboot 中这些东西是揉在一起的,应用是直接调用驱动实现的。也就是说,ping 命令内部是直接调用了 dm9000 的网卡驱动中的函数来实现自己的。


4、以 ping 命令为例,查找代码验证分析

(1) ping 命令是 uboot 的众多命令之一,ping 命令实现的函数叫 do_ping。

(2) 函数的调用关系:

do_pingNetLoopPingStartPingSendArpRequesteth_send(dm9000x.c中)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


(3) 验证了 《3、uboot 中网卡驱动的工作方式简介》 中说的,uboot 中应用程序(ping)调用驱动程序(dm9000x.c)的方式。这就是一种直接调用的方式。


六、使用自己移植的 uboot 启动内核

1、问题:当前我们移植的 uboot 不能启动内核

(1) 用同样的方法(使用 tftp 0x30008000 zImage-qt; 然后 bootm 0x30008000),分别使用我们自己移植的 uboot, 和使用九鼎移植版本的 uboot, 去启动内核,发现九鼎移植版本的可以启动,但是我们自己移植的不可以启动。到此我们就断定,我们的 uboot 有问题,不能启动内核。

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


(2) 做基本检查:首先怀疑是机器码不对。经过和九鼎移植版本的 uboot 对比发现,machid 都是 2456,说明机器码没错。

在这里插入图片描述


(3) 想到一个问题,我们之前做实验时,将串口改为了串口 0,而内核 zImage-qt 的串口输出在串口 2.怀疑可能的问题是,uboot 使用了串口 0, 而内核使用了串口 2,所以在 uboot 后看不到内核的启动信息。


2、解决第一步:将串口改回串口2

(1) 在 smdkv210single.h 中修改串口编号即可。

在这里插入图片描述


3、根据现象分析,定位问题并试图解决

(1) 如果已经启动了内核,那没什么好说的了。应该是可以直接启动了。

在这里插入图片描述


(2) 如何内核没有启动,是 smdkv210single.h 中没有定义 bootm 传参需要的那几个宏造成的。

在这里插入图片描述


源自朱友鹏老师.

相关文章:

ARM uboot 的移植2-从三星官方 uboot 开始移植

一、inand 驱动问题的解决 1、先从现象出发定位问题 (1) 解决问题的第一步,是定位问题。所谓定位问题,就是找到源代码当中导致这个问题的那一句或者那几句代码。有时候解决这个问题需要修改的代码和直接导致这个问题的代码是不同的。我们这里说的定位问…...

js作用域和作用域链

1、局部作用域分为函数作用域和块作用域 1.1、函数作用域: 在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。 总结 1.函数内部声明的变量,在函数外部无法被访问 2.函数的参数也是函数内部的局部变量 3.不同函数内部声明的变量无法互相访…...

C语言字符串

目录 一、字符串的引入和注意事项 1.1 字符串定义的几种方式: 1.2 定义字符串的方法一和方法二的区别: 1.3 字符串输出的几种方式: 1.3.1 循环下标法遍历输出字符串: 1.3.2 转义字符%s输出字符串: 1.3.3 使用puts函…...

Eureka注册中心快速入门

一、提供者与消费者**服务提供者:**一次业务中,被其他微服务调用的服务。(提供接口给其他微服务)**服务消费者:**一次业务中,调用其他微服务的服务。(调用其它微服务提供的接口)比如…...

xmu 离散数学 卢杨班作业详解【1-3章】

文章目录第一章 命题逻辑常用latex数学公式1.4.5679101113171923242627第二章 一阶逻辑1.2.3.6.9.10.12.13.一阶逻辑推理理论12.13.15.第三章 集合2478101213.第一章 命题逻辑 常用latex数学公式 符号代码∨\vee∨$\vee$∧\wedge∧$\wedge$→\rightarrow→$\rightarrow$⇒\Ri…...

mvn命令

在IDEA右侧Maven菜单中,有以下几种指令。 clean:清理,清除上一次构建生产的文件。执行该命令会删除项目地址下的target文件,但不会删除本地的maven已生成的文件。 validate:验证,验证项目是否正确且所有必…...

JS - 事件循环EventLoop

一、面试题:说一下事件循环(回答思路梳理) 首先 js 是单线程运行的( JS 可以修改 DOM,如果在 JS 执行的时候 UI 线程还在工作,就可能导致不能安全的渲染 UI),在代码执行的时候&…...

【Java基础】30分钟Git 从入门到精通

一、 版本控制工具1、什么是版本控制系统?版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对…...

0100 MySQL03

1.distinct关键字 把查询结果去除重复记录,原表数据不会被修改,只能出现在字段的最前端 select distinct job from emp; select distinct job,deptno from emp;//表示两个字段联合起来 去重 2.连接查询 从一张表中单独查询,称为单表查询 两张表联合…...

32- PyTorch基础 (PyTorch系列) (深度学习)

知识要点 PyTorch可以说是现阶段主流的深度学习框架 . 1 PyTorch入门 1.1 PyTorch概述 Torch是什么?一个火炬!其实跟Tensorflow中Tensor是一个意思,可以当做是能在GPU中计算的矩阵.,也可以当做是ndarray的GPU版! PyT…...

用gdb.attach()在gdb下断点但没停下的情况及解决办法

在python中,如果导入了pwntools,就可以使用里面的gdb.attach(io)的命令来下断点。 但是这一次鼠鼠遇到了一个情况就是下了断点,但是仍然无法在断点处开始运行,奇奇怪怪。 这是我的攻击脚本 我们运行一下。 可以看到其实已经运行起…...

Linux入门篇-作业(jobs)调度(本质仍然是进程)

简介 之所以叫做作业调度,作业是以shell为单位的,一个shell建立的作业,不会被另外一个shell看到(包 括root),但是仍然可以看到作业对应的进程。①前台进程(front process) 运行在用户…...

vue 监听 取消监听

vue 的 watch 除了可以使用声明式的配置项以外,还可以通过命令式 this.$watch 方法。 如下是我们比较少用的命令式(想要初始只监听一次,必须命令式写法): 监听只运行一次 声明式 export default{data: {showType: fa…...

0103深度优先搜索和单点连通-无向图-数据结构和算法(Java)

文章目录1.1 走迷宫1.2 图的深度优先搜索实现1.3 算法分析及性能1. 4 单点连通性后记1.1 走迷宫 简单的迷宫,如下图1.1-1所示: 探索迷宫而不迷路,我们需要: 选择一条没有标记过的通道,在你走过的路上铺一条绳子&…...

进销存管理系统

技术:Java等摘要:进销存管理系统是为了实现企业仓库商品管理的系统化、规范化和自动化,从而提高企业管理效率而设计开发的管理信息系统。它完全取代了过去一直用人工管理的工作方式,避免了由于管理人员手工操作上的疏忽以及管理质…...

Sonar:VSCode配置SonarLint/SonarLint连接SonarQube

需求描述 公司为项目代码配置了Sonar检测,希望在VSCode中开发项目时能够同步检测结果。 注意事项 SonarQube版本必须为7.9,否则SonarLint无法连接(GitHub-SonarLint-Wiki第一行就有说明)!!!S…...

陀螺仪小车(Forerake-Car)

项目简介:搭建一辆有arduino UNO 与rnf24l01组成的小车;手部安装由arduino nano开发板、nrf24l01、imu构成的手势控制器,利用手势控制器检测手部状态、发送信号对小车进行前进,实现基于卡尔曼滤波的MPU6050姿态结算。 准备工作&am…...

Leetcode Day5 含有重复元素集合的组合+

1、含有重复元素集合的组合 给定一个可能有重复数字的整数数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。 【题目传送门】 思…...

Mac Book pro(M1)使用总结

1、拿到电脑激活的时候,一定要记住账号密码及安全问题的答案。 2、显示隐藏文件夹: 3、显示.git或者gitignore等隐藏后缀的文件: 打开终端 defaults write com.apple.finder AppleShowAllFiles TRUE重启Finder在终端输入 killall Finder …...

QML集成JavaScript

在QML中可以使用现有的QML元素来创建页面,但QML紧密的集成了必要的JavaScript。 但QML中使用JavaScript比较严格,在QML中不可以添加或修改JavaScript全局对象成员,这样可能会使用一个未经声明的变量。 内联JavaScript 一些小型的JavaScript函…...

React Native 导航系统实战(React Navigation)

导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...