CS:APP第六章学习
开始学 CSAPP的第六章
逐步更新:
2023-1-15:开始写
2023-1-18:补完第二小节
2023-1-19:写完第六章!
梗概跟平时理解的差不多,层次存储,越靠近 CPU 的存储器读写速度越快,造价越贵,容量越小。
这里还举了一个例子:如果你的程序需要的数据是存储在CPU寄存器中的,那么在指令的执行期间,在 0 个周期内就能访问到它们。如果存储在高速缓存中,需要4~75个周期。如果存储在主存中,需要上百个周期。而如果存储在磁盘上,需要大约几千万个周期!
因此,为了考虑程序的性能,我们按照访问的频率,让数据在存储器中依次排好,以便于 CPU 能更快的访问到它需要的数据。
存储技术随机访问存储器随机访问存储器(Random-Access Memory,RAM)分为两类:静态的和动态的。静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多。
SRAM它的每一位存储单元都是双稳态的,特性就是:可以无限期地在两种电压模式下保存,其它任何电压的状态都是不稳定的。
这里给了一个图,描述了这个特性:
只有倒向左边或者倒向右边两种状态是稳定的,其余状态均不稳定,如果出 ...
游戏安全的学习(2)
游戏安全的学习(2)—— 利用Windows API 操作游戏窗口,和扫雷游戏分析。
先定个小目标,实现以下功能:
透视,炸弹不炸,时间暂停,一键扫雷等等
句柄句柄(handle)是Windows操作系统用来标识被应用程序所建立或使用的对象的整数,可以理解为内核有一张句柄表,我们打开获得的句柄得到的是句柄表的偏移值。
特定的,窗口句柄叫 HWND。我们可以通过 VS 的工具选项中的 SPY++
去找到窗口的标题,句柄和类等等信息。
获取窗口句柄使用 API FindWindow 即可,我们需要给定两个参数,第一个参数为 Class Name,第二个参数为 Window name,应该是标题。我们可以给第一个参数传 NULL 一样能成功获取窗口句柄。
设置窗口标题使用 SetWindowText 就可以了,第一个参数为窗口句柄,第二个参数为要修改的标题。
然后我们来搞搞扫雷。
12345678#include<windows.h>#include<iostream>int main() { HWND hwnd=FindWindow( ...
游戏安全的学习(1)
游戏安全的学习(1)—— CE 的基本用法
开始学习游戏安全了,后续跟着队爹搞 O 去。
Cheat Engine简介说到游戏安全就不得不提这个软件了,这个软件本质是一款内存调试器,但是它对内存搜索的便捷特性使得它很容易修改游戏的某些数值,成为入门游戏安全必备的一个软件。
CE练习关卡CE 它内置了很多小游戏帮助我们快速入门 CE 这款软件,基础练习就不说了,我们直接来到游戏修改的这几关。可以在安装目录下找到 gtutorial-i386.exe 这个程序,这就是我们的练习关卡了,有三个经典的小游戏让我们修改。
第一关一个射击游戏,那边有一个靶标,我们需要摧毁目标,提示说了,每射击五次目标会回血并且立刻处于无敌状态,并且是在第五发子弹射出去的瞬间生效,正常过关我们是很难的,那就考虑修改靶标的血量,找到这一块内存。
因为不知道伤害和血量,所以首次搜索使用未知的初始值去搜索,搜索类型为 4 字节。
每射出一发子弹打到目标,就搜一次减少的数值,如果四次打完还没有找到合适的值,那就打出第五发子弹然后去搜 增加的数值,随后再这样循环操作直到看到合适的值。
我们找到了一个初始值为 100 ...
Golang入门学习(19)
Go的第19课——Go对mysql的操作
对于包的理解终于是对包这个东西有点概念了。首先我们直接导包,只会去 GOROOT 当中寻找,GOROOT 就是你安装 go 的一个地方,当然我们如果写的项目太大了肯定是要分很多包的,直接写在 GOROOT 里面又感觉很难受。
那么此时是这样的,我们要新建一个项目,这个项目作为文件夹,然后里面再建包,新建一个 go.mod 文件,内容就是
123module [projectname]go [go version]
比如我的项目名称为 xia0ji233,那么我的 go.mod 就是这样的内容:
123module xia0ji233go 1.19
里面新建的文件夹就会被作为包啦,要引用的时候就是 import "xia0ji233/pkgname"。
环境准备mysql就不说了官网上直接下,主要说说驱动下载,这里建议直接去 github 官网搞下来,这里贴一个 link。
然后像刚刚那样,新建一个项目,把源码目录改名为 mysql 放入项目文件夹即可,只要能引用就可以了。
连接数据库然后再要一个 databas ...
Golang入门学习(18)
Go的第18课——OS模块对进程的操作。
中间歇了一天主要是为ICPC做准备,看ranklist本来感觉能铜,结果打铁,麻了。。
OS模块对进程的操作获取当前进程pid和父进程pid。
12os.Getpid();os.Getppid();
创建一个进程并为进程设置一个属性。
12345678910111213141516171819package mainimport ( "fmt" "os")func main() { fmt.Println(os.Getpid()) fmt.Println(os.Getppid()) attr := &os.ProcAttr{ Dir: "", Env: os.Environ(), Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, Sys: nil, } pid ...
Golang入门学习(17)
Go的第17课——OS模块介绍,OS模块读文件
今天goland又报了错误,按照第一篇文章说的网址激活已经失效,因此换了一个方式,这里贴个链接
OS库OS标准库实现了平台无关的编程接口。
创建文件:
1os.Create("test.txt")
创建目录:
12os.Mkdir("test", os.ModePerm)os.MkdirAll("a/b/c/d", os.ModePerm)
两个区别就是 MkdirAll 支持多级目录创建,如果尝试用 Mkdir 去创建多级目录那么不会被执行。
删除文件:
12os.Remove("test")os.RemoveAll("a")
RemoveAll 也是一样,如果 remove 尝试删除一个非空目录,那么不会被运行。
获取工作目录:
1os.Getwd()
修改工作目录:
1os.Chdir("../../")
重命名文件:
1os.Rename("src","dest&quo ...
CS:APP第五章学习
开始学 CSAPP的第五章
逐步更新吧~
2023-01-08 19:00:00 第一次写
2023-01-11 23:00:00 更新新内容
2023-01-12 12:30:00 写完第五章
优化编译器的能力和局限性也懒得去复制书上的东西了,就是告诉了我们编译器在编译代码的时候会对代码做出优化等等之类的,但是我们的优化需要足够安全,我们必须保证在任何情况下,优化和不优化的代码只会带来效率上的差异而不会对任何形式输出的任何结果产生差异。
这一章主要介绍了一个例子
问:
1234int test(int *x,int *y){ *x+=*y; *x+=*y;}
能否用以下程序作为优化
123int test(int *x,int *y){ *x+=2*(*y);}
乍一看好像可以,因为就是 x 所指向的 int 内存加了两次 y,完全可以用,并且对比上下的代码,上面需要进行 6 次访存(读 y,读x,写x,读y,读x,写x),而下面的代码只需要 3 次访存(读y,读x,写x)
感觉很完美,但是实际上是不行的,因为如果 x 和 y 指向 ...
Git学习之路(3)
Git学习之路(3)——分支
分支(branch)为什么使用分支
如果你希望为项目增加新特性,但很可能会影响当前可正常工作的代码。对于该项目的活跃用户而言,这是很糟糕的事情。与其将特性加入到其它人正在使用的master分支,更好的方法是在仓库的其它分支中变更代码。
更重要的是,Git其设计用于协作。如果所有人都在你代码仓库的master分支上操作,会引发很多混乱。对编程语言或项目的知识和阅历因人而异;有些人可能会编写有错误或缺陷的代码,也可能会编写你觉得不适合该项目的代码。使用分支可以让你核验他人的贡献并选择适合的加入到项目中。(这里假设你是代码库唯一的所有者,希望对增加到项目中的代码有完全的控制。在真实的项目中,代码库有多个具有合并代码权限的所有者)
使用分支的好处
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支常用命令查看当前分支1git branch -v
创建分支1git branch branch_name
删除分支1git branch -d branch_n ...
Git学习之路(2)
Git学习之路(2)——Git的常见命令以及配置
Git常用命令这里记一下常见的 Git 命令以及它的作用:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364git branch 查看本地所有分支git status 查看当前状态git commit 提交git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释git remote add origin git@192.168.1.119:ndshow git push origin master 将文件给推到服务器上git remote show origin 显示远程库origin里的资源git push origin master:develop git push origin master:hb-dev 将本地库与服务器上的库进行关 ...
开发操作系统(2)
开发OS的第二天
&学习Makefile
编写NAS汇编文件这里附件给的源文件已经是纯粹的汇编代码+数据组成了。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061; hello-os; TAB=4 ORG 0x7c00 ; 指明程序装载地址; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code JMP entry DB 0x90 DB "HELLOIPL" ; 启动扇区名称(8字节) DW 512 ; 每个扇区(sector)大小(必须512字节) DB 1 ; 簇(cluster)大小(必须为1个扇区) DW 1 ; FAT起始位置(一般为第一个扇区) DB 2 ; FAT个数(必须为2) DW 224 ; 根目录大小(一般为224项) DW 2880 ; ...