diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e6094c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*~ +obj/ +bin/ diff --git a/README b/README index cccd702..9ad5572 100644 --- a/README +++ b/README @@ -20,6 +20,30 @@ lab6: scheduling lab7: mutex/sync 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: + +After you login, you will see the directory ucore_lab in HOME directory. + EXERCISE STEPS -------------- 1 $cd labX diff --git a/code/lab2/kern/mm/memlayout.h b/code/lab2/kern/mm/memlayout.h index 12af91c..1e58466 100644 --- a/code/lab2/kern/mm/memlayout.h +++ b/code/lab2/kern/mm/memlayout.h @@ -104,8 +104,8 @@ struct Page { }; /* Flags describing the status of a page frame */ -#define PG_reserved 0 // the page descriptor is reserved for kernel or unusable -#define PG_property 1 // the member 'property' is valid +#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 // 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 ClearPageReserved(page) clear_bit(PG_reserved, &((page)->flags)) diff --git a/code/lab3/kern/mm/memlayout.h b/code/lab3/kern/mm/memlayout.h index f0c6816..33b4ea4 100644 --- a/code/lab3/kern/mm/memlayout.h +++ b/code/lab3/kern/mm/memlayout.h @@ -107,8 +107,8 @@ struct Page { }; /* Flags describing the status of a page frame */ -#define PG_reserved 0 // the page descriptor is reserved for kernel or unusable -#define PG_property 1 // the member 'property' is valid +#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 // 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 ClearPageReserved(page) clear_bit(PG_reserved, &((page)->flags)) diff --git a/code/lab4/kern/mm/memlayout.h b/code/lab4/kern/mm/memlayout.h index b6b4094..af1fcb9 100644 --- a/code/lab4/kern/mm/memlayout.h +++ b/code/lab4/kern/mm/memlayout.h @@ -100,16 +100,15 @@ struct e820map { struct Page { int ref; // page frame's reference counter 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 - int zone_num; // used in buddy system, the No. of zone which the page belongs to + unsigned int property; // the num of free block, used in first fit pm manager list_entry_t page_link; // free list link list_entry_t pra_page_link; // used for pra (page replace algorithm) uintptr_t pra_vaddr; // used for pra (page replace algorithm) }; /* Flags describing the status of a page frame */ -#define PG_reserved 0 // the page descriptor is reserved for kernel or unusable -#define PG_property 1 // the member 'property' is valid +#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 // 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 ClearPageReserved(page) clear_bit(PG_reserved, &((page)->flags)) diff --git a/code/lab5/kern/mm/memlayout.h b/code/lab5/kern/mm/memlayout.h index 825dd66..aa6a4ce 100644 --- a/code/lab5/kern/mm/memlayout.h +++ b/code/lab5/kern/mm/memlayout.h @@ -129,16 +129,15 @@ struct e820map { struct Page { int ref; // page frame's reference counter 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 - int zone_num; // used in buddy system, the No. of zone which the page belongs to + unsigned int property; // the num of free block, used in first fit pm manager list_entry_t page_link; // free list link list_entry_t pra_page_link; // used for pra (page replace algorithm) uintptr_t pra_vaddr; // used for pra (page replace algorithm) }; /* Flags describing the status of a page frame */ -#define PG_reserved 0 // the page descriptor is reserved for kernel or unusable -#define PG_property 1 // the member 'property' is valid +#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 // 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 ClearPageReserved(page) clear_bit(PG_reserved, &((page)->flags)) diff --git a/code/lab5/libs/atomic.h b/code/lab5/libs/atomic.h index 958be2e..e8f317b 100644 --- a/code/lab5/libs/atomic.h +++ b/code/lab5/libs/atomic.h @@ -53,5 +53,29 @@ test_bit(int nr, volatile void *addr) { 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__ */ diff --git a/code/lab6/kern/mm/memlayout.h b/code/lab6/kern/mm/memlayout.h index 825dd66..aa6a4ce 100644 --- a/code/lab6/kern/mm/memlayout.h +++ b/code/lab6/kern/mm/memlayout.h @@ -129,16 +129,15 @@ struct e820map { struct Page { int ref; // page frame's reference counter 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 - int zone_num; // used in buddy system, the No. of zone which the page belongs to + unsigned int property; // the num of free block, used in first fit pm manager list_entry_t page_link; // free list link list_entry_t pra_page_link; // used for pra (page replace algorithm) uintptr_t pra_vaddr; // used for pra (page replace algorithm) }; /* Flags describing the status of a page frame */ -#define PG_reserved 0 // the page descriptor is reserved for kernel or unusable -#define PG_property 1 // the member 'property' is valid +#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 // 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 ClearPageReserved(page) clear_bit(PG_reserved, &((page)->flags)) diff --git a/code/lab6/libs/atomic.h b/code/lab6/libs/atomic.h index 958be2e..e8f317b 100644 --- a/code/lab6/libs/atomic.h +++ b/code/lab6/libs/atomic.h @@ -53,5 +53,29 @@ test_bit(int nr, volatile void *addr) { 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__ */ diff --git a/code/lab7/kern/mm/memlayout.h b/code/lab7/kern/mm/memlayout.h index 825dd66..aa6a4ce 100644 --- a/code/lab7/kern/mm/memlayout.h +++ b/code/lab7/kern/mm/memlayout.h @@ -129,16 +129,15 @@ struct e820map { struct Page { int ref; // page frame's reference counter 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 - int zone_num; // used in buddy system, the No. of zone which the page belongs to + unsigned int property; // the num of free block, used in first fit pm manager list_entry_t page_link; // free list link list_entry_t pra_page_link; // used for pra (page replace algorithm) uintptr_t pra_vaddr; // used for pra (page replace algorithm) }; /* Flags describing the status of a page frame */ -#define PG_reserved 0 // the page descriptor is reserved for kernel or unusable -#define PG_property 1 // the member 'property' is valid +#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 // 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 ClearPageReserved(page) clear_bit(PG_reserved, &((page)->flags)) diff --git a/code/lab8/kern/mm/memlayout.h b/code/lab8/kern/mm/memlayout.h index 825dd66..aa6a4ce 100644 --- a/code/lab8/kern/mm/memlayout.h +++ b/code/lab8/kern/mm/memlayout.h @@ -129,16 +129,15 @@ struct e820map { struct Page { int ref; // page frame's reference counter 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 - int zone_num; // used in buddy system, the No. of zone which the page belongs to + unsigned int property; // the num of free block, used in first fit pm manager list_entry_t page_link; // free list link list_entry_t pra_page_link; // used for pra (page replace algorithm) uintptr_t pra_vaddr; // used for pra (page replace algorithm) }; /* Flags describing the status of a page frame */ -#define PG_reserved 0 // the page descriptor is reserved for kernel or unusable -#define PG_property 1 // the member 'property' is valid +#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 // 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 ClearPageReserved(page) clear_bit(PG_reserved, &((page)->flags))