御坂網路司令塔

偉大光榮正確的中土國民會萬歲

x86-64 计算机的启动流程——基于 coreboot+SeaBIOS+GRUB2+GNU/Linux+systemd

x86-64 计算机的启动流程——基于 coreboot+SeaBIOS+GRUB2+GNU/Linux+systemd

概述

x86-64 计算机加电后,CPU 首先从 ROM 中寻找并执行 BIOS 程序,初始化硬件,然后从启动设备(硬盘等)中读取分区表/引导信息,并启动引导加载器(bootloader),引导操作系统启动。
操作系统会进一步初始化硬件,然后启动各种系统服务,最终展现用户界面(CLI 或 GUI),供用户使用。

coreboot - 初始化硬件

coreboot 是一种自由、开放源代码的系统启动固件,在 x86 平台上结合相应的 payload 可以替代 Legacy BIOS 或 UEFI BIOS。

coreboot 在 x86-64 架构下执行时分为 bootblock、romstage、postcar、ramstage、payload 五个阶段,而其中的 payload 可以直接选择 GRUB2 等引导加载器加载操作系统内核,也可以用 SeaBIOS 模拟 Legacy BIOS,或者采用 Tianocore EDK2 执行 UEFI BIOS。

bootblock 阶段

计算机加电后,主板向 CPU 发出重置(reset)信号,并保持直到系统供电稳定为止。CPU 重置后,从重置向量(reset vector)开始执行代码。80386 之后的 x86 处理器的重置向量位于物理地址 FFFFFFF0h(CS:IP FFFF:FFF0h),映射到主板上一块支持片内执行的 ROM 芯片(即 BIOS 芯片)上。这个位置是一条 JMP 跳转指令,跳转到 bootblock 的主要代码区域来执行(_start16bit:,src/cpu/x86/entry16.S)。
bootblock 的工作有:

  • 将高速缓存“当作 RAM”(Cache-As-RAM)用于堆和栈
  • 设置栈指针
  • 将 .bss 段清零
  • 解压并加载下一个启动阶段
    • 下一个启动阶段一般是 romstage,但也可以是可选的 verstage,用于验证固件完整性。
      在 x86 平台上,bootblock 还会:
  • 加载 Microcode 更新
  • 初始化计时器
  • 从16位实模式跳转到32位保护模式

    Cache-As-RAM 模式(CAR)

    也称为“Non-Eviction mode”。此模式可以将 CPU 高速缓存当作普通的 SRAM 内存来使用,从而允许在启动阶段 DRAM 尚未初始化之时使用 C 语言编程。

ramstage 之前的阶段都在 Cache-As-RAM 下运行。

romstage 阶段

此阶段会初始化 DRAM 内存控制器并“训练”(train)内存,得出合适的时序数据。此阶段也进行其他设备的早期初始化。

postcar 阶段

postcar 阶段关闭 CAR 模式并加载 ramstage。

ramstage

ramstage 是 BIOS 中最主要的用于初始化硬件设备的阶段,其工作有:

  • 初始化 PCI 设备
  • 初始化片上(on-chip)设备
  • 初始化 TPM(如果没有 verstage)
  • 初始化显卡(可选,也可以由 SeaBIOS 执行 VGA ROM 来初始化)
  • 初始化 CPU ,例如设置系统管理模式(SMM)
    初始化之后,ramstage 会写入一些表格,让 payload 或操作系统了解硬件是否存在及硬件状态,这些表格包括:
  • ACPI 表(x86 特定)
  • SMBIOS 表(x86 特定)
  • coreboot 表
    ramstage 阶段还会锁定一些硬件和固件:
  • 启动媒体的写保护
  • 锁定安全相关的寄存器
  • 锁定 SMM 模式(x86 特定)

    payload

    Payload 是 coreboot 文件系统(CBFS)中嵌入的软件,可以是引导加载器(GRUB2、FILO 等)、其他固件的模拟器(SeaBIOS、Tianocore 等),也可以是受支持的操作系统内核。

每份 coreboot 构建只能有一个 ELF 可执行文件作为 payload 加载。coreboot 自身不允许在运行时选择 payload,只能由被加载的 payload 执行链式加载来执行 CBFS 中的其他 ELF 文件。

SeaBIOS - 模拟传统 BIOS,执行引导器

SeaBIOS 是一种自由、开放源代码的16位 x86 BIOS 实现。为了兼容性,它支持标准的 BIOS 功能和由典型的专有 x86 BIOS 实现的调用接口。

SeaBIOS 本身可以在模拟器上直接作为 BIOS 执行,也可以嵌入到 Tianocore UEFI 中作为 CSM 执行,当然也可以嵌入到 coreboot 中作为 payload 执行。

POST 阶段

在 coreboot 环境下,SeaBIOS 从32位保护模式的 romlayout.S:entry_elf() 开始执行,然后会调用 post.c:handle_post()。POST 阶段包括以下列出的几个子阶段:

  • “preinit” 子阶段:在代码重定位前执行的代码。主要是检测内存并“预初始化”(preinit) SeaBIOS 内部的 malloc 实现。
  • “init” 子阶段:初始化内部变量和接口。主要包括正式初始化 malloc,初始化 CBFS,初始化中断向量表、BIOS 数据区域 BDA、POST内存管理(PMM)、即插即用(PNP)、键盘和鼠标。
  • “setup” 子阶段:设置硬件和驱动。首先初始化平台硬件,然后执行各种 Option ROM,包括 VGA ROM 并设定显卡,然后显示选择启动设备的界面
  • “prepboot” 子阶段:结束接口,并为 boot 阶段做准备。主要是将 BIOS 内存区域设置为只读,然后回到16位实模式,并调用 0x19 中断,进入 BOOT 阶段。

    BOOT 阶段

    BOOT 阶段首先从处理 0x19 中断开始运行,然后按照选择的启动设备调用相应函数。

对于从硬盘启动,需要调用 0x13 中断读取主引导记录(MBR)的扇区

  • 功能描述:读扇区
  • 入口参数:
    • AH=02H
    • AL=扇区数
    • CH=柱面
    • CL=扇区
    • DH=磁头
    • DL=驱动器,00H7FH:软盘;80H0FFH:硬盘
    • ES:BX=缓冲区的地址
  • 出口参数:
    • CF=0——操作成功,AH=00H,AL=传输的扇区数
    • 否则,AH=状态代码

主引导记录,是位于硬盘0磁头,0柱面,1扇区为起始位置,扇区数为1(512字节)的一段数据。SeaBIOS 将其读出并复制到 0x7c00,然后检查 signature(最后的两个字节)是不是小端序的 0xAA55,如果是就跳转到 CS:IP 0x0000:0x7c00 执行。

GRUB2

GRUB2 是一种模块化的启动加载器,支持 multiboot 启动协议和一些操作系统专有的启动协议。

boot.img

boot.img 是 GRUB2 最首先启动的组件,也就是安装到主引导记录前 446 字节的 bootloader,相当于 GRUB Legacy 的 stage 1。446 字节的 boot.img 太小,无法容纳读取文件系统的指令。因此,boot.img 会从硬盘中加载 core.img 的第一个扇区,并由 core.img 来读取文件系统和加载模块。

core.img

主引导记录 512 字节之后到第一个主分区的位置之间,有 31 KiB 的空间。这个位置过去可以存放 GRUB Legacy 的 stage 1.5,但对于 GRUB2 的 core.img 来说还是太小了。所幸,现代分区工具会按照 1 MiB 对齐的原则来创建分区,在第一个主分区之前保留 1~2 MiB 的空间,这正好可以让 GRUB2 存放 core.img。
core.img 的第一个扇区被加载后,会将自身的其他内容都加载到内存然后继续执行。
core.img 是用 grub-mkimage 创建的,其中包括了足够多的模块用以读取 GRUB 安装位置(通常是某个 GNU/Linux 操作系统的 /boot/grub 目录)——这些模块可能有 part_msdos.mod、ext2.mod 等。core.img 会根据配置文件从 GRUB 安装位置中加载更多模块,然后加载相应的操作系统,或者向用户展示启动菜单。

Linux kernel

引导

header.S - 启动代码和 C 语言环境设置

内核从 _start 启动后跳转到 start_of_setup 执行。这段代码首先设置 cs、ds、es 段寄存器,然后设置 ss 寄存器和栈,最后清空 .bss 段并跳转到 main.c 执行 C 语言代码。

main.c - 主函数

  • 复制启动参数
  • 初始化控制台
  • 初始化堆
  • 检查 CPU 类型
  • 内存分布侦测
  • 初始化键盘
  • 查询系统参数

    main.c - 显示模式初始化和进入保护模式

  • 显示模式的初始化
  • 在进入保护模式之前的准备工作
    • 禁止外部中断
    • 禁止 NMI 中断
    • 使能 A20 地址线
    • 设置中断描述符表(IDT)
    • 设置全局描述符表(GDT)
  • 正式进入保护模式

    startup_32 并进入 64 位长模式

  • 建立栈
  • 确认 CPU 是否支持长模式和 SSE
  • 计算内核解压缩之后的重定位地址(-fPIC)
  • 进入长模式前的准备工作
    • 更新全局描述符表
    • 启用 PAE
    • 初期页表初始化
    • 切换到长模式

      startup_64 和内核解压缩

  • 重置寄存器
  • 保存 rsi 寄存器的值(指向 boot_params)
  • 内核解压缩
    • 再次初始化控制台
    • 调用压缩内核镜像的解压函数,使其原地解压
    • 移动内核镜像到正确的位置
    • 进入内核

      内核初始化

      页式内存管理

      x86-64 下 Linux 系统既采用了内存分段管理,也采用了分页管理;但和其他段页式内存管理系统不同,Linux 的内存分段只用于权限控制,不用于寻址——每个段的大小都等于整个地址空间。
  • 设置初期页表
  • 设置初期中断和异常处理
  • 初始化内存页

    内核入口 - start_kernel

    start_kernel 函数的主要功能包括:
  • 初始化锁验证器
  • 激活第一个 CPU
  • 打印内核版本号和编译环境
  • 调用 setup_arch,进行体系结构相关初始化
    • 配置 ioremap - 将外部设备映射到内存空间虚拟地址上
    • 初始化设备树
    • 初始化内存描述符
    • 设置 NX 位
    • 加载 PCI 设备
    • 检测系统可用内存
    • 从桌面管理接口(DMI)收集系统信息
    • 配置 SMP(对称多处理)
    • 为 DMA 分配空间
    • 初始化稀疏内存
    • 进行 vsyscall 系统调用映射
  • 初始化调度器
    • 配置 NUMA
    • 初始化 PID 散列表
    • 根据编译选项初始化调度器(默认为 CFS 完全公平调度器)
  • 初始化 RCU - Read Copy Update(读复制更新),一种适合少写多读情况的并发同步机制。采用发布-订阅机制实现
  • ACPI 早期初始化
  • 为 init 进程分配缓存
    • 初始化缓存
  • 创建 proc 文件系统
  • 启动 RCU 调度器
  • 启动 SMP 线程
  • 执行 init 进程

systemd

systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。功能包括:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。systemd 支持 SysV 和 LSB 初始脚本,可以替代 sysvinit。除此之外,功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等。——systemd 项目主页 https://freedesktop.org/wiki/Software/systemd

initramfs

GRUB 加载 Linux 内核时,通常会一并加载一个 initramfs,其中包括挂载真实根文件系统以前使用的文件系统。这是因为用户使用的文件系统驱动往往不会全都编译进内核,initramfs 可以提供加载驱动模块的程序。initramfs 在 GNU/Linux 发行版的包管理器安装内核时生成,典型用到的工具有 Fedora 的 dracut 或 Arch Linux 的 mkinitcpio 等。
对于现代 GNU/Linux 系统来说,initramfs 包括:

  • init 进程对应的可执行文件,/sbin/init。这是一个指向 /lib/systemd/systemd 的软链接
  • 根文件系统所需内核驱动模块
  • 挂载根分区所需的其他用户空间可执行文件
    initramfs 阶段,systemd 的启动目标顺序为:
  1. sysinit.target,初始化用户空间运行环境
  2. basic.target,执行早期开机自启动任务,如监听一些 socket,运行一些定时器等
  3. default.target,在 initramfs 中是一个指向 initrd.target 的软链接。initrd.target 挂载根文件系统到 /sysroot
  4. initrd-switch-root.target,切换到真正的根文件系统,并用实际根文件系统上的 systemd 替换现有的 init 进程

    切换根文件系统之后的 systemd

    由于切换根文件系统之后是将 systemd 进程替换为文件系统上的版本,所以 PID 仍然为 1。
    此时的启动目标顺序为:
  5. sysinit.target
  6. basic.target
  7. default.target,此时的 default.target 不再指向 initrd.target,而是指向 multi-user.target(命令行)或 graphical.target(图形界面)。在此阶段,systemd 会启动各种系统服务,并最终执行 getty.service 和/或相应的 Display Manager(如果是图形界面),显示登录界面。

总结——操作系统在计算机启动过程中的作用

操作系统是资源的管理者,向用户提供各种服务,也是对硬件机器的扩展。

操作系统在计算机启动过程中,会配置内部存储器,初始化和管理计算机的各种外部设备(配置中断、映射内存空间等),启用进程和线程的管理功能(状态、控制、同步/互斥、通信、调度等),提供文件系统读写功能,并最终显示用户接口供用户使用。

参考文献

  1. https://doc.coreboot.org/getting_started/architecture.html
  2. https://www.cnblogs.com/gnuemacs/p/14287120.html
  3. https://www.cnblogs.com/shao-ye/p/11202680.html
  4. https://blog.csdn.net/Pedroa/article/details/53455355
  5. https://stackoverflow.com/questions/23422594/reset-vector-in-386-processors
  6. https://zhuanlan.zhihu.com/p/107898009
  7. https://www.seabios.org/Execution_and_code_flow
  8. https://opensource.com/article/17/2/linux-boot-and-startup
  9. https://www.gnu.org/software/grub/manual/grub/grub.html
  10. https://wiki.archlinux.org/index.php/GRUB_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
  11. https://xinqiu.gitbooks.io/linux-inside-zh/content/
  12. https://blog.csdn.net/jinking01/article/details/107098437
  13. https://zhuanlan.zhihu.com/p/67520807
  14. https://www.junmajinlong.com/linux/systemd/systemd_bootup/
  15. https://wiki.archlinux.org/index.php/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
  16. https://blog.csdn.net/sinat_22055459/article/details/51055410

计算机网络复习笔记

  • OSI参考模型:物理层/数据链路层/网络层/传输层/会话层/表示层/应用层
  • TCP/IP 体系结构:网络接口层/网际层/传输层/应用层
  • 电路交换:面向连接;分组交换:无连接;报文交换:无连接
  • 1983年TCP/IP (IPv4)成为ARPAnet标准协议
  • 互联网的两个重要特点:连通性、共享
  • 物理层(尽可能地)屏蔽不同传输媒体和通信手段的差异
  • 什么通信技术让用户共享信道:多路访问(多点接入)技术,如CSMA/CD
  • 透明传输:
    • 异步传输时:字符填充:{0x7E}变成{0x7D, 0x5E},{0x7D}变成{0x7D, 0x5D},ASCII控制字符也在前面加入0x7D作转义处理(LCP协商)
    • 同步传输时:0比特填充法:PPP协议在SONET/SDH上进行同步传输时,采用0比特填充法:
      • 发送时,发现有五个连续的1,就立即填入一个0
      • 接收时,扫描帧中的比特流,发现有五个连续的1,就把紧接着的0删除
  • MTU:最大传输单元,数据链路层一个帧的内容部分的最大大小,以太网1500,PPPoE 1492
  • 链路层PDU:数据帧
  • 以太网帧长度:最小64字节,最大1518字节
  • 传统以太网采用曼彻斯特编码,自同步时钟
  • VLAN在以太网帧格式中插入了4个字节
  • 交换机利用 STP 协议解决环路的问题
  • 路由器两个接口不能配置在同一网段
  • IP地址分类:
    1. A类1.0.0.0~127.255.255.255
    2. B类128.0.0.0~191.255.255.255
    3. C类192.0.0.0~223.255.255.255
    4. D类224.0.0.0~239.255.255.255
    5. E类240.0.0.0~255.255.255.255
  • 分片设备:路由器(只分片不重组)
  • IP 头部表示经过的路由器数量:TTL
  • IPv4 实际头部长度:Internet Header Length(IHL) 4位二进制(5~15)乘以4字节,即实际长度20~60字节
  • TCP 实际头部长度:Data offset 4位二进制(5~15)乘以4字节,即实际长度20~60字节
  • seq:序列号,本报文段所发送的数据的第一个字节的序号
  • ack:期望收到对方的下一个报文段的数据第一个字节的编号
  • TCP 标志位
    1. URG: 紧急指针有效,表示此报文段包含紧急数据,应优先传送
    2. ACK: 只有 ACK=1 时确认号才有效,ACK=0 时确认号无效
    3. PSH: 尽快把数据交给接收应用,不等到缓存填满
    4. RST: 复位,连接立即释放
    5. SYN: 同步,表示这是一个连接请求或连接接受报文
    6. FIN: 终止,表示此方向的数据已发送完毕,释放连接
  • 三次握手
    1. C->S, SYN, seq=client_isn
    2. S->C, SYN+ACK, seq=server_isn, ack=client_isn+1
    3. C->S, ACK, seq=client_isn+1, ack=server_isn+1
  • 四次挥手
    1. 主->被,FIN, seq=u
    2. 被->主,ACK, seq=v, ack=u+1
    • 此时被动关闭方仍可以继续发送数据
    1. 被->主, FIN+ACK, seq=w, ack=u+1
    2. 主->被,ACK, seq=u+1, ack=w+1
  • 端口号
    • 知名:0~1023
    • 注册:1024~49151
    • 客户端使用:49152~65535
  • TCP面向报文段,UDP面向报文
  • UDP伪首部包括:
    1. IP首部。源地址,目的地址,填0,协议(17/0x11表示UDP),UDP长度
    2. UDP首部。源端口,目的端口,数据长度,校验和(填0)
    3. 数据。
  • socket 由 IP地址 和 端口号 两部分构成(TCP 连接包括两个套接字)
  • 以太网的5-4-3规则:
    • 总线型网络,整个网络:5个区段,4个中继器,只能有3个区段含有PC
    • 使用集线器的星型10BASE-T网络,两台PC间:5段网线(集线器之间、集线器到PC),4台集线器,3台集线器连PC

在 virtio 虚拟磁盘上安装 Windows

以前每次在 virtio 磁盘上安装 Windows,都会遇到 0x80300001 错误,说无法将 Windows 安装到此位置。所以御坂一直是采用如下方法来 workaround 这个问题:

  1. 先将磁盘类型设置为 SATA,正常安装。
  2. 添加一块 virtio 磁盘,并安装驱动程序。
  3. 把系统盘设置为 virtio,第二步生成的磁盘可以删除。

结果今天查了一下,发现真正的错误是那个报错:它应该提示更换光盘,而不是无法安装。
此时只需要将 virtio-win.iso 弹出,放入启动时的系统安装盘即可。

Django Q + psycopg2cffi 单元测试踩坑记

可能是出于防止连接丢失的原因,Django Q 项目在 cluster.py 文件中大量应用了 db.close_old_connections(),关闭并重新打开数据库连接。而在 Django 自带的单元测试 django.test.TestCase 中,是采用了数据库事务进行测试数据回滚,以实现测试之间互相隔离的目的;在此时关闭数据库连接,就会使得事务中断,抛出异常——在 psycopg2 中,会说 InterfaceError("connection already closed"),而在 psycopg2cffi 中,会说 TransactionManagementError("An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block

之前查到几个说法,关于 TestCase 改成 TransactionTestCase 之类的,并没有用。

[转]给行动者的五项自我照护建议:觉醒不应意味着灵魂的崩溃

This is translated from 5 Self Care Tips for Activists — ‘Cause Being Woke Shouldn’t Mean Your Spirit’s Broke by Kim Tran. If this article violated anyone’s copyright, please let me know and I will delete it.

Co-translator: limelight 副站长 鳄鱼

昨天,我作了一个二十分钟的访谈,关于社交媒体。

事实上,这二十分钟的对话和网络暴力有关。

对象是一群做民族研究的学生。这些学生不知道该如何处理他们新建立的政治意识和社交圈子,与他们那些很久没有交流过、却很喜欢在 Facebook 墙上发表种族主义言论的中学同学之间的关系。

这是经常发生的。

我之所以知道,是因为我曾经有个学生在下课后问我一些类似“我再也不想应付那些种族主义的朋友了”“我找不到没有刻板印象的电影来看”之类的事情。

我个人最欣赏的是:“有时候,我觉得我所知的关于压迫的一切太多了。”

最后一句是我最偏爱的关于“疲倦”的表达。因为:一、我知道那是什么感觉,你肯定也一样;二、它表达了,对于有政治或激进意识(觉醒)的人们来说,自我照护,或者说生活,有多消耗精力。

我们都知道自我照护清单告诉你要记得吃喝拉撒睡,这些都很重要(要不然你就死了)。但对于快速增加着的觉醒者来说,自我照护往往还需要其它形式。

泡泡浴(译者注:不是王道征途!英文里没有 114514 的说法)、花式晚餐、有氧运动,这些都很好,并且也可以成为你自我照护的一部分。(去吧!)

但是你,和我一样,可能也需要和某个傻瓜绝交,读点小说而不是 The New Jim Crow,或者快乐地吃点加工食品。#我喜欢午餐肉你别拦着我

因此如果你是个行动者、组织者或者社群成员,需要整天、每天从事促进社会正义的工作,而且总是感到疲劳(甚至可能是不健康),这篇文章是为你准备的。

如果你不得不花很多时间在 Facebook 上和家人、朋友甚至陌生人(争论),这是为你准备的。

如果你一天25小时都在和人们解释为什么 The Mindy Project 是一种肥胖羞辱,但是你却还是很喜欢那个少数族裔女主角(译者注:原文为 “she’s a woman of color”——御坂实在找不到中文中等同于 PoC 的说法了。毕竟“有色人种”一词更接近歧视性的 “colored people”),这当然是为你准备的。

因为自我照护对我们是不一样的——是时候该承认这一点了。

以下列表就是 我们的 自我照护要求我们,为了我们自己 运动事业的健康,作出的选择,而不需要自责、羞耻或者摆脱 Netflix。

下面这些对我是适用的,希望对你也有用。

1. 社交媒体是一个特殊的地狱,充斥着网络暴力——你可以随时避开

我的意思是。

远离 Facebook/Twitter/Instagram 这样的地狱挺好的。什么时候都是。

你哥哥的朋友的表兄弟 Jeff 在你小学最好的朋友 Caitlin 的墙上说了一些敌视女性的话,但和他对骂并不总是你的工作。在评论的五楼和十楼之间,你可以离开帖子。

当我第一次开始写下思考的片段时,我给《女权主义连线》写了一些内容,说明我为什么不看好将女性纳入到美军的战斗位置中。

我说,我不是认为女性不勇敢、没能力或者不值得被认可,而是我不信任美国在海外的军事干预,因为它的借口和结果往往不仅是父权制的,也是种族主义的。

为了表示支持,我的一位朋友在 Facebook 上分享了这篇文章。 现在,我不知道为什么人们认为文章的作者不存在。 就像,我不是绿野仙踪。 我是一个人,对自己的工作负责的人。

因此,当我在那篇文章中被贴上标签,并且他的一位朋友(他是一名伊拉克退伍军人)向我说,我反女权并且不支持部队的时候,我回应了。

(那时)我没有直接表达我想说的,比如“你大爷的说的啥玩意啊”或者“对不起,你见过我么?”或者“你家的女权主义长这样?”。相反,我参与到了论战中。

直到我生气,哭泣,后悔在那一天出门。

因此,虽然不是每个人都给女权主义网站写 blog,但是我得到的教训是,我经常发现我被朋友的朋友困在停不下来的 Facebook 对话中。

跟我说:“被骂不是我的错被骂不是我的错被骂不是我的错”重要的话说三遍(
至于是第一条、第五条还是第十条评论?呵呵

我不是为而来的。我要明白我为的是我自己。

2. 安慰你自己,就像安慰你刚刚经历分手的好朋友

哦,我为2008年加州8号提案)而奔走,因为我的生活正依赖于它:虽然婚姻平权对 LGBTQIA+ 人士并不意味着全部的胜利和终结,但是我们毫无疑问应该获得正式婚姻的 1400 项法律权利。

因此我为此而战。

更正:我是为了反对它而站出来的。

当时我和我的母亲一起生活,然后她在她的后院里贴了一张“要8号”的标语。是什么激发了所有的争斗?我在车上贴了一张“不要8号”的标语,然后把车停在后院的小路上。对,就是这样。

这意味着,当我们失败的时候,我已经不只是心碎了——因为失败不仅意味着加州操蛋,可能还包括我个人的失败,即使在我如此努力之后。

我所在的城市唯一一家酒吧里,我从醉酒的麻木中醒来,和调酒师闲聊,仿佛那个我追了两年的女孩在三次约会后就和我分手时的场景。

在投票结束之后,所有分手时遭受的打击在我脑海中一瞬间涌了上来:是我的错吗……如果我做了更多的事情,情况会有所不同么。是不是永远会这样……我们是否还有希望?

有时我觉得我不该悲伤,因为我失去的是一项倡议而不是伴侣。可是,唯一能让我觉得好一些的办法就是像遭遇后者而非前者一样对待自己。

我的心在计划失败后碎了——因此采用和失恋相同的方式来治愈自己是有道理的。我吃了好多糖果,抱头痛哭。我给15个人打电话寻求安慰。

因为有的时候,也许是过半的时间里,这些东西就是我的生命。当一切都结束了,这伤害还不够大吗。

所以让它过去吧。揉好饼干的面团,然后《辣身舞》。

该治愈了。

3. 因新闻媒体而哭,不如卸了这新闻 App

我们是被边缘化的——酷儿、少数族裔……这意味着消费新闻中经常会提到我们社群中的人们面对着射击、爆炸、被杀死或者流离失所。

我明白了这一点:消息灵通是觉醒的一部分。能 一。整。天 在 Facebook / Facebook / 赫芬顿邮报上查看关于战争、自然灾害和私刑的新闻的朋友在我这儿数不清。

因为我们现在能做到这一点了。感谢互联网本网(

但那对我们的心理和身体都有负面影响。新闻对你有害。我不是开玩笑,它有毒。

根据 Rolf Dobelli 的观点,

它持续触发边缘系统。令人恐慌的故事会刺激糖皮质激素(皮质醇)的级联释放,导致免疫系统紊乱,抑制生长激素的释放。 换句话说,你的身体处于慢性压力状态。高糖皮质激素水平会导致消化功能受损,(细胞,毛发,骨骼等)停止生长,神经紧张,以及易于感染。其他潜在的副作用包括恐惧,攻击性,隧道视觉和脱敏。

换言之,过多的新闻会让你和你的身体不堪重负。

这是最傻逼的:我们边缘人群每天都努力想获取更多关于我们社群的消息。

但是其中一个不幸的事实是,我们能得到的信息,全都是在确认我们正在受压迫的消息。还可能让我们生病。

我绝不是建议你圈地自萌,或者停止阅读新闻,但应该更小心地消化它。 毕竟鬼才知道我需不需要在睡前或者早上醒来之后了解下亚太岛民女性中的 HIV 暴涨率。(??)

对我有益的是,谨慎和有意识地采用正确方式获取和接受信息。因为在错误的时间读太多是有害的。因此我不再整天阅读新闻了。

我只是在中午看一下。喝完咖啡,睡觉之前(这货喝完咖啡还睡得香?译者注)。这样我有时间处理和记住的是,除了我们面对着的暴力和压迫,大批我认识和热爱的人们每天都在努力创造一个社会公正的未来。

4. 待在家里,远离那些你知道会变得很意识的聚会——(关于如何)建立团体

如果你告诉我,当我开始有政治意识时,我所有社交聚会都会讨论我本身以及我如何被排斥、被利用、对某事做得不够多(等话题),我会说 “no, thank you, okay, bye”

事实是,世界上只有很少的人是清醒的——这样的我们自然而然地相互靠近。在多数情况下,这很棒。因为拥有一个社区的一部分就是能有亲友倾听、理解、同情你的痛苦。我们相互扶持。这非常美妙。(至少)在一段时期内。

但是这也意味着我们成为了彼此唯一的,讨论从微观到宏观和其间一切事情的伴侣。这有时候有些太多了。

在过去的几年中的一些时间点上,我发现我自己在朋友间和聚会中讨论的最多的话题是——你猜到了——是压迫。比如,严肃地说,崔斯特怎么样了?

一个女孩可以玩香蕉拼字游戏并吃一些玉米片吗?

所以我现在更喜欢用下面的话:“嘿,见到你真高兴,我很感激你相信我的这个故事。但我现在可以开始谈论阶级主义/种族主义/残疾歧视/父权制。我们如果改变话题你介意吗?

因为有时候谈论压迫可能会让人筋疲力尽,而我厌倦了(这样的谈论)。因此,我自己承认这一事实,并认识到自己在谈话中的边界和局限性。

因为这个空间也是社区治愈的一个方面。我们都有权对有趣的事物、拼字游戏和或者guacamole(译者注:一种墨西哥色拉酱)说yes。

未完待续

羡慕英语好的

欢迎指正

概率论与数理统计笔记

  1. 求样本空间
    1. 连续扔一颗骰子, 直到6个结果中有一个结果出现两次. 记录投掷的次数.
    2. 连续扔一颗骰子, 直到6个结果中有一个结果连续出现两次. 记录投掷的次数.
    3. 连续扔一枚硬币, 直到正面出现, 观察正反面出现的情况.
    4. 扔一枚硬币, 如果正面就再扔一次, 否则扔一颗骰子. 观察结果.
  2. 设 A, B 为两个事件,, , ,求 , , , .
  3. 在 100, 101, …, 999 这 900 个三位数中任取一个三位数, 求不包含数字“1”的概率.
    结果数量:
    概率:

为七十五亿同胞求幸福,以尽公民之责任。

有一种相信自己的能力和愿望能突破这种枷锁 去过一辈子“青春”一样的生活
而不去回归上一代人的生活方式。
做女孩子是属于自己的未来中很关键的一部分
但是如果整个未来很绝望的不属于自己
或者换句话说 如果这个世界到时候逼迫我去回归一个“正常女性”的生活……
那何必呢
——神乐坂豆腐

这世界真可怕。这世界就是这么可怕。

还记得许多次和家人讨论的那个话题……如果这个世界都在走法西斯主义路线……还要不要抗争。
“有人选,凭什么不能当?”“希特勒也是人民选上来的。”“希特勒能让德国人民过上好日子,能让每个德国家庭开上甲壳虫,你能吗?”(非原话)

有时候御坂自己也会怀疑,御坂作那么多死,是为了什么。
难道是为了在讣告上写上“革命的一生战斗的一生”吗?
那和“文正”“忠武”有什么区别啊。
一个真正的唯物主义者怎么会信这种东西呢。

如果说有的人牺牲生命去完成某种事业……人死了真的能带走回忆吗?那一定是想要给这个世界留下些什么吧。

被剥削被压迫的阶级,如果不同时使整个社会一劳永逸地摆脱 任何 剥削、压迫以及阶级差别和阶级斗争,就不能使自己从进行剥削和统治的那个阶级的控制下解放出来。——马、恩《共产党宣言》

人的本质不是单个人所固有的抽象物,在其现实性上,它是一切社会关系的总和。——马克思《关于费尔巴哈的提纲》

从这个意义上讲,就算人类被某种继承了人类文明的人工智能之类的东西所替代……也不能算人类社会的灭亡吧。

我们必须明白,人类在宇宙漫长的时间过程里终究是个匆匆过客,指不准什么时候就被各路大大给作死了。这是最好的时代,也是最坏的时代——资本主义社会发达的物质文明,真的能在社会主义社会中延续下去吗?我们是否真的必须面对三百年以上的自然灾害?——但是有一点是可以肯定的,资本主义社会终究有它的尽头,接替它的也许并不是社会主义,而可能是野蛮状态。

这么说还是有些宿命论了。也许自我奋斗在历史的行程面前就像是螳臂当车,可是螺旋上升着的历史究竟是站在谁的一边呢?

善良与凶恶相对的时候,前者显得是多么稚弱而后者显得是多么强大呀。……然而人们还是喜欢善良、欢迎善良、向往善良。——王蒙《善良》

我永远站在鸡蛋这一边。——村上春树

如今,资本主义民族国家的掌权者再一次发动法西斯蒂的潮流,那钢铁洪流更是对人民诉说着自己的骄傲。
哦,不过是当权派续命的手段而已。
“为了强大的祖国”,各路牛鬼蛇神都被搬出来了:乡贤、国学、女德、自信、文化、传统、宗教、邪教……每一个词汇都象征着旧时代想要给人民传达的恐惧。

可是人民很快就将不再恐惧了。只要我们努力。

御坂大概是希望,并且愿意尽自己的一切努力,去活成一盏明灯——就算有一天熄灭了,也至少照亮过这个世界。

敵なんぞ、怖がらず。学べば、戦う!——周郁辉《中国少年先锋队队歌》

中国将废除国家主席连任限制

出处:《晨星》,即原大不列颠共产党党报《工人日报》

中共中央委员会预计于本周举行投票,废除现时禁止“连续超过两届”担任国家主席或或国家副主席的规定。

中央委员会自明天起举行为期三天的会议,研究政治局常委会提出的删除该条款的建议。这将会允许现任主席习近平将任期延长至2023年之后。

中央委员会也有可能支持政治局“将‘习近平新时代中国特色社会主义思想’纳入宪法”的提案。这一思想将被添加到现有的马克思列宁主义、毛泽东思想、邓小平理论、三个代表重要思想和科学发展观之后。

新华社表示,中央将召开会议,讨论党和国家机构体制改革方案、国家经济和社会发展情况,并提出国家和和全国政协领导职位候选人。

根据新华社的声明,政治局认为党和国家机关的现存结构不足以满足“新时代”多项任务的需求。

新华社说,党要下定决心解决体制性障碍,充分发挥中国社会主义制度的优势。

党的领导层表示,中国将继续采取积极的财政政策和稳健的货币政策,以实现2018年的经济和社会发展目标。

那么,我就想问一句:习先生连任好不好啊?

China-DRM PDF 文件破解

御坂的高中同学 Schwoel Lue 今天来找御坂,说有一套题库是 exe 封装过的 pdf,只能看,无法复制出来。他发来了自动生成的机器码和供应商以此发出的密码,但在御坂的电脑上机器码不同,仍然无法打开。

御坂先是用 Process Explorer 导出了一个 dump,再用 /bin/strings 命令查看,发现其中有 china-drm.ini 字样。故上网搜索破解方法。

找到教程之后,御坂照着用 OllyDbg 打开,却根本找不到字符串 -00000000
后来怀疑到可能是加壳了,但御坂怎么可能会脱壳啊!

御坂就在硬盘里找文件,当然是一无所获——但却发现了一个只有两个 ini 的 C:\china-drm 文件夹。回想第一次运行弹出的对话框,御坂决定删除这个文件夹试试。
删掉这个文件夹,安装 Adobe Reader 的对话框会再次弹出,此时在 OllyDbg 中点暂停,再按照上述教程的步骤操作,即可修改机器码。

改掉机器码之后输入密码,文件可以在程序中打开,却不能复制。这时可以用 Shadow Copy 将看着差不多的临时文件 C:/Users/username/AppData/Local/Temp/随机字符串.tmp 复制出来,修改扩展名为 pdf 就可以了。事实上,在他的电脑上,就算不执行上述的操作,直接用 Shadow Copy 也可以导出 PDF……