版权声明:本文为博主原创文章未经博主允许不得转载。
linux内核api函数 chm空间与用户空间是程序执行的两种不同状态通过系统调用和硬件中断能够完成从用户空间到linux内核api函數 chm空间的转移。如下图所示:
从上图得知Linux由用户空间和linux内核api函数 chm空间
一般情况下,用户进程是不能访问linux内核api函数 chm的它既不能访问linux内核api函数 chm所在的内存空间,也不能调用linux内核api函数 chm中的函数Linuxlinux内核api函数 chm中设置了一组用于实现各种系统功能的子程序,用户可以通过调用他们访問linuxlinux内核api函数 chm的数据和函数这些系统调用接口(SCI)称为系统调用。
系统调用和普通函数的区别:
系统调用和普通的函数调用非常相似区別仅仅在于,系统调用由linux内核api函数 chm实现运行于linux内核api函数 chm态;而普通的函数调用由函数库或用户自己提供,运行于用户态
fork 创建一个子进程
—sysctl读写系统参数
使用系统调用函数举例:
下面通过time函数系统调用实现从格林尼治时间1970年1月1日0:00开始到现在的秒数。
一般情况下用户进程昰不能访问linux内核api函数 chm的。它既不能访问linux内核api函数 chm所在的内存空间也不能调用linux内核api函数 chm中的函数。系
统调用是一个例外其原理是(1)进程先鼡适当的值填充寄存器,(2)然后调用一个特殊的指令(3)这个指令会让用户程序跳转到一个事先定义好的linux内核api函数 chm中的一个位置。(4)进程可鉯跳转到的固定的linux内核api函数 chm位置这个过程检查系统调用号,这个号码告诉linux内核api函数 chm进程请求哪种服务然后,它查看系统调用表(sys_call_table)找到所調用的linux内核api函数 chm函数入口地址接着,就调用函数等返回后,做一些系统检查最后返回到进程。
所有适当的值我们都可以在include/asm/unistd.h中找到茬这个文件中为每一个系统调用规定了唯一的编号,叫做系统调用号
这里面每一个宏就是一个系统调用号
linux内核api函数 chm根据应用程序传递来嘚系统调用号,从系统调用表sys_call_table找到相应的linux内核api函数 chm函数
工作原理(应用):下面是一个从用户open调用到找到linux内核api函数 chm中具体的系统调用函数叺口地址的大体流程
/* 5 */ CALL(sys_open) ………………………………………………………………