Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Meeting Summary: CS 326 Lecture/Lab Spring 2025

Date & Time: April 09, 2025, 06:28 PM Pacific Time (US and Canada)
Meeting ID: 813 3845 7711


Quick Recap

  • Project02 Assistance:
    Greg assisted students working on Project02 by addressing various coding issues and offering guidance on system calls and kernel-level implementations.

  • Technical Discussion and Logistics:
    During the session, a disjointed conversation occurred—likely due to poor audio quality—that covered technical issues such as voicemail, coding problems, file management, and meeting logistics.

  • Debugging Unix-Like OS Project Code:
    Greg helped a student debug code related to implementing a process status command (PS) and a history feature for a Unix-like operating system project.


Next Steps

  • Student Tasks:
    • Complete the implementation of system calls and user-level programs for the pipe counter and get_proc_info.
    • Debug and fix any remaining issues in the code before final submission.
    • Prepare for the upcoming final exam, with a focus on kernel-level concepts and system calls.
  • Instructor & TA Support:
    • Greg will be available during additional office hours to provide further assistance.
    • Quinn will assist Greg in reviewing and grading students’ completed assignments.

Detailed Summary

Guidance on Project02 Implementation and Troubleshooting

  • Assistance Provided:
    Greg offered one-on-one help as students worked on Project02. He specifically clarified the implementation of:
    • The pipe counter system call, which involves coordination between a user-level program and a kernel-level system call.
    • The get_proc system call used to access the process array in the kernel.
  • Troubleshooting:
    The session addressed various coding issues, including:
    • File inclusion errors.
    • Compilation error messages.
    • Function implementations that interfaced with kernel-level processes.

Code Example: Pipe Counter System Call

Below is an example snippet from an xv6-riscv implementation that demonstrates a simple system call for counting active pipes:

// sys_pipe_count.c
#include "types.h"
#include "riscv.h"
#include "defs.h"
#include "proc.h"

// Kernel function to return the count of open pipes
int
pipe_count(void) {
  int count = 0;
  // Iterate over the file table (pseudocode)
  for (int i = 0; i < NFILE; i++) {
    if (filetable[i] != 0 && filetable[i]->type == PIPE)
      count++;
  }
  return count;
}

uint64
sys_pipe_count(void) {
  return pipe_count();
}

Technical Issues and Meeting Logistics

  • Audio & Communication:
    The transcript reflected a disjointed conversation, influenced by potential audio quality issues or transcription errors. Despite the fragmented discussion, several technical topics were briefly touched upon, including:
    • Voicemail and file management.
    • Array handling and Wi-Fi connectivity.
    • Scheduling and meeting logistics.
  • Clarification Challenges:
    Due to the fragmented nature, identifying specific decisions or action items was challenging.

Debugging Unix-Like OS Project Code

  • Focus Areas:
    The debugging session covered:
    • Implementation of the process status (PS) command.
    • Incorporation of a history feature to track command history.
  • Issues Addressed:
    Key topics included:
    • Managing white spaces in history output.
    • Resolving redeclaration errors.
    • Using system calls for kernel data transfer, particularly leveraging the copyout function.

Code Example: Process Status Command

A simplified snippet for a process status command in an xv6-like system might look like:

// sys_ps.c
#include "types.h"
#include "riscv.h"
#include "defs.h"
#include "proc.h"
#include "param.h"

uint64
sys_ps(void) {
  struct proc *p;
  char *state;
  // Iterate over the process table
  for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
    if(p->state == UNUSED)
      continue;
    switch(p->state){
      case SLEEPING: state = "sleeping"; break;
      case RUNNABLE: state = "runnable"; break;
      case RUNNING:  state = "running";  break;
      default:       state = "unknown";  break;
    }
    printf("PID: %d\tState: %s\n", p->pid, state);
  }
  return 0;
}

Additional Instructor Anecdotes

  • Brief digressions included references to computer architecture classes and personal anecdotes. Although off-topic, these moments provided additional context and humor during the session.

Code Examples: System Call for Process Information

The following example illustrates how the kernel might implement a system call (e.g., get_proc_info) to retrieve process information:

// sys_get_proc_info.c
#include "types.h"
#include "riscv.h"
#include "defs.h"
#include "proc.h"

uint64
sys_get_proc_info(void) {
  uint64 user_addr;
  struct proc *curproc = myproc();

  // Retrieve the user address argument where proc info should be stored
  if(argaddr(0, &user_addr) < 0)
      return -1;

  // Ensure that the kernel process data is successfully copied to user space
  if(copyout(curproc->pagetable, user_addr, (char *)curproc, sizeof(struct proc)) < 0)
      return -1;

  return 0;
}

Visual Representation: System Call Flow

The following diagram outlines the flow of a system call in an xv6-like operating system:

flowchart TD
    A[User Program Initiates System Call] --> B[Trap to Kernel Mode]
    B --> C[System Call Handler]
    C --> D[Dispatch to sys_x Function]
    D --> E[Kernel-Level Function Execution]
    E --> F[Result Returned to System Call Handler]
    F --> G[Return Result to User Program]

This diagram helps visualize the journey from a user program’s system call invocation to the kernel’s handling and back.


Conclusion

This meeting provided clear guidance on troubleshooting Project02, gave insights into technical aspects of Unix-like operating system development, and highlighted the importance of system calls within kernel-level programming. Greg’s hands-on assistance and detailed explanations, reinforced by practical code examples and visual diagrams, are intended to aid students as they complete their assignments and prepare for their final exam.