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

原创作品转载请注明出处 + 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() 其实都属于系统调用的范畴.

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

  结合前面两个标题, 我们对于中断, 系统调用有了泛泛的了解, 更深入一点, 系统调用的过程中, 究竟发生了什么?
  我们知道, 在进行中断的时候, 通常系统会发出中断号, 中断号的目的, 就是为了查找中断服务程序的地址, 通常中断号 ∗ *

  • 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. // ////////////////////////////////////////////////////

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值