LKD5

第五章 系统调用
1. 系统调用是在用户空间和硬件设备之间添加的一个中间层。作用有三:
-为用户空间提供了一种硬件的抽象接口
-保证系统的安全和稳定
-在用户空间和系统的其余部分提供一层公共接口

2.在Linux中,系统调用是用户空间访问内核的唯一手段,除了异常和陷入外
3.Unix中最流行的编程接口:POSIX标准的。Linux是POSIX兼容的,而C库提供了POSIX标准的大部分API.
4.程序员只关心API,但是内核却仅仅关心系统调用。
5.Unix接口设计的一句格言:"提供机制而不是策略"
---------------------------------------------------------------------------
1.系统调用通常通过函数进行调用。errno保留错误值,perror()把她翻译成用户可以理解的错误字符串。
2. getpid的系统调用:
asmlinkage long sys_getpid(void)
{
 return current->tgid;
}
asmlinkage:通知编译器仅从栈中提取该函数的参数.
sys_是Linux中系统调用遵守的命名规则。
3.Linux中,每个系统调用分配一个系统调用号,独一无二的。sys_ni_syscall()表示未实现的系统调用。
4.内核记录系统调用表中的所有已注册过的系统调用的列表,sys_call_table,与体系结构相关,entry.S
5.Linux的系统调用比较快。(上下文切换的速度,系统调用本身)
------------------------------------------------------------------------------
1.通知内核的机制是靠软中断实现的,引发一个异常来促使系统切换到内核态去执行异常处理程序。x86平台是用 int $0x80
2.处理程序的名字:system_call(),放在entry.S中。新的x86用sysenter指令。
3.陷入内核的同时要传递系统调用号,x86平台是放在eax寄存器中。NR_syscalls作比较
4.参数的传递时通过寄存器,给用户空间的返回值也是靠寄存器传递
-------------------------------------------------------------------------------
1.实现一个系统调用,首要的就是要确定其用途。每个系统调用都应该有一个明确的用途,ioctl是个例外。
2.新系统调用的参数,返回值又是什么?接口力求简洁,参数简单,系统调用的语义和行为非常关键。
3.设计接口要尽量为将来考虑,越通用越好
4.注意其移植性和健壮性,不但要考虑当前,还要考虑未来
5.系统必须检查参数的合法性,如用户提供的指针是否有效。内核必须保证:
-指针指向的内存区域属于用户空间
-指针指向的内存区域在进程的地址空间里
-读写的权限
6.copy_to_user(),copy_from_user()
7.合法权性:suser(),以及更细粒度的全能:capable()
------------------------------------------------------------------------------
1.能够休眠,说明系统调用可以使用内核提供的大部分功能。在进程上下文可以被强占,表明向在用户空间一样,当前的进程同样可以被强占,新的进程可以使用相同的系统调用,所以要确保系统调用是可以重入的。
2.系统调用返回时,控制权仍然在system_call(),他最终负责切换到用户空间并让用户进程继续执行下去
3.注册一个系统调用:
-加入表项
-分配系统调用号
-编译进内核映像
4.如果仅仅写出系统调用,glibc库恐怕并不提供支持。但是Linux本身提供了一组宏:_syscalln(),n的范围从0-6,表明参数的个数。第一个是返回类型,第二参数是系统调用的名称。
5. #define __NR_foo 283
__syscall0(long,foo)
现在就可以用foo函数了
6.为什么不同过系统调用的方式实现?
优点:创建容易,使用方便。高性能显而易见
缺点:系统调用号码需要官方分配。一旦内核稳定就固化。需要注册到各个不同的体系结构中。
脚本中不易调用。也不能从文件系统直接的访问系统调用,仅仅对简单的信息交换,大材小用。

7替代方法:
-用设备节点的方式,用文件IO访问
-一些信号量接口,可以用文件描述符进行操作
-增加的信息放在sysfs的合适位置
8 Linux的系统调用增添频率很低反映出Linux是一个相对稳定并且功能完善的操作系统。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值