热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

系统调用--哈工大李治军操作系统实验2

实验环境是实验楼的地址https:www.shiyanlou.comcourses115参考博客:https:blog.csd
 
 
实验环境是 实验楼的 地址 https://www.shiyanlou.com/courses/115
 
参考博客: https://blog.csdn.net/wangyi_lin/article/details/6921110
 
首先解压oslab下的压缩包 执行 tar zxvf +压缩包名字
 
1.首先修改oslab/linux-0.11/include下的linux文件
 
  添加两个extern:
extern int sys_iaml
extern int sys_whoami

  添加sys_call_table表项:

sys_iam,sys_whoami

  

注:fn_ptr是函数类型指针
在include/linux/sched.h中定义
typedef int (fn_ptr*)();

  sys_call_table是中断服务程序调用系统调用要查的表。表项是函数指针,长度为4字节。中断服务程序执行call来调用系统调用:

call _sys_call_table(,%eax,4) //a(,%eax,4)=a+4*eax , 每个表项4字节所以第i个系统调用的偏移是i*4

  2.linux-0.11/kernel下的system_call.s,将nr_system_calls修改为74(添加了两个系统调用)

3.修改kernel下的makefile文件,修改两处
     1)添加who.o

     2)添加一行

 

who.s who.o: who.c ../include/linux/kernel.h ../include/unistd.h

//图错了!!!!
//图中who.o后面少了个冒号!!!!

  

4.系统调用编号使用的宏定义,例如在unistd.g中 :

 

#define NR_CLOSE 6   //close是sys_call_table第7个

  添加系统调用需要修改unistd.h文件,不能直接在机器中修改而是在虚拟机文件系统中修改

 

oslab下的hdc-0.11-new.img是0.11内核启动后的根文件系统镜像文件,相当于在bochs虚拟机里装载的硬盘。在Ubuntu上访问其内容的方法是
$ sudo ./mount-hdc
之后,hdc目录下就是和0.11内核一模一样的文件系统了,可以读写任何文件(可能有些文件要用sudo才能访问),卸载这个文件系统:
$ sudo umount hdc
 
所以切换到oslab目录下执行sudo ./mount-hdc,然后切换到hdc下就会看到和linux一样的文件目录结构了。
 
切换到hdc/usr/include下,vim unistd.h
Tip:
1.命令模式下/__NR ---->命令模式下  /+要查找的字符可以快速定位,n是下一个,N是上一个
2.'  __NR  '的_是shift加-,这里有两个'_'

  然后添加:

 

#define __NR_iam 72
#define __NR_whoami  73

  

然后在linux-0.11/kernel下添加who.c,包含两个 系统调用

 

#define __LIBRARY__
#include 
#include 
#include char temp[64]={0}; int sys_iam(const char* name) { int i=0; while(get_fs_byte(name+i)!='\0') i++; if(i>23){ return -EINVAL; } printk("%d\n",i); i=0; while((temp[i]=get_fs_byte(name+i))!='\0'){ i++; } return i; }
int sys_whoami(char* name,unsigned int size) { int i=0; while (temp[i]!='\0') i++; if (size

  

5.然后编写iam.c和whoami.c 放在 hdc下的任意位置
     1)whoami.c:

 

     2)iam.c

 

然后执行  sudo umount hdc 解除挂载

 

最后切换到oslab下执行make
切换到oslab下执行./run运行虚拟机
切换到iam.c和whoami.c的目录执行
gcc iam.c -o iam
gcc whoami.c -o whoami

  

总结:
 

 

main将eax寄存器置72(系统调用编号),触发int 0x80中断 (实际是在库函数中做的)
 
int 0x80指令查IDT表(中断向量表,由内核初始化)发现DPL=3 ,而CPL = 3(用户态)可以执行
 
于是将这个IDT表项的段选择子CS  给CS寄存器(例如段选择子为8H=1000,后两位为CPL,特权级别CPL置0),入口函数偏移给IP寄存器
 
然后执行中断服务程序,中断服务程序调用sys_whoami
 
sys_whoami里此时可以访问内核态数据(访问100地址的数据)
 

 

 

 

 

 


推荐阅读
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
  • 本文详细介绍了在Ubuntu操作系统中使用GDB调试工具深入分析和调试标准库函数`printf`的源代码过程。通过具体步骤和实例,展示了如何设置断点、查看变量值及跟踪函数调用栈,帮助开发者更好地理解`printf`函数的工作原理及其内部实现细节。 ... [详细]
  • 在 Ubuntu 系统上正确安装 NVIDIA 显卡驱动程序前,首先需要卸载已有的驱动版本。这一步骤至关重要,以避免新旧驱动冲突导致系统不稳定。接下来,可以通过官方仓库或 NVIDIA 官方网站下载最新驱动,并使用终端命令进行安装。确保在安装过程中启用适当的内核模块支持,以获得最佳性能和兼容性。此外,建议在安装后重启系统并验证驱动是否成功加载。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 如何在Ubuntu系统中直接使用Snap安装软件
    Canonical与Opera Software近日宣布,基于Chromium的Opera浏览器现已作为Snap包提供给Ubuntu用户,显著提升了在Linux操作系统上的安装便捷性和兼容性。通过Snap,用户可以在Ubuntu系统中轻松安装和更新Opera浏览器,享受更流畅的浏览体验。此外,Snap的容器化特性还确保了应用的安全性和稳定性,为用户提供更加可靠的软件环境。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
  • 在Python 3环境中,当无法连接互联网时,可以通过下载离线模块包来实现模块的安装。具体步骤包括:首先从PyPI网站下载所需的模块包,然后将其传输到目标环境,并使用`pip install`命令进行本地安装。此方法不仅适用于单个模块,还支持依赖项的批量安装,确保开发环境的完整性和一致性。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • Docker网络基础探讨了如何通过高效的技术手段实现跨主机容器间的顺畅通信与访问。本文深入分析了Docker网络架构,特别是其在多主机环境下的应用,为Go语言开发者提供了宝贵的实践指导和理论支持。 ... [详细]
  • 本指南详细介绍了如何使用 `apt-get` 命令在 Ubuntu 系统上部署 MySQL 5、Apache 2、PHP 5 及 phpMyAdmin。首先,建议读者查阅 Ubuntu 的官方文档以获取更多背景信息。通过本文,您将逐步了解每个软件包的安装过程及其配置方法,确保系统环境的稳定性和安全性。此外,还将提供一些常见问题的解决方案,帮助用户顺利完成部署。 ... [详细]
  • 技术日志:在Ubuntu 20.04上部署与移除MySQL 8的详细步骤
    技术日志:在Ubuntu 20.04上部署与移除MySQL 8的详细步骤 ... [详细]
author-avatar
wangimcf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有