《第五讲:调用的实现》
实现 调用 第五
2023-09-14 08:57:33 时间
上层应用程序通过调用函数进入操作系统,表面上是函数,实际上是什么呢?
第一个问题:应用程序在内存中,操作系统也在内存中,为什么不能直接进入操作系统中呢?答案是安全。
那么问题来了,既然不可以直接进入,那怎么才能阻止直接进入呢?怎样才能进入内核中呢?
第一个问题的答案是通过硬件将内存分为用户态和内核态。
DPL:目标内存的特权级
CPL:当前特权级。数值越小,级别越高。
执行指令时,只有CPL的特权级高于DPL时,指令才允许执行。
那么究竟怎样才能进入内核呢?答案是中断,进入内核的唯一方法。例如调用open函数,被操作系统展开后包含中断,就可以进入内核。这个中断就是int 0x80
以printf()为例
应用程序调用printf(),在库函数中变成printf()(为了与write()参数匹配),再调用write()(通过宏展开,包含int 0x80中断),再通过中断进入到操作系统内。
那么int 0x80到底做了什么呢?
先从那个展个的,包含int 0x80的宏开始,看看这个宏做了什么呢?(这段没听明白>_<)
接下来介绍int 0x80。通过IDT表来找到要转到哪个地方去执行。
int 0x80调用哪个函数呢?
这一段的核心思想就是,通过中断,更改DPL,使得程序能进入操作系统。
sys_call_table是处理函数表,乘以4表示每个函数指针占用四个字节。
相关文章
- 带你一步步用php实现redis分布式、高并发库存问题
- 使用SpringBoot的@Async实现异步调用方法,以及自己开启新线程异步调用
- 使用 Aeraki Mesh 实现零代码侵入的 Dubbo 服务调用跟踪
- 调用Chatgpt API,并实现联系上下文(gpt-3.5-turbo)
- FATE 2.0:业内首个开源实现异构系统互联互通的开发指南
- Nginx+Tomcat实现动静分离详解程序员
- Java调用Redis实现数据过期(redisjava过期)
- C语言轻松连接Oracle,实现高效数据处理(c语言调用oracle)
- Qt编程实现MySQL数据库调用(qt调用MySQL数据库)
- 简单步骤实现Oracle存储过程的调用(调用oracle存储过程)
- 借助MSSQL函数实现更快速的数据查询(调用mssql函数)
- Redis实现幂等性注解(幂等redis 注解)
- 实现32位MySQL最佳性能配置指南(32位mysql配置)
- Oracle优先级队列的实现之道(enque oracle)
- Oracle 04031实现可靠性与弹性(04031 oracle)
- Redis集群实现并发限制(redis集群并发限制)
- Redis实现数据持久化的方法(redis调用持久化)
- redisRedis集群实现负载均衡的单机解决方案(redis集群单数台)
- pjblog实现类似CMS的首页调用
- asp.net下利用JS实现对后台CS代码的调用方法
- PHP异步调用socket实现代码
- javascript实现信息的显示和隐藏如注册页面
- 算法详解之分支限界法的具体实现
- ThinkPHP控制器间实现相互调用的方法
- ThinkPHP调用百度翻译类实现在线翻译