Merge branch 'master' of github.com:chyyuu/ucore_lab

This commit is contained in:
chyyuu 2012-10-05 21:10:46 +08:00
commit 4a62b31f4e
11 changed files with 94 additions and 24 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*~
obj/
bin/

24
README
View File

@ -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

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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__ */

View File

@ -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))

View File

@ -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__ */

View File

@ -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))

View File

@ -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))