操作系统作业1(Linux内核的编译以及增加系统调用)

目录

初始准备:

相关文章学习:

实验1:Linux内核代码分析

实验2:新增系统调用

Fedora下编译内核

 添加myID系统调用

测试内核调用 

实验中遇到的问题: 


 

初始准备:

实验使用的linux版本:Fedora

VMware使用方法:

VMware虚拟机安装Linux教程(超详细)_虚拟机安装linux系统_七维大脑的博客-CSDN博客

VMware虚拟机Player:https://pan.baidu.com/s/1qYpf7DM

Fedora 7虚拟机镜像:https://pan.baidu.com/s/1pLTdkKF

相关文章学习:

linux下修改文件内容_linux修改文件_一丽�的博客-CSDN博客

Linux【命令】修改文件内容_linux修改文件内容的命令_Jason_Lee155的博客-CSDN博客

切换Linux系统启动时的内核_KenBG的博客-CSDN博客

在Linux系统中运行C语言程序_linux运行c语言程序_I小时候可帅了I的博客-CSDN博客

实验1:Linux内核代码分析

实验目的:通过实验,基本具备对操作系统内核的分析与扩展能力;掌握内核调试基本技术,为基于Linux的内核级系统开发奠定基础。

实验内容:

  1. 安装Linux操作系统;
  2. 阅读Linux源码以了解Linux内核代码的组织方式、进程管理内部数据结构和进程调度过程、系统调用内部数据结构以及执行过程;
  3. 熟悉Linux下的编辑、编译和调试工具的使用;
  4. 实现Linux内核的编译、安装和调试。

实验2:新增系统调用

实验目的:让学生熟悉Linux系统调用,深入了解Linux操作系统中系统调用的实现机制和执行过程。

实验内容:

  1. 阅读并分析Linux内核源码,深入了解Linux内核中系统调用内部数据结构;
  2. 编写一个新系统调用的响应函数,函数的名称和功能由实验者自行定义;
  3. 将新的系统调用函数嵌入到Linux内核中;
  4. 编写应用程序以测试新的系统调用并输出测试结果(体现学号)。

Fedora下编译内核

1.下载内核

6d2ef93eddf3416db475017e89ab3800.png

 把配置文件复制到解压好的文件中

 

2.生成内核配置文件.config

问题:工作目录不对,所以命令无法响应

1947f4079c904335affd3b5b27e212ce.png

解决:

ad80b82dbc9a4b6abd1e01b2aad37766.png

4fa01baa21ee43e699f5fbaa6c93e100.png

7b360dcecaeb4df39c6b8bb158dddd77.png

 到此结束

 

3.编译和安装新内核

make all
#生成期望的内核映像及模块

672506a4f59a4841865e23173d68b570.png

make modules_install
#安装模块到“默认目录/lib/modules/<内核版本号>”下面

30e8722d252a49bfada491bbd241934d.png

114f71d3263f4e209fb2819008588816.png

 make install
#将内核映像等几个文件复制到“/boot”目录,并修改引导程序的配置以启用该新内核

d631b9de17524d109deba966e6cb86ff.png

su  root
cd 需要查看的文件的位置
more menu.lst
​

5a1be200ebab4be0b2df5751c474560a.png

b43e81941cac43a5937379e278214384.png​ 

cat menu.lst
#查看文件内容,得先查看再修改
vim menu.lst
#vim 文件名,进入要编辑的文件

Linux【命令】修改文件内容_linux修改文件内容的命令_Jason_Lee155的博客-CSDN博客212ac2d584314164bae68156c8ae2ab6.png

 点击i进入编辑模式,在hiddenmenu前面加上#

3104123ed11e4358a4f4f4ba02e4b418.png

点击Esc退出编辑模式

4461740077a54f8abd600dce63ff561c.png

09dd2ab296334c02863398f9e8180c06.png​ 此时我们再查看发现已经修改成功

3ada635d858048f796d3afe497725e72.png

reboot
#重启系统

658f41dd4fe248db949567965a64a9c8.png

 添加myID系统调用

1.在文件arch/i386/kernel/syscall_table.S的尾部加上要新增的系统调用函数的名称,如下图中添加了psta系统调用,注释中的320表示它的系统调用号

 a3d260d62ae14e0dbc2ff35521db6a50.png

 90ae1665a2ad40d09155db30789db603.png

2.在include/linux目录下添加头文件myID.h:

 de111f51bf874c64b576e152cf156e4d.png

f4d3c1892cda48559dd441fa6a73f173.png

d58acec607024dd6ac756163a70ed016.png

3. 在kernel目录下新建文件myID.c,在该文件中实现sys_myID函数

 8a45d93b36094db684cb75e0e18f1188.png

宏asmlinkage定义在linux/linkage.h中,表示函数的参数通过栈传递,而不是寄存器,所有的系统调用都遵循这种参数传递方式。

4.修改文件kernel/Makefile,使得myID.c在编译时可见:

4bdda21047a64f38a972c959dd0a7c85.png

1cff600dec794369811f4535089f5eb9.png

5.在include/asm-i386/unistd.h里加上系统调用号的宏定义:

4e90ef5dedf54ac1addb1265accc782a.png

379646d4270f4c029490351f16ba5121.png

 6.修改include/linux/syscalls.h,加上函数sys_myID的声明。
先在头上加入结构体申明struct pinfo; 在该文件的头文件引用列表的末尾添加:

3e8dbe39cfaa48e69d6b30ca2962aa01.png

 4ff730f54a514388a2dc5fba865fdd87.png

 7.重新编译内核
在清理上次编译生成的中间文件之前,最好将配置好的.config文件备份至别的目录下以防删除,否则必须再执行实验1中的第2步配置.config文件。

make mrproper

测试内核调用 

在Linux系统中运行C语言程序_linux运行c语言程序_I小时候可帅了I的博客-CSDN博客

测试内核调用

2005dd61b1834c0d9a4f6e847ce5f1a1.png

 2d5682ea84204cee8c85dddd717c1a40.png

实验中遇到的问题: 

问题1:

5bfaf96effd4400aad1bd15d3b1ed1e7.png

2cb4ceb09df8481487ef8d4546f23203.png

打开虚拟机失败:Error while powering on:Internal error

解决方法重装VMware

(不知道原理,但是成功了)

 2.工作目录不对,所以命令无法响应

1947f4079c904335affd3b5b27e212ce.png

解决:

ad80b82dbc9a4b6abd1e01b2aad37766.png

4fa01baa21ee43e699f5fbaa6c93e100.png

7b360dcecaeb4df39c6b8bb158dddd77.png

 到此结束

 

3.VMware与Windows引起的兼容性蓝屏     PAGE_FAULT_IN_NONPAGED_AREA

【日常分享】Windows10操作系统下虚拟机VMware打开后蓝屏的问题的一种解决方案(PAGE_FAULT_IN_NONPAGED_AREA)_一饭名厨姚鲲鲲的博客-CSDN博客

尝试了,但均失败

最终解决办法,下载了最新版的VMware

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,我们需要下载Linux系统内核。打开终端,输入以下命令: ``` wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.12.10.tar.xz ``` 这会下载Linux内核的tar.xz压缩包。接着,我们需要解压缩它: ``` tar -xvf linux-5.12.10.tar.xz ``` 进入解压缩后的目录: ``` cd linux-5.12.10/ ``` 现在,我们需要为内核添加自己的系统调用。打开文件`arch/x86/entry/syscalls/syscall_64.tbl`,在文件末尾添加以下一行: ``` <syscall_number> 64 <syscall_name> __x64_sys_<syscall_name> ``` 在这里,`<syscall_number>`是你要添加的系统调用的编号,`<syscall_name>`是你要添加的系统调用的名称。例如,如果你的姓名拼音是“zhangsan”,你可以添加以下一行: ``` 400 zhangsanSYSCALL __x64_sys_zhangsanSYSCALL ``` 接着,我们需要在内核中实现这个系统调用。打开文件`arch/x86/entry/syscalls/syscall_64.c`,在文件末尾添加以下一段代码: ``` SYSCALL_DEFINE0(zhangsanSYSCALL) { printk(KERN_INFO "My name is zhangsan, and my student ID is 123456.\n"); return 0; } ``` 这个代码段实现了一个名为`zhangsanSYSCALL`的系统调用,当它被调用时,内核会打印输出自己的姓名和学号。 现在,我们可以编译内核了。在终端中输入以下命令: ``` make menuconfig ``` 这会打开一个菜单界面,让你选择内核的配置选项。在菜单中选择“Save”保存配置,然后退出菜单。 接着,输入以下命令编译内核: ``` make -j4 ``` 这会使用4个线程编译内核。这个过程可能需要一段时间,取决于你的电脑性能。 编译完成后,输入以下命令安装内核: ``` sudo make install ``` 这会把编译好的内核安装到你的系统中。 现在,我们需要重启电脑,以便使用新的内核。在终端中输入以下命令: ``` sudo reboot ``` 重启完成后,你可以在终端中输入以下命令测试你的系统调用: ``` sudo zhangsanSYSCALL ``` 这会打印输出你的姓名和学号。 至此,你已经成功地为Linux内核添加了自己的系统调用,并在Ubuntu系统中进行了内核编译

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItsNorth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值