基础知识

1、通过库函数的方式进行系统调用,库函数用来把系统调用给封装起来。
2、CPU有四种不同的执行级别:0、1、2、3,数字越小,特权越高。Linux操作系统中采用了0和3两个特权级别,分别对应内核态和用户态。
3、宏观上Linux操作系统的体系架构分为:用户态和内核态。
区分内核态和用户态的方法就是CS:EIP的指向范围。
内核态(高指令执行级别):对所有的指令包括特权指令都可以执行,CS:EIP的值可以是任意地址
用户态(低级别指令):对于32位的4GB进程地址空间,只能访问0x00000000~0xbfffffff的地址空间。

4、中断:从用户态进入内核态的主要方式。从用户态切到内核态时,必须保存影虎太寄存的上下文,中断/int指令会在堆栈上保存寄存器的值。进入中断程序,首先要保存现场,保存需要用到的寄存器数据,通过#define SAVE_ALL把其他寄存器的值push到内核堆栈中;退出程序时,恢复现场,恢复保存寄存器的数据,通过RESTORE_ALL把值pop出来。

5、系统调用:为用户态进程与硬件设备进行交互提供了一组接口。

6、系统调用的功能和特性:

把用户从底层的硬件编程中解放出来;
极大地提高系统安全性;
使用户程序具有可移植性。
7、API和系统调用的关系:
API:应用程序编程接口,只是函数定义。

系统调用通过软中断向内核发出了中断请求,int指令的执行就会触发一个中断请求。
libc函数库定义的一些API内部使用了系统调用的封装例程,其主要目的是发布系统调用,使程序员在写代码时不需要用汇编指令和寄存器传递参数来触发系统调用。
一个API可能只对应一个系统调用,也可能内部由多个系统调用实现;一个系统调用也可能被多个API调用。
涉及与内核空间进行交互的API内部会封装系统调用,不涉及与内核空间进行交互的API内部不会封装系统调用。
如果内核增加了一个新的系统调用,但libc函数库没有及时更新为其编写API函数,则可以利用libc提供的syscall函数直接调用。
8、系统调用的三层机制:xyz(),system_call和sys_xyz()

9、内核如何知道用户态进程希望调用的是哪个系统调用?
内核通过给每个系统调用一个编号来区分,即系统调用号,将API函数xyz()和系统调用内核函数sys_xyz()关联起来,用EAX寄存器传递系统调用号参数。

使用库函数API和C代码中嵌入汇编代码触发同一系统调用
使用库函数API进行触发

下面以调用系统库函数getpid()来获取进程识别码为例。

C代码中嵌入汇编代码进行触发

  • 查询linux系统调用号表可知,getpid()系统调用号为20,十六进制即0x14。
  • #define __NR_getpid 20
    

    汇编代码分析:

  • asm volatile("mov $0,%%ebx\n\t"           /*把EBX寄存器清零*/"mov $0x14,%%eax\n\t"     /*把0x14放到EAX寄存器中,EAX寄存器用于传递系统调用号,getpid()系统调用号为20,十六进制即0x14*/"int $0x80"                          /*触发系统调用陷入内核执行20号系统调用的内核处理函数*/:"=a"(pid) );
    

  • 含两个参数的系统调用rename

    rename在内核中的系统调用处理函数为sys_rename(),系统调用号为38,其功能是给一个文件重命名。

  • 嵌入式汇编代码进行触发
  • asm volatile( "movl %1,%%ebx\n\t"                /*把oldname存入EBX寄存器中*/"movl %2,%%ecx\n\t"                /*把newname存入ECX寄存器中*/"movl $0x26,%%eax\n\t"           /*把系统调用号38存入EAX寄存器中*/"int $0x80\n\t"                            /*触发系统调用陷入内核执行38号系统调用的内核处理函数*/:"=a"(ret) :"b"(oldname),"c"(newname) );
    ```![在这里插入图片描述](https://img-blog.csdnimg.cn/8d5cce5d3b084aa8a9c8486436744ff1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bm_5YyX5YWI5qOu,size_18,color_FFFFFF,t_70,g_se,x_16)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/4fabc40297af4f698d144732a706efbe.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bm_5YyX5YWI5qOu,size_17,color_FFFFFF,t_70,g_se,x_16)
    - 库函数API进行触发
    利用库函数API触发rename系统调用将上述改名后的www20212809.c改回www.c。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/766c5003f5c54ecea45e1512f8353d6e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bm_5YyX5YWI5qOu,size_20,color_FFFFFF,t_70,g_se,x_16)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/797dbabbfd5a4ce4b76888ae48e52ffa.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bm_5YyX5YWI5qOu,size_14,color_FFFFFF,t_70,g_se,x_16)

20222817《Linux内核原理与分析》第五周作业相关推荐

  1. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  2. 2022-2023-1 20222809《Linux内核原理与分析》第一周作业

    Linux内核原理与分析第一周作业 配置环境 1.参考Linux(Ubuntu)系统安装图文教程中第二种借助virtualbox成功配置Ubuntu环境 2.升级更新软件包 可以通过调节分辨率和虚拟机 ...

  3. 实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  4. 《Linux内核原理与分析》第二周作业

    反汇编一个简单的C程序 1.实验要求 使用: gcc –S –o test.s test.c -m32 命令编译成汇编代码,对汇编代码进行分析总结.其中test.c的具体内容如下: int g(int ...

  5. 2018-2019-1 20189218《Linux内核原理与分析》第九周作业

    进程调度的时机 进程调度时机就是内核调用schedule函数的时机.当内核即将返回用户空间时,内核会检查need_resched标志是否设置.如果设置,则调用schedule函数,此时是从中断(或者异 ...

  6. 2021-2022-1 20212820《Linux内核原理与分析》第一周作业

    声明:本文是基于Linux 基础入门_Linux - 蓝桥云课 (lanqiao.cn)这门课学习所写的课程笔记. 实验1 Linux系统简介 Linux主要包括是系统调用和内核两部分 Linux与W ...

  7. 20189220 余超《Linux内核原理与分析》第一周作业

    实验一 Linux系统简介 通过实验一主要是学习到了Linux 的历史简介,linux与windows之间的区别,主要是免费和收费,软件和支持,安全性,使用习惯,可制定性,应用范畴等.linux具有稳 ...

  8. 2018-2019-1 20189201 《LInux内核原理与分析》第九周作业

    那一天我二十一岁,在我一生的黄金时代.我有好多奢望.我想爱,想吃,还想在一瞬间变成天上半明半暗的云.那一年我二十一岁,在我一生的黄金时代.我有好多想法.我思索,想象,我不知该如何行动,我想知道一个城市 ...

  9. 2018-2019-1 20189208《Linux内核原理与分析》第九周作业

    活动 main函数编译有问题,div 函数和系统中某个函数重名,浮点输出有问题,scanf也有问题 修改如下 scanf_s("%d %d", &a, &b); p ...

  10. 20189220 余超《Linux内核原理与分析》第二周作业

    计算机如何工作的 一.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机.两个层面: (1)硬件的角度(计算机主板):一个CPU,一块内存,之间有总线连接.CPU内部有一个IP计算器, ...

最新文章

  1. laravel 发送带附件的邮件
  2. VTK:小部件之ImagePlaneWidget
  3. [剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]
  4. java研发工程师与java后端工程师有什么区别?
  5. 新手理解的JS原型链 1
  6. Android Studio(7)---查找例子
  7. Spring Mvc使用Jackson进行json转对象时,遇到的字符串转日期的异常处理(Can not deserialize value of type Date from String)
  8. 房地产企业营销分析系统建设中的关键性指标是什么?
  9. 【Linux】预编译,编译,汇编,链接的四过程
  10. Android Studio for Experts(Android Dev Summit2015)
  11. autorun.inf删除方法
  12. Ext.gridPanel中内容对齐
  13. svn图标没有显示的解决办法
  14. 在html中加入网址,网页超链接怎么做,添加超链接网址的的详细步骤
  15. 【数模】整数规划模型
  16. win10操作系统创建局域网共享文件夹
  17. 5G核心网技术基础自学系列 | 消息业务
  18. Linux (CentOS) 系统下载地址
  19. 电脑更改桌面图标与图标文字的大小
  20. 定时循环发送UDP消息(例如:控制远程电脑的开机、关机、重启、打开和关闭程序等)—— 定时执行专家

热门文章

  1. 递归实现数组的扁平化
  2. vue项目使用预渲染 进行seo优化
  3. 高版本IE浏览器(IE8、IE9)查看网页Applet问题解决方案
  4. AS3多线程快速入门(三):NAPE物理引擎+Starling
  5. 安卓原生运行Win11 再跑 Apk,搁着套娃呢!
  6. 忠告7 成功 = 能力 X 努力 X 态度
  7. 交换机ftp将文件传到服务器,如何用FTP实现交换机间配置文件复制?
  8. CCCC-GPLT L2-023. 图着色问题 图论-点染色
  9. 详解Flink中yarn部署模式以及测试
  10. python自学之《21天学通Python》(2)