御坂网络司令塔
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)用于堆和栈 设置栈指针 将 .
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地址分类: A类1.0.0.0~127.255.255.255 B类128.0.0.0~191.255.255.255 C类192.0.0.0~223.255.255.255 D类224.0.0.0~239.255.255.255 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 标志位 URG: 紧急指针有效,表示此报文段包含紧急数据,应优先传送 ACK: 只有 ACK=1 时确认号才有效,ACK=0 时确认号无效 PSH: 尽快把数据交给接收应用,不等到缓存填满 RST: 复位,连接立即释放 SYN: 同步,表示这是一个连接请求或连接接受报文 FIN: 终止,表示此方向的数据已发送完毕,释放连接 三次握手 C->S, SYN, seq=client_isn S->C, SYN+ACK, seq=server_isn, ack=client_isn+1 C->S, ACK, seq=client_isn+1, ack=server_isn+1 四次挥手 主->被,FIN, seq=u 被->主,ACK, seq=v, ack=u+1 此时被动关闭方仍可以继续发送数据 被->主, FIN+ACK, seq=w, ack=u+1 主->被,ACK, seq=u+1, ack=w+1 端口号 知名:0~1023 注册:1024~49151 客户端使用:49152~65535 TCP面向报文段,UDP面向报文 UDP伪首部包括: IP首部。源地址,目的地址,填0,协议(17/0x11表示UDP),UDP长度 UDP首部。源端口,目的端口,数据长度,校验和(填0) 数据。 socket 由 IP地址 和 端口号 两部分构成(TCP 连接包括两个套接字) 以太网的5-4-3规则: 总线型网络,整个网络:5个区段,4个中继器,只能有3个区段含有PC 使用集线器的星型10BASE-T网络,两台PC间:5段网线(集线器之间、集线器到PC),4台集线器,3台集线器连PC
以前每次在 virtio 磁盘上安装 Windows,都会遇到 0x80300001 错误,说无法将 Windows 安装到此位置。所以御坂一直是采用如下方法来 workaround 这个问题:
先将磁盘类型设置为 SATA,正常安装。 添加一块 virtio 磁盘,并安装驱动程序。 把系统盘设置为 virtio,第二步生成的磁盘可以删除。 结果今天查了一下,发现真正的错误是那个报错:它应该提示更换光盘,而不是无法安装。 此时只需要将 virtio-win.iso 弹出,放入启动时的系统安装盘即可。