Posted in: 生活

小事 · 我曾一度怀疑我之前养的那只狸花猫成精了

头图

我曾一度怀疑我之前养的那只狸花猫成精了

18 年在成都创业,我和两个朋友(其中一个带了女朋友)合租了一套房,从前老板手里抱走了他养了一年的狸花猫,那只狸花一开始就是乖巧,正常的那种乖巧,不让进屋她绝对不进的那种

后来某天我们仨去税务局有事,我那朋友的女朋友留家里打扫卫生,结果出门倒垃圾的时候没带钥匙,不小心把门还关上了

然后狸花给她开的门

当时我们知道后就觉得很惊讶,但毕竟没亲眼所见,所以没啥冲击感

直到后来,我那朋友养了条小奶狗,就半个月不到走路都摇摇晃晃的那种

可我这朋友吧不爱遛狗,于是……

狸花教这只狗去小区花坛拉屎,教它怎么吃猫粮喝水,晚上七点固定了还要出门遛狗,半个小时后把狗送回来再自己出去玩

猫遛狗啊兄弟,我这辈子第一次见,还是每晚七点雷打不动

绝了!

后来我才知道,她带着狗跑隔壁小卖部要火腿肠来吃,完了溜达两圈消完食再回来的

哦对,因为后来去长春就没带上她,把她送给了隔壁小卖部的阿姨,反正在我离开成都之前,这猫已经是半个小区的老大了

Posted in: 生活

美国移民局递交材料翻译要求

 

美国公民及移民服务局(USCIS)在受理包括入籍申请在内的大多数申请时,通常需要外国的重要统计记录和民事文件副本作为支撑材料。

倘若您缺失由原籍国出具的关键统计记录或民事文件,例如出生证明或结婚证明,建议您访问国务院互惠网页。该网站详尽地提供了各国可提供的重要统计和民事文件种类信息,以及获取新文件的具体指南。只需选择您的原籍国并点击“跳转到国家文件”,便可轻松获取针对您问题的详尽解答。

此外,值得注意的是,USCIS对于民事文件的翻译亦有明确要求。我为您提供了USCIS关于申请提交要点的页面链接,您可以在此页面上获得专家关于申请流程的宝贵指导。关于翻译的具体要求如下:

请务必提交所有外语文件的经认证翻译件。翻译人员需确保其具备翻译资格,并承诺译文的准确无误。认证信息应涵盖认证人的全名、亲笔签名及认证日期。推荐采用以下格式:

翻译人员认证声明

 

另需说明的是,虽然N-400申请说明中并未明确要求翻译件必须经过公证,但根据实践经验提供翻译机构的资格证书是常见且推荐的做法。

关于文件提交的最后一点提示:除非特别要求提交原始文件,否则您只需提供清晰可辨的普通复印件即可。若在未要求的情况下提交了原件,该原件将成为官方记录的一部分,即便其提交并非必需。同时,请确保所有提交给移民局的外语文件均附有完整的英文翻译,且翻译人员已按规定证明译文的完整性和准确性,以及其翻译资格证明。

 
6142321451
春天的狼
呱呱id:6142321451
Posted in: 生活

内存是怎么映射到物理地址空间的?内存是连续分布的吗?

头图

如果我们将两个 4G 内存插入内存插槽,得到的内存地址空间是 0 到 8G 吗?是不是 0 到 4G 是第一根内存,4 到 8G 是第二根内存呢?实际情况相差甚远,内存在物理地址空间的映射是分散的。一部分原因是 4G 以下有 Memory map IO(mmio)空间和 PCIe 的配置空间,另一个原因是 Interleaving 会打撒内存地址到各个 Channel、DIMM 甚至是 Rank 和 bank 上。今天我们就一起来了解一下 x86 系统的地址空间分布。

物理地址空间

一个典型的物理地址空间是这样的:

其中只有灰色部分是真正的内存,其余都是 MMIO。而内存被分为 High DRAM 和 Low DRAM,如图:

为什么要把内存强行分割成两块呢?因为历史的包袱。最早内存都很小,32 位的地址(4G)空间看起来永远也用不完,低地址被分配给内存用,高地址就自然而然被分配用来给 Memory map IO。既然已经分给它们了,为了兼容以前的驱动,这一块就被固定下来。再有内存就只能从 4G 以上分配了。

Low MMIO 和 High MMIO

Low MMIO 结构如下图:

其中有几块要特别说明一下:

1.Boot Vector 的空间是 BIOS 内容映射的地址,它的大小是可以调节的,为了满足不同大小的 BIOS。

2.Local APIC 是 APIC 中断模式各个内核 local APIC 寄存器的映射地址。APIC 的中断可以参考这篇文章:

老狼:计算机中断体系二:中断处理

3.PCI ECAM 也有叫做 PCIBAR,是 PCIe 配置地址空间的映射地址。它的起始地址可调,台式机 BIOS 一般会把它设置得很高,这样 4G 以下内存会比较大,方便 32 位 Windows 使用。举个例子,如果我们把 PCIe BAR(BEGREG)设为 0x80000000,那么尽管插了 8G DIMM,4G 以下也不会超过 2G 的内存可以使用,而 2 到 8G 的真实内存都被映射到在 4G 地址空间以上了,而这些是 32 位 Windows 使用不了的。所以有的主板运行 32 位操作系统发现可用内存小了一大块就是这个原因。它的大小可以修改,一般可以设为 64MB 和 128MB。PCIe 的详细内容可以参考这篇文章:

老狼:深入 PCI 与 PCIe 之二:软件篇

High MMIO 被 BIOS 保留作为 64 位 mmio 分配之用,例如 PCIe 的 64 位 BAR 等。

Low DRAM 和 High DRAM

4G 以下内存最高地址叫做 BMBOUND,也有叫做 Top of Low Usable DRAM (TOLUD) 。BIOS 也并不是把这些都报告给操作系统,而是要在里面划分出一部分给核显、ME 和 SMM 等功能:

红框中是在 low DRAM 被“偷”的部分

4G 以上的内存最高端叫做 Top of Up Usable DRAM (TOUUD) ,再上面就是 High MMIO 了。

1MB 以下比较特殊,里面全部都是已经被淘汰的传统 BIOS 和 DOS 关心的内容,我们叫它 DOS Space 或者 Legacy Region:

在那里,我们习惯用传统的实模式地址来划分它们的具体内容:

1.0~640KB,传统 DOS 空间。

2.A 段和 B 段,传统 SMM 空间。VGA 的 MMIO 也被映射到这里,可以通过寄存器切换。

3.C 段和 D 段,legacy opROM 映射空间和 EBDA 空间。

4.E 段和 F 段,BIOS 空间的 Lower 和 Upper 映射地址。BIOS 的 rom 内容也会被映射到这里,方便 Legacy BIOS 实模式跳转到保护模式。

内存的 Interleave

从前面可以看出内存在地址空间上被拆分成两块:Low DRAM 和 High DRAM。那么在每块地址空间上分配连续吗?现代内存系统在引入多通道后,为了规避数据的局部性(这也是 Cache 为什么起作用的原因)对多通道性能的影响,BIOS 基本缺省全部开启了 Interleaving,过去美好的 DIMM 0 和 DIMM 1 挨个连续分配的日子一去不复返了。

什么是 Interleaving?简单来说,就是让内存交错起来,如下面的动图

来自 wikipedia, 参考资料 1

这是一个 bank 层级的模 4 的 interleaving。在桌面电脑上,常见的还有 Channel 级的、DIMM 级的和 Rank 级的。Channel/DIMM/Rank/bank 这些概念可以参考这两篇文章:

老狼:内存系列一:快速读懂内存条标签老狼:内存系列二:深入理解硬件原理

服务器上 Interleaving 更是不可或缺,它的粒度更细,可以达到数十 bytes 层级的 interleave,它和内存的其他特性,如类似磁盘阵列 RAID 的内存 spare, mirror 特性,构成了复杂异常的内存映射系统。在 BIOS 里面,台式机 / 笔记本内存映射相对简单,只有一个大表和数十个寄存器;而在服务器 BIOS 中,有数个相互关联的大表和寄存器阵列来解码(decode)内存的请求,代码的硬件逻辑也是相当复杂。关于它,我会有一篇专栏文章讨论地址译码和地址反向解码,详细内容那里再说,这里只需要知道,物理内存分布在各个 DIMM 上就够了。

物理地址到内存单元的反推

BIOS 实际上一手导演的内存的分配,它当然可以从任何物理地址反推回内存的单元地址。我们可以用下面一组数据来唯一确定某个内存单元:

Channel #;DIMM #; Rank #;Bank #;Row #;Column #

在内存分配表缺失的情况下,BIOS 甚至可以通过它填过的寄存器重建这个映射表。但实际上 BIOS 并不希望一般用户知道这些信息,因为有安全性问题。

暴露内存信息容易招来内存侧信道攻击(Side Channel),比较有名的有 Row hammer 攻击。简单的来说它是通过反复写某个内存单元,借助内存的特性,希望影响相邻 Row/Column 的内容。详细内容可以参考这里:

老狼:内存不刷新会怎样?内存的物理攻击和旁路攻击

有些情况确实需要知道这些信息,就是内存出错的时候。和大家想象的不同,内存是会出错的。尤其云服务器中内存的出错是十分频繁的。出错起来也千奇百怪,开始可能是偶尔的随机错误,经过 ECC 等校正后,就再也不会复现;而有时是某个 Bit 总是出错,进而慢慢的整个 row、column 或者相邻的 cell 开始出错,从可以纠正的错误变成不可修正的错误,导致服务器必须停机。这时候就必须知道哪个内存坏了,进而换掉它。BIOS 的报错是通过 WHEA:

老狼:WHEA 原理和架构

报告给操作系统,但这个信息里面只有物理地址,如何才能知道是哪个内存单元坏了呢?在 Linux 上面可以通过 edca(参考资料 4),有编程经验的同学可以通过 edca 的程序接口(参考资料 3),可以得到更加丰富的信息。

如何关掉 Interleaving

对内存有特殊需求的朋友,如果希望内存连续,可以在 BIOS 里面关闭所有的Interleaving 来达成这个目标:

注意是所有的。之后可以通过 SMBIOS 来看到内存分布信息(dmidecode)。

结论

BIOS 作为内存的大管家,也负责内存的分配和映射 memory map。它会把这些信息通过 E820, GetMemoryMap 函数和 SMBIOS 传递给操作系统。操作系统在此基础上再建立页表,产生虚拟地址。

另一篇相关的文章:

老狼:神秘消失的内存去哪了?

BIOS 培训云课堂

卓易云课堂

参考资料:

[1]: https://en.wikipedia.org/wiki/Interleaved_memory

[2]: https://www.semanticscholar.org/topic/Row-hammer/701344

[3]: https://01.org/linuxgraphics/gfx-docs/drm/driver-api/edac.html

[4]: http://fibrevillage.com/sysadmin/243-edac-error-detection-and-correction

Back to Top