explain me proc.c
#include "proc.h"
#include "mmu.h"
#include "pagesim.h"
#include "va\_splitting.h"
#include "swapops.h"
#include "stats.h"

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"

/\*\*
 \* --------------------------------- PROBLEM 3 --------------------------------------
 \* Checkout PDF section 4 for this problem
 \* 
 \* This function gets called every time a new process is created.
 \* You will need to allocate a frame for the process's page table using the
 \* free\_frame function. Then, you will need update both the frame table and
 \* the process's PCB. 
 \* 
 \* @param proc pointer to process that is being initialized 
 \* 
 \* HINTS:
 \* - pcb\_t: struct defined in pagesim.h that is a process's PCB.
 \* - You are not guaranteed that the memory returned by the free frame allocator
 \* is empty - an existing frame could have been evicted for our new page table.
 \* ----------------------------------------------------------------------------------
 \*/
void proc\_init(pcb\_t \*proc) {
 // TODO: initialize proc's page table.
 pfn\_t pfn\_saved = free\_frame();
 memset(mem + (pfn\_saved \* PAGE\_SIZE), 0, PAGE\_SIZE);
 proc->saved\_ptbr = pfn\_saved;
 frame\_table[pfn\_saved].protected = 1;
 frame\_table[pfn\_saved].mapped = 1;
}

/\*\*
 \* --------------------------------- PROBLEM 4 --------------------------------------
 \* Checkout PDF section 5 for this problem
 \* 
 \* Switches the currently running process to the process referenced by the proc 
 \* argument.
 \* 
 \* Every process has its own page table, as you allocated in proc\_init. You will
 \* need to tell the processor to use the new process's page table.
 \* 
 \* @param proc pointer to process to become the currently running process.
 \* 
 \* HINTS:
 \* - Look at the global variables defined in pagesim.h. You may be interested in
 \* the definition of pcb\_t as well.
 \* ----------------------------------------------------------------------------------
 \*/
void context\_switch(pcb\_t \*proc) {
 // TODO: update any global vars and proc's PCB to match the context\_switch.
 PTBR = proc->saved\_ptbr;
}

/\*\*
 \* --------------------------------- PROBLEM 8 --------------------------------------
 \* Checkout PDF section 8 for this problem
 \* 
 \* When a process exits, you need to free any pages previously occupied by the
 \* process.
 \* 
 \* HINTS:
 \* - If the process has swapped any pages to disk, you must call
 \* swap\_free() using the page table entry pointer as a parameter.
 \* - If you free any protected pages, you must also clear their"protected" bits.
 \* ----------------------------------------------------------------------------------
 \*/
void proc\_cleanup(pcb\_t \*proc) {
 // TODO: Iterate the proc's page table and clean up each valid page
 //pte\_t\* page = (pte\_t\*) (mem + proc->saved\_ptbr \* PAGE\_SIZE \* sizeof(pte\_t));
 pte\_t\* page\_table = (pte\_t\*) (mem + proc->saved\_ptbr \* PAGE\_SIZE);

 for (size\_t i = 0; i < NUM\_PAGES; i++) {
 pte\_t\* page\_table\_entry = &page\_table[i];
 if (page\_table\_entry->valid) {
 page\_table\_entry->valid = 0;
 page\_table\_entry->dirty = 0;
 frame\_table[page\_table\_entry->pfn].mapped = 0;
 }
 if (swap\_exists(page\_table\_entry) != 0) {
 swap\_free(page\_table\_entry);
 }
 }
 frame\_table[proc->saved\_ptbr].protected = 0;
 frame\_table[proc->saved\_ptbr].mapped = 0;
}

#pragma GCC diagnostic pop
설명하기 proc.c#include "proc.h"#include "mmu.h"#include "pagesim.h"#include "va\_splitting.h"#include "swapops.h"#include "stats.h"#프라그마 GCC 진단 푸시#프라그마 GCC 진단 무시 "-사용되지 않은 매개변수"/\*\* \* --------------------------------- 문제 3 -------------------------------------- \* 이 문제에 대한 PDF 섹션 4 확인 \*  \* 이 함수는 새 프로세스가 생성될 때마다 호출됩니다. \* 프로세스의 페이지 테이블을 위해 프레임을 할당해야 합니다. \* free\_frame 함수를 사용하여 프레임을 할당해야 합니다. 그런 다음 프레임 테이블과 프로세스의 PCB를 모두 업데이트해야 합니다. \* 프로세스의 PCB를 업데이트해야 합니다.  \*  초기화 중인 프로세스에 대한 \* @param proc 포인터  \*  \* 힌트: \* - pcb\_t: 페이지심.h에 정의된 구조체로 프로세스의 PCB입니다. \* - 여유 프레임 할당자가 반환한 메모리가 보장되지 않습니다. \*는 비어 있습니다 - 새 페이지 테이블을 위해 기존 프레임이 비워졌을 수 있습니다. \* ---------------------------------------------------------------------------------- \*/void proc\_init(pcb\_t \*proc) { // TODO: proc의 페이지 테이블을 초기화합니다. pfn\_t pfn\_saved = free\_frame(); memset(mem + (pfn\_saved \* PAGE\_SIZE), 0, PAGE\_SIZE); proc->saved\_ptbr = pfn\_saved; frame\_table[pfn\_saved].protected = 1; frame\_table[pfn\_saved].mapped = 1;}/\*\* \* --------------------------------- 문제 4 -------------------------------------- \* 이 문제에 대한 PDF 섹션 5를 확인하세요. \*  \* 현재 실행 중인 프로세스를 proc가 참조하는 프로세스로 전환합니다.  \* 인수가 참조하는 프로세스로 전환합니다.   \* 모든 프로세스에는 proc\_init에서 할당된 대로 자체 페이지 테이블이 있습니다. 사용자는 \* 프로세서에 새 프로세스의 페이지 테이블을 사용하도록 지시해야 합니다. \*  \* 현재 실행 중인 프로세스가 될 프로세스에 대한 포인터입니다. \*  \* 힌트: \* - pagesim.h에 정의된 전역 변수를 살펴보세요. \* pcb\_t의 정의도 참조하세요. \* ---------------------------------------------------------------------------------- \*/void context\_switch(pcb\_t \*proc) { // TODO: context\_switch와 일치하도록 모든 전역 변수와 proc의 PCB를 업데이트합니다. PTBR = proc->saved\_ptbr;}/\*\* \* --------------------------------- 문제 8 -------------------------------------- \* 이 문제에 대한 PDF 섹션 8 확인 \*  \* 프로세스가 종료되면 이전에 해당 프로세스가 점유했던 모든 페이지를 \* 프로세스. \*  \* 힌트: \* - 프로세스가 디스크에 페이지를 스왑한 경우, 반드시 페이지 테이블 항목 포인터를 매개변수로 사용하여 \* swap\_free()를 호출해야 합니다. \* - 보호된 페이지를 해제하는 경우 해당 페이지의 "보호된" 비트도 지워야 합니다. \* ---------------------------------------------------------------------------------- \*/void proc\_cleanup(pcb\_t \*proc) { // TODO: proc의 페이지 테이블을 반복하고 각 유효한 페이지를 정리합니다. //pte\_t\* page = (pte\_t\*) (mem + proc->saved\_ptbr \* PAGE\_SIZE \* sizeof(pte\_t)); pte\_t\* page\_table = (pte\_t\*) (mem + proc->saved\_ptbr \* PAGE\_SIZE); for (size\_t i = 0; i < NUM\_PAGES; i++) { PTE\_t\* PAGE\_tABLE\_ENTRY = &PAGE\_tABLE[i]; if (page\_table\_entry->valid) { page\_table\_entry->valid = 0; page\_table\_entry->dirty = 0; frame\_table[page\_table\_entry->pfn].mapped = 0; } if (swap\_exists(page\_table\_entry) != 0) { SWAP\_FREE(PAGE\_TABLE\_ENTRY); } } frame\_table[proc->saved\_ptbr].protected = 0; frame\_table[proc->saved\_ptbr].mapped = 0;}#프라그마 GCC 진단 팝