linux-系统调用


linux-系统调用
 
系统调用的作用:从用户太陷入内核态三种方式之一,系统调用、中断、异常。
系统调用是os向上的接口,一般应用程序不会直接使用系统调用,而是使用标准的库api,因为标准库的api一般是一致的,但是具体的系统调用有具体系统而定。
linux一大亮点:机制(提供什么功能)和策略(怎样实现功能)的区分,关心前者
   www.2cto.com  
实现机制:
int 0x80终端号->系统调用//问题:这个中断是怎么产生的?怎么识别系统调用?
 
1、用户程序为系统调用设置参数(含系统调用号)
2、触发软中断 int0x80 导致异常
3、执行异常事件(--->)会导致处理器切换到内核态并转到一个新的地址,执行异常处理函数(系统调用函数)
4、找到执行哪一个系统调用
5、返回用户状态,将控制权返回给用户//怎么做?
==========  www.2cto.com  
1\系统调用号非常关键,一旦分配便不能更改,系统调用号是通过eax传递给内核,返回值也放在eax中。其他参数可放在ebx。ecx。edx。esi。edi中,过多就将参数放在用户空间的一段内存,然后将该地址存在制定寄存器中。
2\系统调用必须检查所有参数是否有效,用户提供指针是否有效**比如一个进程给内核的指针是其他用户的那就完了,内核帮他拷贝了是吧。。。
 
3\用户进程空间的访问严格::两个函数调用 copy——from——user和copy——to_user  这两个有可能由于缺页中断而阻塞
4\系统调用的返回值,区别于正常返回值(例如写文件返回个数),所以系统调用都使用一个全局的errno来保存错误码(相关接口 perror)。errno很容易改变,所以处理时先存上。
5\系统调用只能被编译进内核
6\系统调用表entry。h
7\实现放在 kernel/sys.c 一般系统调用好实现,但是一般模块可以替代系统调用
*8\系统调用上下文处于进程上下文中,current引发系统调用的进程可获得,在进程上下中内核可抢占可休眠。*****可抢占说明新的进程会使用同样的系统调用,系统调用是可重入,那么不能有静态变量之类。********可休眠说明内核绝大部分的功能都可用?
 
??此话怎讲???系统调用返回,控制权在syscall中,他负责将返回给用户进程。
9\系统调用访问内核:&(sys_call_table + num*wordsize(4))获取系统调用表项的函数地址-》执行完-》ret——from——sys检查返回用户空间前需要完成的任务。
10\系统调用访问用户:1、靠c库的支持  2、linux提供了一组宏,会设置好寄存器并调用陷入指令 _syscalln() n从0到6表示参数个数
例如: open(const char*filename, int flag int mode)
直接调用open的话需要定义
#define NR open 5 _syscall3(long, open, const char *, filename, int, flag, int, mode)
  www.2cto.com  
新增系统调用:
1、添加源代码:asmlinkage sys_系统调用名(){。。。} 、kernel/sys.c
2、连接系统调用(使内核其余部分知道该系统调用的存在):1\/usr/src/linux/include/asm-i386/unistd.h #define _NR_callname NNN //系统调用对应的号 (内核我才)
                                                                                        2\/usr/src/linux/arch/i386/kernel/entry.S  //.long SYMBOL_NAME(sys_mycall)   sys_call_table中增加(用户我才)
重新编译 使用:_syscall1(int,mycall,int,ret)
 

相关内容

    暂无相关文章