- 1、本文档共50页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[电脑基础知识]7_操作系统接口
Unix/Linux系统程序、库函数、系统调用的分层关系 7.3.3 POSIX标准(续) 返回 7.3.4 系统调用的实现 系统调用工作原理 系统执行访管指令产生中断,由中断和陷入机构调用相应的处理程序 中断和陷入硬件机构 中断和陷入的概念 外中断:由外部设备事件引起,如磁盘中断、打印机中断等 内中断(陷入):由CPU内部事件引起,如非法指令、地址越界等 中断和陷入向量 指两个相邻存储单元,一个存放中断或陷入处理程序的入口地址,一个存放处理机状态字 系统调用号和参数的设置 陷入指令自带方式 直接将参数送入相应地寄存器,MS-DOS 参数表方式,Unix和Linux 系统调用的处理步骤 设置系统调用号和参数,执行系统调用命令(访管指令) 首先,用户态(目态)?系统态(管态) 其次,分析系统调用的类型,转入处理子程序 最后,恢复现场,返回 系统调用处理子程序的处理流程 以执行Creat为例 根据给定的path,查目录 若存在,则释放原文件的磁盘块(permit不许可则出错) 若不存在,则申请一个新目录项,初始化,打开新文件 返回 7.3.4 系统调用的实现(续) 系统调用实现过程示例 返回 Linux在系统文件/usr/src/linux-2.4/arch/i386/kernel/entry.S中存放了系统所提供的系统调用的入口表,表中给出了函数名与调用编号之间的对应关系。比如exit()的调用号是1号,fork()是2号,以此类推,如下所示为部分调用号与函数名之间对应的系统调用入口表。 ENTRY(sys_call_table) .long SYMBOL_NAME(sys_ni_syscall) /* 0 old setup() system call*/ .long SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork) .long SYMBOL_NAME(sys_read) .long SYMBOL_NAME(sys_write) .long SYMBOL_NAME(sys_open) /* 5 */ .long SYMBOL_NAME(sys_close) .long SYMBOL_NAME(sys_waitpid) .long SYMBOL_NAME(sys_creat) .long SYMBOL_NAME(sys_link) .long SYMBOL_NAME(sys_unlink) /* 10 */ *Linux的系统调用 在系统文件/usr/src/linux-2.4/kernel/sys.c中存放了一部分系统调用函数,它们都以asmlinkage开头,类型都是long,而且在调用的函数名前面加上前缀sys_如下所示。比如,上面的入口表中的第0号系统调用函数ni_syscall就是asmlinkage long sys_ni_syscall(void)函数,如下所示。 asmlinkage long sys_ni_syscall(void) { return -ENOSYS; } *Linux的系统调用 还有其它一些系统调用函数,它们都以asmlinkage long sys_开头,比如: asmlinkage long sys_getrusage(int who, struct rusage *ru) { if (who != RUSAGE_SELF who != RUSAGE_CHILDREN) return -EINVAL; return getrusage(current, who, ru); }? asmlinkage long sys_umask(int mask) { mask = xchg(current-fs-umask, mask S_IRWXUGO); return mask; } 如果用户需要在系统内核中增加一个新的系统调用函数,则必须修改上述两个系统文件entry.S和sys.c,并对系统内核进行重新编译形成新的内核,系统才能识别新增加的系统调用函数。 *Linux的系统调用 源码的修改 ①kernel/sys.c中增加系统服务例程如下: asmlinkage int sys_addtotal(int numdata) { int i=0,enddata=0; while(i=numdata) enddata+=i++; return enddata; } 该函数有一个int 型入口参数numdata , 并返回从0 到numdata 的累加值,然而也可以把系统服务例程放在一个自己定义的文件或其他文
文档评论(0)