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
|
||||
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
|
||||
--------------
|
||||
1 $cd labX
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -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__ */
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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__ */
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user