码迷,mamicode.com
首页 > 其他好文 > 详细

《第五讲:调用的实现》

时间:2015-03-21 19:54:50      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

    上层应用程序通过调用函数进入操作系统,表面上是函数,实际上是什么呢?

    第一个问题:应用程序在内存中,操作系统也在内存中,为什么不能直接进入操作系统中呢?答案是安全。

    技术分享

    那么问题来了,既然不可以直接进入,那怎么才能阻止直接进入呢?怎样才能进入内核中呢?

    第一个问题的答案是通过硬件将内存分为用户态和内核态。

    技术分享

      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表示每个函数指针占用四个字节。

         技术分享

    

《第五讲:调用的实现》

标签:

原文地址:http://www.cnblogs.com/573177885qq/p/4356029.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!