新手学电脑,请多多指教。
大学前三年的流水账
首先在开头提醒未来保研的学弟学妹,一定要通过提前联系一些学校的老师给自己有个定位,特别是在大一的时候因为竞赛或者种种原因没有取得高绩点但是专业能力较强而在Rank上无法体现的同学。而保研签卖身契如果自己不打算鸽一定要非常非常慎重。 自己的经历从大一说起。 大一 大一的时候对计算机领域研究了解太少了,看大家都在卷AI以为科研就只有AI相关,但自己又特别不喜欢这个方向,于是当时对保研的想法就是能保就读个划水专硕混学历,若不能保就直接去大厂。然后大一上进来期中考试高数还考了班上120多人内的第3名,就觉得自己没必要把绩点卷成这样,当时恰好自己对高中的OI生涯结果不满意(NOIP省一),于是大学便想继续在ICPC/CCPC(以前称为ACM竞赛)完成自己的遗愿,随后就把重心放在了这些比赛上。 然后很快,大一后半学期在学业上开始摸鱼,竞赛训练倒是更加频繁了,期末考也远没有期中考那么好了,特别是历史课和英语课因为没重视加上自己本来不擅长拖了很大的后腿,最后那个学期大概排名刚好20%。 然后到了大一下,又开始揽了更多的比赛并在自己加入的组织承担了更多的工作。后来有一件事情彻底改变了学习的状态。当时给那届CQUPC(重庆大学程序设计大赛)编写了Web报名系统以及负责了群发短信通知的工作。结果当时需要群发短信通知的日子刚好是比赛前一天晚上,而当时恰好高数老师需要补进度连补了四节课,而我当时给那个比赛编写的群发短信脚本又出了问题,在上课时间一直在折腾这事情,但毕竟当时就得通知到,无论如何都得发出去,最后原因在于被运营商限制了,找了客服解决,但后果是我落下了一晚上的高数课。 至此以后,我高数课就再也听不懂了,而当时各种比赛的压力也日益繁重,当时除了*CPC的日常训练外还报名参加了一个微信小程序的比赛,导致各种压力在一起一直没有挤出时间补上那一晚上落下的高数课,于是过上了抄作业的生活。结果在期末考前三周,连续参加了CTF校赛、ICPC南昌邀请赛、四川省大学生程序设计竞赛,还在那个时间赶工交了微信小程序作品,结果期末复习也真的来不及了,最后那个学期绩点非常惨,四分制GPA直接掉到2.8,感觉自己已经保研无望了。而现在回头来看,当时取得的竞赛成绩在后来都有更好的替代了。 期末结束,开始了计算机类专业分流,我们这一届也是第一届专业分流。当时教务老师明说了我们这届开始保研的时候按照全学院拉通排名,不分专业,因此大家选择专业的时候也主要跟随自己兴趣为主,但大多数人还是选择了计算机科学与技术。然后我当时报名了计科卓越班的选拔,虽然我当时绩点不高但是大一上成绩其实还行,且靠着比赛经历的加成(感觉主要是省程序设计大赛的金牌),还是通过了卓越班的选拔面试,进入了计科卓越工程师班。不过这一选择也成为了我在大三时破防的一个点,若当时没有通过,我可能选择的是信息安全。 大二 经过了绩点倒闭的大一下学期,大二就彻底对GPA躺平了,把心思全部放在算法竞赛上。当时基本每周和队友开1-2场5小时的模拟训练赛外加自己训练以及补题。最后结果还是不错的,在当年的EC-Final上拿了银牌,并且最后最难的那题三个人都有各自的贡献,也在最后10分钟评测机不堪重负等不来结果的时候我们把可能错的位置全部都改一遍,最后终榜出来发现那题过了,尽管那题不过也是银牌,但是总算是对这场比赛没有任何遗憾了。 然后大二下因为疫情在家生活节奏不太适应,又每天晚上被父母拉着出去锻炼身体占用了许多时间,所以一事无成,这个学期就到此为止吧。 唯一需要铺垫的事情是大二下的时候第一次参加了CET-6考试,因为大二上ICPC Asia EC-Final时间与CET-6冲突了,然后第一次参加也没重视就想看看当前水平,就裸考了,最后成绩是350多(具体多少忘了),总之是非常倒闭。因此就打算大三竞赛打完好好补一下英语的短板了。 大三上,突然可以单列保研 到了大三,开学的时候和室友组队参加了数学建模竞赛,结果恰好遇到了一个我非常擅长的问题,是一个图论题,然后我就拿着之前参加算法竞赛攒下的DP+网络流知识搞出了一个非常好的结果,队友也拿强化学习做了一部分,且这些算法结果好又可以把算法写的非常详细,最后我们获得了全国一等奖。按照当时已经符合学校的单列保研标准了。当时也非常高兴自己可以去混个学历了。 大三上,突然有志于系统结构方向科研 但也很快,就在这个学期,我们当时有一位助教在做操作系统的教改,把清华的uCore操作系统实验引入了我们学校,然后我当时看了指导书后对OS非常着迷。特别是把那些实验自己读代码读文档后补全代码做完以后发现自己对计算机系统的认识发生了本质性的变化,特别是搞清楚了内存管理后,开始理解了为什么像Java这样需要GC的语言在某些场景具有优势,觉得一下子思维都开阔了。于是发现自己找到了自己真正喜欢的东西,计算机底层的相关研究,或者说体系结构。于是开始有了好好做研究的想法,从曾经只想读个水专硕变成了想直博认真做研究。…
使用Debian Preseeding在无VNC控制台的虚拟机上安装Debian
起源 找学长要了一台学校的高配置虚拟机方便运行自动调参内卷机,但由于不提供VNC控制台也不提供Debian镜像,只提供Ubuntu和CentOS,且安装虚拟机内系统还得找服务器厂家的人来进行,我也不知道是啥Hypervisor,因此非常难受,就想自己折腾一下安装。 后来经过Soha指点,可以采用Debian Preseeding来进行,现在汇报研究成果。 前置技能 由于涉及到修改bootloader的配置,需要对当前虚拟机内的Linux发行版使用的bootloader有一定的了解,本文将以grub2为例。 且为了防止遇到一些问题,建议在开始之前先进行切换至root用户。 准备文件 下载当前Debian的安装内核与initrd wget http://mirrors.cqu.edu.cn/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz wget http://mirrors.cqu.edu.cn/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux 注:如果服务器并非amd64架构,例如arm64,换成对应的架构也是可以的,曾经在华为云的ARM机器上亲测成功 修改initrd 解压initrd mkdir initrd…
修改binutils在RISC-V上添加汇编指令
1. 起源 最近给学长打工做的相关研究需要对RISC-V指令集进行扩展,因此需要魔改编译器添加指令。 而RISC-V架构上做到这一点其实非常容易,官方提供了一个riscv-opcodes工具,它可以用于生成编译器所需的opcode宏来添加所需的指令。 2. 准备环境 我的实验基于Debian Bullseye发行版进行。(写这篇文章之时Bullseye还处于Testing状态) 首先我们需要编译安装riscv-gnu-toolchain. sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev…
阅读笔记《Lord of the Ring(s):基于Intel Ring总线的侧信道攻击》
Lord of the Ring(s): Side-Channel Attacks on the CPU On-Chip Ring Interconnect Are Practical 作者:Riccardo Paccagnella, Licheng Luo,…
使用CONNMARK解决Linux上源进源出问题
FWMARK是啥? FWMARK是Linux在处理网络数据包的时候给数据包加上的一个标识,我们可以根据fwmark配置不同的转发规则。 作用域 FWMARK作用于单个数据包。 比如我们可以采用ip rule add fwmark 0x1234 lookup 456这样,让被mark为0x1234的数据包查询路由表456出去。 由于FWMARK是针对单个PACKET而言的,因此在下文中我们所指的Packet Mark与这里的FWMARK相同。 如何给出去/进来的数据包设置FWMARK? 如果要对服务器外出连接设置fwmark,可以使用socket,可以通过setsockopt来设置数据包的MARK,详见这里。 如果要对于某个Wireguard网卡的流入数据包设置fwmark,可以使用wg set $WG_IFACE…
GDB Watchpoint在x86、MIPS、ARM上的实验与MIPS Illegal instruction
MIPS上遇到的glibc的坑 最近突发奇想可以用硬件提供的Debug功能来做一些简单的安全防护,于是进行了一个小实验测试在不支持硬件Debug的平台上设置GDB的Watchpoint带来的性能影响。但是在MIPS平台上测试的时候遇到了一个小问题。 首先将测试程序通过mipsel-linux-gnu-gcc在其它平台上交叉编译,只添加-static -g用于使用静态编译以及开启调试,并在x86上使用qemu-user-static测试通过,然后通过sftp传到MIPS平台上(手边除了FPGA的软核只有一台使用mt7621CPU的路由器为MIPS架构硬件,因此选择了我的路由器作为实验环境),结果发生了以下一幕。 root@OpenWrt:/tmp/gdb-perf# file a.out a.out: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV),…
基于块设备的Linux内核内存监视模块
就在完成了支持Linux 5.10的ramdisk驱动模块后不久,突发奇想,既然之前提到Linux内核模块之间地址空间是完全共享的,那么可以编写一个模块,通过块设备驱动的方式来直接对内存进行读写。 因此,我便对之前块设备驱动的代码做了些许改动,编写了一个新的模块,名为spy。 于是我便尝试从新的模块对之前的ramdisk模块进行一个数据盗取。 获取数据的地址 Linux内核本身提供了一个查看内核符号的接口,位于/proc/kallsyms,我们只需要将它cat出来然后用grep选择我们所需的数据即可。 $ sudo cat /proc/kallsyms | grep myramdisk ffffffffc0bd8024 r _note_7 [myramdisk] ffffffffc0bd7000…
自己动手写支持Linux 5.10的ramdisk驱动模块
major与minor 首先,我们需要了解Linux下块设备的major与minor的概念。 对于Linux用户,可以尝试执行在自己的电脑上执行一下ls -l /dev | grep -E 'nvme|sd。输出大概会长这样: crw——- 1 root root 250, 0 Mar 9 13:25…
Linux内核调试环境的搭建 QEMU+GDB
最近在折腾Linux内核,但是折腾调试环境以及修改内核的编译选项就折腾了我一晚上的时间。 我使用的调试环境包括: QEMU(用于软件模拟系统执行环境,方便对硬件各寄存器等状态进行调试,为了方便起见,这里使用x86_64环境) GDB 以下是我的折腾步骤: Step 0. 安装必要工具 需要确保你已经有以下软件包(对于Debian/Ubuntu): build-essential gdb qemu-system-x86 rsync(用于带权限的文件复制) 如果你采用其他发行版,可以参考对应发行版的相关Wiki,以及使用软件包管理器的搜索功能。 Step 1. 准备内核 Substep…