HDU操作系统课程设计实验一

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

这是一个很简单、基础的实验,只需要看懂源码,然后在源码中稍作修改就行。注意:编译内核花费时间比较长,长则一天,短则2-3小时,如果用虚拟机记得多开机器核心数目(机器核心数目越多越快,但不要超过物理机的核心数目)和内存(内存不足会导致中途编译失败),最好一次成功。

一、设计目的

Linux是开源操作系统,用户可以根据自身系统需要裁剪、修改内核,定制出功能更加合适、运行效率更高的系统,因此,编译Linux内核是进行内核开发的必要基本功。
在系统中根据需要添加新的系统调用是修改内核的一种常用手段,通过本次实验,读者应理解Linux系统处理系统调用的流程以及增加系统调用的方法。

二、内容要求

1、内核修改时有自己标签,用 dmesg验证
2、Linux内核标签(系统启动显示一次)
3、显示当前系统名称和版本的系统调用
4、修改nice和prio值的系统调用功能
5、改变主机名称为自定义字符串的系统调用

三、实验内容

修改Linux内核标签

找到init/main.c中的start_kernel函数,加入一句pr_notice(“学号 姓名”);//pr_notice()用来打印内核日志,可以用dmesg命令查看代码。

添加系统调用

1.分配系统调用号,修改系统调用表
查看系统调用表(arch/x86/entry/syscalls/syscall_64.tbl),每个系统调用在表中占一个表项,其格式为<系统调用号><commom/64/x32><系统调用名><服务例程入口地址>,在表中为系统调用添加一个系统调用号。
2.申明系统调用服务例程原型
Linux系统调用服务例程的原型声明在文件linux-4.12/include/linux/syscalls.h中,可在文件末尾添加类似asmlinkage long sys_zwhsyscall(void);的系统调用代码。
3.实现系统调用服务例程
下面为新调用编写服务例程,通常添加在sys.c文件中,其完整路径为linux-5.9.1/kernel/sys.c。具体编程思路可以看下面。
4.重新编译内核
5.编写用户态程序测试系统调用

编译内核

  1. 在开始完全重新编译之前,需要用makemrproper命令清除残留的.config和.o文件。
  2. 运行make menuconfig命令配置内核。
  3. 内核配置完成后,执行make命令,开始编译内核。
  4. 执行make modules命令,开始编译模块。
  5. 执行make modules_install命令,开始安装模块。执行make install命令,开始安装内核。
  6. 执行update-grub2命令,自动修改grub引导程序。
  7. 执行reboot命令,重启系统。

显示当前系统名称和版本的系统调用

显示当前系统名称和版本的系统调用函数可以参考linux-5.9.1/kernel/sys.c中的newuname函数。
linux-5.9.1的newuname函数(不一定适用于其他版本)
SYSCALL_DEFINEX类型函数的格式:SYSCALL_DEFINEX(函数名,参数变量类型1,参数变量名1,…,…参数变量类型X,参数变量名X),系统调用函数的定义格式。

SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
{
   
   
	struct new_utsname tmp;

	down_read(&uts_sem);
	memcpy(&tmp, utsname(), sizeof(tmp));
	up_read(&uts_sem);
	if (copy_to_user(name, &tmp<
### 杭州电子科技大学操作系统课程设计资源 #### 关于操作系统课程设计的目标与要求 操作系统课程设计旨在让学生深入理解操作系统的原理及其实际应用。学生需掌握进程管理、内存分配、文件系统以及设备驱动等方面的知识,并能够独立完成个小规模的操作系统模块开发或优化现有系统性能的任务。 #### 可供参考的学习材料和教程链接 对于希望获取更多关于杭州电子科技大学操作系统课程设计的信息,建议访问学校官网的教学资源页面或是联系授课教师获得官方发布的指南文档。此外,在线平台上也有许多优质的开源项目案例可供学习借鉴: - **GitHub**: 许多高校会将其OS实验项目的源码托管于此处,可以找到不同版本内核实现细节; - **Stack Overflow & 优快云论坛**: 当遇到具体技术难题时可在此类社区提问交流寻求解决方案; #### 示例代码片段:简易调度器模拟 下面给出段简单的Python程序来演示如何创建个多道批处理环境下的轮转法(Round Robin)CPU调度仿真工具[^1]: ```python import queue class Process: def __init__(self, pid, burst_time): self.pid = pid self.burst_time = burst_time def round_robin(processes, time_slice): ready_queue = queue.Queue() for p in processes: ready_queue.put(p) while not ready_queue.empty(): current_process = ready_queue.get() if current_process.burst_time > 0 : print(f"Executing process {current_process.pid}") if current_process.burst_time >= time_slice: current_process.burst_time -= time_slice if current_process.burst_time > 0: ready_queue.put(current_process) else: remaining_time = min(time_slice,current_process.burst_time) current_process.burst_time=0 if __name__ == '__main__': proc_list=[Process(1,8),Process(2,4),Process(3,9)] slice_duration=2 round_robin(proc_list,slice_duration) ``` #### 报告撰写模板结构框架 份完整的课程设计报告通常应包含以下几个部分: - 封面页:题目名称、作者姓名学号班级等基本信息。 - 摘要摘要:简述研究背景意义目的方法结论等内容不超过页纸长度。 - 正文主体章节划分如下: - 绪论Introduction:介绍选题缘由现状分析理论依据等前置知识铺垫工作。 - 方案设计Design Scheme:描述整体架构思路关键技术难点解决措施等具体内容阐述。 - 实验测试Experimentation and Testing:记录调试过程参数设置运行结果对比评价指标体系构建等情况说明。 - 总结Conclusion:总结研究成果不足之处未来改进方向展望等收尾性质的文字表达。 最后附上必要的参考资料列表以便读者查阅原始出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值