系统调用(1-基础)
cp4 (退而不休)
在读 Linux内核设计与实现
- 章节名:系统调用(1-基础)
P50: 》》 系统调用的意义: 1 提供抽象接口,易用; 2 对访问进行裁决,保护系统; 3 进程运行在虚拟系统中。 . 除了异常和陷入外,系统调用是访问内核的唯一合法入口。 . 大多数Unix系统上,根据POSIX定义的API和系统调用有着直接关系。实际上,POSIX就是仿照UNIX系统界面建立的;Windows NT也提供了与POSIX兼容的库。 C库提供了UNIX系统、也是POSIX的绝大部分API。 . "提供机制(mechanism)不提供策略(policy)"。。。。。。 .
asmlinkage long sys_getpid( void ) { return current->tgid; }1:asmlinkage:通知编译器仅从栈中提取该函数的参数。所有系统调用都需要的限定词。 2:get_pid()在内核中被定义成sys_getpid():所有系统调用的命名规则。 . Linux中,每个系统调用被赋予一个系统调用号,进程不会提及系统调用的名称。 系统调用号不能由任何变更,即使一个系统调用被删除,它的系统调用号也不允许被回收利用,以免发生兼容性问题。Linux中的sys_ni_syscall()只返回-ENOSYS,专门给无效的系统调用“补位”。 内核记录了所有已注册的系统调用列表,存储在sys_call_table中,它与体系结构有关,一般在entry.S中。 . Linux系统调用比其他许多OS执行得要快,其令人难以置信的上下文切换时间是一个重要原因,另一个原因是每个系统调用本身都非常简洁。 . 通知内核的机制是靠软中断实现的,引发一个异常促使系统切换到内核执行异常处理程序,该程序就是系统调用处理程序。x86的软中断由int $0x80产生,它会导致进入内核态执行128号异常处理程序,该程序正式系统调用处理程序,名叫system_call()。它与硬件体系结构紧密相关,一般在entry.S中。 x86新增了一条sysenter指令,提供了更快、更专业的陷入内核执行系统调用的方式。 x86上,系统调用号通过eax寄存器传给内核。 system_call()通过将系统调用号与NR_syscalls作比较检查其有效性,大于等于NR_syscalls就返回-ENOSYS,否则执行。 call * sys_call_table(, %eax, 4) 系统调用表的表项以32位存放,内核需将给定系统调用号乘以4,然后查询其位置。 . 除了系统调用号,外部的参数输入也需从用户空间传给内核,最简单的办法是放在其他寄存器里,比如ebx, ecx, edx, esi, edi按顺序放前5个参数,如罕见需6个以上参数,用单独寄存器指向存放所有参数的用户空间的地址。 . 给用户空间的返回值也通过寄存器,x86放在eax中。 . 给Linux添加新的系统调用是相对容易的工作,怎样设计和实现一个系统调用是难题所在。 . 每个系统调用应该有一个明确的用途;系统调用的接口应力求简洁、参数尽可能少;它们应力求稳定,不做改动。 . 系统调用必须仔细检查参数的有效性,如果用户把不合法的参数传给内核是非常危险的。 最重要的检查是:指针。内核必须保证: 1 指针指向的空间属于用户空间 2 指针指向的区域在进程的地址空间里 3 如果读,内存应被标记为可读;如果写,内存应被标记为可写。 . 内核提供的两个方法完成必须的检查和内核与用户空间的数据来回拷贝。 从内核到用户:copy_to_user() 从用户到内核:copy_from_user() 失败,返回没能完成拷贝的字节数;成功,返回0。 这两个函数都可能引起阻塞,比如用户数据页被换到了硬盘上。 . 权限检查,老版本的Linux用suser()检查用户是否是超级用户;现在用capable()检查是否有全能对指定资源进行操作:非0有权,0无权。<Linux/capability.h> . 内核在执行系统调用处于进程上下文。在进程上下文中,进程可以休眠(比如系统调用阻塞或显式调用schedule)并且可以被抢占。 休眠说明系统调用可以使用内核提供的绝大部分功能。??? 由于可以被抢占,而新的进程可能使用同样的系统调用,必须保证该系统调用是可重入的。 . 从系统调用返回时,控制权仍在system_call()中,负责切换回用户空间。
cp4对本书的所有笔记 · · · · · ·
-
进程(4-调度算法)
每个优先级队列有两个优先级数组,活跃的和过期的。kernel/sched.c . prio_array{ int ...
-
进程(5-抢占、实时、系统调用)
context_switch()完成两项基本工作: 调用<asm/mmu_context.h>中的switch_mm()把虚拟内...
-
系统调用(1-基础)
-
系统调用(2-实例)
P55 》》 注册一个正式的系统调用: 1 在系统调用表最后加入一个表项。从0算起,系统调用在该...
-
中断(1)
P59: 》》 中断请求IRQ,PC上,IRQ0是时钟中断,IRQ1是键盘中断,但对于PCI总线上设备而言,...
说明 · · · · · ·
表示其中内容是对原文的摘抄