《linux内核设计与实现》Chapter5章系统调用(笔记)

5章系统调用


5.0系统调用介绍

(先贴个第一章的图,这样一看,就明白系统调用在哪里了)

《linux内核设计与实现》Chapter5章系统调用(笔记)_第1张图片
作用:

1提供硬件抽象接口

2保证系统稳定性与安全性

3为用户空间&系统提供接口


5.1APIPOSIXC
一般情况,APP应用程序通过应用程序接口API实现编程,而不是系统调用(因为APP使用API不需要和内核提供的系统调用对应)

总言之:

Unix系统调用提供机制而不提供策略



5.2系统调用(syscalls
asmlinkage
(限定词)通知编译器仅从栈中提取该函数的参数

sys_xxxx()系统调用的函数名前加上sys_

1系统调用号——通过寄存器传递(一蛋分配好不再便,否则编译好的APP崩溃)

2syscalls性能——高效快(进程上下文切换快;系统调用处理程序&系统调用简洁)

(说到这里,如果我自己久一点时间再看,肯定也不知到自己说些什么,看不懂没关系,等接触源码的时候就会记住啦)



5.3系统调用处理程序

用户空间程序无法直接执行代码,通过软中断通知内核

system_call()系统调用处理程序

1指定恰当的系统调用

2参数传递

上面已经说了好多遍咯,通过register传递(为什么?快嘛)



5.4系统调用实现

Linux系统调用实现不太关心与系统调用处理程序之间的关系(问题少年来了,为什么呢?因为Unix系统调用提供机制而不提供策略咯),因此系统调用难在设计和实现

实现第一步:确定系统调用的用途(注意啦,Linux中一个系统调用一个用途)

实现第二步:参数、返回值、错误码力求简洁稳定,恰到好处

实现第三步:设计要通用(通常不会增加系统调用,所以不用我们设计,Linux已经很健壮了)


参数验证:

系统调用必须检测所有参数是否有效,下面给出2个最重要的检查:

1检查用户提供的指针是否有效,接收用户空间必须保证指针:

1.point指向内存区域belongto user space

2.point指向内存区域在process‘saddress space

3.如果是读,则内存标记为可读

而上诉的kernelspace & user space的数据交换通过copy_to_user()| copy_from_user()

2.检查针是否有合法权限



5.5系统调用上下文(syscallscontext
先来理解下面3个小概念,然后来介绍如何对系统调用进行操作吧:

1kernel执行syscalls时在processcontextcurent指向引发系统调用的process

2processcontextkernel可以休眠&抢占

3系统调用return时,system_call()负责切换到用户空间并让用户进程继续执行


1.绑定一个系统调用的最后一步

当我编写完系统调用啦,就要注册它:

1.系统调用表中加入表项

2.<asm/unistd.h>定义支持体系结构(这里不需要太清楚,以后看LDD时会详细说明滴)
3.
编译进kernelimage

最后usersapce就可以调用你的系统调用函数啦

(注:嗯嗯,如果实践中能做到这一步,那么你已经是半个Hacker)

2.从用户空间访问调用

1.通常syscallslibC支持

2.通宏_syscalln()对系统调用直接访问

3.哈哈,最好不要自己建立一个新的系统调用

为什么呀?Linux本来给你提供的系统调用已经非常好用了,而且跟30多年的Unix差不多,所以,上面所说的123个步骤就可以忽略掉啦。只需要理解它是如何执行,如何调度就好了。



系统调用小结:

执行系统调度的连锁反映:

陷入kernel

传递系统调用号和参数

执行正确的系统调用函数

把返回值带回空间



==========================iam a happy dividing line==========================


你可能感兴趣的:(《linux内核设计与实现》Chapter5章系统调用(笔记))