随便搞点没用的
史上最详细GTASA音频修改教程
本教程是《史上最详细GTASA修改教程》关于音频部分的展开详述,作者Cyber蝈蝈总(蝈总)。 友利奈绪镇楼 依然说明一下,本教程只针对PC老版,虫豸版、安卓和IOS我概不了解也不打算做。 音频结构 圣安地列斯的音频,存储在audios文件夹,audios文件夹里又有CONFIG、SFX和streams文件夹: CONFIG:声音配置文件,记录了SFX和streams里音频的信息 SFX:声音、音效文件,例如人物语音、武器车辆环境音效、任务对白 streams:音乐文件,例如电台音乐、过场动画、主题曲 CONFIG 如果是涉及音频文件的替换(而不是挂载),这些文件也会修改,因为音频大小发生改变,offset偏移值之类的东西也会改变。 SFX FEET:脚步声或其他 GENRL:主要是车辆引擎 PAIN_A:CJ和NPC的惨叫声,把这个改成二次元老婆的娇喘,配合人物MOD老带劲了,别问我怎么知道的 SCRIPT:非过场动画的任务对白 SPC_EA:警察消防救护这些公共组织的NPC的语音 SPC_FA:特殊NPC的语音 SPC_GA:大部分NPC的语音 SPC_NA:帮派NPC和任务人物的语音 SPC_PA:CJ的语音 每个文件都是特殊编码的,解包之后会看到每个文件其实又分了许多个bank,具体每个bank里是什么内容,可以参看这两个链接:(这两个网站本身也很有用,如果愿意挖坟的话,可以挖到很多有用的信息) http://www.zazmahall.de/ZAZGTASANATORIUM/GTASA_SFX_Directory.htm#SCRIPT https://gtaforums.com/topic/923407-gta-san-andreas-sounds-list/ streams 都是与音乐有关的。俩字母的那些都是电台音乐,但是并不是完整的电台音乐,都被做了切片。 BEATS:开场曲、过关音效等,包括开局汤普尼驾车送CJ去巴拉斯地盘的过场对白。我真想不明白这段过场为什么放在BEATS里而不是CUTSCENE,害我找了老久(可能是因为这个动画并不是过场动画而是实时演算)。 CUTSCENE:过场动画的音频,一共70多条,命名没有规则,具体哪段是哪个过场动画全靠自己找,诶嘿。 音频编辑 如果想编辑和替换原有的游戏音频,这三样必不可少:modloader挂载器、SAAT声音替换工具、audacity音频编辑软件 SAAT声音替换工具 全名 San Andreas Audio Toolkit,可以对SA进行声音的提取和导入。这里需要说明一件事儿,就是导入和导出的路径,还有游戏目录路径,都最好不要包含中文,否则可能失效。 一般的操作流程是,用这个工具把SA的音频进行提取,对提取出来的音频进行内容上的修改,然后再用这个工具导入到游戏里。或者,如果只修改SFX里的音频,修改音频之后可以将其放到MOD挂载器中,不需要覆盖游戏原文件。 modloader挂载器 不多赘述,把需要替换的文件,按照目录结构理顺了,放在modloader文件夹就完事儿。SFX音频文件同理。 例如我的中配MOD的挂载内容如下:(看目录结构) 这里重点说明一件事儿:modloader不能挂载streams里面的文件,这个还是要靠SAAT进行封装。 audacity音频编辑 这个不一定要用audacity,但是音频编辑软件一定要足够专业,能够进行bit级别的编辑。特别注意一件事情,就是你自己制作的替换音频,格式必须与原游戏对应的音频完全一样。采样率、数据率、时长,必须分毫不差,否则很容易出问题,即使没出问题,也建议中午做,因为早晚会出事。尤其是streams里的文件。 技巧:如果你用audacity,你可以先把原音频拖入,然后将自己做的音频也拖进来,把原音频前99.9%的内容扣掉,然后把自己的音频截成合适的长度,拖进去原音频空下的部分,然后删掉自己音频的轨道,然后导出为对应格式,就OK了。这样可以保证以上指标与原音频完全一致。图示过程如下: 第一步,拖入原音频 第二步,拖入自己的音频,这里已经可以看到两条音轨采样率不一样,所以必须统一格式 第三步,删掉原音频前99.9%的部分(是为了保证总长度不变) 第四步,将自己的音频截成合适的长度,正好塞进原音频空下的部分 第五步,删去自己的音频的轨道,然后导出为对应的格式(SFX都是wav单音轨,streams都是ogg双音轨) 参考链接:https://gtaforums.com/topic/494176-sa-how-to-replace-anyall-sounds/ MOD制作 如果想把你自己DIY的音频制作成MOD,要看你是替换了streams还是SFX,如果是SFX,那只提供modloader里需要挂载的音频即可;如果还替换了streams,那你在使用SAAT导入的时候实际上还修改了CONFIG里文件的内容,你最后的MOD里一定要带上你那里的CONFIG文件夹。 关于AI 看了这么多,咦,咋没有半点AI的东西?AI只负责制作你自己的音频,我这个教程,教的是你做好自己的音频后,应该怎么导入游戏。AI怎么玩,可以参考B站上SOVITS相关教程,我这里不重复讲了。我训练好的AI模型会选择合适的方式提供给愿意合作的朋友们,感谢大家的支持!

史上最详细GTASA修改教程
蕾米镇楼 话说在前面,本教程只针对PC(我没关注过安卓,可能有差别),涵盖内容非常之大,意在尝试一劳永逸地解决所有关于GTASA的MOD安装相关问题,这么多年的老游戏了还是不断地有小白尝试搞懂怎么装各种MOD。为了容易看懂,我尽量通俗地描述。仔细看完这篇文章,我相信你的疑惑八成就解决的差不多了,即使以后还遇到其他问题也能自己尝试一些解决办法。我会分以下几个方面介绍: 观前提醒:任何替换操作都有可能失败,注意备份原文件! [TOC] 游戏文件组成 文件类型 cfg:配置文件,存放用户设置、配置数据,游戏里用于存放各种参数,例如载具速度等; ide:功能同cfg,存储数据参数,例如武器伤害值等; dat:一般系统会把它识别成媒体文件,这是因为它大多是MPG格式转换成的。但SA的dat文件也只是一种广义的配置文件,同cfg和ide,存储数据或记录; ifp:专属于R星公司开发游戏的文件,存储动作(动画)信息,例如人物走路姿势; img:对OS熟悉的应该知道,这是一种镜像文件,可以理解成把光盘软盘上的内容压缩归档,变成了这种数字格式。SA的img文件有压缩模型文件的,也有压缩动画文件的,可以理解成一些同类文件的压缩文件;(不要忘记SA最早是PS2平台的,有这种奇怪格式的东西并不奇怪) ico/icn:顾名思义图标文件; ipl文件:全称Item Placement File,专属于R星开发游戏的格式,存储各种位置信息,例如加特林的刷新地点,一般轮不着我们直接修改,一些地图MOD才会用到; fxp:这个我没怎么看懂,不过它是用来存储一些特效的,例如开枪的火光和爆炸等; gxt:字体文件; dff:一般系统会把它识别成音乐,但SA的dff是3D模型文件,像obj, ply等文件一样存储3D模型信息; txd:与dff文件配套的贴图文件 游戏文件 打开游戏根目录,有这样几个文件需要了解: anim文件夹 anim.img:存储一些动作文件,例如驾驶载具时CJ的姿势; cuts.img:过场动画里任务的动作文件; ped.ifp:一般游戏过程中CJ和NPC的姿势,例如走路; audio文件夹: 这是区分完整版和阉割版的重要证据,完整版游戏有全套声音,包括过场动画和电台音乐都在audio里,而且audio占了90%的存储空间,完整版游戏至少3.8G左右; SFX:里面的文件都是特殊编码(其实不复杂)的音效文件,一般的软件无法将其解码; stream:同上,它里面大部分是音乐文件和过场动画的音效; data文件夹: 大部分不必深究,大型MOD都是直接覆盖,犯不着你自己去一个个修改。经常手动修改的无非如下几个 carcols.dat/ carmods.dat/ handling.cfg/ vehicles.ide:车辆数据,总体上都是牵一发而动全身的危险数据,网上有修改handling.cfg文件的教程但是不权威,我建议尽量不要自己单独改某一个文件,会引发很多乱七八糟的问题; weapon.dat:武器数据,建议同上,除了伤害值这些耦合性较低的参数可以自己改着玩一玩,其他不建议自己乱改; *grp.dat:星号代表可以有多种前缀,这种文件存储了游戏物体的刷出特性,例如什么地方什么时间会刷出什么东西来,我做《侠盗终章》大电影的时候就是修改了这类文件,达到了午夜也能刷出很多人和车发生暴动的效果; models文件夹: 顾名思义它就是存储了游戏模型和贴图等文件的地方,只需要记住三个文件在这里: gta3.img:车辆npc等常用模型 cutscene.img:过场动画的模型 player.img:主角的模型,包括各种服饰 NPC模型替换 通过上面的解析应该已经知道,游戏过程和过场动画用的是两套模型,非过场动画过程中的npc是一般npc 一般NPC的替换 一般NPC的模型都在gta3.img里,每个模型都包括同名的dff和txd。比如最常见的卡车司机NPC,名字是male01,那么它的模型文件就是male01.dff和male01.txd: SA如何确定“这个模型是这个npc的模型”的呢?其实就是通过它的名字。 所以如果要将这个NPC替换成你喜欢的人物(例如胡桃),做法是这样的:想必你已经下载了胡桃的MOD,里面可以找到HuTao.dff和Hutao.txd,那就把这俩文件重命名为male01.dff和male01.txd,替换掉gta3.img中的原有文件。然后启动游戏,就能发现所有卡车司机都变成了胡桃。如何打开和修改img文件,后面的工具介绍有。 过场动画的替换 过场动画的模型都在cutscene,img里,如果你打开这个img就会发现大部分模型都有cs前缀,是cutscene的缩写。这里有一个不太广泛但是可以记一下的规律,就是对于过场动画和一般场景下都出现过的npc,他们的名字往往都只有一个“cs”前缀的差别,例如斯威特在gta3.img里叫sweet.dff/txd,在cutscene.img里就叫cssweet.dff/txd。当然也有不少例外,比如大结局里穿防弹衣的斯莫克,在gta3.img里叫smokev.dff/txd,在cutscene.img里就成了cssmokevest.dff/txd。 过场动画和一般过程用的模型有一点差别,有时候是无法通用同一个mod的。一般过程的模型兼容性较好,换成别的mod不容易出问题,但是过场动画不能保证。 主角模型替换 主角是模型替换里最复杂的一个,目前有两种办法: 一种是某些mod就是专门针对替换主角的,他们提供的文件可能只有一个player.img,那这就比较简单了,直接替换原来的player.img就完事儿,但是网上支持这样做的MOD非常少,所以我们接下来的讨论都是针对另一种方法的; 另一种是借助更换人物cleo和一对dff/txd文件,实现用一个简单模型替换掉复杂的主角模型。 但是能否替换掉过场动画里主角的模型,还是取决于更换人物cleo的功能,因为单纯的替换游戏dff/txd模型是难以修改过场动画的主角的。这方面的cleo可以来我群里拿。(文末) 车辆模型替换 车辆模型也是由dff和txd组成的,而且基本都在gta3.img里,替换起来并不复杂。而且在游戏过程中,主角登上一辆载具的同时,右下角会显示载具的名字,90%的载具文件名和本身的名字是一样的。 对车辆MOD感兴趣的可以专门背一背车辆表,每一个车辆都有自己的编号和名字,例如牛肉干NRG500就是522号,九头蛇(秘籍JUMPJET)就是521号,著名的炼狱魔TURISMO就是451号。在SAMP和一些刷车器中,就是通过提供车辆编号来刷出对应车辆的。这些编号在vehicles.ide中能查到(如图)。当然贴吧也有盘点。 有一些车辆MOD会附带一个名为ImVehFt的文件夹,这个是车灯系统,需要安装ImVehFt“主程序”才能起作用。推荐工具里有教程,它是依附于cleo主程序的。 还有一些车辆MOD会附带车辆数据(往往在readme.txt里),参见下面的该数据注意事项。 (如图是同时具有ImVehFt和数据的MOD车包) 数据文件修改 一般这种事情交给专门搞MOD的大神做就完事,我也尝试过但是并没有彻底搞明白,因为稍有不慎就容易给改废了。但是如果是自己随便改着玩玩,可以试试改如下几个属性: 在handling.cfg中,随便找到一行: TURISMO 1400....
OS笔记5:IO系统
五、I/O系统 IO控制方式 程序控制IO 轮询IO,CPU代表进程向IO模块发出指令,然后忙等,直到IO完成; 优点:简单 缺点:CPU效率低 中断驱动 不用不断询问,完成后由设备控制器主动地来通知设备驱动程序说这次结束; 优点:提高CPU利用率 缺点:每次IO都要中断CPU,浪费了时间 DMA 直接存储器访问方式,有专门的控制器完成IO 优点:CPU只需干预开始和结束的工作,而其中的一批数据读写无需CPU控制,适用于数据块传输 缺点:每个设备一个DMA 通道 一个特殊的有自己的指令的处理器,专门负责IO,与CPU分时使用内存; 优点:一个通道程序可以完成多个IO操作,减少CPU干预 缺点:贵 缓冲区 缓冲技术的优点: 匹配CPU与外设的不同处理速度 减少CPU中断次数 提高CPU与IO设备的并行性 RAID 一种把多块独立的硬盘(物理硬盘)按照不同方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据冗余的技术。 优点:成本低,功耗小,传输速率高,可提供容错功能 RAID0:仅提供了并行交叉存取。它虽然有效提高了磁盘I/O速度,但并无冗余校验功能; RAID1:将每一数据块重复存入镜像磁盘,以改善磁盘机的可靠性。镜像盘也称拷贝盘,使有效容量下降了一半,成本较高。 RAID10:10是先镜像再分块,01是先分块再镜像,显然10的容错性更好。 RAID2:采用海明码纠错的磁盘阵列,将数据位交叉写入几个磁盘中。按位条带化。 RAID3:采用奇偶校验冗余的磁盘阵列,也采用数据位交叉,阵列中只有一个校验盘。 优点:将磁盘分组,采用字节级别的条带,读写要访问所有盘,每组一个盘作为奇偶校验 缺点:恢复时间长,读写性能水桶效应瓶颈 RAID4:一种独立传送磁盘阵列,采用数据块交叉,用一个校验盘。将数据按块交叉存储在多个磁盘上。 优点:冗余代价等于RAID3,访问方法不同于RAID3,使用较少磁盘参与操作,使得磁盘阵列可以并行 操作 缺点:随机读快,随机写慢(竞争同一个校验盘) 测试题 IO设备分类: 块设备,数据块为单位,速率高可寻址 字符设备:字符为单位,速率低不可寻 MIPS平台的IO端口地址: 内存映像编址,intel体系是独立IO编址 设备独立性是实现了: 应用程序与物理设备无关 设备驱动程序包括: 自动配置和初始化子程序、IO操作子程序、中断服务子程序 采用双缓冲的条件是: CPU和外设的速度相近 SPOOLing程序和外设进行数据交换是: 实际IO,虚拟设备技术把独享设备转变成具有共享特征的虚拟设备提高设备利用率 提高I/O性能的方式: DMA,预先读,延时写,异步IO,缓冲,SPOOLING Linux中设备管理的代码占中代码量的: 1/2以上 某文件占10个磁盘块,现要把该文件的磁盘块逐个读入主存缓冲区,并送用户区进行分析。一个缓冲区与磁盘块大小相等。把一个磁盘块读入缓冲区的时间为100μs,缓冲区数据传送到用户区的时间是50μs,CPU对一块数据进行分析的时间为50μs。分别计算在单缓冲区和双缓冲区结构下,分析完该文件的时间是多少? 方法:画时序带重叠的图,单缓冲下读入缓冲区和CPU分析可以并行,双缓冲下相邻任务都可以并行。 单缓冲:150*10+50=1550 双缓冲:100*10+50+50=1100 假设磁盘请求以柱面10、35、20、70、2、3 和38的次序到达。寻道时磁头每移动一个柱面需要6ms,磁头起停时间忽略不计,计算以下各算法所需的寻道时间是多少: a) 假设磁头初始位置为0, 先来先服务...
OS笔记6:文件系统
六、文件系统 索引结构 磁盘空间管理 空闲链表法 将所有的空闲盘区连成一条空闲链,可有两种方式:空闲盘块链、空闲盘区链。 位图法 磁盘块大小 块过大:读取磁盘次数少,但浪费空间 块过小:磁盘空间利用率高,但因多次读取磁盘而浪费时间 文件控制块FCB 基本信息 文件名:字符串,通常在不同系统中允许不同的最大长度,可修改 物理位置 文件逻辑结构:有/无结构(记录文件,流式文件) 文件物理结构:(如顺序,索引等) 访问控制信息 文件所有者(属主):通常是创建文件的用户,或者改变已有文件的属主 访问权限(控制各用户可使用的访问方式):如读、写、执行、删除等 使用信息 创建时间,上一次修改时间,当前使用信息等。 测试题 在文件系统中,访问一个文件f时首先需要从目录中找到与f对应的目录项。已知文件系统数据块大小为1KB,一个目录项的大小为128字节,文件平均大小为100KB。该文件系统的目录结构如图所示。不考虑磁盘块的提前读和缓存等加速文件读写的技术,请回答以下问题: 1)如果采用串联文件实现,同时文件属性直接存储在目录项中,并且根目录的目录项已读入内存中。访问第三级目录下的一个文件中的一个块平均需要访问几次磁盘? 2)如果采用索引文件实现,目录项中仅存储文件名和i节点指针,其中文件名占14个字节,i节点指针占2个字节。如果仅采用直接索引,每个第三级目录下的文件数不超过50个,且根目录的i节点已读入内存,访问第三级目录下的一个文件的一个块平均需要访问几次磁盘? 3)假设该文件系统所管理的磁盘空间为16ZB(1ZB=270B)。如果inode中包括512字节的索引区,且允许采用一级间接索引进行组织,那么该文件系统支持的最大文件是多少字节? 因为根目录在内存里,那么读取二级目录不用访问磁盘。访问三级目录时,一个磁盘块1KB,一个目录项128B,则一个磁盘块可以放8个目录项,共有128个目录项,分布在16个磁盘块上。因为是串联实现,所以线性访问1-16次,所以访问目录项平均8.5次;访问文件块时,一个文件100KB,每个文件要100个磁盘块,串联访问平均50.5次。总共59次 访问二级目录时,访问二级目录的i节点一次,访问二级目录内容1次,一共2次;访问三级目录时,访问i节点1次;访问三级目录内容时,一个目录项14+2=16B,一个磁盘块存放64个目录项,则三级目录存放在2个磁盘块上,访问三级目录项1-2次平均1.5次磁盘,总2.5次;访问文件块,访问i节点1次,访问磁盘块1次,总2次。总共6.5次(注意只是访问文件的一个块,访问i节点是得知某块的磁盘位置) 16ZB对应2^64^个磁盘,块号就要有64位即8B空间,inode索引区用了64个磁盘块,每个磁盘块可以存储1kb/8b=128个块号,最终支持文件大小64*128*1K=8M
OS笔记4:进程与并发程序设计
四、进程与并发程序设计 并发与并行 并发:两个活动在同一时间各自处在起点和终点之间的某一处,不一定并行(不一定都在处理机上) 并行:两个程序在同一时间度量下同时运行在不同的处理机上 进程与程序 进程:数据+程序+PCB(进程管理块) 通过多次执行,一个程序对应多个进程;通过调用,一个进程包括多个程序 进程原语 指令序列执行是连续的,不可分割 是操作系统核心组成部分 必须在管态(内核态)下执行,且常驻内存 进程三状态 就绪、执行、等待 进程与线程 资源拥有者称为进程,可执行单元称为线程。将资源与计算分离,提高并发效率; 线程作用:减小进程切换的开销;提高进程内的并发程度;共享资源 一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有 进程是资源分配的基本单位,线程是处理机调度的基本单位,所有的线程共享其所属进程的所有资源与代码 线程共享进程的数据的同时,线程有自己私有的的堆栈 进程通信 临界资源:一次仅允许一个进程访问的资源 临界区:每个进程中访问临界资源的那段代码 同步:直接制约,逻辑上的依赖 互斥:间接制约,资源的等待 同步互斥原则: 空闲让进:临界资源处于空闲状态,允许进程进入临界区 忙则等待:临界区有正在执行的进程,所有其他进程则不可以进入临界区 有限等待:对要求访问临界区的进程,应在保证在有限时间内进入自己的临界区,避免死等 让权等待:当进程(长时间)不能进入自己的临界区时,应立即释放处理机,尽量避免忙等 信号量:PV操作 管程:分散的临界区集中起来,为每个可共享资源设计一个专门机构来统一管理各进程对该资源的访问,管程是一种语言概念,由编译器负责实现互斥,任一时刻,管程中只能有一个活跃进程。 调度算法 短作业优先 先来先服务 最短剩余时间SRTF 最高相应比优先HRRF 时间片轮转算法 优先级算法 死锁 死锁、活锁、饥饿 死锁发生的必要条件:互斥、请求和占有、不可剥夺、环路等待 安全序列:序列中每个进程需要的附加资源 <= 当前可用资源 + 它前面所有进程占有的资源 银行家算法:先看request(当前进程请求资源量)是否小于need(当前进程可能需要的最大资源量-当前占有量),小于的话再看request是否小于available(当前还有多少可用),如果都行的话假设分配一下用安全性算法检测,若安全则分配否则不分配 安全性算法:找need<work的进程,有的话,这个进程对应的finish数组置true,work+=allocate,初始时work=available,如果最后所有进程全为true则安全 RAG资源分配图算法……
OS笔记3:内存管理
三、存储管理 覆盖与交换 覆盖:程序员做的,将一个大作业分割成若干小部分,当前一个部分运行结束后,其占用的内存被后面的部分直接覆盖 交换:程序员不用做,解决运行多道程序所出现的内存不足问题,交换出暂时不需要的作业。 分区存储 固定分区 当系统初始化时,把存储空间划分成若干个任意大小的区域;然后,把这些区域分配给每个用户作业 优点 :易于实现,开销小。 缺点:内碎片造成浪费,分区总数固定,限制了并发执行的程序数目。 分配方式:单一队列与多队列 可变式分区 分区的边界可以移动,即分区的大小可变。没有内碎片,但是有外碎片。 内碎片:分区中无法被利用的存储空间。 外碎片:分区与分区之间的碎片,可以用紧凑技术消除外碎片。 空闲空间管理:位图和空闲链表 位图表示法:给每个分配单元赋予一个字位,字位取值为0表示单元闲置,取值为1则表示已被占用。 链表表示法:由“标志位(空闲或程序)+起始地址+空间长度+链表指针”构成。 分配算法 首次适应算法:从这个空白区域链的始端开始查找,选择第一个足以满足请求的空白块。 低地址部分留下了很多很小空闲空间,增加了查找开销。 下次适应算法:每次为存储请求查找合适的分区时,总是从上次分配的下一块开始,只要找到一个足够大的空白区,就将它划分后分配出去。 使小空闲分区均匀分布,但会导致缺乏大空闲分区。 最佳适应算法:总是寻找其大小最接近于作业所要求的存储区域(将空闲分区按容量递增排列)。 留下许多小分区(碎片)。 最坏适应算法:总是寻找最大的空白区(将空闲分区按容量递减排列)。 当大作业来时,可能没有那么大的空间了。 页式存储 小页面: 减少页内碎片和总的内存碎片,有利于提高内存利用率 每个进程页面数增多,使页表长度增加,占用内存较大 大页面: 每个进程页面数减少,页表长度减少,占用内存较小 增加页内碎片增大,不利于提高内存利用率 反置页表: 依据内存中的物理页面号来组织,表项为进程pid+逻辑页号p。如果检索到与之匹配的表项,则表项的序号 i 便是该页的物理块号,将该块号与页内地址一起构成物理地址。反置页表的大小只与物理内存的大小相关,与逻辑空间大小和进程数无关。 段式存储 每个进程一张段表,每个段一张页表。段表含页表始址和页表长度。页表含物理页号。 缺页异常处理流程 陷入内核态,保存必要的信息(OS及用户进程状态相关的信息)。(现场保护) 查找出发生缺页中断的虚拟页面(进程地址空间中的页面)。这个虚拟页面的信息通常会保存在一个硬件寄存器中,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析该指令,通过分析找出发生页面中断的虚拟页面。(页面定位) 检查虚拟地址的有效性及安全保护位。如果发生保护错误,则杀死该进程。(权限检查) 查找一个空闲的页框(物理内存中的页面),如果没有空闲页框则需要通过页面置换算法找到一个需要换出 的页框。(新页面调入(1)) 如果找的页框中的内容被修改了,则需要将修改的内容保存到磁盘上¹。(注:此时需要将页框置为忙状态,以防页框被其它进程抢占掉)(旧页面写回) 页框“干净”后,操作系统将保持在磁盘上的页面内容复制到该页框中²。(新页面调入(2)) 步骤5,6会引起写磁盘调用,发生上下文切换(在等待磁盘写的过程中让其它进程运行)。 当磁盘中的页面内容全部装入页框后,向CPU发送一个中断。操作系统更新内存中的页表项,将虚拟页面映射的页框号更新为写入的页框,并将页框标记为正常状态。(更新页表) 恢复缺页中断发生前的状态,将程序指针重新指向引起缺页中断的指令。(恢复现场) 程序重新执行引发缺页中断的指令,进行存储访问。(继续执行) 页面置换策略 Belady现象:分配的页面数增多但缺页率反而提高的异常现象 OPT:最优置换,无法被实现,但可以用于衡量其他页面置换算法的效果。 FIFO:先入先出,当必需置换掉某页时,选择最旧的页换出。 Second Chance :每个页面都有一个标志位。用于标识此数据放入缓存队列后是否被再次访问过。删的时候如果没被访问过直接删,如果访问过的话清除标志然后跳过删下一个,这个下次再删。FIFO的改进版。 clock:环形队列,没被访问过直接替换,被访问过的话清除标志,指向下一个。Second Chance改进版。 LRU:每访问到一个已有的页,把它移到队尾,置换时选择队首页。 AGING:老化算法,每个页面一个移位寄存器,每隔一段时间右移一位,访问一次就在最高位写1,置换时选数值最小的。 页目录自映射 自映射:页表中有一项是页目录,页目录中有一项指向页目录物理地址 对于一个4G的存储空间,有1024个4M大小的页,其中页表4M;页表有1024个4K大小的表项,其中页目录4K。给定页表基地址PTbase(4M对齐即低22位都是0) 页目录基地址:PDbase = PTbase | (PTbase » 10) 解析:PTbase相对于0,有 PTbase/4M 即 PTbase » 22 个页,设为xt页...
OS笔记2:系统引导
二、系统引导 MIPS启动流程 两个阶段:Stage1(汇编代码),Stage2(C代码) 四个虚拟空间:kseg0(最高位置0得物理地址,cache存取),kseg1(高三位置0,不用cache,重启时可正常工作),kseg2(内核态,MMU转换),kuseg(用户态,MMU转换) Stage1 Stage2 MIPS下Linux启动流程 Bootloader将 Linux 内核映像拷贝到RAM 从head.s文件的kernel_entry()开始,初始化内核堆栈 …… ELF文件 测试题 Bootloader的实现严重依赖于具体硬件,即使是相同的CPU,它的外设(比如Flash)也可能不同,所以不可能有一个Bootloader支持所有的CPU、所有的开发板。但是bootloader是可以支持不同CPU架构和不同操作系统,只不过常常不能直接拿来用,需要做一些移植的工作。 MIPS平台外设IO空间通常映射到kseg1段,映射到0xA0000000-0xBFFFFFFF的不通过cache的空间中。 cc1是预处理器和编译器,as是汇编器,collect2是链接器,他们都是gcc所包含的工具。 C语言要支持不定个数的参数,其压栈顺序就必然是从右至左。 C程序真正的入口点是_start,它首先做一些初始化工作(启动例程, Startup Routine),然后调用C代码中提供的main函数。 Linux中sys_execve()只是函数do_execve()的一个界面,实际的处理加载可执行文件动作在do_execve()中完成。
OS笔记1:操作系统概论
一、操作系统概论 批处理 把用户提交的作业成批送入计算机,由作业调度程序自动选择作业运行。 作用: 缩短作业之间的交接时间 减少处理机的空闲等待,提高系统效率 多道程序 指允许多个程序同时进入内存并运行。即同时把多个程序放入内存中,并允许它们交替在CPU中运行 好处: 提高CPU利用率; 提高I/O设备和内存利用率; 进而提高系统效率 分时 多个用户分享使用同一台计算机。多个程序分时共享硬件和软件资源。 分布式操作系统 网络操作系统:在传统单机OS上加单独软件层,主要提供联网功能和资源的远程访问,实现多机互联。 分布式操作系统:多台机器统一管理形成单一系统,相比网络操作系统,对用户和应用高度透明(看不到也不需要看到) 实时系统:及时响应,高可靠性和安全性,系统的整体性强,交互会话活动较弱,专用系统 操作系统主要功能 进程管理,存储器管理,设备管理,文件系统,作业控制 现代操作系统的基本特征 并发执行,资源共享(复用),虚拟化管理,不确定性事件的处理 操作系统工作模式 内核态(管态),用户态(目态); 切换过程:通过异常(陷阱或中断),进入内核态 异常与中断 中断:主要由I/O设备、处理器时钟或定时器等硬件产生,可以被启用或禁用 陷阱:用户进程中某一特定指令执行的结果, 在相同条件下,异常可以重现,例如内存访问错误、调试指令以及被零除。 系统调用 提供操作系统服务的编程接口 与函数调用的区别: 用户态到内核态,切换堆栈 移植性差 开销较大 过程:先跳转到异常分发代码,通过异常类型调用handle_sys函数根据系统调用号完成系统调用的实现 操作系统内核 是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。通过异常来陷入内核态。 微内核 内核只完成不得不完成的功能,其他诸如文件系统、内存管理、设备驱动等的内容都被作为系统进程放到了用户态空间。 好处:架构独立,减小系统耦合,增加可移植性。 坏处:频繁系统调用,效率难以保证。 测试题 分时系统与批处理系统相比,主要的开销是什么? 管理时间片的系统开销、管理多用户的系统开销、管理硬件的系统开销(引入了虚存)、交互IO的系统开销等等。
