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…
Reference in New Issue
Block a user