自己做网站很难,asp网站开发四酷全书:新闻_论坛_电子商城_博客,自学网网站,网站制作的行业前言#xff1a;
第一周的重点就在于一张图表#xff1a; 基于这张图#xff0c;我们将陷入内核分为了两个大块Trap和Interrupt。同时我们知道一件事情任何一次I/O操作或者错误程序操作都将陷入内核#xff0c;从而使得内核可以监控所有的外部设备以及维护整个电脑程序运行…前言
第一周的重点就在于一张图表 基于这张图我们将陷入内核分为了两个大块Trap和Interrupt。同时我们知道一件事情任何一次I/O操作或者错误程序操作都将陷入内核从而使得内核可以监控所有的外部设备以及维护整个电脑程序运行的安全。
此时就要提出一个问题 如果每次I/O请求都需要陷入操作系统或者每次运行n/0时都会报错从而陷入操作系统 。那么我们可不可以自己去通过汇编语言写一个I/O操作或者div操作使得这些操作不会陷入内核从而提高程序运行的效率。 答案自然是不可以的
操作系统的保护
保护原因
对于上面那个问题——跨过内核直接进行I/O操作或者进行非法操作这会导致操作系统崩溃。
正常流程 此时如果一开始跨过内核直接调用I/O接口那么在最后cpu调用操作系统时操作系统进程记录中并没有一开始调用I/O接口的进程记录此时操作系统就会崩溃操作系统需要对每一个操作完成进程的管理
保护方式
为了防止上面的情况出现设计了一种特殊结构包括 指令集的双类型、硬件系统的双模式 这一结构的要点在于 一、硬件系统双模式有内核模式、用户模式 二、指令集的双类型有特征指令、非特征指令 三、特征指令可能对操作系统或计算机本身造成损害的机器指令 四、内核模式操作系统开始运行后包括cpu在内的计算机硬件状态 五、内核模式下才能运行特征指令用户模式下只能运行非特征指令 保护逻辑
进一步来思考为什么这个结构可以实现保护
保护原因里面提到的出现崩溃的原因就是有一些指令他跨过了操作系统被用户直接调用而这些指令对整个计算机系统的运行是有潜在损害的。 所以解决问题的关键就是让用户不能使用这些指令让这些指令只能被操作系统使用 此时 将这些指令设置为特征指令再让硬件系统只有在陷入内核时才转为内核模式平时硬件系统为用户模式 那么 如果用户不陷入内核硬件系统会保持用户模式此时调用I/O指令属于特征指令硬件系统会认为这是一种错误的指令调用于是认为是interrupt重新陷入内核然后内核会将进程杀死。从而起到保护的作用 注意1、陷入内核是非特征指令回到用户模式是特征指令 2、在kernal mode下运行的软件总体叫作kernal 3、进入kernal mode的方式只有三种中断 操作系统保护的验证(开源编程工具集、GDB调试工具集
课上老师利用C语言内嵌汇编语言来给我们展示如果直接调用特征指令的后果。
具体操作如下
这里老师使用的是开源的编程工具集常用于编译和链接各种编程语言的源代码
gcc -g 编译C语言文件包含调试信息源代码放到目标文件当中
gcc -o 生成C语言文件的目标文件文件名为staticcli
gcc -S 将C语言文件变为汇编文件 由于GDB是为unix系统开发的在window系统上不能直接使用所以老师这里远程连接了一台linux的虚拟机。linux、MaxOs都是基于unix开发的所以可以调用GDB。
通过上面的linux操作语句得到包含调试信息的目标文件staticcli这里再调用gdb -x staticcli对包含调试信息的目标文件进行深入调试。
start语句表示开始gdb模式info all-registers语句表示查看寄存器中的信息如下图寄存器中存放的就是一条条机器语句。通过这个我们可以找到main所在的寄存器位置然后利用jump指令跳转到main的寄存器。因为编译器为了和操作系统等联系会在我们的代码外面自动加上一层。
由于staticcli是目标文件目标文件是由机器代码组成的而机器代码是汇编语言组成的所以下面调用x/i语句就可以一一查看文件汇编代码的一条条语句。
而nexti语句就是一步步去运行汇编代码。运行结果如下
一步步查看并运行汇编代码到达asm“cli” 由于该指令是一条关中断指令特征指令而我们并不是调用接口通过操作系统去运行而是自己写汇编去运行。所以会被操作系统强行中断进程报出segmentation fault段错误)
总结
本文到这里就结束啦~~这堂课设计的内容较为杂乱、复杂但是学一学拓展一下知识是非常好的呀~~ 如果觉得对你有帮助辛苦友友点个赞哦~理解总结编辑花了4h左右呢 知识来源操作系统概念黑宝书、山东大学高晓程老师PPT及课上讲解。不要私下外传