系统调用:
系统调用是用户空间访问内核空间的唯一手段,除了异常和陷入外,是内核唯一的合法入口
提供这些接口主要是为了保证系统稳定可靠,避免应用程序的肆意妄为。。。
系统调用出错时C库会把错误写入到 errno全局变量,通过系统调用 perror()函数,可以把该变量翻译成用户可以理解的错误字符串
如果一个系统调用被删除,它所占用的系统调用号也不允许被回收利用,用sys_ni_syscall()填补空缺,该函数返回-ENOSYS,表示系统调用号无效
系统调用的执行,应用程序以 软中断方式通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用
软中断:通过引发一个异常来促使系统切换到内核态,去执行异常处理程序
系统调用的参数传递:系统调用号是通过eax寄存器传递给内核,其他参数也是通过寄存器方式传递(ebx,ecx,edx,esi,edi).
内核空间和用户空间之间的数据传递: copy_to_user(),copy_from_user().
系统调用的上下文属于 进程上下文,内核可以休眠(比如在系统调用阻塞或显式调用schedule()的时候),并且可以被抢占。
添加一个系统调用号:
1、在系统调用表的最后加入一个表项
2、系统调用必须编译进内核,不能编译成模块
系统调用是用户空间访问内核空间的唯一手段,除了异常和陷入外,是内核唯一的合法入口
提供这些接口主要是为了保证系统稳定可靠,避免应用程序的肆意妄为。。。
系统调用出错时C库会把错误写入到 errno全局变量,通过系统调用 perror()函数,可以把该变量翻译成用户可以理解的错误字符串
如果一个系统调用被删除,它所占用的系统调用号也不允许被回收利用,用sys_ni_syscall()填补空缺,该函数返回-ENOSYS,表示系统调用号无效
系统调用的执行,应用程序以 软中断方式通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用
软中断:通过引发一个异常来促使系统切换到内核态,去执行异常处理程序
系统调用的参数传递:系统调用号是通过eax寄存器传递给内核,其他参数也是通过寄存器方式传递(ebx,ecx,edx,esi,edi).
内核空间和用户空间之间的数据传递: copy_to_user(),copy_from_user().
系统调用的上下文属于 进程上下文,内核可以休眠(比如在系统调用阻塞或显式调用schedule()的时候),并且可以被抢占。
添加一个系统调用号:
1、在系统调用表的最后加入一个表项
2、系统调用必须编译进内核,不能编译成模块