系统调用机制及简单的嵌入式汇编/API实现

本文介绍了系统调用的概念、中断的分类,并详细阐述了Linux系统调用的编程实现,包括API库函数和C语言嵌入式汇编的使用。通过对Linux-5.0内核的编译和QEMU虚拟机的实践,深入探讨了系统调用在系统内部的执行流程。
摘要由CSDN通过智能技术生成

原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
本文主要参考了实验楼中"使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用"的实验.
部分则讲解系统调用的处理过程.



 
 

系统调用

  系统调用是操作系统中耳熟能详的一个名词了, 本科上OS时的记忆已经有点模糊, 乘着这次作业刚好可以回顾一下.
  了解系统调用之前, 先来看看中断.

系统中断

  中断通常分为两类: 同步(synchronous)中断和异步(asynchronous)中断, 顾名思义, 前者是在一条指令中止执行后CPU才会发出的; 后者则是有其他硬件设备按照CPU时钟信号随机产生的. 我们也常常成同步中断和异步中断为异常(exception)和中断(interrupt).
  Intel的文档中把中断和异常分为以下几个大类:

  • 中断
    • 可屏蔽(maskable)中断
    • 非屏蔽中断
  • 异常
    • 故障(fault)
    • 陷阱(trap)
    • 异常终止(abort)
    • 编程异常(programmed exception)

  编程异常通常是由我们这些程序猿引发的, 众所周知, 在linux系统中, 凡是涉及到资源管理和设备交互这些事情, 通常是由OS管理, 当我们需要调用系统的功能时, 通常通过系统调用将这些服务交由OS来做. 系统调用就是OS为用户态进程与硬件设备进行交互提供的一组接口, 系统调用的好处多多, 不仅把用户(client, 编程用户: 程序猿)从底层的硬件编程中解放出来, 还极大地提高了系统的安全性, 使得我们开发的程序有了可移植性.
关于以上的更多详细介绍, 可以参考维基百科: 中断

系通调用的编程实现

  系统调用的缘由和原理我们知道了, 但是如何实现系统调用, 才是认识过程的第二次飞跃. Linux内核的底层代码都是通过C语言实现的, 在C语言的库中, 就有一些API引用了封装例程, 封装例程的目的, 就是进行系统调用. 我们常见的printf(), chdir() 其实都属于系统调用的范畴.

系统调用在系统内部的表现

  结合前面两个标题, 我们对于中断, 系统调用有了泛泛的了解, 更深入一点, 系统调用的过程中, 究竟发生了什么?
  我们知道, 在进行中断的时候, 通常系统会发出中断号, 中断号的目的, 就是为了查找中断服务程序的地址, 通常中断号 ∗ * 4 即为中断向量的地址, 而中断向量通过中断描述表( I n t e r r u p t d e s c r

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include"..\ucos-ii\includes.h" /* uC/OS interface */ #include "..\ucos-ii\add\osaddition.h" #include "..\inc\drv.h" #include <string.h> #include <math.h> #pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting ///******************任务定义***************/// OS_STK Main_Stack[STACKSIZE*8]={0, }; //Main_Test_Task堆栈 void Main_Task(void *Id); //Main_Test_Task #define Main_Task_Prio 12 /**************已经定义的OS任务************* tcp监控任务 11 以太网物理层监控任务 8 触摸屏任务 9 键盘任务 10 lcd刷新任务 59 系统任务 1 *****************************************************/ ///*****************事件定义*****************/// OS_EVENT *Nand_Rw_Sem; //Nand_Flash读写控制权旗语 //and you can use it as folloeing: // Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件// // OSSemPend(Nand_Rw_Sem,0,&err); // OSSemPost(Nand_Rw_Sem); OS_EVENT *Uart_Rw_Sem; //Uart读写控制权旗语 //and you can use it as folloeing: // Uart_Rw_Sem=OSSemCreate(1); //创建Uart读写控制权旗语,初值为1满足互斥条件// // OSSemPend(Uart_Rw_Sem,0,&err); // OSSemPost(Uart_Rw_Sem); ////////////////////////////////////////////////////////// void initOSGUI() //初始化操作系统的图形界面 { initOSMessage(); initOSList(); initOSDC(); initOSCtrl(); initOSFile(); } ///////////////////////////////////////////////////// // Main function. // ////////////////////////////////////////////////////
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值