在Linux内核中增加系统调用

2017-05-27 15:09丁乔
中文信息 2016年12期
关键词:操作系统内核

丁乔

摘 要: 为了扩大操作系统的功能以及学习由Linux系统提供的系统调用,可以在内核中增加系统调用。运用Linux操作系统,VMware Workstation和Ubuntu达到我们的目的。获得Linux内核源代码,配置、编译和安装内核二进制并且将一个新条目添加到一组可引导的内核来构建一个新的内核。接下来的工作是扩展内核源代码,将系统调用增加到内核中,其中一个是打印功能,另一个是函数返回系统数据和时间功能。最后,我们将在用户程序中完成系统调用。

关键词:Linux 操作系统 系统调用 内核

中图分类号:TP399 文献标识码:A 文章编号:1003-9082(2016)12-0001-02

一、Linux和系统调用

1. Linux介绍

Linux操作系统是UNIX操作系统的一种克隆系统,现已成为世界上使用最多的UNIX类操作系统。Linux可免费使用和自由传播,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行UNIX工具軟件、应用程序和网络协议,支持32位和64位硬件并且继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

Linux闻名于它的高效性和灵活性,Linux模块化处理它的设计结构,使它不仅能在昂贵的工作站上运行,还能在廉价的PC机上体现Unix的全部特性,具有多任务、多用户的能力。[1]

操作系统的功能在于管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具备更突出的兼容性,内核提供一系列具备预定功能的多内核函数,通过一组系统调用的接口呈现给用户。系统调用将应用程序的需求传送给内核,调用相对应的的内核函数完成需要的处理,将结果返回给应用程序。[2]

2.系统调用介绍

系统调用出现过程调用用户程序,但导致执行上下文的变化和特权。用户模式和过程调用系统调用有一些差异和相似之处。

2.1用户模式过程调用

2.1.1将参数传递给被调用的堆栈或寄存器上;

2.1.2保存当前状态和PC,并跳到被调用的过程;

2.1.3特权是相同的。

2.2系统调用

2.2.1系统调用是对用户程序的调用,但是会导致执行上下文和特权的变化。在英特尔386,系统调用是通过存储系统调用数字到EAX寄存器来完成的,比如在其他寄存器中向系统调用存储参数(如EBX,ECX,EDX,ESI),或执行指令的陷阱。(INT 0x80指令)。

2.2.2在计算中,系统调用是一个计算机程序的编程方式来请求执行在操作系统上的内核。这可能包括硬件相关服务,创建和执行新的流程和沟通与整体内核进程调度等服务。系统调用提供了一个基本流程和操作系统之间的接口。在大多数系统中,系统调用可能只在用户空间进程中实现,而在其他一些系统中,例如继任者,特权系统代码也可以实现系统调用。

2.3系统调用执行

2.3.1在陷阱之后,系统调用表用于索引代码指针来为处理器标志起始地址。

2.3.2 2system_call()函数将比较系统调用号和NR_syscalls之间的价值。

2.3.3如果相比下来该值更大或相等,便回到ENOSYS。如果小,执行call* sys_call_table(% eax,4),并跳转到处理程序;

2.3.4特权在用户和内核模式之间转化,内核代码执行请求的服务:

I/O交互过程管理其他活动无法在用户模式下执行

二、在内核中增加系统调用

1.打印功能

1.1查看内核版本

Sudo是一种常用的在Linux下允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或所有的根命令。这不仅可以减少根用户登录和管理的时间,也提高了安全性。

1.2输入/usr/SRC查看活跃文件是否存在

1.3检查源文件中的版本号

apt-cache是一个属于Linux的恰当的包管理工具,它可以查询恰当的二进制包缓存文件。Apt-cache通过不同的参数和子命令来显示包、包的依赖关系和有关其他功能的信息。

1.4搜索版本信息,修正、同时更新版本。

1.5创建的文件“helloworld.c”

保存和退出

1.6创建“Makefile文件和进口

1.7编译

出现以上信息,这表明编译成功。

1.8 insmod模块并检查它

1.8.1这个系统调用(sys_init_module时)分配内核内存到相应的模块, 这个内存分配操作是通过vmallo.c years来获得

1.8.2然后将内容复制到这个模块的存储空间;

1.8.3内核申报模块的引用

1.8.4初始化模块调用涵数

Hello World已经写在“syslog”

2.函数返回系统时间和日期

2.1检查当前系统内核启动项

2.2修改文件/usr/src/linux-source-/kernel/sys.c

2.3附加/usr/src/linux-/arch/x86/include/asm/unistd_32.h:#define__NR_mycall 337

2.4编译内核

2.4.1让mrproper消除不稳定的内核对象文件,附件,和内核配置文件

2.4.2使清洁:清除用于生成目标文件和其他文件

2.4.3让oldconfig使用默认内核配置

2.4.4使bzImage:编译内核

2.4.5让模块:编译模块

2.4.6 modules_install安装模块

2.4.7开始使用最新的项目

2.4.8增加启动菜单项, 配置启动文件/boot/grub/grub.cfg

2.4.9测试程序

三、结论

这个实验的内容涉及到Linux系统调用。也就是说,应用程序的操作系统和内核提供了一组接口。通过此接口,应用程序可以被转换到内核状态,并调用相应的的内核函数,从而实现应用程序之间的交互和系统内核。

本文提出,任务指标应该向Linux内核中增加两个系统调用。程序执行系统调用可以在以下步骤中运行。程序调用libc库包函数。然后调用软中断0 x80 int到内核。内核首先实现system_call函数(首先系统调用号(eax)和CPU寄存器可以使用和保存到对应的堆栈(由SAVE_ALL完成)。之后,在系统调用表中找到对应的系统调用服务例程根据系统调用号。

在时代下的Windows操作系统,许多底层的东西都被掩盖了。感谢我们的Linux让我们更深入理解操作系统以及与操作系统相关的各个方面。同时,也是一个很好的机会让我们学会操作系统的系统调用。

参考文献

[1]Linux系统,2016-11-1取自http://baike.so.com/doc/5349227-5584683.html

[2]系统调用,2016-10-29取自http://baike.so.com/doc/5715175-5927901.html

[3]"The Linux Foundation Releases Linux Development Report". Linux Foundation. 18 February 2015. Retrieved 20 February 2015.

猜你喜欢
操作系统内核
强化『高新』内核 打造农业『硅谷』
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究