Linux与VxWorks主要区别(五):请求内核服务方式

来源:互联网 发布:数据库设计有哪些步骤 编辑:程序博客网 时间:2024/06/05 20:25
Linux与VxWorks的主要区别

5、请求内核服务方式
       Linux                       VxWorks
  系统调用,更安全       函数调用,更快

函数调用:计算机编或运行时,使用某个函数来完成相关命令。
C语言中,函数调用的一般形式为:函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
在C语言中,可以用以下几种方式调用函数:
1. 函数表达式:
   函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。
2. 函数语句:
   函数调用的一般形式加上分号即构成函数语句。例如: printf ("%d",a);scanf ("%d",&b);都是以函数语句的方式调用函数。
3. 函数实参:
   函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y)); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。

函数调用的实际(汇编)实现
指针寄存器EBP和ESP
   EBP是所谓的帧指针,指向当前活动记录的上方(上一个活动记录的最下方)
   ESP是所谓的栈指针,指向当前活动记录的最下方(下一个将要插入的活动记录的最上方)
   这两个指针的值规定了当前活动记录的位置
参数传递
   将函数参数压栈:mov eax,dword ptr [n] ;(n为参数变元)
   push eax
函数调用分配空间
   函数调用将执行如下操作:
   ⒈将帧指针压入栈中:push ebp
   ⒉使得帧指针等于栈指针:mov ebp,esp
   ⒊使栈指针自减,自减得到的内存地址应当能够(足够)用来存储被调用函数的本地状态:sub esp,0CCh
    注意:0CCh为0xCC,随着具体函数的不同而不同。
传入保存状态
    push ebx ;保存ebx寄存器的值
    push esi ;保存esi寄存器的值
    push edi ;保存edi寄存器的值
装入edi
    lea edi,[ebp-0CCh] ;0cch是当前活动记录的大小。
    EDI是目的变址寄存器。
恢复传入的保存状态
    00411417 pop edi
    00411418 pop esi
    pop ebx
栈指针上移,恢复空间
    add esp,0CCh
函数返回释放空间
    当函数返回时,编译器和硬件将执行如下操作:
    ⒈使栈指针等于帧指针: mov esp,ebp
    ⒉从栈中将旧的帧指针弹出: pop ebp
    ⒊返回:ret
    

系统调用:由操作系统实现的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。
操作系统的主要功能是为应用程序的运行创建良好的环境,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给用户。系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序。
Linux系统调用,包含了大部分常用系统调用和由系统调用派生出的的函数。
主要包括如下几部分:
1、进程控制
如:fork 创建一个新进程
  clone 按指定条件创建子进程  等
2、文件系统控制
  a)文件读写操作
  如:open 打开文件
    creat 创建新文件  等
  b)文件系统操作
  如:chdir 改变当前工作目录
     chmod 改变文件方式   等
3、系统控制
如:reboot 重新启动
    sysinfo 取得系统信息   等
4、内存管理
如:mmap 映射虚拟内存页
    msync 将映射内存中的数据写回磁盘   等
5、网络管理
如:getdomainname 取域名
  setdomainname 设置域名   等
6、socket控制
如:socketcall socket系统调用
  socket 建立socket   等
7、用户管理
如:getuid 获取用户标识号
  setuid 设置用户标志号  等
8、进程间通信
如:semctl 信号量控制
  semget 获取一组信号量
  semop 信号量操作   等
原创粉丝点击