高次方程的解
序
高中时期真的很爱数学,虽然老师老是骂我不做作业,可是我真的有在努力的,只是不喜欢做题而已。高中三年我的数学课本上一直存在两段公式,一是一元三次方程的判别式和一元四次方程降阶的公式。记得当时一元三次方程用了一两个月的时间才推导出来的,其解法主要也是变量代换。其实即便拥有现代知识的我们去推导三次方程也需要花些时间的,可以先考虑非一般式的三次方程,比如没有二次项或者没有一次项,形如\(x^3+bx+c =
0\)这样的,其实我高中时就是这么干的,若干年后发现其实当年的诸多数学家也是这样做的,然后再通过将一般形式的三次方程转换为缺少二次项的形式进行求解。
而四次方程的研究我连续研究了2个多月的晚自习也毫无头绪,完全没辙,无奈最终只能放弃,当时还很受挫,原本还做着春秋大梦想着找到所有高次方程的通解公式。可是直到一天我在新华书店看到一本书叫《人类在数学上的发现》里面提到四次方程曾经让无数数学家都束手无策(心里突然释怀了,当时还不会上网,不懂得去网上查找资料)最后是费拉里给出了解决方案,而我将这段公式从高一的数学课本抄写到高三的数学课本中(因为实在不好解,很繁杂记不住只得抄录)。于是今天打算整理 ...
从光速不变论到狭义相对论
光速测量史
罗默测定光速(1676年)
太阳(点A)照射于木星(点B)会产生阴影(范围从木卫一轨道的点C至点D)。从地球观察,当木卫一蚀发生之时(点C),木卫一会突然消失,运行进入木星阴影,称这现象为“消踪”;当木卫一蚀结束之时(点D),木卫一会突然出现,运行离开木星阴影,称这现象为“现踪”。
地球的公转轨道包含了点E、F、G、H、L、K。在任意一次木卫一蚀里,消踪与现踪不能够从地球都观察得到,因为其中一种现象必会被木星掩蔽。在冲日点(点H,地球在太阳与木星连线之间),消踪与现踪都会被木星掩蔽。在地球位置点L、K都可以观察到木卫一现踪(点D)。由于点L比点K接近点D,光波需要更多传播时间才能抵达点K。类似地,在地球位置点F、G都可以观察到木卫一消踪(点C)。由于点G比点F接近点C,光波需要较少传播时间才能抵达点G。
由于光线从D点到L和到K的距离不同导致在这两个点观察到的木卫一蚀时间上存在差异,罗默就利用这个时间差以及L与K之间的距离估算出了光速,当然罗默测的光速比实际慢了26%,这是由于当时对木星的轨道根数的错误造成的误差导致的。天文学家通过对天体的观察就推算出了光速,确实非常了不 ...
光的本性之争
我为什么会写这篇文章呢?高中时期读过几本对我影响非常大的书籍,其中一本是关于光的本质之争的书籍被我遗失了,之后也再没找到,最近在网络上搜集相关资料重新整理一下。当时读的时候关于光的波粒二象性相关实验对我触动很大,尤其那个非常恐怖的双缝干涉实验以及之后引出的一系列问题。
牛顿的《光学》光的粒子性权威
1704年,牛顿著成《光学》,其中他详述了光的粒子理论。
1383100502692lutyt.gif
光的反射:微粒碰到刚体后发生反射
光的折射:更高密度的介质对光有一个吸引力,光在更高密度的介质中传播速度更快
光的色散:白色光是由多种色彩混合而成,通过三棱镜可以将其分开,其中红色微粒质量更大,惯性更大,而紫色微粒质量最小惯性最小
看似非常合理,光的微粒说可以完美解释光的反射、折射,色散等现象。
题外话
思考:其实牛顿在《光学》中做了大量实验,其中很多实验设计都很巧妙,牛顿时代以胡克为代表的光是机械波的学说还比较盛行(当时已经知道声音是一种波,人们想当然的认为光也是一种机械波),但是机械波的传播依赖传播介质,因此那个时代真空中存在以太物质这个假说还很盛行,可是牛顿大神不相信以太 ...
UAC 框架梳理
UAC 框架梳理
USB-Framework.png
UAC Host
UAC Host 流程
UAC Host调用流程.png
代码流程都是类似的找到sound/usb/pcm.c文件里的struct snd_pcm_ops
结构体,相关回调都在这里:
1234567891011static const struct snd_pcm_ops snd_usb_playback_ops = { .open = snd_usb_pcm_open, .close = snd_usb_pcm_close, .hw_params = snd_usb_pcm_hw_params, .hw_free = snd_usb_pcm_hw_free, .prepare = snd_usb_pcm_prepare, .trigger = snd_usb_substream_playback_trigger, .sync_stop = snd_usb_pcm_sync_stop, .pointer = snd_usb_pcm_pointer, .ack = snd_usb_pcm_playba ...
一次UAC设备不识别问题追查
USB枚举流程
USB连接过程
UACId1.png
这个过程包括Attached、Powered、Reset(进入Default状态)、Set
Address(进入Address状态)。然后会进入config阶段,如下:
Config过程
请求device描述符
UACId2.png
bmRequestType:0x80表示从设备到主机,请求标准命令,接收者为设备
bRequest:0x06表示读取描述符
wValue:
表示要获取描述符的索类型。(高字节为描述符类型,低字节为描述符索引)
123456描述符的类型有:1——设备描述符2——配置描述符3——字符串描述符4——接口描述符 //随配置描述符一并获取5——端点描述符 //随配置描述符一并获取
这里0x0100,表示设备描述符,索引为0
wIndex:字段表示字符串描述符的语言ID, 其它描述符为0
wLength:指定了描述符的字节数,这里为0x12(18)字节
device的设备描述符
UACId3.png
bLength:设备描述符的字节数大小,这里长度为0x12(18)字节
bDescri ...
栈溢出
Memset栈空间
在debug期间我们可以给栈空间赋值为一个特定值,比如0x5a,然后在每次中断中检查该值是否发生变化,来检测操作内存附近是否有内存被改写,同时该方法也可以用于统计栈最大使用情况。
-fstack-protector
-fstack-protector 会在函数返回地址之前插入一个保护字(称为“canary”)。如果在函数执行期间发生了缓冲区溢出,可能会覆盖这个保护字。在函数返回之前,编译器会检查这个保护字是否被修改,如果被修改,程序会立即终止,从而防止潜在的攻击。
stack-protector:保护函数中通过alloca()分配缓存以及存在大于8字节的缓存。缺点是保护能力有限。
stack-protector-all:保护所有函数的栈。缺点是增加很多额外栈空间,增加程序体积。
stack-protector-strong:在stack-protector基础上,增加本地数组、指向本地帧栈地址空间保护。
stack-protector-explicit:在stack-protector基础上,增加程序中显式属性"stack_protect"空间。
123 ...
Hexo Butterfly 使用手册
标签外挂
标签外挂是 Hexo 独有的功能,并不是标准的 Markdown 格式。
Note
simplemodernflatdisabledno-icon123456789101112131415161718192021{% note 'fab fa-cc-visa' simple %}你是刷 Visa 还是是 UnionPay{% endnote %}{% note red 'fas fa-bullhorn' simple %}2021年快到了....{% endnote %}{% note pink 'fas fa-car-crash' simple %}小心开车 安全至上{% endnote %}{% note green 'fas fa-fan' simple%}这是三片呢?还是四片?{% endnote %}{% note orange 'fas fa-battery-half' simple %}该充电了哦!{% endnote %}{% note purple 'far fa-hand-scissors' simple %}剪刀石頭布{% endnote %}{% no ...
CPUIdle
cpu idle实现原理
通过wfi或wfe指令进入low-power-state。在low-power-state下cpu
core保持上电状态,但其大部分时钟停止或者进入时钟门限。这意味着core的绝大部分都处于static
state,唯一消耗的功率是用于寻找中断唤醒条件的泄漏电流和少量逻辑时钟。进入low-power-state后将暂停当前的工作直到某个中断或event事件发生会退出low-power-state进入正常运行state。
cpuidle1.png
cpuidle2.png
其唤醒wfi或wfe的interrupt或者event请参考《The AArch64 System Level
Programmers’ Model 》D1.6 Mechanisms for entering a low-power state
cpu idle代价
cpu的状态被称为C状态,不同的C状态功耗不同,其中C0是normal
state,正常运行状态就是C0状态,其他各state退出到C0状态所需的时间也不同,以下是一个笔记本的CPU各C状态的功耗和退出latenc ...
记录一次UAC 丢包问题分析过程
实验
测试发现period_size=512或者256时均不发生丢包,于是做以下实验:
sampling rate
channel
bit depth
period_size
package size
是否丢包
48k
2
16bit
1024
4096Byte
丢包
48k
1
16bit
1024
2048Byte
丢包
48k
2
16bit
512
2048Byte
不丢包
48k
4
16bit
512
4096Byte
不丢包
通过实验发现,丢包与period_size相关与package size无关。
通过perf top分析
通过perf top查看系统和aplay中哪些函数占比高:
这里可以看到有大量的spin_lock函数占用比较高的cpu时间。猜测系统哪里可能有自旋锁使用不当。但是这里无法看到函数调用栈,不知道哪里调用的spinlock占用cpu资源多。
通过火焰图分析
查看ftrace 123456789101112131415mount -t debugfs none /sys/kernel/debug/c ...
Encryption Algorithm
AES
AES(Advanced
Encryption
Standard),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES。其密钥长度则可以是128,192或256比特。
SubBytes:通过一个非线性的替换函数,用查找表(S-Box)的方式把每个字节替换成对应的字节。
ShiftRows:将矩阵中的每个横列进行循环式移位。
MixColumns:每一列的四个字节通过线性变换互相结合得到新的4字节值.
AddRoundKey:将输入与轮密钥进行XOR。
以上就是AES加密中的一轮,不同密钥长度进行的轮数不同,128位10轮,192位12轮,256位14轮。
下面具体分析每一步
SubBytes
从一张拥有256个值的替换表(S-Box)中找出对应的值替换。S-Box是固定的,查找公式也是固定。具体可参见Rijndael
S-box。用此步骤混淆了输入内容。
ShiftRows
上一步处理后将16个字节分为4组,每组4字节。以字节位单位进行乱序处理,这种打乱是有规律的。如上图中输入第一组第一个字节移动到输出第一组第一个字 ...