Project 1 System Calls

Similar documents
Introduction. This project will focus primarily on processes.

CS333 Project 1 Test Report Your Name Here

LAB 2: PROCESS SYNCHRONIZATION IN XV6

CS Lab 1 xv6 Introduction Setup and exercise

Project 3 Improved Process Management

COP4610: Operating Systems Project 1

EEE3052: Introduction to Operating Systems. Fall Project #1

Project #1 Exceptions and Simple System Calls

University of Colorado at Colorado Springs CS4500/ Fall 2018 Operating Systems Project 1 - System Calls and Processes

W4118 Operating Systems. Junfeng Yang

Pebbles Kernel Specification September 26, 2004

ICS143A: Principles of Operating Systems. Lecture 14: System calls (part 2) Anton Burtsev November, 2017

The Process Abstraction. CMPU 334 Operating Systems Jason Waterman

Scientific Programming in C X. More features & Fortran interface

CS3210: Isolation Mechanisms

Operating Systems, Assignment 2 Threads and Synchronization

This is an open book, open notes exam. But no online or in-class chatting.

CMIS 102 Hands-On Lab

Creating a Shell or Command Interperter Program CSCI411 Lab

Gabrielle Evaristo CSE 460. Lab Dining Philosophers and Deadlock

Project 5 File System Protection

Processes and Threads

Project 5 File System Protection

1 Programs and Processes

Programming Assignment #2

Programs. Function main. C Refresher. CSCI 4061 Introduction to Operating Systems

CS 3113 Introduction to Operating Systems Midterm October 11, 2018

CS 3113 Introduction to Operating Systems Midterm October 11, 2018

CS350 Operating Systems Fall Assignment Two

CS342 - Spring 2019 Project #3 Synchronization and Deadlocks

3. Process Management in xv6

Interrupts & System Calls

CS 326 Operating Systems C Programming. Greg Benson Department of Computer Science University of San Francisco

Problem Set 1: Unix Commands 1

W4118: interrupt and system call. Junfeng Yang

CMPT 300. Operating Systems. Brief Intro to UNIX and C

Week 2 Intro to the Shell with Fork, Exec, Wait. Sarah Diesburg Operating Systems CS 3430

CSci 4061 Introduction to Operating Systems. Programs in C/Unix

CS Programming I: Arrays

CSC209 Review. Yeah! We made it!

Windows architecture. user. mode. Env. subsystems. Executive. Device drivers Kernel. kernel. mode HAL. Hardware. Process B. Process C.

Computer Systems Assignment 2: Fork and Threads Package

CS 470 Operating Systems Spring 2013 Shell Project

Hint #1. Define a syscall

Discussion of Assignments 2. Line buffered vs. full buffered I/O. Some often encountered issues in the submissions.

TDDB68. Lesson 1. Simon Ståhlberg

CITS2002 Systems Programming. Creating a new process using fork() 1 next CITS2002 CITS2002 schedule

AIMMS Function Reference - Date Time Related Identifiers

Chap 4, 5: Process. Dongkun Shin, SKKU

Gabrielle Evaristo CSE 460. Lab Shared Memory

NYU Poly s Policy on Academic Misconduct:

Arrays III and Enumerated Types

1. Overview This project will help you understand address spaces and virtual memory management.

Exercise Session 2 Systems Programming and Computer Architecture

CSC369 Lecture 2. Larry Zhang, September 21, 2015

Project 2: Shell with History1

Reading Assignment 4. n Chapter 4 Threads, due 2/7. 1/31/13 CSE325 - Processes 1

Pointer Arithmetic and Lexical Scoping. CS449 Spring 2016

CSC209: Software tools. Unix files and directories permissions utilities/commands Shell programming quoting wild cards files

CSC209: Software tools. Unix files and directories permissions utilities/commands Shell programming quoting wild cards files. Compiler vs.

Programming in C - Part 2

High Performance Computing

Parallel System Architectures 2016 Lab Assignment 1: Cache Coherency

Introduction to OS Processes in Unix, Linux, and Windows MOS 2.1 Mahmoud El-Gayyar

Project 2: User Programs

15-213/18-213/15-513, Spring 2018 C Programming Lab: Assessing Your C Programming Skills

Friday, September 16, Lab Notes. Command line arguments More pre-processor options Programs: Finish Program 1, begin Program 2 due next week

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2018 Lecture 20

CSCI-243 Exam 2 Review February 22, 2015 Presented by the RIT Computer Science Community

CS 550 Operating Systems Spring Process III

Operating Systems and Networks Assignment 2

Project 2--User Programs

CSC369 Lecture 2. Larry Zhang

15-213/18-213/15-513, Fall 2017 C Programming Lab: Assessing Your C Programming Skills

UNIVERSITY OF NEBRASKA AT OMAHA Computer Science 4500/8506 Operating Systems Fall Programming Assignment 1 (updated 9/16/2017)

Package RcppBDT. August 29, 2016

Project 2 Overview: Part A: User space memory allocation

CSCE Operating Systems Interrupts, Exceptions, and Signals. Qiang Zeng, Ph.D. Fall 2018

CS201: Lab #4 Writing a Dynamic Storage Allocator

Project 2: Signals. Consult the submit server for deadline date and time

Programming in C. Pointers and Arrays

CS 33. Architecture and the OS. CS33 Intro to Computer Systems XIX 1 Copyright 2018 Thomas W. Doeppner. All rights reserved.

Asks for clarification of whether a GOP must communicate to a TOP that a generator is in manual mode (no AVR) during start up or shut down.

Laboratory work in TDDB68 Pintos Assignments 2, 3. Viacheslav Izosimov

Computer Science 322 Operating Systems Mount Holyoke College Spring Topic Notes: C and Unix Overview

Operating Systems Synchronization and Signals

Computer Science 2500 Computer Organization Rensselaer Polytechnic Institute Spring Topic Notes: C and Unix Overview

COMP26120: Algorithms and Imperative Programming. Lecture 5: Program structuring, Java vs. C, and common mistakes

CSE 351, Spring 2010 Lab 7: Writing a Dynamic Storage Allocator Due: Thursday May 27, 11:59PM

Project #1: Tracing, System Calls, and Processes

Introduction to Operating Systems Prof. Chester Rebeiro Department of Computer Science and Engineering Indian Institute of Technology, Madras

Operating Systems (234123) Spring 2017 (Homework Wet 1) Homework 1 Wet

Programming in C week 1 meeting Tiina Niklander

CS 33. Architecture and the OS. CS33 Intro to Computer Systems XIX 1 Copyright 2017 Thomas W. Doeppner. All rights reserved.

CS3157: Advanced Programming. Outline

Machine Problem 3: UNIX System Programming. 100 points + 10 bonus points Due date: To Be Announced

Operating Systems. Objective. Background

Programming in C First meeting

Processes. Johan Montelius KTH

Programming Assignment #1: A Simple Shell

Transcription:

Project 1 System Calls

Introduction In this project, you will become familiar with: 1. Using the xv6 Makefile 2. Using conditional compilation. 3. The xv6 system call invocation path. 4. Implementing a new system call. 5. Creating a new shell command. 6. The xv6 process structure. 7. Control sequences for the xv6 console. 8. The format and content for project reports. The reading for this project is chapters 1 3 from the xv6 book. Future projects will require you to determine which parts of the xv6 book are pertinent to your work. The conditional compilation flag for this project is CS333 P1. The xv6 Makefile The xv6 Makefile is structured so that all student modifications are at the top of the Makefile. Here is the relevant part of the Makefile: # Set f l a g to c o r r e c t CS333 p r o j e c t number : 1, 2,... # 0 == o r i g i n a l xv6 pdx d i s t r i b u t i o n f u n c t i o n a l i t y CS333 PROJECT?= 0 CS333 CFLAGS = CS333 UPROGS = CS333 TPROGS = PRINT SYSCALLS?= 0 i f e q ( $ (PRINT SYSCALLS), 1) CS333 CFLAGS += DPRINT SYSCALLS i f e q ( $ (CS333 PROJECT), 1) CS333 CFLAGS += DCS333 P1 CS333 UPROGS += d a t e i f e q ( $ (CS333 PROJECT), 2) CS333 CFLAGS += DCS333 P1 DUSE BUILTINS DCS333 P2 CS333 UPROGS += d a t e time ps CS333 TPROGS += i f e q ( $ (CS333 PROJECT), $ ( f i l t e r $ (CS333 PROJECT), 3 4 ) ) CS333 CFLAGS += DCS333 P1 DUSE BUILTINS DCS333 P2 DCS333 P3P4 CS333 UPROGS += d a t e time ps CS333 TPROGS += 1

i f e q ( $ (CS333 PROJECT), 5) CS333 CFLAGS += DUSE BUILTINS DCS333 P1 DCS333 P2 \ DCS333 P3P4 DCS333 P5 # i f P3 and P4 f u n c t i o n a l i t y not d e s i r e d # CS333 CFLAGS += DCS333 P1 DUSE BUILTINS DCS333 P2 DCS333 P5 CS333 UPROGS += d a t e time ps chgrp chmod chown CS333 TPROGS += # p5 t e s t t e s t s e t u i d CS333 MKFSFLAGS += DCS333 P2 DCS333 P5 ## CS333 s t u d e n t s should not have to make m o d i f i c a t i o n s p a s t here ## For this project, you will change CS333 PROJECT?= 0 to CS333 PROJECT?= 1. To activate the facility to trace system calls, you will change PRINT SYSCALLS?= 0 to PRINT SYSCALLS?= 1 and set the value back to 0 to turn off system call tracing. The variable CS333 UPROGS is a listing of new shell command names (user programs), with a leading underscore. The variable CS333 TPROGS is where you list any test programs that you write for the assignment using the same naming scheme as CS333 UPROGS. Both are used to update the Makefile variable UPROGS. As should be clear, the correct project compilation flags and correct UPROGS variable are set via the value of CS333 PROJECT. You will need to correctly set this value in subsequent projects. Conditional Compilation You are required to write your code in such a way so that if all conditional compilation flags are turned off then xv6 will function the same as the initial distribution. This means that your code will need to be wrapped in preprocessor directives. For example: #i f d e f CS333 P1 int s y s d a t e ( void ) struct r t c d a t e d ; // code removed #endif The statement #ifdef CS333 P1 is a C compiler preprocessor directive that indicates that the code between this line and the matching #endif will only be included in the compiled program if the flag is turned on; that is, defined. Preprocessor directives are defined in the project Makefile. Limitations: It is important to note that the preprocessor directives do not apply to assembly programs (those ending in.s) as they are assembled, not compiled. Because of this, you cannot use a preprocessor directive in the file usys.s. Fortunately, the system is designed such that any extra code in this file will not impact xv6 functionality when conditional compilation flags are turned off. Because of this restriction on usys.s, conditional compilation flags cannot be used in the file sycalls.h either. These are the only two files where you will add code that is not subject to conditional compilation. System Call Tracing Your first task is to modify the xv6 kernel to print out a line for each system call invocation. It is enough to print the name of the system call and the return value; you don t need to print the system call arguments. 2

When completed, you should see output like this when booting xv6:... fork -> 2 exec -> 0 open -> 3 close -> 0 $write -> 1 write -> 1 That s the init process using the fork() system call to create a new process and the exec() system call invoked to run the shell (sh) followed by the shell writing the $ prompt. The last two lines show the output from the shell and the kernel being intermixed. This is a concurrency issue; more about that in class. This new and wonderful feature of your kernel will cause a trace to be printed every time a system call is invoked. You will find this feature annoying, so you want to be able to turn this feature on or off as necessary. You are required to implement your syscall tracing facility (code and data structures) using conditional compilation so that it can easily be turned on or off with a simple compilation flag. The flag name is PRINT SYSCALLS. Hint: Modify the syscall() function in syscall.c and add a second table (array) similar to one for system call function pointers just above the syscall() function (name it syscallnames ). Be sure to print the system call name (e.g. date ) and not the kernel-side routine name (e.g., sys date ). Use conditional compilation so that the code and data structure are only included in the compiled code if the flag is turned on in the Makefile. For the x86 architecture, the return code is the value of the eax register on return from the callee. The date() System Call Your second task is to add a new system call 1 to xv6. The goal of the exercise is for you to become familiar with the principle parts of the system call infrastructure. Your new system call will get the current UTC time and return it to the invoking user program. You must use the function, cmostime() 2, defined in lapic.c, to read the real-time clock. The supplied include file date.h contains the definition of the rtcdate data structure, a pointer to which you will provide as an argument to cmostime(). You will need a shell command that invokes your new date() system call and we have provided one in the file date.c. You can also write your own, but since this command is so simple, we provide it as an example. Adding a New System Call Adding a new system call to your xv6 kernel, while straightforward, requires that several files be modified. The following files will need to be modified in order to add the date() system call. Note that all other system calls in xv6 are defined in a similar manner. user.h contains the function prototypes for the xv6 system calls and library functions 3. This file is required to compile user programs that invoke these routines. The function prototype for date() is int date(struct rtcdate*); 1 Having both the system call and test program named date can be confusing. We will always call a program that we run from the shell prompt a command or program and always call a system call that your programs invoke to obtain kernel services a system call. 2 The time resolution for cmostime() is one second. 3 The files ulib.c, printf.c and ls.c comprise the C library for xv6. Pretty small. 3

usys.s contains the list of system calls made available (exported) by the kernel. We recommend that you add any new system calls at the end of this list as it will make it easier for course staff to find your additions should they need to help debug some problem. Remember that you will not be able to use preprocessor directives in this file. This file contains the code that actually invokes your system call 4. Be sure to understand how the code here will cause the system to change mode to kernel for your process. syscall.h contains the mappings of system call name to system call number. This is a critical part of adding a system call. In xv6, we require that the name associated with the system call number use the SYS prefix. This is a very good technique for a kernel developer to use. Use the next integer value for the system call number of any new system call that you add. It should be clear, at this point, that system calls are actually invoked via number and not name. Remember that you will not be able to use preprocessor directives in this file. syscall.c is where the system call entry point will be defined. There are several steps to defining the entry point in this file. 1. The entry point will point to the implementation. The implementation for our system call will be in another file. You indicate that with extern i n t s y s d a t e ( void ) ; which you will add to the end of the list of similar extern declarations. You must declare the routine to take a void argument! 2. Add to the syscall function definition. The function dispatch table i n t ( s y s c a l l s [ ] ) ( void ) = declares the mapping from symbol name (as used by usys.s and declared in syscall.h) to the function name, which is the name of the function that you want to call for that symbol. You will want to add [ SYS date ] sys date, to the end of this structure. The routine syscall() at the bottom of syscall.c causes the correct system call to be dispatched based on these definitions; see vectors.pl. You have just defined this system call number for the date() system call. The mapping in syscalls[] constitutes what is known as a function dispatch table. sysproc.c is where you will implement sys date(). The implementation of your date() system call is very straightforward. All you will need to do is add the new routine to sysproc.c; get the argument off the stack 5 ; call the cmostime() routine correctly; and return a code indicating SUCCESS or FAILURE, which will most likely be 0 because this routine cannot actually fail 6. Note that since you passed into the kernel a pointer to the structure, any changes made to the structure within the kernel will be reflected in user space. The first part of your implementation is provided for you i n t s y s d a t e ( void ) s t r u c t r t c d a t e d ; 4 In xv6, a system call is invoked via a specific trap int 0x40 5 This is why the function argument is void. 6 Your date command, however, must check for an error and do something reasonable. 4

i f ( argptr ( 0, ( void )&d, s i z e o f ( s t r u c t r t c d a t e ) ) < 0) return 1; The rest of the routine is left as an exercise for the student. See the xv6 book for how to properly use the argptr() routine. Be sure to read and understand the comments for the argptr() routine in syscall.c as this will become critical in later projects. The date Command We cannot directly test a system call and instead have to write a program that we can invoke as a command at the shell prompt. An example program, date.c has been provided. This file has not yet been added to the xv6 build environment since the required system call does not exist yet. The date.c program is designed to mimic date -u under Linux. #include types. h #include user. h #include date. h static char months [ ] = NULL, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec ; static char days [ ] = Sun, Mon, Tue, Wed, Thu, Fri, Sat ; int dayofweek ( int y, int m, int d ) return ( d+=m<3?y :y 2,23 m/9+d+4+y/4 y/100+y / 400)% 7; int main ( int argc, char argv [ ] ) int day ; struct r t c d a t e r ; i f ( date(&r ) ) p r i n t f ( 2, Error : date c a l l f a i l e d. %s at l i n e %d\n, FILE, LINE ) ; e x i t ( ) ; day = dayofweek ( r. year, r. month, r. day ) ; p r i n t f ( 1, %s %s %d, days [ day ], months [ r. month ], r. day ) ; p r i n t f ( 1, %d:%d:%d UTC %d\n, r. hour, r. minute, r. second, r. year ) ; e x i t ( ) ; The printf() routine 7 takes a file descriptor as its first argument: 1 is standard output (stdout) and 2 is error output (stderr). 7 The printf() library routine in xv6 differs from the standard C library. 5

The function main() must terminate with a call to exit() and not return() or simply fall off the end of the routine. This is a very common source of compilation errors. Note that date.c and date.h are already added to the runoff.list file so that the commands make dist-test-nox and make tar will work correctly. Control P The xv6 kernel supports a special control sequence, control p, which displays process information on the console 8. It is intended as a debugging tool and you will expand the information reported as you add new features to the xv6 process structure. Note that the routine procdump(), at the end of proc.c, implements the bulk of the control p functionality. You will modify struct proc in proc.h to include a new field, uint start ticks. You will modify the routine allocproc() in proc.c so that this field is initialized to the value for the existing global kernel variable ticks. This allows the process to know when it was created. This will allow us to later calculate how long the process has been active. Put the initialization code right before the return at the end of the routine. The PSU version of xv6 does not require a lock around accesses to the ticks global variable. If you look around you can figure out why. You will then modify the procdump() routine to print out the amount of time that each process has been active in system. This is fairly straightforward since each tick is a millisecond ( 1 1000 of a second). Report the elapsed time in seconds, accurate to the millisecond. The longest running process in xv6 will always be the init process, but the first shell will be close behind. There is no need to modify the printf() or cprintf() routines to print this information. The first line of output should be a set of labels for each column. You will be adding to the control p output in later projects and the header will help with interpreting the output. The last set of information printed from procdump() contains the program counters as returned by the routine getcallerpcs(). The header for this last section can just be labeled PCs. Keep the code in procdump() as clean as you can. It may be useful for you to create a helper function so as not to clutter the code in that routine. Example Output PID State Name Elapsed PCs 1 sleep init 1.346 80104e82 80104c54 801066ba 80105786 80106ac9 801068ba 2 sleep sh 2.452 80104e82 801009b6 80101f11 801011b7 80105960 80105786 80106ac9 801068ba Required Tests The list of required tests are in the project rubric. Before You Submit As described in the Survival Guide, you must test that your submission is working properly before submission. There is a Makefile target to help you. Be sure to run make dist-test-nox to verify that your kernel compiles and runs correctly, including all tests. A common error is to not put the name of new files into runoff.list. Once you have verified that the submission is correct, use make tar to build the archive file that you will submit. Submit your project report as a separate PDF document. Failure to submit your report in PDF format will result in a grade of zero for the report. 8 See console.c, case C( P ): 6