This repository has been archived on 2024-01-18. You can view files and clone it, but cannot push or open issues or pull requests.
OS_Project/Part2
2023-09-15 11:38:42 -04:00
..
A4 Completed Part2: 07_timers. 2023-09-15 11:38:42 -04:00
Images Completed Part2: 07_timers. 2023-09-15 11:38:42 -04:00
Instructions Modifying Location 2023-09-13 14:10:45 -04:00
.DS_Store Completed Part2: 07_timers. 2023-09-15 11:38:42 -04:00
kernel.tar.gz Finished Part I, moved part 2 relavent files to own folder. 2023-09-12 13:03:34 -04:00
README.md Finished Part I, moved part 2 relavent files to own folder. 2023-09-12 13:03:34 -04:00

CS3502 Project 01-A Fall 2023

Setting up the OS Development Environment

Learning Objectives:

The purpose of this assignment is to continue the development examples of setting up an Operating System kernel.

Submissions will be placed here and they will contribute to the total assignment grade of 100 points.

This is the kernel build environment setup process and constitutes the Part I of the Kernel Build assignment. This assignment in D2L contains four sections that will complete the Project Assignment:

Part I: Set up Environment -- install NASM,QEMU, GCC, GDB in WSL, VM or native installation.

First, read Part I below and review the attached Power Point for how to set up the environment.

Part II: Get to a working shell prompt.

Then complete the tasks for Part II given below in this document. Do not forget to answer the questions at the end.

Part III: Add a Memory Manager (the HEAP, Linked List data structures)

Implement Best Fit, Worst Fit and First Fit kernel memory manager algorithm.

Part IV: Add a Process Manager (Linked List or Balanced BST data structure)

Given a process binary load a process into memory.

Part V: Add a File Manager (Linked List and Tree or graph data structures)

Implement a directory structure.

PART I

See the Power Point file in D2L EnvironmentSetup.ppt and complete the instructions. Be sure to contact me in class, office hours (or even outside of office hours) if you have any difficulties -- and... you will have difficulties. Contact me early and often.

NOTE: 4Gb is probably the minimum size for Ubuntu16 with all the sudo apt-get installs done but you may want more room (i.e. 20Gb if you have sufficient space). ALSO be sure to install a FIXED size, this will save performance issues later.

Future assignment kernel development sections will depend and build on completing this one.

The files are in D2L and for convenience are embedded here as well.

10 points

**
**

PART II -- The debugger and world's simplest shell prompt

See the very bottom of assignment for discussion questions, points for both the screenshot and each section questions at end of Part II:

You will need NASM, GCC, QEMU, GDB. The latter three are already installed but from the bash (Windows Subsystem for Linux) or x-term (Ubuntu 16 Virtual Machine) run the following:

sudo apt-get update

sudo apt-get upgrade

sudo apt-get dist-upgrade

sudo apt-get install gdb

As before retrieve the file kernel.zip.gz from D2L and extract to your home directory or another place. The file is included here but if it does not show up properly retrieve from D2L as well.

In WSL you may have to copy from Downloads by executing the command:

cd ~

cp /mnt/c/Users/<Windows Login ID>/Downloads/kernel.zip.gz .

In the VM though it may be easier to just access D2L from Firefox88 (ignore warnings about compatibility it still runs today) and download the files directly in the VM in D2L. Otherwise you may have to use sftp to connect to the host machine. See me for any issues and we can go through this part together.

E.g. run:

cd ~

tar -xvf kernel.tar.gz

This will create eight directories under the directory a4:

For section 01_gdb, it will be longer than the others, the rest are just make... screenshot --- for the most part. RED is the section assignment, GREEN asks specifically for submission information.

Part II -- Connecting the gnu debugger, Video and Interrupts

01_gdb - Simple kernel continuation for "vga" graphic manipulation and connecting to debugger

Change to the directory 01_gdb and run the command:

make clean

make

make run (if you are using qemu -vga std)

make curses (if you have trouble with qemu -vga std and run qemu -curses)

You should have a window that looks similar to this.

Navigate to the kernel directory under 01_gdb and edit the file kernel.c to insert the following after the line " *video_memory = 'X';". Don't forget to make sure the brace } at the end doesn't get overwritten when you add these lines:

If you are running Windows Subsystem for Linux you can run notepad.exe from a bash prompt e.g. if your files are extracted under your home directory:

cd ~ --- will take you to home directory

cd a4

cd 01_gdb

cd kernel

If in WSL run:

/mnt/c/Windows/notepad.exe kernel.c

If you are familiar with using "vi" or other editors you can use them instead.

If in ubuntu16 Virtual Machine the native text editor is gedit:

gedit kernel.c

unsigned char a;

unsigned char b;

a = 0;

b = 0;

for( int i = 1; i < 24; ++i) {

for( int j = 0; j < 80; ++j) {

*(video_memory + i*160 + j*2) = '.';

}

}

*video_memory = 'Z';

for( int i = 10; i < 20; ++i) {

for( int j = 50; j < 60; ++j) {

*(video_memory + i*160 + j*2) = 'X';

}

}

while( 1) {

*(video_memory+0) = b;

*(video_memory+1) = ++a;

b = b + a/255;

}

Once done editing, save the file, in the shell prompt rebuild the edited:

cd .. ###This should take you to up one level back to a4/01_gdb directory

make clean

make

make curses --OR-- make run

Take a screenshot of the result and submit it. Exit this instance, make sure you are in the directory 01_gdb and run the command:

make clean

make debug

Then, open a second x-term/bash shell, navigate to the directory 01_gdb and connect the debugger to the running program in the other shell:

make gdb

You will see two windows like these (debugger and connected program):

{width="3.3333333333333335in" height="1.7516338582677164in"}

In the gdb window at the (gdb) prompt type:

list 0

jump _start

break _start

info break

jump _start

step 1

step 2

step 10

You may have to hit Ctrl-C if the prompt disappears and appears to do nothing here. Then you can restart.

NOTE: On my office computer gdb ran fine, but on my home computer gdb connected but did not control the program output as it did in the office. Depending on your setup, the second window may respond differently.

Show a screenshot of the gdb window of the results from the above commands.

NOTE: If you only allocated 1 CPU to the Ubuntu 16 Virtual Machine this program will freeze your VM. If you only have one CPU allocated go ahead and run it but you'll have to reset it from the VM Window to stop it.

02_driver - Simple video driver implementation

Change directory to 02_driver and run:

make clean

Make run (or curses)

Modify the code so that the "X" that is printed after the text is now 2 rows down and 10 characters (columns) further over instead so that:

Loading kernel into memory.

X

Becomes:

Loading kernel into memory.

X

Instead.

Print and submit a screenshot of the result.

03_strings - Writing more than one character at a function call

Change directory to 03_string and run:

make clean

Make run (or curses)

Print and submit a screenshot of the result.

04_scroll - Writing by lines and scrolling out of view

Change directory to 04_scroll and run:

make clean

Make run (or curses)

Modify the kernel.c code by changing i<24 value to i<30 and slowing down the scroll by adding the following for loop after kprint_at(str, 0, i):

for( int j = 0; j < 100000000; ++j) {

;

}

Print and submit a screenshot of the result.

05_basic_int - Building a simple Interrrupt table

Change directory to 05_basic_int and run:

make clean

Make run (or curses)

Modify the message "Breakpoint" to print instead "Breakpoint, Halted"

Print and submit a screenshot of the result.

06_irq - Filling in the interrupt request handlers

Change directory to 06_irq and run:

make clean

Make run (or curses)

Modify the result to print "Z" before the "S".

Print and submit a screenshot of the result.

07_timers - Implementing a simple timer system

Change directory to 07_timers and run:

make clean

Make run (or curses)

Change the value of 50 in init_timer(50) to 1000.

Change the value of 50 in init_timer(50) to 10.

Print and submit a screenshot of the result.

08_shell - Implementing the world's simplest shell

Change directory to 08_shell and run:

make clean

Make run (or curses)

Enter the following shell commands:

echo

END

dir

end

Print and submit a screenshot of the result.

You are now ready to begin kernel design of the principle modules of Kernel design: The CPU Scheduler, Memory Manager and File System Implementation

QUESTIONS

01_gdb -- How does the while(1) change the output when *video_memory and *video_memory +1 are updated with the a and b values?

01_gdb -- What information do you receive from running the debugger step commands while watching the kernel run in the other terminal?

02_driver -- In kernel.c why is offset_from_vga assigned position multiplied by *2?

03_strings -- Where is the function kprint_at stored in the 03_strings build?

03_strings -- kprint_at( "X", 1, 6) what is each argument representing here?

04_scroll -- After modifying to slow scroll down and increasing number of i loops; was the result what you expected, what do you think is happening?

05_basic_int What is the directive in kernel.c: __asm__ __volatile__("int $2"); doing?

06_irq - Where is the routine that prints the S when an interrupt is received in 06_irq?

07_timers -- What is the value 10/50/1000 doing to the timer result?

08_shell -- Why does typing "END" produce the output "?E?N?D" ?

15 points (Part II)

For the interested, see the guide website I used as a template for this: https://github.com/cfenollosa/os-tutorial

Submission Guidelines:

  • No handwritten submission is accepted, always submit answers as text within this or similar document file with any support images embedded in the file.

  • EXCEPTION: If asked for source code implementation you can submit those individually and as separate files in ASCII format in their original file format .cpp, .java, .py, .cs etc. or even as a .txt file will be acceptable. Do not insert code into the submission document file. It ruins spacing which makes .python and some languages (perl, awk etc.) difficult to test build.

  • Do not submit ZIP files... ever... for anything in D2L. The system is extremely unhelpful with regards to those filetypes and grading.

  • You may include your freehand drawing/image and handwritten scans in the submission. However, the writing and images must be clearly legible. Though, it is best to present non-handwritten submissions, generally, as is done in the professional setting.

  • If asked, show all work/calculations/graphs etc. in the determination of the problem.

  • Please complete your entire work in a single Word Document and Save the file as: yournetid_CS3502_ProjectP1_2.docx (e.g. ogarcia5_CS3502_ProjectP1_2.docx.) and upload your file in D2L.

  • Please observe the submission due date and time. After the due date there is a 50% penalty for the next 24 hours. Any submission after 24 hours of the due date will be graded at 0%.

  • If you include a reference or an image taken from other sources, please cite them appropriately. APA is preferred but cite them so they can be found. NOTE: verbatim copying or even paraphrasing is plagiarism so if the source used constitutes your answer rather than simply supporting the answer, it will be considered invalid. This is especially true of source code implementation answers.

  • If you resubmit, please make sure to attach the file again. Your latest submission before the due date will be the one graded.