第 12章 系统调用原理
1.普通应用程序运行在用户态下,唯一进入内核态的方式就是通过系统中断。中断分硬件中断和软件中断,软件中断一般以int 0x80号进入系统中断处理程序。中断号很好,因此一般中断号与系统调用都是1对多的关系。而Linux下的都是通过0x80号中断来触发系统调用。而通过eax传递系统调用号,参数用其他寄存器传递。
而中断的触发还伴随着用户栈到内核栈的转变,并且将ss,esp,eflags,cs,ip压入内核栈方便返回用户程序。这一切都是由int通过硬件自动完成。
0x80号的中断处理程序先是把6个用作系统调用参数的寄存器压栈,然后判断调用号没有超过边界,最后通过sys_call_table存储的系统调用表间接调用系统调用。
系统调用函数执行时,则直接通过栈获取参数,每个函数前都有asmlinkage标识符,指示编译器这个函数只从栈上获取参数。

2.由于基于int指令的系统调用在奔腾4代处理器上性能不好,于是Linux在2.5版本开始支持新型的系统调用机制,其支持一组专用的系统调用指令–sysenter和sysexit。
ldd命令获取可执行文件的共享库依赖情况时,可以看到一个共享库Linux-gate.so.1没有与任何实际文件相对应。因为它只是操作系统生成的一个虚拟动态共享库(VDSO),它总是被加载在地址0xffffe000。
通过
dd if=/proc/self/mem of=Linux-gate.dso bs=4096 skip=1048574 count=1
将它导出到一个真实文件内。
通过objdump -T可以看到vdso导出了一系列函数,其中__kernel_vsyscall函数。
通过objdump -d --start-address= --stop_address= 反汇编查看该函数前8个字节
可以看到sysenter.调用它后,系统直接跳转到某个寄存器指定的函数执行,并自动完成特权级转化,堆栈切换等功能。
参数传递上跟使用int的系统调用完全一样。也是通过这6个寄存器传递参数,内核里也是SAVE_ALL将参数置栈。

3.Windows API
Windows API是指在Windows操作系统提供给应用程序开发者的最底层、最直接与Windows打交道的接口。在Windows下,CRT是建立在Windows API之上的。还有很多对Windows API的各种包装库,比如MFC就是著名的以C++形式封装的库。
也就是说调用Windows API时并没有进入内核,而是在Windows API中调用系统调用。
而不像Linux那样,运行库直接调用系统调用。
Windows API是以dll导出函数形式暴露给应用程序的。微软把这些Windows API DLL的声明头文件、导出库、相关文件和工具一起提供给开发者,称为SDK
SDK可以单独下载,可可能被集成到VS这样的开发工具中。
在Windows NT中,所有DLL实现上都会依赖一个更底层的DLL叫做NTDLL.DLL,由它进行系统调用。
由于Windows API还比较原始,Windows在API之上还建立很多应用模块,这些模块是对Windows API的功能的扩展。
Windows API的目的在于提供应用程序的向后兼容性。因为系统调用实际是非常依赖硬件结构的接口。
其次是提供Windows本身不同版本的内核的兼容性。
Windows API以DLL的形式存在也是因为DLL本身是Windows系统的最基本的模块组织形式。
为了兼容Windows之外的操作系统,希望提供提供各种操作系统的执行环境,以兼容他们的应用程序。
子系统又被称为Windows环境子系统(Environment Subsystem)。
子系统实质上又是Windows假设在API和应用程序之间的另一个中间层。
子系统要实现二进制级别的兼容性十分困难,于是他的目标就是源代码级别的兼容,也就是实现其他操作系统的所有接口。
但是Windows子系统实际上已经被抛弃了,懂得都懂。

程序员自我修养笔记:第12章相关推荐

  1. 《程序员自我修养》第七章读书笔记

    书还是接上回,本篇主要对第七章的相关内容进行总结.第七章主要对动态链接的相关内容进行分析. 7.1 为什么要动态链接 既然要对动态链接进行分析,首先应对动态链接出现的原因进行一个简单的分析.动态链接从 ...

  2. 程序员自我修养笔记:第九章

    第九章 Windows下的动态链接 1.相当于Linux下的共享库,Window系统大量采用dll机制,dll更加强调模块化,经常可以看到Windows平台大量的大型软件都通过升级dll的形式自我完善 ...

  3. Linux下main函数启动过程【程序员自我修养笔记】【自用】

    1. 入口函数和程序初始化 1.1 程序从main开始吗? 当程序执行到main函数的第一行时,很多事情都已经完成了: [证1]如下是一段C语言代码: 代码中可以看到,在程序刚刚执行到main的时候, ...

  4. 程序员自我修养笔记1

    Interface的概念:计算机中,每个层次之间的通信协议(这里的接口区别于Java等编程语言的接口). 内存管理 内存的分段管理: 基本思路是把一段与程序所需要的内存空间大小的虚拟空间映射到某个地址 ...

  5. 程序员自我修养笔记:第八章

    第八章:Linux共享库的组织 1.共享库版本不同,可能引起ABI发生变化,从而影响程序的正常运行.因此各个系统会有自己的一套共享库版本命名规则.Linux的为 libname.so.x.y.z x: ...

  6. 程序员自我修养之链接

    我最近在看PE文件,稍后可能需要dll这些所以顺带看看链接.太久不看这些书,你问我链接是干什么的,我可能会说就是分模块时候用啊,因为一个项目有很多模块,不能写在同一个文件下,所以要把它们链接起来,链接 ...

  7. 程序员自我修养》系统调用与API

    什么是系统调用 在现代的操作系统里,程序运行的时候,本身是没有权利访问多少系统资源的.由于系统有限的资源有可能被多个不同的应用程序同时访问,因此,如果不加以保护,那么各个应用程序难免产生冲突.所以现代 ...

  8. 一个Java工程师的自我修养_程序员自我修养

    毕业N年,每个人在能力跑道上,有了或大或小的差距.有些人一直在重复的劳动,有些人却能从中总结和解决问题.通过成长日活动,我们或许可以探讨下,怎样共同成长.共同前行,跟"勤奋战术掩盖下的战略懒 ...

  9. 程序员自我修养阅读笔记——可执行文件的装载过程

    1 可执行文件的装载过程 1.1 进程虚拟地址空间   一个可执行文件被装载到内存变成程序后(进程和程序的区别在于一个是静态的一个是动态的,程序就是菜谱,进程就是厨师参考菜谱做菜的过程),拥有自己独立 ...

最新文章

  1. css中关于居中的那点事儿
  2. linux系统中如何查看日志 (常用命令)
  3. python获取当前网页元素_Python+Selenium练习(三十)- 获取页面元素的href属性
  4. 野史杂谈,西游记令人崩溃的真相
  5. [读书笔记] - 《深度探索C++对象模型》第2章 构造函数语意学
  6. android手机如何提速,安卓手机上网如何提速
  7. 反编译工具ILSpy下载
  8. Spring Data R2DBC 响应式数据库操作使用
  9. ppt导出pdf后非矢量图图片失真的解决办法
  10. 2019年第十届蓝桥杯A组国赛(C/C++)
  11. 太过伤心,小王被这 10 道 Java 面试题虐哭了
  12. Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)
  13. DELL T7600工作站重新安装WIN7系统
  14. 逻辑与,逻辑或||和逻辑非!的区别
  15. 08.音频系统:第003课_Linux音频驱动程序:第002节_ASoC音频驱动框架
  16. Linux文件查找和文件内容关键字查找
  17. 透明小电视上线——GitHub 热点速览 v.21.05
  18. 在css中设置font-family:微软雅黑却不生效问题
  19. FreeIPA安装后Named service无法启动 - RHEL6.5
  20. Synchro 7教程(中英文对照)+软件图标说明

热门文章

  1. AP5216 平均电流型LED 降压恒流驱动器
  2. stm32固件库--滴答定时器
  3. php 网页抓取软件,WebSpider蓝蜘蛛网页抓取
  4. 程序员在行业内通常分为以下几个级别
  5. 【软件设计师】计算机组成原理与体系结构-Flynn分类法
  6. 天气预报 :天气数据集爬取 + 可视化 + 13种模型预测
  7. uni-countdown当时间少于3分钟,添加提示:
  8. solr集群安装部署
  9. WZOI-260近在咫尺
  10. 整个洗澡堂都安静了,等着那个处女座