首页 Home.

  • 自制操作系统(28):TCP(五)——HTTP、TELNET TCP栈这么有用的东西,不好好利用岂不是浪费了? HTTP源码获取 我们可以获取HTTP源码!现在有了TCP框架的加持,HTTP协议本身的支持并不是什么特别难的事情。 while(1) { int ret = poll(fds, 2, -1); // -1 = 无限等待 if (ret < 0) { break; } if (fds[0].revents & POLLIN) { int n = read(0, buff, sizeof(buff)); buff[n - 1] = '\0'; if (n <= 0) […]

  • 最近由于工作需要去考了个托业。 去深圳的经理大厦考点考的,考前模拟了两套ABCEED,能拿个950左右,考完预期也是950分,但是成绩出来结果就刚好上900多。 有点纳闷,怎么阅读成绩比预期低这么多?感觉没有啥特别难的题啊。去小红书看了一圈,发现大家都说阅读比预期低?不清楚发生了什么。总而言之,也够用了。

  • 自制操作系统(27):TCP(四)——关闭连接 今天我们来实现连接的关闭。 关闭连接是所谓的“四次挥手”,简单来说就是: A:我发完了(FIN)。B:好的(ACK)。(一会后)我也发完了(或者“好的,我也发完了”,FINACK) A:好的。然后这个时候两方都会进入一个TIME_WAIT的状态,等待一段时间之后,再销毁TCB。 主动关闭 主动关闭会发FINACK,然后把自己的状态转入FIN_WAIT_1,这代表我们已经完成了数据发送,并在确认对方是否已经了解这一情况,而一旦收到来自对方的ACK,那就可以再把状态转入FIN_WAIT_2,代表对方已经知道我们不会发数据了,并且正在等待对方把它那边的 […]

  • 自制操作系统(26):TCP(三)——接发数据 今天我们来实现TCP接发数据。 用户态 pollfd fds[2] = { { .fd = 0, .events = POLLIN, .revents = 0}, // 标准输入 { .fd = conn, .events = POLLIN, .revents = 0 } }; char buff[256]; while(1) { int ret = poll(fds, 2, -1); // -1 = 无限等待 if (ret < 0) { break; } if (fds[0].revents & POLLIN) { uint32 […]

  • 自制操作系统(25):TCP(二)——三次握手(被动) 在上一节,我们踏上了TCP旅程的第一步,实现了通过三次握手主动创建TCP连接,这一节,我们要实现被动的三次握手。 目标态 老规矩,我们先来实现目标态的用户程序tcp-server: #include <net/net.hpp> #include <net/socket.hpp> #include <file.h> #include <stdio.h> #include <format.h> #include <stdlib.h> #include <poll.h […]

  • 自制操作系统(24):TCP(一)——三次握手(主动) TCP是非常复杂的一套协议,其实我很担心凭借我多年前贫瘠的计算机网络课程知识能不能挺下去,但是无论如何,让我们先乐观地开始吧。 什么是TCP? IP层是不可靠的,不保证送达,不保证顺序,不保证不重复发送。为了在这样一套不可靠的底层协议上面去做一层可靠的传输,前人想了很多办法,归纳出了几个比较重要的点: Basic Data Transfer 基础数据传输 Reliability 可靠性 Flow Control 流量控制 Multiplexing 多路复用 Connections 连接 Precedence and Security 优先 […]

  • 自制操作系统(23):SocketFS与Ping应用程序 我们今天要把我们做的网络栈的一部分接口通过SocketFS暴露到用户态。 目标态 虽然我们现在眼中只有ICMP,做SocketFS不免眼光狭隘,会做出一些让后面的我们很为难的早期设计,但这正是理解何为”正确设计“的过程!相信现在就给我们一套标准,告诉我们就这么做,以我们现在的眼光,虽然会接受这个标准,但是也不知道为什么这么做吧!所以我认为,按我们的想法先做一套出来,后面再根据需求优化是很有必要的。所以,我们自上而下,先做一个用户态的ping出来: #include <file.h> #include <stdio.h& […]

  • 自制操作系统(22):IP、ICMP与重构 在上一节,我们实现了rtl8139网卡驱动,并用它实现了对ARP协议的支持,我们的操作系统在某种程度上具备了网络通信的能力!但是,我们的通信能力到现在位置还仅限于局域网内,而IP协议的适配可以使我们摆脱局域网进行数据传输。今天我们就来适配IP协议,并再基于IP协议来适配ICMP,并实现一个用户程序——PING。 IP IP协议的实现可以使我们摆脱局域网进行数据传输。既然IP属于网络栈的一部分,那它也有属于自己的报文格式: 这里面有很多的字段,但是我不打算逐一解释,网上有很多相关的资料,在查阅资料时,我们可以忽略区分服务、可选选项这两个字段,因为这些字 […]

  • 自制操作系统(21):rtl8139网卡驱动(下)- 中断处理与ARP支持 我们先接着写驱动来实现一个获取MAC地址的函数。 获取MAC地址 获取MAC地址也是读取网卡驱动的某个寄存器。RTL8139 的 MAC 地址存储在 I/O 端口偏移 0x00 ~ 0x05 处,直接逐字节读取就行: static void get_mac(uint8_t mac[6]) { for (int i = 0; i < 6; ++i) mac[i] = inb(io_addr + i); } 我这里还多做了一步,把这个网卡的mac也包了起来: static int nic_mac_read(char* […]

  • 小时候玩的盗版"中文游戏 300 合 1"里,超级马里奥的城堡关卡总会响起一段诡异得像恐怖片的"胜利音乐"。这段让无数 80、90 后难忘的童年阴影到底是怎么来的?本期通过 ROM 比对和 6502 反汇编,一步步定位到了真正的元凶——原来那段音乐,其实是盗版厂商塞进去的选关补丁代码,被 APU 当成乐谱"演奏"了出来。
    涉及内容:NES ROM 结构 / PRGROM 与 CHRROM / 6502 汇编 / NMI 中断 / APU 声道 / 盗版卡带逆向