国产一区二区三区香蕉-2020国产成人精品视频-欧美日韩亚洲三区-www.91桃色-最美情侣中文第5季免费观看-久草毛片-国产成人精品av-男女猛烈拍拍拍无挡视频-中文字幕看片-色视频欧美一区二区三区-久久久久久久久久影院-一级a爱片久久毛片-精品久久久久久无码中文字幕一区-欧美色图网站-无码色偷偷亚洲国内自拍-国产一区在线免费观看

CS202代做、代寫Java/Python程序語言

時間:2024-04-07  來源:  作者: 我要糾錯



CS202: Lab 4: WeensyOS

Home | Schedule | Policies and grading | Labs | Infrastructure | Exams | Reference materials | Announcements
CS202: Lab 4: WeensyOS
Introduction
In this lab, you will implement process memory isolation, virtual memory, and a system call (fork()) in a tiny
(but real!) operating system, called WeensyOS.
This will introduce you to virtual memory and reinforce some of the concepts that we have covered this
semester.
The WeensyOS kernel runs on x86-64 CPUs. Because the OS kernel runs on the “bare” hardware, debugging
kernel code can be tough: if a bug causes misconfiguration of the hardware, the usual result is a crash of the
entire kernel (and all the applications running on top of it). And because the kernel itself provides the most
basic system services (for example, causing the display hardware to display error messages), deducing what
led to a kernel crash can be particularly challenging. In the old days, the usual way to develop code for an OS
(whether as part of a class, in a research lab, or in industry) was to boot it on a physical CPU. The lives of
kernel developers have gotten much better since. You will run WeensyOS in QEMU.
QEMU is a software-based x86-64 emulator: it “looks” to WeensyOS just like a physical x86-64 CPU with a
particular hardware configuration. However, if your WeensyOS code-in-progress wedges the (virtual)
hardware, QEMU itself and the whole OS that is running on the “real” hardware (that is, the “real” Linux OS that
QEMU is running on) survive unscathed (“real” is in quotation marks for reasons that will be unpacked in the
next paragraph). So, for example, your last few debugging printf()s before a kernel crash will still get logged
to disk (by QEMU running on Linux), and “rebooting” the kernel youʼre developing amounts to re-running the
QEMU emulator application.
What is the actual software/hardware stack here? The answer is different for students with x86-64 computers
(for example, Windows machines and older Macs) and ARMs. All students are running a host OS (on your
computer) on top of either x86-64 or ARM hardware (ARM being the architecture for so-called Apple silicon,
namely M1 and M2 chips). Then, the Docker containerization environment runs on top of the host OS (as a
process). That environment, loosely speaking, emulates either an x86 or an ARM CPU, and running on top of
that emulated CPU is Ubuntu Linux, targeted to x86-64 or ARM. Running on top of Ubuntu is QEMU. QEMU
presents an emulated x86-64 interface, and QEMU itself is either an x86-64 or ARM binary, again depending
on the underlying hardware. Finally, WeensyOS is exclusively an x86-64 binary, and that of course runs on
QEMU (though if you have some x86-64 hardware sitting around, you can try installing WeensyOS and
running it “bare”). Taking that same progression, now top-down: if you have an ARM CPU, that means you are
running the WeensyOS kernelʼs x86-64 instructions in QEMU, a software-emulated x86-64 CPU that is an
ARM binary, on top of Linux (targeted to ARM), running in the Docker containerization environment (also itself
an ARM binary), on macOS, running on an ARM hardware CPU.
Heads up. As always, itʼs important to start on time. In this case, on time means 3 weeks before the
assignment is due, as you will almost certainly need all of the allotted time to complete the lab. Kernel
development is less forgiving than developing user-level applications; tiny deviations in the configuration of
hardware (such as the MMU) by the OS tend to bring the whole (emulated) machine to a halt.
To save yourself headaches later, read this lab writeup in its entirety before you begin.
Resources.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 2/19
You may want to look at Chapter 9 of CSAPP3e (from which our x86-64 virtual memory handout is
borrowed). The book is on reserve at the Courant library. Section 9.7 in particular describes the 64-bit
virtual memory architecture of the x86-64 CPU. Figure 9.23 and Section 9.7.1 show and discuss the
PTE_P, PTE_W, and PTE_U bits; these are flags in the x86-64 hardwareʼs page table entries that play a
central role in this lab.
You may find yourself during the lab wanting to understand particular assembly instructions. Here are
two guides to x86-64 instructions, from Brown and CMU. The former is more digestible; the latter is
more comprehensive. The supplied code also uses certain assembly instructions like iret; see here
for a reference.
Getting Started
Youʼll be working in the Docker container as usual. We assume that you have set up the upstream as described
in the lab setup. Then run the following on your local machine (Mac users can do this on their local machine or
within the Docker container; Windows and CIMS users should do this from outside the container):
$ cd ~/cs202
$ git fetch upstream
$ git merge upstream/main
This labʼs files are located in the lab4 subdirectory.
If you have any “conflicts” from lab 3, resolve them before continuing further. Run git push to save your work
back to your personal repository.
Another heads up. Given the complexity of this lab, and the possibility of breaking the functionality of the
kernel if you code in some errors, make sure to commit and push your code often! It's very important that
your commits have working versions of the code, so if something goes wrong, you can always go back to a
previous commit and get back a working copy! At the very least, for this lab, you should be committing
once per step (and probably more often), so you can go back to the last step if necessary.
Goal
You will implement complete and correct memory isolation for WeensyOS processes. Then you'll implement
full virtual memory, which will improve utilization. You'll implement fork() (creating new processes at runtime)
and for extra credit, youʼll implement exit() (destroying processes at runtime).
Weʼve provided you with a lot of support code for this assignment; the code you will need to write is in fact
limited in extent. Our complete solution (for all 5 stages) consists of well under 300 lines of code beyond what
we initially hand out to you. All the code you write will go in kernel.c (except for part of step 6).
Testing, checking, and validation
For this assignment, your primary checking method will be to run your instance of Weensy OS and visually
compare it to the images you see below in the assignment.
Studying these graphical memory maps carefully is the best way to determine whether your WeensyOS code
for each stage is working correctly. Therefore, you will definitely want to make sure you understand how to
read these maps before you startto code.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 3/19
We supply some grading scripts, outlined at the end of the lab, but those will not be your principal source of
feedback. For the most part, they indicate only whether a given step is passing or failing; look to the memory
maps to understand why.
Initial state
Enter the Docker environment:
$ ./cs202-run-docker
cs202-user@172b6e333e91:~/cs202-labs$ cd lab4/
cs202-user@172b6e333e91:~/cs202-labs/lab4$ make run
The rest of these instructions presume that you are in the Docker environment. We omit the cs202-
user@172b6e333e91:~/cs202-labs part of the prompt.
make run should cause you to see something like the below, which shows four processes running in parallel,
each running a version of the program in p-allocator:
This image loops forever; in an actual run, the bars will move to the right and stay there. Don't worry if your
image has different numbers of K's or otherwise has different details.
If your bars run painfully slowly, edit the p-allocator.c file and reduce the ALLOC_SLOWDOWN constant.
Stop now to read and understand p-allocator.c.
Hereʼs how to interpret the memory map display:
WeensyOS displays the current state of physical and virtual memory. Each character represents 4 KB
of memory: a single page. There are 2 MB of physical memory in total. (Ask yourself: how many pages
is this?)
WeensyOS runs four processes, 1 through 4. Each process is compiled from the same source code (pallocator.c), but linked to use a different region of memory.
Each process asks the kernel for more heap memory, one page at a time, until it runs out of room. As
usual, each process's heap begins just above its code and global data, and ends just below its stack.
The processes allocate heap memory at different rates: compared to Process 1, Process 2 allocates
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 4/19
twice as quickly, Process 3 goes three times faster, and Process 4 goes four times faster. (A random
number generator is used, so the exact rates may vary.) The marching rows of numbers show how
quickly the heap spaces for processes 1, 2, 3, and 4 are allocated.
Here are two labeled memory diagrams, showing what the characters mean and how memory is arranged.
The virtual memory display is similar.
The virtual memory display cycles successively among the four processesʼ address spaces. In the
base version of the WeensyOS code we give you to start from, all four processesʼ address spaces are
the same (your job will be to change that!).
Blank spaces in the virtual memory display correspond to unmapped addresses. If a process (or the
kernel) tries to access such an address, the processor will page fault.
The character shown at address X in the virtual memory display identifies the owner of the
corresponding physical page.
In the virtual memory display, a character is reverse video if an application process is allowed to
access the corresponding address. Initially, any process can modify all of physical memory, including
the kernel. Memory is not properly isolated.
Running WeensyOS
Read the README-OS.md file for information on how to run WeensyOS.
There are several ways to debug WeensyOS. We recommend adding log_printf statements to your code.
The output of log_printf is written to the file /tmp/log.txt outside QEMU. We also recommend that you use
assertions (of which we saw a few in lab 1) to catch problems early. For example, call the helper functions
weʼve provided, check_page_table_mappings and check_page_table_ownership to test a page table for
obvious errors.
Finally, you can and should use gdb, which we cover at the end of this section.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 5/19
Memory system layout
The WeensyOS memory system layout is defined by several constants:
Constant Meaning
KERNEL_START_
ADDR
Start of kernel code.
KERNEL_STACK_
TOP
Top of kernel stack. The kernel stack is one page long.
console Address of CGA console memory.
PROC_START_AD
DR
Start of application code. Applications should not be able to access memory below this
address, except for the single page at console.
MEMSIZE_PHYSI
CAL
Size of physical memory in bytes. WeensyOS does not support physical addresses ≥
this value. Defined as 0x200000 (2MB).
MEMSIZE_VIRTU
AL
Size of virtual memory. WeensyOS does not support virtual addresses ≥ this value.
Defined as 0x300000 (3MB).
Writing expressions for addresses
WeensyOS uses several C macros to handle addresses. They are defined at the top of x86-64.h. The most
important include:
Macro Meaning
PAGESIZE Size of a memory page. Equals 4096 (or, equivalently, 1 << 12).
PAGENUMBER(addr) Page number for the page containing addr. Expands to an expression analogous
to addr / PAGESIZE.
PAGEADDRESS(pn) The initial address (zeroth byte) in page number pn. Expands to an expression
analogous to pn * PAGESIZE.
PAGEINDEX(addr, le
vel)
The index in the levelth page table for addr. level must be between 0 and 3; 0
returns the level-1 page table index (address bits 39–47), 1 returns the level-2
index (bits 30–38), 2 returns the level-3 index (bits 21–29), and 3 returns the
level-4 index (bits 12–20).
PTE_ADDR(pe) The physical address contained in page table entry pe. Obtained by masking off
the flag bits (setting the low-order 12 bits to zero).
Before you begin coding, you should both understand what these macros represent and be able to derive
values for them if you were given a different page size.
Kernel and process address spaces
The version of WeensyOS you receive at the start of lab4 places the kernel and all processes in a single,
shared address space. This address space is defined by the kernel_pagetable page table.
kernel_pagetable is initialized to the identity mapping: virtual address X maps to physical address X.
As you work through the lab, you will shift processes to using their own independent address spaces, where
each process can access only a subset of physical memory.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 6/19
The kernel, though, must remain able to access any location in physical memory. Therefore, all kernel functions
run using the kernel_pagetable page table. Thus, in kernel functions, each virtual address maps to the
physical address with the same number. The exception() function explicitly installs kernel_pagetable when
it begins.
WeensyOS system calls are more expensive than they need to be, since every system call switches address
spaces twice (once to kernel_pagetable and once back to the processʼs page table). Real-world operating
systems avoid this overhead. To do so, real-world kernels access memory using process page tables, rather
than a kernel-specific kernel_pagetable. This makes a kernelʼs code more complicated, since kernels canʼt
always access all of physical memory directly under that design.
Using tmux
It will be handy to be able to “see” multiple sessions within Docker at the same time. A good tool for this is
called tmux.
We suggest reading, and typing along with, this excellent tmux tutorial. It should take no more than 10 minutes
and will be well worth it. Our debugging instructions below will assume that you have done so. Other tmux
resources:
MITʼs missing semester: Search for the section called “Terminal Multiplexers”.
Cheatsheet: This is a more comprehensive list of commands, though the formatting is not the best, being
interspersed with ads.
If you find yourself needing to exit tmux, either exit all of the panes in the current window, or do: C-b :killsession<return>. (The C-b is the usual Ctrl-b, and then you type :kill-session and press return or enter.)
Using gdb
The debugger that we have seen, gdb, can be used to debug an already running process, even one over a
network. QEMU supports this facility (see here). As a result, you can use gdb to single-step the software that is
running on top of the emulated processor created by QEMU.
Here are the steps. These steps assume that (1) you have taken the 10 minutes to work through the tmux
tutorial above, and (2) you are working within the directory lab4 underneath cs202-labs inside the Docker
container.
We will start by creating two side-by-side panes in tmux. The C-b % means “type Ctrl-b together, let go, and
then type the % key”. Please see the tmux tutorial above for more.
$ tmux
C-b %
At this point, you should have two side-by-side panes, with the active one being the one on the right. Go back
to the one on the left.
C-b <left> # refers to the left arrow key
If youʼre having trouble with C-b (which, again, refers to Ctrl-b), please again see the tmux tutorial in the prior
section. At this point you should be in the left pane. The next command runs QEMU in a mode where it expects
a debugger to attach:
$ make run-gdb
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 7/19
You will see “VGA Blank mode”. Now, get back to the right-hand pane:
C-b <right> # refers to the right arrow key
In that terminal, invoke gdb. Do this via the script gdb-wrapper.sh, which will invoke the correct version of gdb
(handling the case of M1/M2 hardware). You donʼt need to tell gdb what you are debugging and how to
connect over the network, because the .gdbinit file in that directory tells gdb about these things for you. So
you type:
$ ./gdb-wrapper.sh
Make sure you see:
...
The target architecture is set to "i386:x86-64".
add symbol table from file "obj/bootsector.full" at
 .text_addr = 0x7c00
add symbol table from file "obj/p-allocator.full" at
 .text_addr = 0x100000
add symbol table from file "obj/p-allocator2.full" at
 .text_addr = 0x140000
add symbol table from file "obj/p-allocator3.full" at
 .text_addr = 0x180000
add symbol table from file "obj/p-allocator4.full" at
 .text_addr = 0x1c0000
add symbol table from file "obj/p-fork.full" at
 .text_addr = 0x100000
add symbol table from file "obj/p-forkexit.full" at
 .text_addr = 0x100000
If you do not see something like that, then it means that you did not load the appropriate debugging
information into gdb; likely, you are not running from within the lab4 directory.
Now, set a breakpoint, for example at the function kernel() (or whatever function you want to break at):
(gdb) break kernel
Breakpoint 1 at 0x40167: file kernel.c, line 86.
Now run the “remote” software (really, the WeensyOS kernel in the left-hand pane). Do this by telling gdb to
continue, via the c command:
(gdb) c
You should see in the right-hand pane:
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 8/19
Continuing.
Breakpoint 1, kernel (command=0x0) at kernel.c:86
86 void kernel(const char* command) {
1: x/5i $pc
=> 0x40167 <kernel>: endbr64
 0x4016b <kernel+4>: push %rbp
 0x4016c <kernel+5>: mov %rsp,%rbp
 0x4016f <kernel+8>: sub $0x20,%rsp
 0x40173 <kernel+12>: mov %rdi,-0x18(%rbp)
(gdb)
You will also see the kernel begin to execute in the left-hand pane.
Now, you can and should use the existing facilities of gdb to poke around. gdb understands the hardware very
well. So can, for example, ask it to print out the value of %cr3:
(gdb) info registers cr3
cr3 0x8000 [ PDBR=8 PCID=0 ]
You are encouraged to use gdbʼs facilities. Type help at the (gdb) prompt to get a menu.
See the tmux section above for how to exit tmux.
Step 1: Kernel isolation
In the starting code weʼve given you, WeensyOS processes could stomp all over the kernelʼs memory if they
wanted to. Better prevent that. Change kernel(), the kernel initialization function, so that kernel memory is
inaccessible to applications, except for the memory holding the CGA console (the single page at (uintptr_t)
console == 0xB8000).
When you are done, WeensyOS should look like the below. In the virtual map, kernel memory is no longer
reverse-video, since the user canʼt access it. Note the lonely CGA console memory block in reverse video in
the virtual address space.
Hints:
1
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 9/19
Use virtual_memory_map. A description of this function is in kernel.h. You will benefit from reading all
the function descriptions in kernel.h. You can supply NULL for the allocator argument for now.
If you really want to look at the code for virtual_memory_map, it is in k-hardware.c, along with many
other hardware-related functions.
The perm argument to virtual_memory_map is a bitwise-or of zero or more PTE flags, PTE_P, PTE_W, and
PTE_U. PTE_P marks Present pages (pages that are mapped). PTE_W marks Writable pages. PTE_U marks
User-accessible pages—pages accessible to applications. You want kernel memory to be mapped with
permissions PTE_P|PTE_W, which will prevent applications from reading or writing the memory, while
allowing the kernel to both read and write.
Make sure that your sys_page_alloc system call preserves kernel isolation: Applications shouldnʼt be
able to use sys_page_alloc to screw up the kernel.
When you're done with this step, make sure to commit and push your code!
Step 2: Isolated address spaces
Implement process isolation by giving each process its own independent page table. Your OS memory map
should look something like this when youʼre done:
(Yours wonʼt look exactly like that; in the first line of physical and virtual memory, instead of having the pattern
R11223344, yours will probably have a pattern like R1111222233334444. This is because the gif is from a 32-bit
architecture; recall that on a 64-bit architecture, there are four levels of page table required.)
That is, each process only has permission to access its own pages. You can tell this because only its own
pages are shown in reverse video.
What goes in per-process page tables:
The initial mappings for addresses less than PROC_START_ADDR should be copied from those in
kernel_pagetable. You can use a loop with virtual_memory_lookup and virtual_memory_map to copy
them. Alternately, you can copy the mappings from the kernelʼs page table into the new page tables; this
is faster, but make sure you copy the right data!
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 10/19
The initial mappings for the user area—addresses greater than or equal to PROC_START_ADDR—should be
inaccessible to user processes (that is, PTE_U should not be set for these PTEs). In our solution (shown
above), these addresses are totally inaccessible (so they show as blank), but you can also change this so
that the mappings are still there, but accessible only to the kernel, as in this diagram:
The reverse video shows that this OS also implements process isolation correctly.
[Note: This second approach will pass the automated tests for step 2 but not for steps 3 and beyond. Thus,
we recommend taking the first approach, namely total inaccessibility.]
How to implement per-process page tables:
Change process_setup to create per-process page tables.
We suggest you write a copy_pagetable(x86_64_pagetable* pagetable, int8_t owner) function
that allocates and returns a new page table, initialized as a full copy of pagetable (including all mappings
from pagetable). This function will be useful in Step 5. In process_setup you can modify the page table
returned by copy_pagetable according to the requirements above. Your function can use pageinfo to
find free pages to use for page tables. Read about pageinfo at the top of kernel.c.
Remember that the x86-64 architecture uses four-level page tables.
The easiest way to copy page tables involves an allocator function suitable for passing to
virtual_memory_map.
Youʼll need at least to allocate a level-1 page table and initialize it to zero. You can also set up the whole
four-level page table skeleton (for addresses 0…MEMSIZE_VIRTUAL - 1) yourself; then you donʼt need an
allocator function.
A physical page is free if pageinfo[PAGENUMBER].refcount == 0. Look at the other code in kernel.c for
some hints on how to examine the pageinfo[] array.
All of process Pʼs page table pages must have pageinfo[...].owner == P or WeensyOSʼs consistencychecking functions will fail. This will affect your allocator function. (Hint: Donʼt forget that global variables
are allowed in your code!)
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 11/19
If you create an incorrect page table, WeensyOS might crazily reboot. Donʼt panic! Add log_printf
statements. Another useful technique that may at first seem counterintuitive: add infinite loops to your
kernel to track down exactly where a fault occurs. (If the OS hangs without crashing once youʼve added an
infinite loop, then the crash youʼre debugging must occur after the infinite loop.)
Again, once finished with step 2, commit and push!
Step 3: Virtual page allocation
Up to this point in the lab, WeensyOS processes have used physical page allocation: the page with physical
address X is used to satisfy the sys_page_alloc(X) allocation request for virtual address X. This strategy is
inflexible and limits utilization. Change the implementation of the INT_SYS_PAGE_ALLOC system call so that it
can use any free physical page to satisfy a sys_page_alloc(X) request.
Your new INT_SYS_PAGE_ALLOC code must perform the following tasks.
Find a free physical page using the pageinfo[] array. Return -1 to the application if you canʼt find one.
Use any algorithm you like to find a free physical page; our solution just returns the first one we find.
Record the physical pageʼs allocation in pageinfo[].
Map that physical page at the requested virtual address.
Donʼt modify the assign_physical_page helper function, which is also used by the program loader. You can
write a new function if you need to.
Hereʼs how our OS looks after this step.
Now commit and push your code before moving on to step 4!
Step 4: Overlapping address spaces
Now the processes are isolated, which is awesome. But theyʼre still not taking full advantage of virtual memory.
Isolated address spaces can use the same virtual addresses for different physical memory. Thereʼs no need to
keep the four process address spaces disjoint.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 12/19
In this step, change each processʼs stack to start from address 0x300000 == MEMSIZE_VIRTUAL. Now the
processes have enough heap room to use up all of physical memory! Hereʼs how the memory map will look
after youʼve done it successfully:
Notice the single reverse video page in the bottom right, for all processes. This is their stack page: each
process has the same virtual address for its stack page, but (if youʼve implemented it correctly) different
physical pages.
If thereʼs no physical memory available, sys_page_alloc should return an error to the caller (by returning -1).
Our solution additionally prints “Out of physical memory!” to the console when this happens; you donʼt
need to.
As always, make sure to commit and push after finishing this step!
Step 5: Fork
The fork() system call is one of Unixʼs great ideas. It starts a new process as a copy of an existing one. The
fork() system call appears to return twice, once to each process. To the child process, it returns 0. To the
parent process, it returns the childʼs process ID.
Run WeensyOS with make run or make run-console. At any time, press the ‘fʼ key. This will soft-reboot
WeensyOS and ask it to run a single process from the p-fork application, rather than the gang of allocator
processes. You should see something like this in the memory map:
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 13/19
Thatʼs because you havenʼt implemented fork() yet.
How to implement fork():
When a process calls fork(), look for a free process slot in the processes[] array. Donʼt use slot 0. If no
free slot exists, return -1 to the caller.
If a free slot is found, make a copy of current->p_pagetable, the forking processʼs page table, using
your function from earlier.
But you must also copy the process data in every application page shared by the two processes. The
processes should not share any writable memory except the console (otherwise they wouldnʼt be
isolated). So fork() must examine every virtual address in the old page table. Whenever the parent
process has an application-writable page at virtual address V, then fork() must allocate a new physical
page P; copy the data from the parentʼs page into P, using memcpy(); and finally map page P at address V
in the child processʼs page table. (memcpy() works like the one installed on your Linux dev box; use the
man pages for reference.)
The child processʼs registers are initialized as a copy of the parent processʼs registers, except for reg_rax.
Use virtual_memory_lookup to query the mapping between virtual and physical addresses in a page
table.
When youʼre done, you should see something like the below after pressing ‘fʼ.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 14/19
An image like the below, however, means that you forgot to copy the data for some pages, so the processes
are actually sharing stack and/or data pages when they should not:
Other hints.
Make sure youʼre setting the owner correctly when allocating new page tables.
Failing this step of the lab does not mean that the bug is actually in this step. Itʼs very common that a
studentʼs step 5 code fails because of errors made in any of the earlier steps.
Don't forget to commit and push after finishing fork!
(Extra credit) Step 6: Shared read-only memory
This extra credit and the next are challenging—and the point values will not be commensurate to the extra
effort. We supply these for completeness, and for those who want to go deeper into the material.
Itʼs wasteful for fork() to copy all of a processʼs memory. For example, most processes, including p-fork,
never change their code. So what if we shared the memory containing the code? Thatʼd be fine for process
isolation, as long as neither process could write the code.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 15/19
Step A: change the process loader in k-loader.c to detect read-only program segments and map them as
read-only for applications (PTE_P|PTE_U). A program segment ph is read-only iff (ph->p_flags &
ELF_PFLAG_WRITE) == 0.
Step B: From step 5, your fork() code already shouldnʼt copy shareable pages. But make sure in this step that
your code keeps track accurately of the number of active references to each user page. Specifically, if
pageinfo[pn].refcount > 0 and pageinfo[pn].owner > 0, then pageinfo[pn].refcount should equal
the number of times pn is mapped in process page tables.
When youʼre done, running p-fork should look like this:
Hint:
Mark a program segment read-only after the memcpy and memset operations that add data to the
segment. Otherwise youʼll get a fault.
Again, commit and push!
(Extra credit) Step 7: Freeing memory
So far none of your test programs have ever freed memory or exited. Memory allocationʼs pretty easy until you
add free! So letʼs do that, by allowing applications to exit. In this exercise youʼll implement the sys_exit()
system call, which exits the current process.
This exercise is challenging: freeing memory will tend to expose weaknesses and problems in your other code.
To test your work, use make run and then type ‘eʼ. This reboots WeensyOS to run the p-forkexit program.
(Initially itʼll crash because sys_exit() isnʼt implemented yet.) p-forkexit combines two types of behavior:
Process 1 forks children indefinitely.
The child processes, #2 and up, are memory allocators, as in the previous parts of the lab. But with small
probability at each step, each child process either exits or attempts to fork a new child.
The result is that once your code is correct, p-forkexit makes crazy patterns forever. An example:
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 16/19
Your picture might look a little different; for example, thanks to Step 6, your processes should share a code
page, which would appear as a darker-colored “1”.
Hereʼs your task.
sys_exit() should mark a process as free and free all of its memory. This includes the processʼs code,
data, heap, and stack pages, as well as the pages used for its paging structures.
In p-forkexit, unlike in previous parts of the lab, sys_fork() can run when there isnʼt quite enough
memory to create a new process. Your code should handle this case. If there isnʼt enough free memory to
allocate a process, fork() should clean up after itself (i.e., free any memory that was allocated for the
new process before memory ran out, including pages that were allocated as part of the paging
structures), and then return -1 to the caller. There should be no memory leaks.
The check_virtual_memory function, which runs periodically, should help catch some errors. Feel free to add
checks of your own.
Further study (extra-extra credit)
If you are finished and can't wait to do more of this type of work, try the following. These will receive only token
points, and are for you to explore, if youʼre interested:
Copy-on-write page allocation!
Faster system calls, for instance using the syscall and sysexit instructions!
Running the grading tests
As stated at the start of this lab, the visual memory map displayed by QEMU as your WeensyOS kernel runs is
the best way to determine how your code is behaving.
However, we provide automated tests, to help us grade, and for you to confirm that youʼve completed a step.
The tests are not dispositive: there will be cases where your code passes the tests but is not ultimately correct
(and will lose points on manual inspection during grading). We have not seen the reverse, however: cases
where your code fails the tests but is correct. Thus, if the tests are failing, you almost certainly have a bug.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 17/19
The bottom line: run with make run or make run-console (or make run-gdb) to visualize how memory is
being used while you are coding and validating your design. Then, switch to the automated tests described
below when you think youʼve completed a step and want to double-check.
There are five tests, one for each step. You can run each of them with the shell commands make grade-one
through grade-five. Note that the step numbers are written out in text and not using digits. Each stepʼs result
is all-or-nothing.
There are three invariants in all five stepsʼ tests that your code must satisfy. These invariants are:
The CGA console must be accessible by all processes (this requirement is discussed in the text above on
step 1).
If we consider process P, there should be no virtual page in Pʼs page table at a user-space address (that
is, whose address is above the kernel/user virtual address split point) that is owned by P but not
accessible by P.
When we run our tests, we configure the WeensyOS kernel to exit after 10 seconds of execution (1000
WeensyOS kernel “ticks”). If a bug in your code makes the kernel crash before 1000 WeensyOS kernel
ticks, youʼll fail the test on which that happens. Alternatively, if your kernel enters an infinite loop, and thus
never reaches our exit at 1000 ticks, the VM will get stuck in the infinite loop and never exit, so the tests
will hang and youʼll need to terminate your hung kernel. Do so by opening another terminal window and
issuing the command make kill, which will kill all QEMU processes you have running.
These invariants are reasonable: regardless of what your memory map display looks like, a good solution
should neither crash nor enter an infinite loop.
Our tests are cumulative: each stepʼs test runs all prior stepsʼ tests. If any of the prior stepsʼ tests fail, the
“current” stepʼs test is deemed to have failed. As a consequence, if you have a regression bug—for example,
code in a current step re-introduces a bug in an earlier step—you can lose points not only for the current step
you are working on, but also for prior steps. If you need to submit and find this has happened, donʼt despair:
simply revert your code to the last good version before your regression (using the history provided by GitHub
—so, once again, make sure you commit and push often!).
Using gdb in “grading” mode
The make grade-X scripts pass slightly different options to QEMU than make run. If you find that youʼre failing
the grading tests, you can run with the grading options, under gdb. To do so, follow the gdb instructions above,
except where it says make run-gdb, type instead make grade-gdb.
Miscellaneous tips
The kernel defines a constant, HZ, which determines how many times per second the kernelʼs clock ticks. Donʼt
change this value—there is absolutely no need to do so while solving the lab, and doing so will likely cause
your code to fail our tests!
After you run any of our per-stage make grade-N tests, if you happen to examine the /tmp/log.txt file, youʼll
see a vast amount of output therein that we generate for use in the automated tests. You can ignore it (and it
will be absent when you run with make run while you are developing, so it wonʼt clutter your own debugging
logprintf()s in those runs).
2
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 18/19
Submission
Handing in consists of three steps:
1. Executing this checklist:
Make sure your code builds, with no compiler warnings.
Make sure youʼve used git add to add any files that youʼve created.
Fill out the top of the answers.txt file, including your name and NYU Id
Make sure youʼve answered every question in answers.txt
Make sure you have answered all code exercises in the files.
Create a file called slack.txt noting how many slack days you have used for this assignment. (This
is to help us agree on the number that you have used.) Include this file even if you didnʼt use any
slack days.
git add and commit the slack.txt file
2. Push your code to GitHub, so we have it (from outside the container or, if on Mac, this will also work
from within the container):
$ cd ~/cs202/lab4
$ make clean
$ git commit -am "hand in lab4"
$ git push origin
Counting objects: ...
....
To git@github.com:nyu-cs202/labs-24sp-<YourGithubUsername>.git
 7337116..ceed758 main -> main
3. Actually submit, by timestamping and identifying your pushed code:
Decide which git commit you want us to grade, and copy its id (you will paste it in the next sub-step).
A commit id is a 40-character hexadecimal string. Usually the commit id that you want will be the one
that you created last. The easiest way to obtain the commit id for the last commit is by running the
command git log -1 --format=oneline. This prints both the commit id and the initial line of the
commit message. If you want to submit a previous commit, there are multiple ways to get the commit
id for an earlier commit. One way is to use the tool gitk. Another is git log -p, as explained here, or
git show.
Now go to NYU Brightspace; there will be an entry for this lab. Paste only the commit id that you just
copied.
You can submit as many times as you want; we will grade the last commit id submitted to
Brightspace.
NOTE: Ground truth is what and when you submitted to Brightspace. Thus, a non-existent commit id in
Brightspace means that you have not submitted the lab, regardless of what you have pushed to GitHub. And,
the time of your submission for the purposes of tracking lateness is the time when you upload the id to
Brightspace, not the time when you executed git commit.
This completes the lab.
4/2/24, 1:01 AM CS202: Lab 4: WeensyOS
https://cs.nyu.edu/~mwalfish/classes/24sp/labs/lab4.html 19/19
Acknowledgments
This lab is due to Eddie Kohler, with modifications and some infrastructure due to Brad Karp and Nikola
Gvozdiev.
1. Making the console accessible in this way, by making the range of RAM where the contents of the display
are held directly accessible to applications, is a throwback to the days of DOS, whose applications
typically generated console output in precisely this way. DOS couldnʼt run more than one application at
once, so there wasnʼt any risk of multiple concurrent applications clobbering one anotherʼs display writes
to the same screen locations. We borrow this primitive console design to keep WeensyOS simple and

請加QQ:99515681  郵箱:99515681@qq.com   WX:codinghelp

















 

標簽:

掃一掃在手機打開當前頁
  • 上一篇:CS 455代做、Java編程語言代寫
  • 下一篇:代做DS2500、代寫Python設計程序
  • 無相關信息
    昆明生活資訊

    昆明圖文信息
    蝴蝶泉(4A)-大理旅游
    蝴蝶泉(4A)-大理旅游
    油炸竹蟲
    油炸竹蟲
    酸筍煮魚(雞)
    酸筍煮魚(雞)
    竹筒飯
    竹筒飯
    香茅草烤魚
    香茅草烤魚
    檸檬烤魚
    檸檬烤魚
    昆明西山國家級風景名勝區
    昆明西山國家級風景名勝區
    昆明旅游索道攻略
    昆明旅游索道攻略
  • NBA直播 短信驗證碼平臺 幣安官網下載 歐冠直播 WPS下載

    關于我們 | 打賞支持 | 廣告服務 | 聯系我們 | 網站地圖 | 免責聲明 | 幫助中心 | 友情鏈接 |

    Copyright © 2025 kmw.cc Inc. All Rights Reserved. 昆明網 版權所有
    ICP備06013414號-3 公安備 42010502001045

    主站蜘蛛池模板: 欧洲精品久久 | 欧类av怡春院| 成人在线免费视频播放 | 岛国av在线播放 | 黄瓜视频在线免费看 | 天堂在线观看av | 色视频在线观看免费 | 成人福利视频在线观看 | 色婷婷亚洲综合 | 国产高清不卡视频 | 亚洲视频在线观看免费视频 | 怡红院成人影院 | 一区二区日韩视频 | 免费观看日韩av | 久久精品一区二区三区四区 | 日本理伦片午夜理伦片 | 国产精品啊啊啊 | 在线视频1卡二卡三卡 | 夜夜躁狠狠躁日日躁av麻豆 | 成人高清视频在线观看 | 国产3区 | 在线观看视频色 | 麻豆国产一区二区三区四区 | www.中文字幕.com| 久久影音先锋 | 好吊日好吊操 | 日韩操操| 亚洲风情av | 乳揉みま痴汉4在线播放 | 国产援交| a免费在线 | 久国产精品 | 天堂中文字幕免费一区 | 青青草黄色| 欧美成人精品在线观看 | 国产露脸国语对白在线 | 黄色片hd | 亚洲黄色www | 国产视频欧美 | 精品久久久久久久久久久久久久 | 欧美极品一区 | 欧美日在线| 精品国产一区一区二区三亚瑟 | 久久久久久久久久久久久久久久久久 | 亚洲国产精品99久久久久久久久 | 国产超碰人人爽人人做人人爱 | av黄在线| 色偷偷888欧美精品久久久 | 欧美黄色小视频 | 国产精品www | 极品少妇xxxx精品少妇偷拍 | 久热精品视频在线播放 | 日韩成人av在线播放 | 天天干干天天 | 狠狠插狠狠操 | 欧美精品日韩 | 午夜亚洲福利 | 麻豆成人91精品二区三区 | 国产亚洲精 | 欧美疯狂做受 | 新宿事件粤语在线观看完整免费观看 | 国产无遮挡又黄又爽又色视频 | 狠狠搞视频 | 91久操 | 午夜九九| 久久久久久久久久久免费av | 亚洲午夜精品一区二区 | 一级生活毛片 | 亚洲伊人av | 夜夜撸网站 | 亚洲精品网站在线 | 91色站| 日本免费不卡视频 | 尤物网址在线观看 | 一级片视频免费看 | 在线视频观看免费 | 不卡av中文字幕 | 西厢记在线观看 | 绯色av一本一道道久久精品 | 亚洲性激情 | 啪啪的网站 | 91久久国语露脸精品国产高跟 | 亚洲美女视频一区 | 九九精品国产 | 国产干干| 一本大道香蕉大a√在线 | 国产精品综合久久久久久 | 色综合久久天天综合网 | 优优色欧美 | 日本japanese乳偷乱熟 | 午夜毛片在线观看 | 久久久久久久久久亚洲 | 亚洲精品偷拍 | 大号bbwassbigav女| 成人av色| 国语对白一区二区 | 日韩在线二区 | 一级免费毛片 | 欧美小视频在线 | 婷婷国产在线 | 欧美一区二区三区精品 | 日本欧美色 | 最新av| 精品在线播放 | 九九人人 | 伊人涩 | 日本特黄成人 | av图片在线 | 亚洲男人天堂网址 | 日本不卡中文字幕 | 亚洲aⅴ在线 | 在线观看国产一区 | 最近好看的2019中文在线一页 | 最新毛片网 | 精品123区 | 99久久婷婷国产综合精品草原 | 最好看在线观看视频 | 激情宗合网 | 99在线视频精品 | 日本一级片在线播放 | 国产精品一区久久久 | 欧美一级成人 | www.男人天堂.com | 2018天天干天天操 | 中文字幕第一区综合 | 欧美成年人网站 | 亚洲三区视频 | 国产免费成人 | 毛片网站免费 | 国产精品999在线观看 | 欧美午夜影院 | 国内精品视频一区 | 女久久 | 最近中文字幕免费在线观看 | 天天色天天射天天操 | 99热99热| 成人综合一区 | 久久机热这里只有精品 | 日本在线免费看 | 中文字幕在线视频播放 | 茄子视频懂你更多在线观看 | 中文日韩欧美 | 香蕉色视频 | 亚洲天堂少妇 | 亚洲自偷精品视频自拍 | 色噜噜一区二区 | 青青av在线 | 伊人79 | 好色综合| 毛片黄色一级 | 亚洲精选在线观看 | 国产欧美一区二区三区在线看蜜臂 | 亚洲成人激情在线 | 中文视频在线观看 | 欧美a级黄色片 | 久久久香蕉 | 99色| 人人爱人人看 | 国产精品1区| 久色网站| 日韩精品久久 | 一级做a爰片久久毛片a | 三级亚洲欧美 | 国产精品999久久久 国产999精品久久久久久 | 久久精品视频在线观看 | 亚洲国产精品嫩草影院久久av | 宅男噜噜噜一区二区三区 | 国产精品乱码久久久 | 激情久久综合 | 911色| 自拍偷拍亚洲天堂 | 91麻豆精品国产91久久久久久 | 91精品国产福利在线观看 | 麻豆综合 | 久久久久99啪啪免费 | 一级片大全 | 一女三黑人理论片在线 | 日韩理论片在线观看 | 色婷婷免费视频 | 亚洲 欧美 综合 | 精品小视频在线观看 | 色老二导航 | 伊人资源| 久久不射视频 | 国产一区二区三区四区在线观看 | 九九热这里有精品视频 | 亚洲午夜久久久久 | 一级黄色片免费观看 | 综合网视频| 久久精品一日日躁夜夜躁 | 国产精品福利一区 | 五月综合激情日本mⅴ | 中文字幕在线观看视频网站 | 国产香蕉在线视频 | www.久久久久 | 在线观看欧美日韩视频 | 国产性一乱一性一伧一色 | 伊人网站在线 | 91老肥熟 | 99伊人网 | 91免费视频播放 | 懂色av一区二区三区在线播放 | www.日本在线观看 | 欧美69av | 亚洲欧美视频在线 | 亚洲砖区区免费 | 99在线观看免费视频 | 超碰人人做 | 一区二区国产欧美 | 亚洲永久免费在线观看 | 伊人宗合 | 成人一区av | 欧美男人的天堂 | 久久在线免费 | 日本视频黄色 | 污污视频免费看 | 国产91免费观看 | 国产a久久 | 性欧美一区二区三区 | 玖玖精品在线 | 午夜影院一区二区三区 | 农村偷人一级超爽毛片 | 亚洲欧洲成人在线 | 国产精品一区二区人人爽 | 精品视频九九 | 成人在线免费观看视频 | 91精品国产麻豆国产自产在线 | 一级黄色免费毛片 | 啪啪av| 亚洲亚洲人成综合网络 | 亚洲日本国产 | 亚洲网站av | 久久国产精品亚州精品毛片 | 丰满尤物白嫩啪啪少妇 | 欧美日日夜夜 | 九九碰| 在线欧美亚洲 | 午夜男人影院 | 日韩欧美一区在线观看 | 亚洲v天堂 | 又色又爽又黄无遮挡的免费视频 | 日本不卡高字幕在线2019 | 天堂网av在线播放 | 亚洲靠逼 | 91麻豆精品国产自产在线观看一区 | 久久人精品| www.国产精品视频 | 天天色天天色天天色 | 亚洲午夜精品在线观看 | 日韩久久久久 | 在线视频亚洲 | 黄色成年网站 | 久久国产中文字幕 | 久久久久久久福利 | 最近中文字幕免费观看 | 亚洲精品97 | 神马午夜一区 | av毛片网 | 一级久久久久久 | 草草影院在线观看 | 欧美午夜精品久久久久久浪潮 | 视频在线观看一区二区三区 | 天堂网视频在线观看 | 91www在线观看| 成人网在线 | 香蕉大人久久国产成人av | 夜夜综合网 | 午夜精华| 成人av综合网 | 摸摸摸bbb毛毛毛片 熊猫成人网 | 激情小说偷拍 | 国产成人高清视频 | 波多野结衣二区三区 | 久久精品韩国 | 91精品国产综合久久蜜臀 | 国产精品一区二区av日韩在线 | 欧美体内she精高潮 欧美午夜精品久久久久久人妖 | 亚洲自拍偷拍第一页 | 999免费视频 | 91av一区| 亚洲v日本 | 夜久久 | 久久精品国产精品亚洲毛片 | 成人在线免费av | 91视频精选| 欧美激情视频一区二区 | 经典杯子蛋糕日剧在线观看免费 | 好吊视频一区二区三区四区 | 激情开心站 | 越南av | 操干网 | 一区二区三区不卡在线观看 | 理论片高清免费理论片毛毛片 | 亚洲国产大片 | 波多野结衣视频一区 | 久青草视频在线 | 亚洲香蕉网站 | 欧美黄色一级 | 特黄特色大片免费播放器使用方法 | 丰满肉嫩西川结衣av | 中文字幕在线免费看 | 日本xxxx人 | 91成人精品一区二区三区四区 | 中文在线观看视频 | 天天干天天操天天爱 | 国产高清黄色 | 一区二区国产在线观看 | 久久有精品 | 欧产日产国产69 | 激情图片在线观看 | 成人黄页| 国产男女无套 | 欧美激情视频一区 | 亚洲一区中文字幕 | 刺激性视频黄页 | 在线观看69| 人人干夜夜操 | 最近日本字幕mv免费观看在线 | 亚洲天堂小视频 | 黄色在线免费 | 黄色工厂这里只有精品 | 亚洲区中文字幕 | 久久久久久一区二区三区 | 欧美精品在线观看 | 日本免费网 | 中文字幕一区2区3区 | 精品www久久久久久奶水 | 九九热免费在线视频 | 国产人人精品 | 国语对白真实视频播放 | 在线播放亚洲视频 | 韩国毛片一区二区三区 | 五月天婷婷影院 | 全部免费毛片在线播放 | 色婷婷国产精品 | 欧美日韩有码 | 亚洲一区二区毛片 | 日本中文一区 | 99午夜视频 | 在线97| 久久久久久久国产精品影院 | av一级久久 | 久久99精品国产麻豆91樱花 | 久久亚洲精品国产 | 污污视频在线免费看 | 热99视频| 蜜桃传媒一区二区亚洲 | 日韩一级精品 | 在线免费不卡视频 | 在线观看aa | 亚洲欧美日韩国产一区二区三区 | 一区高清 | 中年夫妇啪啪高潮 | 夜夜欢天天干 | 国产午夜毛片 | 日韩tv| 怡红院成人影院 | 最新地址在线观看 | 最新地址av| 欧美一区在线看 | 亚洲国产看片 | 国产精品一区二区免费 | 日韩激情综合 | 69久久 | 日本国产一区二区 | 欧美在线黄色 | 国产精品欧美一区二区 | 韩国中文字幕hd久久精品 | 亚洲国产精品嫩草影院久久av | 人人人爽| 亚洲日本国产精品 | 成人伊人网 | 国产日韩欧美视频在线观看 | 亚洲一区二区黄色 | 青青青青青青青青草 | 亚洲乱码国产乱码精品精软件 | 五月天久久久久久 | 在线观看一二区 | 亚洲最大成人在线 | 91 色| 国产女人水真多18毛片18精品 | 久操国产在线 | 综合激情在线 | 日韩一区二区三区免费 | 97在线免费视频 | 国产亚洲va天堂va777 | 国内自拍在线 | 久久久久成人精品 | 欧美色图在线视频 | 亚洲欧美激情一区二区三区 | 成 人 黄 色 片 在线播放 | 91久久在线观看 | 日韩经典在线观看 | 成人黄色a | 色奇米 | www.99re7.com | 亚洲国产欧美另类 | 桃色一区 | 视频一区二区在线播放 | 粗喘呻吟撞击猛烈疯狂 | 亚欧成人精品一区二区 | 欧美一级片在线 | 欧美综合激情 | 天天射天天 | 国产女主播福利 | 夜夜爽网站 | 久久中文av | 99久久一区二区三区 | 8x8x最新网址 | 这里只有精品视频 | 日韩不卡一区 | 人人爽人人射 | 超碰在线99 | 中文字幕日韩精品欧美一区蜜桃网 | 欧美做受69 | 狠狠爱夜夜 | 欧美一二区 | 国产精品久久久久久婷婷天堂 | 嫩草影院污 | 免费在线观看毛片 | 久久国产成人精品av | 欧美三级韩国三级日本三斤 | 国产亚洲资源 | 国产高清久久久 | 国产又大又粗又长 | 亚洲激情综合 | 成人免费视频一区二区 | 日本高清视频一区 | 成年人性生活视频 | 日韩欧美高清dvd碟片 | 啪啪免费视频网站 | 在线免费视频网站 | 美女黄页在线观看 | 亚洲成人av免费在线观看 | 免费黄色三级 | 免费观看高清在线 | 亚洲一区二区精品视频 | 亚洲成人动漫在线观看 | 中文字幕乱码日产无人区 | 纯爱无遮挡h肉动漫在线播放 | 亚洲欧美综合 | av不卡免费在线观看 | 午夜av网站| 日韩色综合网 | 国产一级一级va | 黄色污污视频网站 | 91免费大片 | 国产三级在线 | 欧美一区二区在线视频 | 高潮中文字幕 | 亚洲伦理久久 | 婷婷久久综合 | 人人澡人人干 | 伊人伊色 | 就爱av| 国产一级在线免费观看 | 熊出没之冬日乐翻天免费高清观看 | 国产精品久久久久一区二区 | 亚洲大胆视频 | 成人深夜福利在线观看 | 久久中出| 黄色国产视频 | 色多多污 | 久久久久久亚洲精品 | 91麻豆精品在线 | 日本不卡在线播放 | 国产精品第72页 | 中文资源在线播放 | 亚洲美女性生活视频 | 五十路在线 | 国产乱淫av公 | 欧美特黄一级大片 | 天天成人| 亚洲成av人片在www色猫咪 | 2018天天干天天操 | 国产青草视频 | 日本欧美三级 | 成人免费看片视频 | 亚洲第一视频在线播放 | 日本中文字幕在线观看视频 | 成人久久免费视频 | 亚洲乱码国产乱码精品精在线网站 | 国产一级特黄视频 | 亚洲靠逼| 成人av免费 | 久久cao | 亚洲综合天堂 | 新中文字幕 | 日日碰日日摸 | av在线免费观看av | 日韩精品系列 | 亚洲欧洲中文 | 国产在线第二页 | 亚洲精品午夜久久久久久久久久久 | 亚洲国产精品一区二区www | 国产精品7| 国产三级一区二区三区 | 久久久夜 | 精品黑人| 日韩精品激情 | 不卡一区二区在线观看 | 波多野结衣在线观看一区 | 精品视频在线免费 | 久久久午夜精品福利内容 | 国产一区成人 | 免费成人深夜在线观看 | 一级黄色播放 | 一区二区三高清 | 久久色婷婷 | 欧美极品喷水 | 日韩免费在线观看 | japanesexxxx日本妞 | 国产aaa| 久久中文视频 | 久久久综合色 | 久久久久久久久久久影院 | 在线免费观看亚洲 | 亚洲欧美色视频 | 天天天天天干 | 成人夜夜| 伊伊成人网 | 91精品日韩 | 97在线免费视频 | 亚洲一区在线观看视频 | 日本中文在线播放 | 在线欧美国产 | 天堂伊人网| 337p粉嫩大胆噜噜噜噜69影视 | 亚洲精品综合在线 | 爱爱免费网址 | 国产在线免费视频 | 成人精品视频99在线观看免费 | 欧美日本一区二区 | 农村偷人一级超爽毛片 | 成年人久久 | 中文字幕永久在线视频 | 欧美男女啪啪 | 欧美日韩在线视频免费 | 长篇爽欲亲伦96部小说 | 青青草免费av | 五月天精品视频 | 91av网址| 在线观看亚洲精品视频 | 成人va在线 | 黄色av免费 | 国产露脸国语对白在线 | 91精品福利在线 | av网站网址 | 亚洲成人一区二区三区 | 一级在线免费观看 | 中国一级特黄视频 | 亚洲淫视频 | 亚洲精品视频一区二区三区 | 经典三级av在线 | 69天堂| 污视频免费看 | 在线一区二区三区做爰视频网站 | 国产人人爱 | 亚洲一区二区观看 | 国产亚洲久一区二区 | 国产一级一片 | 九九99精品| 一区二区三区视频网站 | 久久久一本精品99久久精品66 | 国产不卡一区在线 | 亚洲精品日日夜夜 | 在线观看国产成人 | 中文字幕视频在线观看 | 看毛片视频 | 在线精品视频观看 | 亚洲乱码国产乱码精品精网站 | 佐佐木明希99精品久久 | 亚洲欧美v | 亚洲艳情网站 | 欧美精品系列 | 777久久 | 国产三级第一页 | h视频在线免费观看 | 国产中文综合免费 | www.狠狠操 | 91九色视频在线观看 | 久久久1| 五月天婷婷基地 | 五月婷在线视频 | 久久久国产高清 | 精品国产乱码久久久久久蜜退臀 | 自拍偷拍专区 | 国产91页 | 伊人久久大香线蕉成人综合网 | 亚洲射射射 | 国产精品99久久99久久久二 | 精品初高中害羞小 | 我爱av好色 | 亚洲精品福利网站 | 精品国产乱码久久久久久婷婷 | 日本三级欧美三级 | 国产一区二区在线观看视频 | 国产伦精品一区二区三区照片 | 涩涩视频软件 | 色.www| av毛片网 | 国内精品久久久久久久久 | 久色91| 四虎视频在线 | 成人在线免费av | 亚洲精品中字 | 视频免费在线观看 | 亚色网站 | 日产久久视频 | 久久综合久色欧美综合狠狠 | 在线观看视频色 | 欧美黄一级 | 美日韩一区二区三区 | 久久久久久久久免费 | 亚洲自拍首页 | 干爹你真棒插曲免费 | 日本精品视频网站 | 日韩欧美一区二区三区在线 | 青青草97国产精品免费观看 | 欧美日韩精品在线视频 | 日本黄色片一级 | 天天操操操操 | 非洲黑寡妇性猛交视频 | 黄色综合网站 | 91国在线 | 小视频在线播放 | 国产亚洲片 | 日日艹夜夜艹 | 国产欧美亚洲精品 | 亚洲最大黄色 | 青草青在线| 免费簧片在线观看 | 一级三级黄色片 | 五月婷婷伊人网 | 天天爽天天色 | 欧美一区二区三区影视 | 国产二区视频 | 国产激情免费 | 日韩免费观看视频 | 国产xxxx裸体肉体大胆147 | 欧美日韩综合一区二区 | 福利一区福利二区 | 成人做爰www看视频软件 | 中文字幕av片 | 韩国三级做爰高潮 | 一区二区久久久 | 日韩三级网 | 在线免费黄色 | 色天天天| 黄色av网站在线看 | 黄色一级片毛片 | 欧美成人精品二区三区99精品 | 夜夜草av| 日本在线精品视频 | 青青草偷拍视频 | 日韩黄页网站 | 亚日韩| 91成人免费看片 | 亚洲精品乱码久久久久 | 97久久人人 | 91高清视频在线 | 五月婷婷网站 | 性开放网站 | 成人国产精品久久久春色 | 天天插夜夜 | 亚洲区小说区图片区qvod | japanesexxx日本乱| av在线高清观看 | 男女污污视频在线观看 | 伊人干综合 | 日韩精品1区 | 国产成年人免费视频 | 操综合网| 台湾av在线 | 爱乃なみ加勒比在线播放 | 亚洲免费视频观看 | 国产一级淫片a | 日韩一级完整毛片 | 性生交大片免费中文 | 午夜国产福利 | 成人av时间停止系列在线 | 打开免费观看视频在线 | 国产在线a| 特黄色一级片 | 国产欧美在线播放 | 亚洲精品在线观看免费 | 特级淫片裸体免费看 | 国产乱乱 | 久久人人干 | 亚洲国产女人aaa毛片在线动漫 | 在线欧美视频 | 极品销魂美女一区二区 | 午夜污 | 成人免费视频视频 | 欧美性猛交xxxⅹ富婆 | 伊人99热 | 欧美精品久久久久久久多人混战 | 亚洲综合在线免费 | 国产欧美在线视频 | 一级少妇精品久久久久久久 | 国内精品免费视频 | 超碰福利在线观看 | 农村末发育av片一区二区 | 中文字幕亚洲精品 | 国产做受高潮漫动 | 久久99久久99精品免观看软件 | 九色在线观看 | 天天干天天弄 | 在线日韩精品视频 | 综合久久99| 久久精品片 | 亚洲伊人婷婷 | 黄色一级片免费 | 日韩免费一级 | 91鲁| av黄色网址 | 亚洲欧美日韩在线播放 | 国产高潮流白浆喷水视频 | 99色综合 | 一级片网址| 欧美日韩在线视频一区 | 日韩特级片 | 在线观看亚洲国产 | 国产第一区第二区 | 鸥美毛片| 懂色av蜜臂av粉嫩av | 国产成人一级片 | 最新视频 - 88av | 美女国产精品 | 德国性猛交xxxxhd | 免费在线| 六月啪啪 | 日韩精品视频在线观看网站 | 国产91精品高潮白浆喷水 | www.久久久 | 色站综合 | 国内精品视频在线 | 亚洲精品久久久久久久久久久 | 99久久综合国产精品二区 | 成人1区2区3区 | 成年人小视频在线观看 | 亚洲视频在线观看免费视频 | 人人爽人人香蕉 | 先锋影音一区二区三区 | www.com亚洲| 国产视频第一区 | 国产人成一区二区三区影院 | www.天天操| 在线看中文字幕 | 欧美亚洲第一页 | 国模大胆一区二区三区 | 国产免费小视频 | 日美毛片| 最近日本中文字幕 | 国产精品久久一区二区三区 | 青青操视频在线播放 | 日本美女影院 | 少妇久久久久久 | 久久6精品| 日本在线视频免费 | 欧美综合区 | 最新理伦片eeuss影院 | 一道本av| 成人h动漫精品一区 | 亚洲人免费| 国产色片| 久久亚洲一区二区 | 主播粉嫩国产在线精品 | 日韩少妇av | 国语自产偷拍精品视频 | 亚洲三区av | 亚洲精品美女 | 久久性网 | 色播99| 在线小视频国产 | 毛片在线视频 | 亚洲巨乳av | www激情| 成人动漫在线观看 | 日韩一区二区免费视频 | 国产无遮挡又黄又爽又色视频 | 91亚洲日本aⅴ精品一区二区 | 手机成人在线 | 五月婷婷六月丁香综合 | 国产成人在线免费观看视频 | 综合国产精品 | 日韩大片免费看 | 91毛片观看 | 国产影视av| 黄色高潮| 成人尤物 | 在线激情小视频 | 大学生第一次破女处视频国产 | 中文字幕一区不卡 | 久久久久久综合 | 亚洲小视频在线观看 | 99re久久精品国产 | 日韩网站免费 | 久久久国产成人一区二区三区 | 96国产精品久久久久aⅴ四区 | 成人免费av网站 | 99久久视频 | jizz国产精品 | 成人av网址大全 | 亚洲男人天堂久久 | 红桃视频黄色 | 欧美另类在线视频 | 日韩第一页在线 | 在线免费国产 | 国产乱国产乱老熟 | 国产成人免费看一级大黄 | 在线观看视频 | 自拍 偷拍 欧美 | 国产精品久久久久精囗交 | 日韩在线资源 | 91九色蝌蚪| 亚洲国产一区二区三区 | 日本欧美三级 | 黄色片网站免费看 | 天天插天天操 | 黄色一级免费视频 | 牛人盗摄一区二区三区视频 | 亚洲精品77777 | 欧美视频中文字幕 | 天堂中文在线免费观看 | 影音先锋国产精品 | 伊人成年综合网 | 97狠狠 | 国产无遮挡又黄又爽免费网站 | 最近更新2019中文字幕 | 中文字幕av久久爽 | 色原网| 福利国产在线 | 国产精品久久久久久免费播放 | 亚洲日本黄色 | 91丨porny丨刺激 | 99久久99久久精品免费看蜜桃 | 精品中文字幕在线播放 | 久久精品性 | 精品国产免费一区二区三区 | 国产最新网址 | 黄色大全在线观看 | 国产精品伦一区 | 久久九 | 成av人片一区二区三区久久 | 在线看国产精品 | 69久久| 在线色资源 | 美女啪啪免费视频 | 伊人av在线免费观看 | 国产精品乱码一区二三区小蝌蚪 | 69亚洲乱人伦 | 欧美日韩网 | 谁有av网址 | 青娱乐免费在线视频 | 日本顶级大片 | 懂爱av| 91精品国产福利在线观看 | 特黄特色免费视频 | 国产区一区二区三区 | 精品国产免费久久久久久婷婷 | 日韩大片免费观看 | eeuss鲁一区二区三区 | 91精品国产福利在线观看 | 中文字幕视频在线播放 | 日本久久久久久久久久久 | 亚洲激情专区 | 黄色小说视频网站 | 一区二区三区av在线 | 1024视频污 | 伊人久久久久久久久久 | 国产男女视频 | 亚洲第一精品在线观看 | 国产免费看av | 欧美一区免费 | 欧美在线免费观看视频 | 亚洲一区精品视频 | 一区二区三区av夏目彩春 | 8x8x成人| 亚洲香蕉成人av网站在线观看 | 国产精品爽爽久久 | 日本国产一区 | 少妇与公做了夜伦理69 | 日日躁夜夜躁狠狠躁 | 中文字幕一级 | 青青青青青青青青草 | 插骚| 欧美另类色 | 波多野结衣中文字幕一区二区 | 特级免费毛片 | 色综合中文网 | 超碰男人天堂 | 国产成人精品一区二三区 | 福利影院在线观看 | 国产三级大片 | 超碰在线观看av | 九九热精品在线视频 | 韩国三级少妇高潮在线观看 | 中文字幕25页 | 99在线精品视频 | 极品粉嫩鲍鱼视频在线观看 | 九九热在线视频观看 | 成人日b视频 | 岛国一区 | 国产一区二区三区探花 | 中日韩在线视频 | 亚洲国产精品一区二区三区 | 久久网站免费 | 亚洲国产成人欧美激情 | 91刺激视频| 亚洲精品1区2区3区 国产免费一级视频 | 亚洲精选国产 | 久久久久久久国产精品美女 | 99cao| 成人免费毛片网站 | 日韩欧美不卡 | 97天堂网| 欧美综合国产 | 午夜精品一二三区 | 亚洲 小说区 图片区 都市 | 男人天堂新地址 | 一区二区三区蜜桃 | 国产精品v欧美精品v日韩精品v | av中文网 | 日韩在线网址 | 天天操天天干天天爱 | 中文字幕一区二区在线视频 | 欧美色视频在线 | 国产精品自产拍高潮在线观看 | av免费资源| 大牛影视剧免费播放在线 | 一级生活毛片 | 久久人人干 | 一级片在线免费播放 | 丁香婷婷在线 | 黄色网页在线观看 | 天天艹天天爽 | 91网站在线观看视频 | 国产a级自拍 | 亚洲激情在线播放 | 97人人精品 | 亚洲激情网站 | 国产伦精品一区二区三区四区免费 | 日本不卡视频在线观看 | 国产偷人视频 | 午夜激情成人 | 久久艹久久 | 国产成人区 | 少妇高潮久久久久久潘金莲 | 中文字幕第五页 | 天天色天天操天天射 | 国产精品成人一区二区网站软件 | 日本成人在线网站 | 亚洲码国产精品高潮在线 | 久久国产精 | 超碰久草| 在线亚洲区 | 成人精品免费网站 | 中日韩免费视频 | 涩天堂 | 91色站| 2019天天干天天操 | 成人精品鲁一区一区二区 | 青草一区二区 | 精品一区二区三区不卡 | 国产精品1页 | 嫩草视频在线观看免费 | 中文字幕26页 | 日韩女优在线播放 | 成人tv| av图片在线| 亚洲成人av在线播放 | 中文第一页 | 精品黑人一区二区三区国语馆 | 深夜福利视频在线观看 | 精品久久精品久久 | 91www在线观看 | 精品欧美一区二区精品久久 | 国产精品视频自拍 | 永久免费在线 | 国产精品二区视频 | 亚洲国产精品av | 青青艹在线视频 | 欧美黄色小说 | 殴美一级特黄aaaaaa | 美女网站av| 黄色的毛片 | 国产视频一区在线观看 | 大牛影视剧免费播放在线 | 免费看黄色大片 | 亚洲欧美自拍另类 | 精品国自产在线观看 | 午夜精品三级久久久有码 | 自拍偷拍色综合 | 99热热99 | 色撸撸在线 | 国产伦一区二区三区 | 国产精品a成v人在线播放 | 国产午夜一区二区三区 |