当前位置: 首页 > news >正文

衡水建设公司网站互联网开发工程师证书

衡水建设公司网站,互联网开发工程师证书,flash 做网站,潼南集团网站建设【README】 本文内容总结自 《操作系统-哈工大李治军老师》#xff0c;内容非常棒#xff0c;墙裂推荐#xff1b; 【1】操作系统接口 0#xff09;用户使用计算机3种方式#xff1a; 命令行#xff1b; 命令行执行 hello world图形界面#xff1b;如计算机磁盘浏览器…【README】 本文内容总结自 《操作系统-哈工大李治军老师》内容非常棒墙裂推荐 【1】操作系统接口 0用户使用计算机3种方式 命令行 命令行执行 hello world图形界面如计算机磁盘浏览器cd盘应用程序如word 1命令行 系统启动完成后 会执行shell主体程序 并打印出 /home/username/ 字符串 并scanf 等待用户输入用户输入后执行函数 fork()  exec() 申请cpu执行 output.c 代码 具体的 调用Fork() exec() 实现对cpu使用调用scanf() 实现对键盘的使用调用printf()实现对显示器的使用 【总结】命令行就是一段程序程序调用了一些函数来对计算机硬件进行使用 无论命令行还是图形界面都是普通C程序关键是调用了重要函数这才可以操作计算机硬件 【1.1】操作系统接口 1操作系统接口 指的就是 重要函数这些函数是操作系统对外提供的接口即接口表现为 函数调用又由操作系统提供所以称为系统调用 system call所以操作系统接口就是系统调用 2有哪些具体的操作系统接口 或系统调用呢 2.1操作系统接口标准 POSIX 为操作系统接口定义了统一的标准可以让相同的应用程序可以在不同的操作系统上运行即调用系统接口 POSIX(可移植操作系统接口)是一个公认的工业标准。规范中的操作系统是POSIX兼容的。 2.2到哪里去查询系统调用 posix 查询 X 通常都指 Unix 这是惯例 Posix 常用系统调用 8.1 posix --The most common POSIX system calls. 【小结】什么是操作系统接口被称为系统调用的函数 具体来说如 forkopenreadwrite 等函数如上图系统调用函数可以理解操作系统开放出来的操作操作系统的api【2】系统调用实现 【2.1】为啥不直接访问内核数据 不能直接访问内核内存需要通过系统调用访问内核数据 原因在于 内核有很多关键数据是不能被外泄的如root用户名密码而且访问可能带来被恶意修改的问题内核被修改可能导致操作系统不可用带来严重后果不能随意调用内核数据不能随意jmp的原因【2.2】内核态与用户态 0引入硬件设计把内存分为内核段与用户段计算机对内存的使用都是一段一段的使用 用户段的程序不能直接访问内核段的数据只能通过系统调用接口来完成用户段内核段都需要段寄存器来做两个段寄存器 CS DS代码段寄存器数据段寄存器 1如何区分 内核态与用户态 0 表示内核态 3 表示用户态   2可以看下 DPL CPL DPL- destination privilege level用于描述目标内存段的特权级存储在 GDT表中 特权级数字越大权限越低DPL存储在GDT中CPL-current privilege level 当前特权级 CPL存储在cs段寄存器中 3)    DPL  CPL 有什么作用 只有当当前特权级 CPL 小于等于 目标函数的DPL时才允许访问否则访问权限不足DPL CPL 数值越小级别越高 4    用户态请求内核态 用户态的DPL是3在执行用户态时会请求cs段寄存器会把DPL赋值给cs中的CPL而内核态的DPL是0当用户态访问内核态时 因CPL3而内核态DPL0权限不足所以访问段寄存器就会报错了 【例】用户态访问内核态权限不足 序号 代码 内存区域 描述 1 void main() {          whoami(); } 用户态 特权级CPL3CPL保存在cs段寄存器中 2 void whoami() {          printf(100,8); } 内核态 特权级CPL0 所以代码1 无法访问代码2 CPL保存在cs段寄存器中 【补充】GDT 一个GDT表项就描述一段内存GDT表示整个操作系统所以gdt表项无论数据段还是代码段对应gdt表项的DPL 全等于0 5那用户态如何访问内核态的代码呢 通过中断计算机提供的唯一进入内核的方法通过中断才能进入内核6系统调用核心 用户程序中包含一段包含 int指令的代码操作系统写中断处理获取想调用程序的编号操作系统根据编号执行代码【2.3】 系统调用具体实现 操作系统通过 int 0x80 这条中断指令操作系统才能进去 Printf() 调用 printf库函数 printf库函数调用 write库函数write库函数调用 write系统调用write库函数被编译成宏需要用宏 _syscall3 来展开成一段包含 int 0x80中断的 汇编代码因为 int 中断时进入内核的唯一方式【小结】 所以系统调用细节从宏 _syscall3 开始说起【2.4】linux系统调用实现细节 1syscall3 宏 通过实参我们知道 type赋值为intname赋值为writeatype赋值为inta赋值为fd 把typenameatypea 替换为右边的值 就会得到 int write(int a, int b, int c) {long __res;__asm_volative // 这个是内嵌汇编指令。。。。。。 } 其中 “a”(__res) 把 %eax寄存器数据 赋值给 __res 变量作为返回值 “”(__NR_##name) 把 __NR_write赋值给 %eax 寄存器“b”(long(a)) 把fd赋值给 %ebx寄存器“c((long)b)” 把 b 赋值给%ecx 寄存器其中 __NR_write 是系统调用号用来标识是哪种系统调用 如write 为 __NR_write open为  __NR_open 等 【补充】 syscall3 表示有3个参数syscall2 表示有2个参数 【总结】系统调用步骤 把一个系统调用号 赋值给eax调用 int 0x80 进入内核进入内核的唯一方法依靠int指令【2.5】int 0x80 中断指令 1int 中断指令 要查询 IDT 表通过IDT 找到中断要转到哪个地方去执行转到哪个中断服务程序执行 2 IDT 中断描述符表结构 处理函数入口点偏移 P DPL 01110 段选择符 处理函数入口点偏移 补充 中断是计算机设计中的里程碑的创新 通过 set_system_gate(0x80, system_call) 直到 0x80中断跑去 system_call 执行即初始化 中断描述符表 IDT表 当中断发生时查找  IDT找到中断处理函数入口地址并跳转到中断处理函数执行 3看代码 _set_gate(idt[n], 15, 3, addr) // idt 是中断向量表基址3赋值给 dpl又main函数入口的调用程序的cpl等于3所以main函数可以访问内核态 换句话说int80的在IDT的初始化故意把dpl设置为3了 system_call 赋值给 addr0x0008 赋值给 段选择符所以 cs:ip 8 : system_call 跳转到 cs:ip 去执行 system_call 这个函数 补充 cs0x0008又 cs的最后两位表示CPL所以 CPL 00; CS段寄存器结构 0000 0000 0000 1000 main函数 发起系统调用如 write此时 CPL3是用户态 write系统调用通过中断 int 0x80从 IDT 中断描述符表 查找80中断的服务程序入口地址 入口地址通过 cs:ip 来表示其中cs0x0008 由cs的最后两位表示CPL000所以进入内核态调用 system_call 执行特权级变成0了 【总结】 在初始化IDT的时候80号中断的DPL设置为3 故意让 CPL3 的用户代码能够进来一旦进来后又由于 cs设置为0x0008 其CPL000所以进入内核态的system_call 执行【2.6】system_call 功能 1 代码1 movl 0x10, %edx mov %dx, %ds mov %dx, %es 把ds es 都设置为0x10 补充 0x08是内核的代码段 0x10是内核的数据段 2 代码2 Call_sys_call_table (, %eax, 4) ; 根据 eax% 跳转到 sys_call_table 去执行 其中 eax是 __NR_write系统调用号 即跳转到 _sys_call_table 为基址的以 4*%eax 为偏移量的地址去执行 为啥是4 每个函数的指针为4个字节32位 也可以 把 sys_call_table 理解为函数表 【2.7】函数表 sys_call_table 存储函数指针的表 以 __NR_write4为例则下标为4的元素就是 sys_write 【小结】写文件调用过程 Step1用户调用  printf CPL3Step2printf 展成 int 0x80 而在 初始化 IDT时把 80号中断服务处理程序设置为sys_call补充80号中断的 IDT表项的DPL初始化为3 Step3调用 system_call 中断处理程序时 cs:ip0x0008:system_call其中cs的DPL0所以 CPL0进入内核态补充 cs0x0008表示代码段ds0x10表示数据段Step4system_call 根据传入的 系统调用号 __NR_write4  会查询 sys_call_table 函数表项 得到 sys_writeStep5调用 sys_write 函数【问题】 main函数所在内存的DPL3whoami所在内存的DPL0所以main函数无法直接调用 whoami函数 解决方法硬件提供了唯一渠道即中断让用户态访问内存态的程序 步骤1设置 eax72,72等于 whoami函数的系统调用号int 0x80 发生中断步骤2又 80号中断在IDT初始化时的中断服务程序是  system_call步骤3system_call 根据 eax72 查询 sys_call_table 系统调用函数表的72号元素值 sys_whoami步骤4执行 sys_whoami() 函数
http://wiki.neutronadmin.com/news/411632/

相关文章:

  • 网站建设需求wordpress 大学网站
  • 游戏网站开发推广计划书傻瓜式php网站开发
  • 重庆建设信息工程信息网路由优化大师官网
  • 网站管理系统后台不能发布文章了对建设工程施工合同实施过程中
  • 福田欧曼服务站做外贸的网站域名怎么买
  • 如何办网站天元建设集团有限公司第八分公司
  • 北京网站建设策划方案关于网站建设的名言
  • 网站运营方案案例如何修改wordpress站名
  • 网站建设平台协议书模板下载网站的建站过程
  • 网站开发公司模版郑州公司网站制作
  • 东莞做营销型网站的松江专业做网站
  • 如何选择扬中网站建设网页制作软件大全
  • 集团网站设计特性个人免费设计网站
  • 如何能去医疗网站做编辑温州商城网站建设
  • 广州公司制作网站0735郴州网
  • 太原模板建站典型十大优秀网络营销案例
  • 专业餐饮网站建设企业网站的设计怎么做
  • 东莞网站建设(曼哈顿信科)中国建设网官方
  • 四川省住房和城乡建设厅网站首页wordpress阿里云数据库
  • 黑龙江省农业网站建设情况北京pc端网站开发
  • 杭州 专业网站建设 网络服务南京做网站价格
  • 系统网站那个网站科四做课时
  • 旅游的网站怎么做的品牌推广和营销推广
  • 深圳网站设计公司哪种下载安装注册app
  • 视频网站建设解决方案万网创始人
  • 产品类型 速成网站WordPress自己安装了插件
  • 小说代理平台泰安网站建设与优化
  • PHP套模板做网站网页无法访问qq可以登陆
  • 社区网站怎么建企业营销推广公司
  • 微网站首选公司旅游网站模板html免费下载