实验二:添加Linux系统调用及熟悉常见系统调用

Slides:



Advertisements
Similar presentations
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
Advertisements

第 13 章 基于 proc 的 Linux 进程控制块 信息读取 山东科技大学操作系统教研组. 理解 proc 伪文件系统的基本概念和功能,掌握常见操作命令。 了解 Linux 进程控制块 task_strcut ,并理解其重要成员变量的含义。 理解基于 seq_file 机制的 proc 伪文件操作机制.
行程(process).
四資二甲 第三週作業 物件導向程式設計.
第一章 C语言概述 计算机公共教学部.
编译原理上机实习
補充: Input from a text file
基于操作系统的编程复习 张玉宏
专题研讨课二: 数组在解决复杂问题中的作用
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
C语言程序设计 第十二章 位运算.
chapter 1-Introduction
计算概论 第二十一讲 文件操作 北京大学信息学院.
Shell Script 程式設計.
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第3章 C 語言的基本知識.
編譯環境介紹.
第七章. 文件系统 (lab5).
第7章 Linux环境编程.
助教:胡光能,解定宝 编译原理讲师:戴新宇
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
第4章 字串及資料的輸入/輸出格式.
CH.8 硬體管理.
进程及进程管理 第4章 进程及进程管理.
Linux基本操作 程設實習課 ( 2/25 ).
进程操作.
Process management(程序管理)
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
作業系統實習課(三) -建造新的System Call-
THE C PROGRAMMING LANGUAGE
Ch9 Communicating with Hardware
如何生成设备节点 广州创龙电子科技有限公司
Linux 文件操作——系统调用和标准 IO 库
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
第四章 串.
ADFGVX 张天豪 陆纪圆.
实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法;
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第六章 shell 程序调试 一. 程序执行状态跟踪 程序: -n 读取命令, 但不执行. 主要用于跟踪程序流程是
C语言程序设计.
第7章 输入/输出流 文件和I/O流概述 标准I/O流的对象及其成员函数 文件流.
实验三、共享内存与进程同步 一、实验目的 1、掌握Linux下共享内存的概念与使用方法; 2、掌握环形缓冲的结构与使用方法;
实验三、共享内存与进程同步 一、实验目的与要求 二、实验内容
杨振伟 清华大学 第一讲:Linux环境下编程(1)
函式庫補充資料.
C標準輸出入函數庫 與 作業系統.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
实验一:编译运行Linux内核并使用gdb进行调试
第二章 类型、对象、运算符和表达式.
1.3操作系统提供的服务和用户接口 操作系统提供的用户接口 程序接口与系统调用 操作接口与系统程序
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab4.
第十二章 位运算.
Class 2005/05/25.
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
第2章 Java语言基础.
杨振伟 清华大学 第一讲:Linux环境下编程(1)
獨孤派作業系統 main memory 中正大學 作業系統實驗室 指導教授:羅習五.
C语言程序设计 第13章 文件操作.
第11章 字符和内存处理 一、字符数组、指针和字符串的初始化作用 二、strlen函数确定字符串有效长度 三、strcpy函数拷贝字符串.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

实验二:添加Linux系统调用及熟悉常见系统调用 助教:田成锦、汪睿、游翎璟 吴加禹、李佳伟、唐凯成

实验目的 学习如何添加Linux系统调用 熟悉Linux下常见的系统调用 2019/5/25

实验环境 主机:Ubuntu 32位 14.04 Linux内核版本:2.6.26 (内核版本最好是2.6.26,否则代码可能会有所不同) 本次实验是以实验一为基础,如有不熟悉的步骤,请重新浏 览实验一文档。 2019/5/25

实验内容——1.添加Linux系统调用 需要添加两个系统调用,与如下形式类似 void print_val(int a); //通过printk在控制台打印如下信息(假设a是1234) // in sys_print_val: 1234 void str2num(char *str, int str_len, int *ret); //将一个有str_len个数字的字符串str转换成十进制数字,然后将结果写到ret指向的地址中   2019/5/25

实验内容——1.添加Linux系统调用 分配系统调用号 在Linux源代码根目录下,找到include/asm-x86/unistd_32.h,在文件 末尾仿照已分配的系统调用号新增自己的两个系统调用号。 ...... #define __NR_utimensat 320 #define __NR_signalfd 321 #define __NR_timerfd_create 322 #define __NR_eventfd 323 #define __NR_fallocate 324 #define __NR_timerfd_settime 325 #define __NR_timerfd_gettime 326 //在此添加   2019/5/25

实验内容——1.添加Linux系统调用 修改系统调用表 为了让系统能根据系统调用号找到syscall_table中的相应表项,找到 arch/x86/kernel/syscall_table_32.s,仿照原格式添加系统调用号和调 用函数的对应关系。 注意系统调用函数名字应该以"sys_"开头。 ...... .long sys_timerfd_create .long sys_eventfd .long sys_fallocate .long sys_timerfd_settime /* 325 */ .long sys_timerfd_gettime //在此添加   2019/5/25

实验内容——1.添加Linux系统调用 实现系统调用函数 在include/linux/syscalls.h中声明新增的两个系统调用函数。注意 sys_str2num的声明中指针参数需要有"__user"宏. ...... asmlinkage long sys_timerfd_gettime(int ufd, struct itimerspec __user *otmr); asmlinkage long sys_eventfd(unsigned int count); asmlinkage long sys_fallocate(int fd, int mode, loff_t offset, loff_t len); //在此添加   2019/5/25

实验内容——1.添加Linux系统调用 实现系统调用函数 在kernel/sys.c中实现新增的两个系统调用函数。 (注意:函数实现的头部与函数声明保持一致!) 提示:sys_str2num的实现中需要利用copy_from_user和copy_to_user 函数。(注意n的大小) unsigned long copy_from_user(void * to, const void __user * from, unsigned long n); unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);   2019/5/25

实验内容——1.添加Linux系统调用 编译内核 执行下面命令编译内核 make i386_defconfig make 2019/5/25

实验内容——1.添加Linux系统调用 编写测试程序 创建一个简单的用户程序验证已实现的系统调用正确性,要求能够 从终端读取一串数字字符串,通过str2num系统调用将其转换成数字, 然后通过print_val系统调用打印该数字。执行用户程序后需要有如 下输出: 提示:通过syscall函数执行系统调用 Give me a string: 78234 in sys_print_val: 78234   long int syscall (long int sysno, ...); //sysno为系统调用号,后面跟若干个系统调用函数参数,参数个数与其原型一致 2019/5/25

实验内容——1.添加Linux系统调用 运行测试程序 利用实验一中的busybox生成根文件系统。 使用GCC静态编译用户程序 并将可执行文件test复制到busybox下的_install目录下,重新打包该 目录生成新的cpio.gz文件 运行qemu进入shell环境后,输入./test,执行用户程序。 gcc –static test.c –o test 2019/5/25

实验内容——2.熟悉常见的系统调用 熟悉以下系统调用的用法 pid_t fork(); //创建进程 pid_t waitpid(pid_t pid,int* status,int options); //等待指定pid的子进程结束 int execv(const char *path, char *const argv[]); //根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了 int system(const char* command); //调用fork()产生子进程,在子进程执行参数command字符串所代表的命令,此命令执行完后随即返回原调用的进程 FILE* popen(const char* command, const char* mode); //popen函数先执行fork,然后调用exec以执行command,并且根据mode的值("r"或"w")返回一个指向子进程的stdout或指向stdin的文件指针 int pclose(FILE* stream); //关闭标准I/O流,等待命令执行结束   2019/5/25

实验内容——2.熟悉常见的系统调用 利用上面的系统调用函数实现一个简单的shell程序 每行命令可能由若干个子命令组成,如"ls -l; cat 1.txt; ps -a",由“;” 分隔每个子命令,需要按照顺序依次执行这些子命令。 每个子命令可能包含一个管道符号“|”,如"cat 1.txt | grep abcd"(这 个命令的作用是打印出1.txt中包含abcd字符串的行),作用是先执 行前一个命令,并将其标准输出传递给下一个命令,作为它的标准 输入。 最终的shell程序应该有类似如下的输出: OSLab2->echo abcd;date;uname -r abcd Mon Apr 8 09:35:57 CST 2019 2.6.26 OSLab2->cat 1.txt | grep abcd 123abcd abcdefg   2019/5/25

实验内容——2.熟悉常见的系统调用 利用上面的系统调用函数实现一个简单的shell程序 程序的大致的框架如下 int main(){ char cmdline[256]; while (1) { printf("OSLab2->"); //读取一行字符串并根据“;”将其划分成若干个子命令 for (i=0; i < cmd_num; i++) { if () { //处理包含一个管道符号“|”的情况,利用popen处理命令的输入输出转换 } else { //通常的情况,利用fork创建子进程并执行命令 } } } return 0; }   2019/5/25

验收方式 现场验收 实验内容一 实验内容二 向助教展示修改的文件以及测试程序 在qemu中运行测试程序 向助教展示编写的测试程序 2019/5/25

报告提交方式 将实验报告、自己修改的所有代码文件,打包为压缩包提交 (请勿打包整个内核文件) 提交至邮箱:ustc_os2019@163.com 邮件主题、文件名称、压缩包名称 均采用以下格式命名 x-学号-姓名(x:代表第x次实验) 例如张三的第1次实验命名为“1-PB17011010-张三” 未按照规范命名的邮件会被忽略、删除 2019/5/25