第2部分第6次课linux2.6内核之系统调用及定时器讲解.ppt

第2部分第6次课linux2.6内核之系统调用及定时器讲解.ppt

  1. 1、本文档共84页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式Linux 内核体系架构 李超 lichao-runing@163.comPART ONE 嵌入式Linux系统调用 系统调用 概念 所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。 系统调用发生在用户进程,通过一些特殊的函数(如open)来请求内核提供服务,这时,用户进程挂起, 内核验证用户请求,尝试之行,并把结果反馈给用户进程,接着用户进程重新启动 系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。 系统调用是用户程序和内核交互的接口。 系统调用的作用 系统调用是用户接口在内核中的实现,如果没有系统调用,用户就不能利用内核。 API/POSIX及C库 API:应用程序接口 POSIX接口(Portable Operating System Interface):是IEEE提出的标准,用于定义一个可移植的操作系统接口,它应用于UNIX、DEC OpenVMS以及windows NT C库中实现了UNIX系统的主要API,包括标准的C库函数和系统调用 系统调用执行流程 系统调用执行流程 执行用户程序(如:fork) 根据glibc中的函数实现,取得系统调用号并执行int $0x80产生中断。 进行地址空间的转换和堆栈的切换,执行SAVE_ALL。(进行内核模式) 进行中断处理,根据系统调用表调用内核函数。 执行内核函数。 执行RESTORE_ALL并返回用户模式 系统调用sethostname()分析 功能:设置计算机在网络中的主机名 使用:int sethostname(const char *name,size_t len); Sethostname()是库函数,定义在/usr/lib/libc.a 基于X86平台添加系统调用 (2)添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存在。为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件。 第一个要修改的文件是:   /usr/src/linux/include/asm-i386/unistd.h   该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。文件中每一行的格式如下:   #define __NR_name NNN   其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码。应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。我们的系统调用如下:   #define __NR_mycall 191 第二个要修改的文件是:   /usr/src/linux/arch/i386/kernel/entry.S   该文件中有类似如下的清单:   .long SYMBOL_NAME()   该清单用来对sys_call_table[]数组进行初始化。该数组包含指向内核中每个 系统调用的指针。这样就在数组中增加了新的内核函数的指针。我们在清单最后添 加一行:   .long SYMBOL_NAME(sys_mycall) (3)重建新的Linux内核 为使新的系统调用生效,需要重建Linux的内核。这需要以超级用户身份登录。   #pwd   /usr/src/linux   # 超级用户在当前工作目录(/usr/src/linux)下,才可以重建内核。   #make config   #make dep   #make clearn   #make bzImage 编译完毕后,系统生成一可用于安装的、压缩的内核映象文件:   /usr/src/linux/arch/i386/boot/bzImage  用新的内核进行启动系统 (4)使用新的系统调用   在应用程序中使用新添加的系统调用mycall。同样为实验目的,我们写了一个 简单的例子xtdy.c。   /* xtdy.c */   _syscall1(int,mycall,int,ret)   main()   {   printf(%d n,mycall(100));   } 基于ARM-Linux平台的系统调用 第一步 编写源程序添加到内核,该函数名称应该是新的系统调用名称前面加上sys_标志,假如新加的系统调用mycall(int *number), 在/armsys2410/kernel/kernel/sys.c文件中添加源代码,如下所示: asmlinkage int sys_mycall(int *num) { int *number,data=0; number = data; if(copy_from_user(number,num

文档评论(0)

美洲行 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档