使用 Linux 系统调用的内核命令
2007 年 4 月 17 日
Linux® 系统调用 ——
我们每天都在使用它们。不过您清楚系统调用是如何在用户空间和内核之间执行的吗?本文将探究 Linux
系统调用接口(SCI),学习如何添加新的系统调用(以及实现这种功能的其他方法),并介绍与 SCI 有关的一些工具。
系统调用
就是用户空间应用程序和内核提供的服务之间的一个接口。由于服务是在内核中提供的,因此无法执行
直接调用;相反,您必须使用一个进程来跨越用户空间与内核之间的界限。在特定架构中实现此功能的方法会有所不同。因此,本文将着眼于最通用的架构 ——
i386。
在本文中,我将探究 Linux SCI,演示如何向 2.6.20
内核添加一个系统调用,然后从用户空间来使用这个函数。我们还将研究在进行系统调用开发时非常有用的一些函数,以及系统调用的其他选择。最后,我们将介绍
与系统调用有关的一些辅助机制,比如在某个进程中跟踪系统调用的使用情况。
SCI
Linux 中系统调用的实现会根据不同的架构而有所变化,而且即使在某种给定的体架构上也会不同。例如,早期的 x86
处理器使用了中断机制从用户空间迁移到内核空间中,不过新的 IA-32 处理器则提供了一些指令对这种转换进行优化(使用 sysenter
和 sysexit
指令)。由于存在大量的方法,最终结果也非常复杂,因此本文将着重于接口细节的表层讨论上。更详尽的内容请参看本文最后的 参
考资料
。
要对 Linux 的 SCI 进行改进,您不需要完全理解 SCI
的内部原理,因此我将使用一个简单的系统调用进程(请参看图 1)。每个系统调用都是通过一个单一的入口点多路传入内核。eax
寄存器用来标识应当调用的某个系统调用,这在 C
库中做了指定(来自用户空间应用程序的每个调用)。当加载了系统的 C
库调用索引和参数时,就会调用一个软件中断(0x80 中断),它将执行 system_call
函数(通过中断处理程序),这个函数会按照 eax 内容中的标识处理所有的系统调用。在经过几个简单测试之后,使用 system_call_table
和 eax 中包含的索引来执行真正的系统调用了。从系统调用中返回后,最终执行 syscall_exit
,并调用 resume_userspace
返回用户空间。然后继续在 C
库中执行,它将返回到用户应用程序中。
图 1. 使用中断方法的系统调用的简化流程
SCI 的核心是系统调用多路分解表。这个表如图 2 所示,
相关文档:
在Linux下看电视
时间:2009-12-09 13:37:00 来源:网络 作者:小卢
长期以来,在Linux操作系统下使用电视卡是一件比较麻烦的事,这是因为各家电视卡生产厂商都没有提供官方的Linux驱动,只有Windows下的WDM驱动。
Linux下的电视卡驱动,一直由linux.bytesex.org的Linux爱好者负责开发。该驱动有两 ......
哈希表(Hashtable)又称为“散置”,Hashtable是会根据索引键的哈希程序代码组织成的索引键(Key)和值(Value)配对的集合。Hashtable 对象是由包含集合中元素的哈希桶(Bucket)所组成的。而Bucket是Hashtable内元素的虚拟子群组,可以让大部分集合中的搜寻和获取工作更容易、更快速。
哈希函 ......
Linux 内核中采用可加载的模块化设计(LKMs,Loadable Kernel
Modules),一般情况下编译的Linux
内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其他的代码可以选择在内核中,或者编译为内核的模块文件。常见的驱动程序也是作为内核
模块动态加载的。
模块相关命令
lsmod 列出当前系统加载的 ......
和其他操作系统一样,Linux包含进程调度与进程间通信(IPC)、内存管理(MMU)、虚拟文件系统(VFS)、网络接口等,下图给出了Linux的组成及其关系:
Linux内核源代码包括多个目录:
(1)arch:包括硬件特定的内核代码,如arm、mips、i386等;
(2)drivers:包含硬件驱动代码,如cha ......
目 录
驱动
I/O端口
from smth
基本结构
驱动程序
具体实现
PCI
loopback
Sis 900
ISA总线DMA的实现
驱动
Linux系统支持三种类型的硬件设备:字符设备、块设
< type="text/javascript">< type="text/jav ......