CSAPP 第二章笔记
写在前面:这是一个很有意义的一节课,在哈佛大学的CS50X计算机入门课后,这是对二进制数值系统更加深入的一门课。
大量计算机的安全漏洞都是由于计算机算术运算的微妙细节引发的,也有是对于数值范围的不了解和不负责引发的。波音 787 的电力控制系统在 248 天电力不中断的状况下会自动关机,这是由于其使用了32位整形Integer,248天的来源是因为一个int的最大值是2147483647,2147283647 / (60 60 24) = 248.55天,这就是bug的来源(一个不小心,bug又多一个。当然,知道怎么避免bug,随手写点小bug也就很顺理成章了,详情请见防御性编程)
信息存储字数据大小为什么现在大部分系统的一个字节是8个比特?你是不是觉得这是理所当然的?【伯克利CS61C】计算机架构的伟大思想 (RISC-V基金会主席Krste亲自授课)这门课上就有人问了这个问题(CS61ABC系列也是UCB的神课,有空可以去看看),教授指出:最终决定一个字节大小是8个比特的,是1964年出现的大名鼎鼎的 IBM System/360,当时IBM为System/360设计了一套 ...
《操作系统概念》第九章笔记 1
引入 | Introduction「进程的代码等数据必须在内存中」,这是因为 CPU 只有能力访问内存,而并不能访问磁盘。但是,在上一节的末尾我们提出了 swapping 机制,这一机制允许我们把那些在 [[main memory]] 里放不下的内容交换到 disk 里。这一机制其实扩展了「内存」的概念:在这种机制的支持下,我们并不需要顾虑内存的实际大小;物理内存和用于交换的磁盘空间一并被用来提供「内存」的作用,也就是给操作系统提供按照地址访问内存单元中数据的能力。然而,虚拟内存的实现并不容易,使用不当可能会降低性能。
背景 | Background虚拟内存将用户逻辑内存与物理内存分开,使得编程更加容易,不用关注具体的物理地址(关注了也没用,每次都不一样)。虚拟地址空间就是进程如何在内存中存放的逻辑,物理地址按帧组织,并且分配给进程的物理帧也可以不连续,需要 内存管理单元(MMU) 将逻辑页映射到内存的物理页帧。随着动态内存的分配,允许堆向上增长,同时随着子程序不断调用,允许栈向下生长。下图是采用虚拟内存的共享库,这样做可以有效加快内存的访问速度。
请求调页 | Demand Pagi ...
《操作系统概念》第八章笔记 1
背景 | Background硬件 | Basic HardwareCPU 根据 PC (Program Counter) 的值从内存中提取指令。CPU 可以访问的通用存储只有内存 & 寄存器,因此想要访问数据,要先移动到内存上。对 registers 的访问通常可以在一个 CPU 时钟周期中完成,而完成内存的访问可能需要多个时钟周期。在这些时钟周期里,由于没有用来完成指令的数据,这会引起 stall(暂停,抛锚)。为了补救,我们在 CPU 芯片上增设更快的内存,称为 cache (高速缓存)。确保每一个进程都有单独的内存空间且不相互影响,通过两个寄存器base registers 和 limit register 指定范围的大小。
地址绑定 | Address Binding程序作为二进制文件存放在磁盘上,进程在执行时可以在磁盘和内存之间移动。源程序中的地址通常是用符号表示(symbolic, 例如各种变量、函数名;汇编中的 label 等);编译器会将其绑定到 relocatable addresses,即相对于某一个段/模块等的偏移。链接器或加载器(linker / lo ...
《操作系统概念》第七章笔记 1
堵车就是一种死锁,这时候谁倒车就是一个问题。
死锁的特征发生死锁时,进程永远不能完成,系统资源被阻碍使用,以至于阻止了其他作业开始执行。下面是一段互斥锁的死锁代码123456789101112131415161718192021222324252627/* 创建互斥锁并初始化 */pthread_mutex_t first_mutex;pthread_mutex_t second_mutex;pthread_mutex_init(&first_mutex, NULL);pthread_mutex_init(&second_mutex, NULL);/* thread 1 在如下进程中 */void* do_work_one(void *param){ pthread_mutex_lock(&first_mutex); pthread_mutex_lock(&second_mutex); pthread_mutex_unlock(&second_mutex); pthread_mutex_unlock(&first_mutex); ...
《操作系统概念》第六章笔记 1
跳过了第四章:多线程编程 和 第五章:进程调度的内容,因为感觉这些内容更像是工具书,因此暂时略过。可能在后续学习过程中会进行重新学习。
临界区问题通俗的讲, 临界区就是可能会同时被两个及以上的进程执行的代码区块临界区问题就是有可能两个进程同时对该代码的内存进行了修改,但是由于汇编语言的执行存在先后问题,可能导致多种运行结果发生。临界区解决的方案应满足如下三条要求:
互斥:如果进程 P 在临界区内执行,那么其他进程不能在其临界区内执行
进步(progress):书上的翻译是这个,其实更好的意思是空闲让进:如果没有进程在其临界区内执行,并且有进程需要进入临界区。那么只有那些不在剩余区内执行的进程可以参加选择。
有限等待:从一个进程做出进入临界区的请求知道这个请求允许为止、这三个要求也是证明一个方法能否解决临界区问题的证明手段。Peterson 解决方案这是一种基于软件的解决方案。Peterson 解决方案要求两个进程共享两个数据项 int turn; bool flag[2];12345678910do{ flag[i] = true; turn = j;//j表示另一个进程 ...
数据结构实验题代码
一元多项式的求导P.S. 最后一项还是输出空格了,没做实验题要求的最后一项后不输出空格解决方法很简单:最后输出一个\b就解决了,即回退一个字符。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include <stdio.h> #include <stdlib.h> #include <iostream> struct Node { int data, pow; struct Node* next; }; int len = 0; void insert(struct Node** head, int data, int pow) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; n ...
当年琵琶树下
749d76bb5a0b7c75e79c636a92f7c347b1b44da5b39c389c7ae70ad8d6ffeac70118cfbfc5893e044b901df780a90edf1a1d8559872b10a584a0611af8184365636f3faf1aade3191b8fcd1708badd4cabf412be1144681a0e9968e5b1c8b5db9a28a9cce877747b8fb49200cd2264a075ecf073c4e02bd44e3152e5aff74faad470ce17e77888fa73d5c1a5a6202f9d2f119ed9603f0815c04190d08dd1b0f0c974ffe0b171b19935e36179b2f4504191979f8e9ab578afeff4fd07419e5236581e75c4b65b4cbb630d04ba1ce14d643a5125c537ae8860004812f1a97f9193c2d7fcb3b4efbf0d73cea95ee53e939b3422c70fb6b845c03 ...
2023 纳新赛 部分 WP
Misc来都来了Ctrl C + Ctrl V 即可
尊嘟假嘟尊嘟假嘟O.o (zdjd.asia)Ctrl C + Ctrl V 然后丢到这个尊嘟假嘟翻译器里面就可以了这玩意挺好找的,抖音上随便搜搜到处都是
1flag{zun_du_jia_du}
表情包,嘿嘿看似毫无头绪,实则这个东西其实是base 100 加密,题目里也有提示,base 家族嘛BASE100编码解码 - Bugku CTF
顺便如果 edge 浏览器复制粘贴失败了,换个 PDF 阅读器就行,火狐都比这玩意好使。1flag{WelcOm3_to_CTF}
兽语简单的兽语加密,网上随便找个兽语加密解码器就可以了兽音译者在线编码解码 - 兽音翻译咆哮体加密解密 (iiilab.com)
1flag{y0u_Ne3d_4_good_fr1end}
目前为止都是送分题的范畴,主要是通过简单的解码激发对于 CTF 的兴趣。
文王八卦通过八卦和次序,提示了应该是从八进制作为入手点,按照给定次序从0开始依次给八卦编号,从而转换成8进制,然后将其对应 ASCII 码打出即 ...
《操作系统概念》第三章笔记 2
进程间通信方式进程间通信有两种模型,一种是共享内存,另一种是消息传递,两种模型在操作系统中都十分常见。
POSIX 共享内存什么是 POSIXPOSIX(Portable Operating System Interface for Computing Systems)是由IEEE 和ISO/IEC 开发的一簇标准。该标准是基于现有的UNIX 实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。所以从某种程度上 POSIX 就是一个标准接口。为了便于程序员们在不同的操作系统上移植代码。
关于 IX 的来源由于 GNU 不是 Unix,而它的目的是取代 Unix,我不希望人们把 GNU 称为 “Unix 系统”。因此,我提出了一个人们可能真正使用的简洁的名字。在没有特别灵感的情况下,我用了一种很笨的方式取了一个名字。我取了 “可移植操作系统” 的首字母并加上 “ix”。IEEE 马上就采用了这个名字。——Richard Stallman
函数解释shm_open()shm_fd = shm_open(name, O_CREAT | ...
《操作系统概念》第三章笔记 1
进程概念进程程序本身不是进程,程序只是一种存储指令的文件,是静态的,相反,进程本身是动态的。进程不是执行的程序,进程不只是程序代码,进程还包括程序计数器,堆栈,数据段等进程本身可以作为一个环境,用于执行其他代码(比如Java的JVM)
进程状态进程在执行时会改变状态,取决于进程的当前活动,状态如下(进程的五态模型)
new :创建进程
running: 执行进程/指令
waiting:进程等待发生事件(比如IO信号),也叫阻塞状态
ready:进程等待分配处理器
terminated:完成执行进程控制块操作系统内的每个进程表示,采用进程控制块(Process Control Block, PCB),也称为任务控制块,它包含了许多与特定进程的相关信息
进程状态:上面的进程五态模型
程序计数器:进程将要执行的下个指令的地址
CPU寄存器:寄存器的数量与类型取决于计算机体系结构,存储了许多进程的信息包括累加器,寄存器,指针等。这些状态使得进程在中断后能够正确的执行
CPU 调度信息:包括进程优先级,调度队列指针等
内存管理信息:
说明信息(accounting information):使 ...