diff options
Diffstat (limited to 'web/l1.html')
-rw-r--r-- | web/l1.html | 288 |
1 files changed, 0 insertions, 288 deletions
diff --git a/web/l1.html b/web/l1.html deleted file mode 100644 index 9865601..0000000 --- a/web/l1.html +++ /dev/null @@ -1,288 +0,0 @@ -<title>L1</title> -<html> -<head> -</head> -<body> - -<h1>OS overview</h1> - -<h2>Overview</h2> - -<ul> -<li>Goal of course: - -<ul> -<li>Understand operating systems in detail by designing and -implementing miminal OS -<li>Hands-on experience with building systems ("Applying 6.033") -</ul> - -<li>What is an operating system? -<ul> -<li>a piece of software that turns the hardware into something useful -<li>layered picture: hardware, OS, applications -<li>Three main functions: fault isolate applications, abstract hardware, -manage hardware -</ul> - -<li>Examples: -<ul> -<li>OS-X, Windows, Linux, *BSD, ... (desktop, server) -<li>PalmOS Windows/CE (PDA) -<li>Symbian, JavaOS (Cell phones) -<li>VxWorks, pSOS (real-time) -<li> ... -</ul> - -<li>OS Abstractions -<ul> -<li>processes: fork, wait, exec, exit, kill, getpid, brk, nice, sleep, -trace -<li>files: open, close, read, write, lseek, stat, sync -<li>directories: mkdir, rmdir, link, unlink, mount, umount -<li>users + security: chown, chmod, getuid, setuid -<li>interprocess communication: signals, pipe -<li>networking: socket, accept, snd, recv, connect -<li>time: gettimeofday -<li>terminal: -</ul> - -<li>Sample Unix System calls (mostly POSIX) -<ul> - <li> int read(int fd, void*, int) - <li> int write(int fd, void*, int) - <li> off_t lseek(int fd, off_t, int [012]) - <li> int close(int fd) - <li> int fsync(int fd) - <li> int open(const char*, int flags [, int mode]) - <ul> - <li> O_RDONLY, O_WRONLY, O_RDWR, O_CREAT - </ul> - <li> mode_t umask(mode_t cmask) - <li> int mkdir(char *path, mode_t mode); - <li> DIR *opendir(char *dirname) - <li> struct dirent *readdir(DIR *dirp) - <li> int closedir(DIR *dirp) - <li> int chdir(char *path) - <li> int link(char *existing, char *new) - <li> int unlink(char *path) - <li> int rename(const char*, const char*) - <li> int rmdir(char *path) - <li> int stat(char *path, struct stat *buf) - <li> int mknod(char *path, mode_t mode, dev_t dev) - <li> int fork() - <ul> - <li> returns childPID in parent, 0 in child; only - difference - </ul> - <li>int getpid() - <li> int waitpid(int pid, int* stat, int opt) - <ul> - <li> pid==-1: any; opt==0||WNOHANG - <li> returns pid or error - </ul> - <li> void _exit(int status) - <li> int kill(int pid, int signal) - <li> int sigaction(int sig, struct sigaction *, struct sigaction *) - <li> int sleep (int sec) - <li> int execve(char* prog, char** argv, char** envp) - <li> void *sbrk(int incr) - <li> int dup2(int oldfd, int newfd) - <li> int fcntl(int fd, F_SETFD, int val) - <li> int pipe(int fds[2]) - <ul> - <li> writes on fds[1] will be read on fds[0] - <li> when last fds[1] closed, read fds[0] retursn EOF - <li> when last fds[0] closed, write fds[1] kills SIGPIPE/fails - EPIPE - </ul> - <li> int fchown(int fd, uind_t owner, gid_t group) - <li> int fchmod(int fd, mode_t mode) - <li> int socket(int domain, int type, int protocol) - <li> int accept(int socket_fd, struct sockaddr*, int* namelen) - <ul> - <li> returns new fd - </ul> - <li> int listen(int fd, int backlog) - <li> int connect(int fd, const struct sockaddr*, int namelen) - <li> void* mmap(void* addr, size_t len, int prot, int flags, int fd, - off_t offset) - <li> int munmap(void* addr, size_t len) - <li> int gettimeofday(struct timeval*) -</ul> -</ul> - -<p>See the <a href="../reference.html">reference page</a> for links to -the early Unix papers. - -<h2>Class structure</h2> - -<ul> -<li>Lab: minimal OS for x86 in an exokernel style (50%) -<ul> -<li>kernel interface: hardware + protection -<li>libOS implements fork, exec, pipe, ... -<li>applications: file system, shell, .. -<li>development environment: gcc, bochs -<li>lab 1 is out -</ul> - -<li>Lecture structure (20%) -<ul> -<li>homework -<li>45min lecture -<li>45min case study -</ul> - -<li>Two quizzes (30%) -<ul> -<li>mid-term -<li>final's exam week -</ul> - -</ul> - -<h2>Case study: the shell (simplified)</h2> - -<ul> -<li>interactive command execution and a programming language -<li>Nice example that uses various OS abstractions. See <a -href="../readings/ritchie74unix.pdf">Unix -paper</a> if you are unfamiliar with the shell. -<li>Final lab is a simple shell. -<li>Basic structure: -<pre> - - while (1) { - printf ("$"); - readcommand (command, args); // parse user input - if ((pid = fork ()) == 0) { // child? - exec (command, args, 0); - } else if (pid > 0) { // parent? - wait (0); // wait for child to terminate - } else { - perror ("Failed to fork\n"); - } - } -</pre> -<p>The split of creating a process with a new program in fork and exec -is mostly a historical accident. See the <a -href="../readings/ritchie79evolution.html">assigned paper</a> for today. -<li>Example: -<pre> - $ ls -</pre> -<li>why call "wait"? to wait for the child to terminate and collect -its exit status. (if child finishes, child becomes a zombie until -parent calls wait.) -<li>I/O: file descriptors. Child inherits open file descriptors -from parent. By convention: -<ul> -<li>file descriptor 0 for input (e.g., keyboard). read_command: -<pre> - read (1, buf, bufsize) -</pre> -<li>file descriptor 1 for output (e.g., terminal) -<pre> - write (1, "hello\n", strlen("hello\n")+1) -</pre> -<li>file descriptor 2 for error (e.g., terminal) -</ul> -<li>How does the shell implement: -<pre> - $ls > tmp1 -</pre> -just before exec insert: -<pre> - close (1); - fd = open ("tmp1", O_CREAT|O_WRONLY); // fd will be 1! -</pre> -<p>The kernel will return the first free file descriptor, 1 in this case. -<li>How does the shell implement sharing an output file: -<pre> - $ls 2> tmp1 > tmp1 -</pre> -replace last code with: -<pre> - - close (1); - close (2); - fd1 = open ("tmp1", O_CREAT|O_WRONLY); // fd will be 1! - fd2 = dup (fd1); -</pre> -both file descriptors share offset -<li>how do programs communicate? -<pre> - $ sort file.txt | uniq | wc -</pre> -or -<pre> - $ sort file.txt > tmp1 - $ uniq tmp1 > tmp2 - $ wc tmp2 - $ rm tmp1 tmp2 -</pre> -or -<pre> - $ kill -9 -</pre> -<li>A pipe is an one-way communication channel. Here is an example -where the parent is the writer and the child is the reader: -<pre> - - int fdarray[2]; - - if (pipe(fdarray) < 0) panic ("error"); - if ((pid = fork()) < 0) panic ("error"); - else if (pid > 0) { - close(fdarray[0]); - write(fdarray[1], "hello world\n", 12); - } else { - close(fdarray[1]); - n = read (fdarray[0], buf, MAXBUF); - write (1, buf, n); - } -</pre> -<li>How does the shell implement pipelines (i.e., cmd 1 | cmd 2 |..)? -We want to arrange that the output of cmd 1 is the input of cmd 2. -The way to achieve this goal is to manipulate stdout and stdin. -<li>The shell creates processes for each command in -the pipeline, hooks up their stdin and stdout correctly. To do it -correct, and waits for the last process of the -pipeline to exit. A sketch of the core modifications to our shell for -setting up a pipe is: -<pre> - int fdarray[2]; - - if (pipe(fdarray) < 0) panic ("error"); - if ((pid = fork ()) == 0) { child (left end of pipe) - close (1); - tmp = dup (fdarray[1]); // fdarray[1] is the write end, tmp will be 1 - close (fdarray[0]); // close read end - close (fdarray[1]); // close fdarray[1] - exec (command1, args1, 0); - } else if (pid > 0) { // parent (right end of pipe) - close (0); - tmp = dup (fdarray[0]); // fdarray[0] is the read end, tmp will be 0 - close (fdarray[0]); - close (fdarray[1]); // close write end - exec (command2, args2, 0); - } else { - printf ("Unable to fork\n"); - } -</pre> -<li>Why close read-end and write-end? multiple reasons: maintain that -every process starts with 3 file descriptors and reading from an empty -pipe blocks reader, while reading from a closed pipe returns end of -file. -<li>How do you background jobs? -<pre> - $ compute & -</pre> -<li>How does the shell implement "&", backgrounding? (Don't call wait -immediately). -<li>More details in the shell lecture later in the term. - -</body> - - |