• MIPS 实现指南(零) -- MIPS 简介

    | /

    MIPS 是一种极为优雅的 RISC 体系结构,对后世的体系结构影响深远。在后续 DEC 公司的 Alpha 以至于当前炒得火热的 RISC-V 中,我们都可以看到 MIPS 的影子。尽管 MIPS 的优雅设计不能使它在商业市场中长盛不衰,但其处理器总是能在保持简洁设计的同时获取极为高效的性能。

  • Go 语言系统调用

    | /

    64位 Linux 上的系统调用

    系统调用是操作系统内核提供给用户空间程序的一套标准接口。通过这套接口,用户态程序可以受限地访问硬件设备,从而实现申请系统资源,读写设备,创建新进程等操作。事实上,我们常用的 C 语言标准库中不少都是对操作系统提供的系统调用的封装,比如大家耳熟能详的 printf, gets, fopen 等,就分别是对 read, write, open 这些系统调用的封装。使用 ltrace 来追踪调用就可以清楚地看到这一点,例如:

  • CS:APP Lab 3 解题报告 - 64位

    | /

    CSAPP 的 Lab 3 在第三版之前都是所谓的 Buffer Lab,而 CSAPP 第三版的配套 Lab 3 则是 Attack Lab。因为我们学校新开的计算机系统基础课可能要以此为实验,故再来重新感受一番。该 Lab 的实验流程与 Buffer Lab 基本相同,我们直接开始。本次实验笔者使用的环境为 Ubuntu 18.04。

  • 数字逻辑 - 组合电路:小型设计 笔记

    这一章介绍的是设计小的组合电路时候的设计方法。

    信号命名标准

    对于一个信号,如果逻辑 1 表示有效,逻辑 0 表示无效,不活跃或者禁止的话,我们称此信号为高电平有效的,通常我们使用不带任何前缀或者后缀的名称来表示一个高电平有效的信号;如果逻辑 0 表示有效,逻辑 1 表示无效,不活跃或者禁止的话,该信号就是低电平有效的,我们一般使用带有下划线的名称来表示低电平有效信号。

    对于单个信号,我们通常使用小写来表示,对于多个则一般用大写字母。比如 x,X, _x , _X分别定义了单个/多个 高电平/低电平信号。

  • 手撸调试器(1) —— 载入 inferior

    | /
    • { C }

    近几天放假无事可做,便开始翻 Linux 中国的微信公众号找乐子,在他们的推送里,我发现了这篇文章,看完后有了想要自己写一个玩具调试器玩玩的想法。于是就有了这个系列的文章。

    在正式开始写调试器之前,我们先要了解下 inferior 的概念,在 gdb 里面,inferior 表示的是被调试的东西。它可能是一个进程,可能是运行在一个虚拟机上的内核,也可能是运行在通过各种方式与这台计算机连接起来的远程设备上的进程。我们要写的调试器的作用,就是帮助用户检测程序的错误。我们在本系列文章中实现的调试器大致支持的功能有如下几个:设置断点、暂挂已启动的程序、单步执行代码和检查变量的内容 —— 这几个功能也是我在使用 gdb 时候常用的几个初级功能。

  • 使用正则表达式匹配 3 的倍数

    | /

    北邮的考试周,与别处是不同的。都是近两周的时间,经常穿插着空挡,预备着可以随时抱佛脚。复习的人,傍午傍晚复习崩溃,每每花四十分钟,拿出手机 —— 这是十年前的事情,现在根本没有这么多时间。 —— 在教室做着,热热的玩了休息;倘肯多花一小时,便可以水一水群,或者看一看知乎,做精神娱乐了,如果歇到八九个小时,那就能回一趟宿舍,但这些学生,多是害怕考试挂科的,大抵没有这样阔绰。只有做学霸的,才踱进教室西边的宿舍里,拿起电脑,慢慢地玩游戏。

    我从十七岁起,便在校内的计院当学渣。在考试周周末下午歇息时,看到了一个有趣的网站。便顶着要挂科的压力,好好地把玩了一番这个网站。网站的问题大抵是很常规的正则表达式的问题,但其中的 Triples 很有意思,题意大概如下:

    使用正则表达式匹配出全部 3 的倍数。

  • CS:APP Lab 4 解题报告

    | /

    CSAPP 的第四章《处理器体系结构》大多讲述的是 CPU 的实现,比较偏硬件。大约也是这个原因,很多高校在选用此教材讲述计算机系统导论课程时会直接跳过这一章。与之配套的 Lab 4,Architecture Lab 则更是无人问津。我趁着考完期中的空闲时间,花了近一天时间啃了下第四章,并顺便做了个下这个 Architecture Lab。

    Architecture Lab 的主要目标是修改一个 Y86-64 汇编程序写就的函数 ncopy 以及我们使用的流水线 CPU 的 HCL 代码,使之在我们的 Y86-64 处理器上的效率尽量高(CPE(Clocks Per Element) 尽量小)。在这个任务之前,有两个小的任务来帮助我们熟悉相关的操作。

  • 详解并查集(基础篇)

    |
    • { C }
    /

    简介

    并查集是一种树型的数据结构,用于处理一些不相交集(Disjoint Sets)的合并及查询问题。不相交集,顾名思义,就是交集为空集的一些集合。比如集合 {1,3,5} 和集合 {2,4,6} 就是不相交集。 {2,3,5} 和 {1,3,5} 就不是,因为他们的交集不是空集。该数据结构由Bernard A. Galler和Michael J. Fischer于1964年提出。

    对于并查集,主要有如下操作:

    1. 合并两个集合(“并”)

    2. 判断两个元素是否属于同一个集合。(“查”)

  • 使用 C/C++ 模拟 defer 关键字

    | /

    笔者在翻译完 这篇文章 以及同系列的下一篇文章(尚未发布…)后,受到了 ESR 大神的鼓舞,遂决定在寒假学习一下 Go 语言。在学习 Go 语言的过程中,觉着这语言和之前学到的 C/C++ ,Scheme 相比有着无法比较的简洁感。笔者尤其喜欢 defer 这一关键字的设计。于是就在今天尝试使用 C/C++ 模拟了下 defer 关键字。

    ---- 某咸鱼的碎碎念