游戏修改器——从计算机基础学科出发
qq:610551883@qq.com
主要针对单机游戏。从操作系统层面对如何做进行了说明。
-
认识内存
图1所示的为某一代内存条的硬件示意图,任何与CPU打交道的硬件部分都通过其自身的一个控制芯片进行通信完成读写操作。图1引用了 https://www.cnblogs.com/mikewolf2002/archive/2012/11/13/2768804.html中的示意图,具体细节可以参考该引用。
图1 .某一代内存条的硬件示意图
该内存条会作为一种资源被操作系统接管,并且会被分成若干页,也称页框。页框可以装载不同的页帧。一段代码被编译成可执行文件K后,K文件结构体中会包含所需的所有段的信息。被OS加载到内存时,OS为其配置相关资源,这些资源中就包括被分配到的页框信息,此时就有了图2、图3(可参考https://blog.csdn.net/lvyibin890/article/details/82217193)。
关于虚拟内存与物理内存的联系
图2.虚拟内存与物理内存的联系
页表的工作原理如下图
图3.页表的工作原理
进程控制块与可执行文件
进程控制块,具体可以参考:https://blog.csdn.net/qq_38499859/article/details/80057427,该链接博文的第2部分的介绍。
可执行文件,以exe文件为例子。exe文件比较复杂,属于一种多段的结构,是DOS最成功和复杂的设计之一。要了解exe文件,首先需要了解exe文件的文件头结构。每个exe文件包含一个文件头和一个可重定位程序的映像。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映像中可重定位段地址的指针链表。详细可以参考https://wenku.baidu.com/view/04965066581b6bd97f19eae9.html。
//摘自:https://blog.csdn.net/qq_38499859/article/details/80057427
//linux eg.
struct task_struct
{
long state; /*任务的运行状态(-1 不可运行,0 可运行(就绪),>0 已停止)*/
long counter;/*运行时间片计数器(递减)*/
long priority;/*优先级*/
long signal;/*信号*/
struct sigaction sigaction[32];/*信号执行属性结构,对应信号将要执行的操作和标志信息*/
long blocked; /* bitmap of masked signals */
/* various fields */
int exit_code;/*任务执行停止的退出码*/
unsigned long start_code,end_code,end_data,brk,start_stack;/*代码段地址 代码长度(字节数)
代码长度 + 数据长度(字节数)总长度 堆栈段地址*/
long pid,father,pgrp,session,leader;/*进程标识号(进程号) 父进程号 父进程组号 会话号 会话首领*/
unsigned short uid,euid,suid;/*用户标识号(用户id) 有效用户id 保存的用户id*/
unsigned short gid,egid,sgid; /*组标识号(组id) 有效组id 保存的组id*/
long alarm;/*报警定时值*/
long utime,stime,cutime,cstime,start_time;/*用户态运行时间 内核态运行时间 子进程用户态运行时间
子进程内核态运行时间 进程开始运行时刻*/
unsigned short used_math;/*标志:是否使用协处理器*/
/* file system info */
int tty; /* -1 if no tty, so it must be signed */
unsigned short umask;/*文件创建属性屏蔽位*/
struct m_inode * pwd;/*当前工作目录i 节点结构*/
struct m_inode * root;/*根目录i节点结构*/
struct m_inode *