详解Linux内核编译及添加系统调用

实验一:Linux内核编译及添加系统调用(HDU)

花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了,也应该是懂了。

一、前期准备工作

1.需要准备虚拟机上安装Ubuntu,笔者安装的是Ubuntu18.04,安装的教程自行百度解决,教程很多。有几点需要提一下,就是内存分配至少60G,核分配4个最好,为了在编译的时候别崩溃。

建议去熟悉一下Linux下面的文件目录结构,根目录下每个目录一般会存放什么样的文件

,然后常见命令操作也要熟悉一下。

2.下载Linux内核地址,自行选择版本,建议选择4.xx版本,因为版本高出错的概率也大。

下载好了之后,会放在自己的Ubuntu中的Downloads目录下,同时是一个压缩文件,到时候需要解压到放内核目录文件下。首先进入到该Downloads文件目录下,查看是否下载好了。

$cd ~/Downloads
$ls
linux-4.19.25.tar.xz

之后开始解压上面的那个压缩文件到存放内核的地方,就是Linux系统的/usr/src目录下,此目录用来存放内核源码的。从上图也可以了解到。

cd ~/Downloads
tar xvJf linux-4.19.25.tar.xz -C /usr/src

进入/usr/src目录查看是否有,如果有就可以开始后续工作了。

二、实验要求和内容

1. 内容要求:

(1)添加一个系统调用,实现对指定进程的nice值的修改或读取功能,并返回进程最新的nice值及优先级。建议调用原型是int mysetniec(pid_t pid, int flag, int nicevalue, void_user* prio, void_user* nice);
参数含义:
pid:进程ID
flag:若为0,则表示读取nice的值;若为1,则表示修改nice的值。
nicevalue:为指定的进程设置新的nice。
prio,nice:指向进程的优先级和nice值。
返回值:系统调用成功时返回0;失败时返回错误码EFAULT。
(2)写一个简单的应用程序测试(1)中添加的系统调用。
(3)若系统调用了Linux的内核函数,要求深入阅读相关的源码。

2. Linux系统调用的基本概念

实质是指调用内核函数,于内核态中运行,Linux中的用户通过执行一条访管指令“int $0x80”来调用系统调用,该指令会产生一个访管中断,从而让系统暂停当前的进程执行,而转去执行系统调用处理程序。通过用户态传入的系统调用号从系统调用表中找到相应的服务例程的入口并执行,完成后返回。
(1)系统调用号与系统调用表:Linux内核中设置了一张系统调用表,用于关联系统调用号及其相对应的服务例程入口地址,定义在./arch/x86/entry/syscalls/syscall_64.tbl文件中,每个系统调用占一个表项,一旦分配好就不可以有任何变更。
(2)系统调用服务例程:每个系统调用都对应一个内核服务例程来实现系统调用的功能,其命名的格式都是以"sys_开头。其代码通常放在./kernel/sys.c中,服务例程的原型声明则是放在./include/linux/syscall.h中。如sys_open,通常格式是asmlinkage long sys_open(int flag......)。其中的amslinkage是一个必需的限定词,用于通知编译器从堆栈中提取函数的参数,而不是从寄存器中。
在sys.c中编程时,格式是SYSCALL_DEFINE5(mysetnice, pid_t, pid, int, flag, int, nicevalue, void __user *, prio, void __user *, nice)N=5代表参数的个数。
(3)系统调用参数传递:在X86中,Linux通过6个寄存器来传入参数,其中一个eax是传递系统调用号,后面的5个传递参数。
(4)系统调用参数验证

三、开始实验

1. 切换到root权限下,防止权限不够,导致出错。

$ sudo passwd root
[sudo] password for leslie: 
Enter new UNIX password: 
Retyp
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
杭电实验1所涉及的内容是Linux内核编译添加系统调用。 在这个实验中,首先需要了解Linux内核编译过程。Linux内核是操作系统的核心部分,由C语言编写。编译内核的目的是为了生成可执行的内核镜像文件,即vmlinuz。内核编译的一个重要环节是配置内核,确定编译时的各种选项和功能。 首先,需要从官方网站(https://www.kernel.org/)上获取最新的Linux内核源代码。在命令行中使用wget命令下载源代码文件,并解压缩到合适的目录。 接下来,进入源代码目录,使用make menuconfig命令配置内核。此命令会打开一个文本界面菜单,可以选择需要的功能和驱动,并进行一些优化设置。可以根据实验要求选择需要的功能,也可以使用默认配置。 配置完成后,使用make命令开始编译内核编译过程需要一定时间,取决于计算机性能和内核大小。编译完成后会生成可执行的内核镜像文件vmlinuz。 接下来是添加新的系统调用系统调用是应用程序与操作系统之间的接口,用于请求操作系统提供服务。在实验中,需要在内核添加一个自定义的系统调用。 首先,在内核源代码中找到系统调用表文件syscalls.h,添加新的系统调用的函数原型。然后,在内核的核心文件kernel/sys.c中实现该系统调用的功能代码。 在添加系统调用的功能代码后,需要编译内核并安装。使用make命令编译内核,并使用make install命令将编译好的内核安装到系统中。安装完成后,重启计算机,系统就会使用新的内核和新添加系统调用。 总结来说,杭电实验1是介绍了Linux内核编译过程和系统调用添加方法。通过这个实验,可以了解Linux内核的基本结构和编译过程,以及如何在内核添加新的系统调用。这对于深入理解操作系统内核开发是非常有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值