Merge branch 'master' of github.com:chyyuu/ucore_lab
This commit is contained in:
		
						commit
						4a62b31f4e
					
				
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					*~
 | 
				
			||||||
 | 
					obj/
 | 
				
			||||||
 | 
					bin/
 | 
				
			||||||
							
								
								
									
										24
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								README
									
									
									
									
									
								
							@ -20,6 +20,30 @@ lab6: scheduling
 | 
				
			|||||||
lab7: mutex/sync
 | 
					lab7: mutex/sync
 | 
				
			||||||
lab8: filesystem
 | 
					lab8: filesystem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you don't want to install ubuntu and other softs to finish these labs in Windows, you can use VirtualBox soft (https://www.virtualbox.org/) and
 | 
				
			||||||
 | 
					a virtual disk image with all these softs. Below example is shown how to setup lab environment in Windows.
 | 
				
			||||||
 | 
					You can download this virtual disk image -- oslabs_for_student_2012.zip (576.2MB,) from  http://pan.baidu.com/share/link?shareid=69868&uk=2585194235, which
 | 
				
			||||||
 | 
					is an VirtualBox disk image (contains ubuntu 12.04 and needed softs, and is zipped with zip and xz format), and can be unzipped 
 | 
				
			||||||
 | 
					by haozip software (http://www.haozip.com). 
 | 
				
			||||||
 | 
					After unzip oslabs_for_student_2012.zip, you will get 
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					C:\vms\ubuntu-12.04.vbox.xz
 | 
				
			||||||
 | 
					C:\vms\ubuntu-12.04.vmdk.vmdk.xz
 | 
				
			||||||
 | 
					C:\vms\ubuntu-12.04.vmdk-flat.vmdk.xz
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					then you will continue unzip all these files, and get
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					C:\vms\ubuntu-12.04.vbox
 | 
				
			||||||
 | 
					C:\vms\ubuntu-12.04.vmdk.vmdk
 | 
				
			||||||
 | 
					C:\vms\ubuntu-12.04.vmdk-flat.vmdk
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					If you installed VirtualBox soft, then the last step is: double clik file "ubuntu-12.04.vbox" and run ubuntu 12.04 in VirtualBox.
 | 
				
			||||||
 | 
					In ubuntu 12.04 login Interface:
 | 
				
			||||||
 | 
					username: chy
 | 
				
			||||||
 | 
					password: <SPACE KEY>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After you login, you will see the directory ucore_lab in HOME directory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXERCISE STEPS
 | 
					EXERCISE STEPS
 | 
				
			||||||
--------------
 | 
					--------------
 | 
				
			||||||
1 $cd labX  
 | 
					1 $cd labX  
 | 
				
			||||||
 | 
				
			|||||||
@ -104,8 +104,8 @@ struct Page {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Flags describing the status of a page frame */
 | 
					/* Flags describing the status of a page frame */
 | 
				
			||||||
#define PG_reserved                 0       // the page descriptor is reserved for kernel or unusable
 | 
					#define PG_reserved                 0       // if this bit=1: the Page is reserved for kernel, cannot be used in alloc/free_pages; otherwise, this bit=0 
 | 
				
			||||||
#define PG_property                 1       // the member 'property' is valid
 | 
					#define PG_property                 1       // if this bit=1: the Page is the head page of a free memory block(contains some continuous_addrress pages), and can be used in alloc_pages; if this bit=0: if the Page is the the head page of a free memory block, then this Page and the memory block is alloced. Or this Page isn't the head page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
					#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
					#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
 | 
				
			|||||||
@ -107,8 +107,8 @@ struct Page {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Flags describing the status of a page frame */
 | 
					/* Flags describing the status of a page frame */
 | 
				
			||||||
#define PG_reserved                 0       // the page descriptor is reserved for kernel or unusable
 | 
					#define PG_reserved                 0       // if this bit=1: the Page is reserved for kernel, cannot be used in alloc/free_pages; otherwise, this bit=0 
 | 
				
			||||||
#define PG_property                 1       // the member 'property' is valid
 | 
					#define PG_property                 1       // if this bit=1: the Page is the head page of a free memory block(contains some continuous_addrress pages), and can be used in alloc_pages; if this bit=0: if the Page is the the head page of a free memory block, then this Page and the memory block is alloced. Or this Page isn't the head page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
					#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
					#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
 | 
				
			|||||||
@ -100,16 +100,15 @@ struct e820map {
 | 
				
			|||||||
struct Page {
 | 
					struct Page {
 | 
				
			||||||
    int ref;                        // page frame's reference counter
 | 
					    int ref;                        // page frame's reference counter
 | 
				
			||||||
    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
					    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
				
			||||||
    unsigned int property;          // used in buddy system, stores the order (the X in 2^X) of the continuous memory block
 | 
					    unsigned int property;          // the num of free block, used in first fit pm manager
 | 
				
			||||||
    int zone_num;                   // used in buddy system, the No. of zone which the page belongs to
 | 
					 | 
				
			||||||
    list_entry_t page_link;         // free list link
 | 
					    list_entry_t page_link;         // free list link
 | 
				
			||||||
    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
					    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
				
			||||||
    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
					    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Flags describing the status of a page frame */
 | 
					/* Flags describing the status of a page frame */
 | 
				
			||||||
#define PG_reserved                 0       // the page descriptor is reserved for kernel or unusable
 | 
					#define PG_reserved                 0       // if this bit=1: the Page is reserved for kernel, cannot be used in alloc/free_pages; otherwise, this bit=0 
 | 
				
			||||||
#define PG_property                 1       // the member 'property' is valid
 | 
					#define PG_property                 1       // if this bit=1: the Page is the head page of a free memory block(contains some continuous_addrress pages), and can be used in alloc_pages; if this bit=0: if the Page is the the head page of a free memory block, then this Page and the memory block is alloced. Or this Page isn't the head page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
					#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
					#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
 | 
				
			|||||||
@ -129,16 +129,15 @@ struct e820map {
 | 
				
			|||||||
struct Page {
 | 
					struct Page {
 | 
				
			||||||
    int ref;                        // page frame's reference counter
 | 
					    int ref;                        // page frame's reference counter
 | 
				
			||||||
    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
					    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
				
			||||||
    unsigned int property;          // used in buddy system, stores the order (the X in 2^X) of the continuous memory block
 | 
					    unsigned int property;          // the num of free block, used in first fit pm manager
 | 
				
			||||||
    int zone_num;                   // used in buddy system, the No. of zone which the page belongs to
 | 
					 | 
				
			||||||
    list_entry_t page_link;         // free list link
 | 
					    list_entry_t page_link;         // free list link
 | 
				
			||||||
    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
					    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
				
			||||||
    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
					    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Flags describing the status of a page frame */
 | 
					/* Flags describing the status of a page frame */
 | 
				
			||||||
#define PG_reserved                 0       // the page descriptor is reserved for kernel or unusable
 | 
					#define PG_reserved                 0       // if this bit=1: the Page is reserved for kernel, cannot be used in alloc/free_pages; otherwise, this bit=0 
 | 
				
			||||||
#define PG_property                 1       // the member 'property' is valid
 | 
					#define PG_property                 1       // if this bit=1: the Page is the head page of a free memory block(contains some continuous_addrress pages), and can be used in alloc_pages; if this bit=0: if the Page is the the head page of a free memory block, then this Page and the memory block is alloced. Or this Page isn't the head page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
					#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
					#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
 | 
				
			|||||||
@ -53,5 +53,29 @@ test_bit(int nr, volatile void *addr) {
 | 
				
			|||||||
    return oldbit != 0;
 | 
					    return oldbit != 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* *
 | 
				
			||||||
 | 
					 * test_and_set_bit - Atomically set a bit and return its old value
 | 
				
			||||||
 | 
					 * @nr:     the bit to set
 | 
				
			||||||
 | 
					 * @addr:   the address to count from
 | 
				
			||||||
 | 
					 * */
 | 
				
			||||||
 | 
					static inline bool
 | 
				
			||||||
 | 
					test_and_set_bit(int nr, volatile void *addr) {
 | 
				
			||||||
 | 
					    int oldbit;
 | 
				
			||||||
 | 
					    asm volatile ("btsl %2, %1; sbbl %0, %0" : "=r" (oldbit), "=m" (*(volatile long *)addr) : "Ir" (nr) : "memory");
 | 
				
			||||||
 | 
					    return oldbit != 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* *
 | 
				
			||||||
 | 
					 * test_and_clear_bit - Atomically clear a bit and return its old value
 | 
				
			||||||
 | 
					 * @nr:     the bit to clear
 | 
				
			||||||
 | 
					 * @addr:   the address to count from
 | 
				
			||||||
 | 
					 * */
 | 
				
			||||||
 | 
					static inline bool
 | 
				
			||||||
 | 
					test_and_clear_bit(int nr, volatile void *addr) {
 | 
				
			||||||
 | 
					    int oldbit;
 | 
				
			||||||
 | 
					    asm volatile ("btrl %2, %1; sbbl %0, %0" : "=r" (oldbit), "=m" (*(volatile long *)addr) : "Ir" (nr) : "memory");
 | 
				
			||||||
 | 
					    return oldbit != 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* !__LIBS_ATOMIC_H__ */
 | 
					#endif /* !__LIBS_ATOMIC_H__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -129,16 +129,15 @@ struct e820map {
 | 
				
			|||||||
struct Page {
 | 
					struct Page {
 | 
				
			||||||
    int ref;                        // page frame's reference counter
 | 
					    int ref;                        // page frame's reference counter
 | 
				
			||||||
    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
					    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
				
			||||||
    unsigned int property;          // used in buddy system, stores the order (the X in 2^X) of the continuous memory block
 | 
					    unsigned int property;          // the num of free block, used in first fit pm manager
 | 
				
			||||||
    int zone_num;                   // used in buddy system, the No. of zone which the page belongs to
 | 
					 | 
				
			||||||
    list_entry_t page_link;         // free list link
 | 
					    list_entry_t page_link;         // free list link
 | 
				
			||||||
    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
					    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
				
			||||||
    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
					    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Flags describing the status of a page frame */
 | 
					/* Flags describing the status of a page frame */
 | 
				
			||||||
#define PG_reserved                 0       // the page descriptor is reserved for kernel or unusable
 | 
					#define PG_reserved                 0       // if this bit=1: the Page is reserved for kernel, cannot be used in alloc/free_pages; otherwise, this bit=0 
 | 
				
			||||||
#define PG_property                 1       // the member 'property' is valid
 | 
					#define PG_property                 1       // if this bit=1: the Page is the head page of a free memory block(contains some continuous_addrress pages), and can be used in alloc_pages; if this bit=0: if the Page is the the head page of a free memory block, then this Page and the memory block is alloced. Or this Page isn't the head page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
					#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
					#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
 | 
				
			|||||||
@ -53,5 +53,29 @@ test_bit(int nr, volatile void *addr) {
 | 
				
			|||||||
    return oldbit != 0;
 | 
					    return oldbit != 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* *
 | 
				
			||||||
 | 
					 * test_and_set_bit - Atomically set a bit and return its old value
 | 
				
			||||||
 | 
					 * @nr:     the bit to set
 | 
				
			||||||
 | 
					 * @addr:   the address to count from
 | 
				
			||||||
 | 
					 * */
 | 
				
			||||||
 | 
					static inline bool
 | 
				
			||||||
 | 
					test_and_set_bit(int nr, volatile void *addr) {
 | 
				
			||||||
 | 
					    int oldbit;
 | 
				
			||||||
 | 
					    asm volatile ("btsl %2, %1; sbbl %0, %0" : "=r" (oldbit), "=m" (*(volatile long *)addr) : "Ir" (nr) : "memory");
 | 
				
			||||||
 | 
					    return oldbit != 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* *
 | 
				
			||||||
 | 
					 * test_and_clear_bit - Atomically clear a bit and return its old value
 | 
				
			||||||
 | 
					 * @nr:     the bit to clear
 | 
				
			||||||
 | 
					 * @addr:   the address to count from
 | 
				
			||||||
 | 
					 * */
 | 
				
			||||||
 | 
					static inline bool
 | 
				
			||||||
 | 
					test_and_clear_bit(int nr, volatile void *addr) {
 | 
				
			||||||
 | 
					    int oldbit;
 | 
				
			||||||
 | 
					    asm volatile ("btrl %2, %1; sbbl %0, %0" : "=r" (oldbit), "=m" (*(volatile long *)addr) : "Ir" (nr) : "memory");
 | 
				
			||||||
 | 
					    return oldbit != 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* !__LIBS_ATOMIC_H__ */
 | 
					#endif /* !__LIBS_ATOMIC_H__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -129,16 +129,15 @@ struct e820map {
 | 
				
			|||||||
struct Page {
 | 
					struct Page {
 | 
				
			||||||
    int ref;                        // page frame's reference counter
 | 
					    int ref;                        // page frame's reference counter
 | 
				
			||||||
    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
					    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
				
			||||||
    unsigned int property;          // used in buddy system, stores the order (the X in 2^X) of the continuous memory block
 | 
					    unsigned int property;          // the num of free block, used in first fit pm manager
 | 
				
			||||||
    int zone_num;                   // used in buddy system, the No. of zone which the page belongs to
 | 
					 | 
				
			||||||
    list_entry_t page_link;         // free list link
 | 
					    list_entry_t page_link;         // free list link
 | 
				
			||||||
    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
					    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
				
			||||||
    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
					    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Flags describing the status of a page frame */
 | 
					/* Flags describing the status of a page frame */
 | 
				
			||||||
#define PG_reserved                 0       // the page descriptor is reserved for kernel or unusable
 | 
					#define PG_reserved                 0       // if this bit=1: the Page is reserved for kernel, cannot be used in alloc/free_pages; otherwise, this bit=0 
 | 
				
			||||||
#define PG_property                 1       // the member 'property' is valid
 | 
					#define PG_property                 1       // if this bit=1: the Page is the head page of a free memory block(contains some continuous_addrress pages), and can be used in alloc_pages; if this bit=0: if the Page is the the head page of a free memory block, then this Page and the memory block is alloced. Or this Page isn't the head page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
					#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
					#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
 | 
				
			|||||||
@ -129,16 +129,15 @@ struct e820map {
 | 
				
			|||||||
struct Page {
 | 
					struct Page {
 | 
				
			||||||
    int ref;                        // page frame's reference counter
 | 
					    int ref;                        // page frame's reference counter
 | 
				
			||||||
    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
					    uint32_t flags;                 // array of flags that describe the status of the page frame
 | 
				
			||||||
    unsigned int property;          // used in buddy system, stores the order (the X in 2^X) of the continuous memory block
 | 
					    unsigned int property;          // the num of free block, used in first fit pm manager
 | 
				
			||||||
    int zone_num;                   // used in buddy system, the No. of zone which the page belongs to
 | 
					 | 
				
			||||||
    list_entry_t page_link;         // free list link
 | 
					    list_entry_t page_link;         // free list link
 | 
				
			||||||
    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
					    list_entry_t pra_page_link;     // used for pra (page replace algorithm)
 | 
				
			||||||
    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
					    uintptr_t pra_vaddr;            // used for pra (page replace algorithm)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Flags describing the status of a page frame */
 | 
					/* Flags describing the status of a page frame */
 | 
				
			||||||
#define PG_reserved                 0       // the page descriptor is reserved for kernel or unusable
 | 
					#define PG_reserved                 0       // if this bit=1: the Page is reserved for kernel, cannot be used in alloc/free_pages; otherwise, this bit=0 
 | 
				
			||||||
#define PG_property                 1       // the member 'property' is valid
 | 
					#define PG_property                 1       // if this bit=1: the Page is the head page of a free memory block(contains some continuous_addrress pages), and can be used in alloc_pages; if this bit=0: if the Page is the the head page of a free memory block, then this Page and the memory block is alloced. Or this Page isn't the head page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
					#define SetPageReserved(page)       set_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
					#define ClearPageReserved(page)     clear_bit(PG_reserved, &((page)->flags))
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user