Total Score: 110 Points
#I. Introduction: The purpose of this project is to let you configure and modify the kernel by yourself. In this project you will learn: Some data structures that Linux kernel uses to maintain virtual addresses and physical addresses of a process. Some functions and macros related to virtual addresses, physical addresses, and processes.
In the following project description, you can use Google to find the meanings of words or phrases prefixed with the tag.
###II. Project Description :
####1. Add a new system call in Linux kernel. (10 points in this part)
New system call prototype : int sys_project(long pid)
;
: Add a new system call in Linux
The following tasks need to be done inside your new system call which is in the kernel address space.
####2. Find the process according to the pid parameter. Print the image name of the process. (10 points) For example, if you execute an executable file called “project.out,” the result that you print out should be “project.out”.
: struct task_struct
####3. Dump the process virtual address space areas. The output may be similar to the following figure.
Print the vm_start and vm_end of all virtual address areas of the process. (15 points). If a file is associated with a virtual address area, print the name of the file. (15 points)
: struct mm_struct, struct vm_area_struct : you can use the /proc/$pid/maps to verify your result.
####4. Dump the physical frame addresses that the process is using (15 points).
: struct page and related functions and macro.
####5. Optional Bonus Point: (10 points) Add a new system call int nonwritable(unsigned long begin, unsigned long end)which specifies a virtual address range between begin and end as non-writable. You can use program project_user_2.c in appendix to verify your code.
: Change a page table entry from read-write to read-only.
: struct vm_area_struct, vm_flag, page fault
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *ptr = (char *)malloc(0x1000);
unsigned int i;
for(i = 0; i < 0x1000; i++)
ptr[i] = 'a';
for( i = 0; i < 10; i++)
printf("%c ", ptr[i]);
nonwritable(ptr, ptr+0x1000-1);
/* verify read permission */
for( i = 0; i < 10; i++)
printf("%c ", ptr[i]);
/* write permission */
ptr[0] = 'w';
printf("if u see this message, you missed 15 points\n");
}
###III. TA Q & A ( 20 points) : ####1. Describe how you finished the project and the problems you encountered. ####2. Describe how you verify the result in step 4.
###IV. Report Content ( 15 points):
關於加分題,我往另一個方向去想,老師說他們做的時候,照理說是改了 PTE 但是一樣不會 core dump,於是我去 mm/memory.c 看了一番,發現一個有趣的 function
(kernel 3.14.25)
這個 function 專門測試 usermode 對於記憶體的使用,要是超出就直接 pass 掉,不會依照我們想的去取得
它,所以要是以老師的說法,會不會老師的作法跟 memory.c 中的 function 有關,假設有關那麼做好後再來改這裡做個例外讓他不要pass掉我們的請求,或許就有機會?