Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
0fae9896
提交
0fae9896
12月 07, 2011
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rejigger kalloc.c, add a lame block/slab allocator.
上级
12d384cb
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
50 行增加
和
23 行删除
+50
-23
kalloc.c
kalloc.c
+38
-19
kalloc.h
kalloc.h
+2
-1
kernel.h
kernel.h
+5
-1
main.c
main.c
+1
-1
param.h
param.h
+3
-0
proc.c
proc.c
+1
-1
没有找到文件。
kalloc.c
浏览文件 @
0fae9896
...
...
@@ -16,7 +16,18 @@ static u64 nmem;
static
u64
membytes
;
struct
kmem
kmems
[
NCPU
];
struct
kmem
kstacks
[
NCPU
];
static
struct
kmem
slabmem
[][
NCPU
]
=
{
[
slab_stack
][
0
...
NCPU
-
1
]
=
{
.
name
=
" kstack"
,
.
size
=
KSTACKSIZE
,
.
ninit
=
CPUKSTACKS
,
},
[
slab_perf
][
0
...
NCPU
-
1
]
=
{
.
name
=
" kperf"
,
.
size
=
PERFSIZE
,
.
ninit
=
1
,
},
};
extern
char
end
[];
// first address after kernel loaded from ELF file
char
*
newend
;
...
...
@@ -189,11 +200,10 @@ kalloc(void)
return
kmemalloc
(
kmems
);
}
// Allocate KSTACKSIZE bytes.
char
*
ksalloc
(
void
)
void
*
ksalloc
(
slab_t
slab
)
{
return
kmemalloc
(
kstacks
);
return
kmemalloc
(
slabmem
[
slab
]
);
}
// Memory allocator by Kernighan and Ritchie,
...
...
@@ -221,6 +231,21 @@ kminit(void)
}
}
void
slabinit
(
struct
kmem
*
k
,
char
**
p
,
u64
*
off
)
{
for
(
int
i
=
0
;
i
<
k
->
ninit
;
i
++
)
{
if
(
*
p
==
(
void
*
)
-
1
)
panic
(
"slabinit: memnext"
);
// XXX(sbw) handle this condition
if
(
memsize
(
p
)
<
k
->
size
)
panic
(
"slabinit: memsize"
);
kfree_pool
(
k
,
*
p
);
*
p
=
memnext
(
*
p
,
k
->
size
);
*
off
=
*
off
+
k
->
size
;
}
}
// Initialize free list of physical pages.
void
initkalloc
(
u64
mbaddr
)
...
...
@@ -238,11 +263,12 @@ initkalloc(u64 mbaddr)
kmems
[
c
].
size
=
PGSIZE
;
}
for
(
int
i
=
0
;
i
<
NELEM
(
slabmem
);
i
++
)
{
for
(
int
c
=
0
;
c
<
NCPU
;
c
++
)
{
kstacks
[
c
].
name
[
0
]
=
(
char
)
c
+
'0'
;
safestrcpy
(
kstacks
[
c
].
name
+
1
,
"kstack"
,
MAXNAME
-
1
);
initlock
(
&
kstacks
[
c
].
lock
,
kstacks
[
c
].
name
);
kstacks
[
c
].
size
=
KSTACKSIZE
;
slabmem
[
i
]
[
c
].
name
[
0
]
=
(
char
)
c
+
'0'
;
initlock
(
&
slabmem
[
i
][
c
].
lock
,
slabmem
[
i
]
[
c
].
name
);
}
}
cprintf
(
"%lu mbytes
\n
"
,
membytes
/
(
1
<<
20
));
...
...
@@ -255,16 +281,9 @@ initkalloc(u64 mbaddr)
p
=
(
char
*
)
PGROUNDUP
((
uptr
)
newend
);
k
=
(((
uptr
)
p
)
-
KBASE
);
for
(
int
c
=
0
;
c
<
NCPU
;
c
++
)
{
// Fill the stack allocator
for
(
int
i
=
0
;
i
<
CPUKSTACKS
;
i
++
,
k
+=
KSTACKSIZE
)
{
if
(
p
==
(
void
*
)
-
1
)
panic
(
"initkalloc: e820next"
);
// XXX(sbw) handle this condition
if
(
memsize
(
p
)
<
KSTACKSIZE
)
panic
(
"initkalloc: e820size"
);
kfree_pool
(
&
kstacks
[
c
],
p
);
p
=
memnext
(
p
,
KSTACKSIZE
);
}
// Fill slab allocators
for
(
int
i
=
0
;
i
<
NELEM
(
slabmem
);
i
++
)
slabinit
(
&
slabmem
[
i
][
c
],
&
p
,
&
k
);
// The rest goes to the page allocator
for
(;
k
!=
n
;
k
+=
PGSIZE
,
p
=
memnext
(
p
,
PGSIZE
))
{
...
...
kalloc.h
浏览文件 @
0fae9896
...
...
@@ -4,9 +4,10 @@ struct run {
struct
kmem
{
char
name
[
MAXNAME
];
u64
size
;
u64
ninit
;
struct
spinlock
lock
;
struct
run
*
freelist
;
u64
size
;
u64
nfree
;
}
__mpalign__
;
...
...
kernel.h
浏览文件 @
0fae9896
...
...
@@ -114,8 +114,12 @@ void iderw(struct buf*);
void
ioapicenable
(
int
irq
,
int
cpu
);
// kalloc.c
typedef
enum
{
slab_stack
,
slab_perf
,
}
slab_t
;
char
*
kalloc
(
void
);
char
*
ksalloc
(
void
);
void
*
ksalloc
(
slab_t
);
void
kfree
(
void
*
);
void
*
kmalloc
(
u64
);
void
kmfree
(
void
*
);
...
...
main.c
浏览文件 @
0fae9896
...
...
@@ -62,7 +62,7 @@ bootothers(void)
// Tell bootother.S what stack to use and the address of apstart;
// it expects to find these two addresses stored just before
// its first instruction.
stack
=
ksalloc
();
stack
=
ksalloc
(
slab_stack
);
*
(
u32
*
)(
code
-
4
)
=
(
u32
)
v2p
(
&
apstart
);
*
(
u64
*
)(
code
-
12
)
=
(
u64
)
stack
+
KSTACKSIZE
;
...
...
param.h
浏览文件 @
0fae9896
...
...
@@ -19,14 +19,17 @@
#define NCPU 16 // maximum number of CPUs
#define MTRACE 0
#define WQENABLE 0 // Enable work queue
#define PERFSIZE 1<<30ull
#elif defined(HW_qemu)
#define NCPU 4 // maximum number of CPUs
#define MTRACE 0
#define WQENABLE 0 // Enable work queue
#define PERFSIZE 16<<20ull
#elif defined(HW_ud0)
#define NCPU 4 // maximum number of CPUs
#define MTRACE 0
#define WQENABLE 0 // Enable work queue
#define PERFSIZE 512<<20ull
#else
#error "Unknown HW"
#endif
proc.c
浏览文件 @
0fae9896
...
...
@@ -201,7 +201,7 @@ allocproc(void)
panic
(
"allocproc: ns_insert"
);
// Allocate kernel stack if possible.
if
((
p
->
kstack
=
ksalloc
())
==
0
){
if
((
p
->
kstack
=
ksalloc
(
slab_stack
))
==
0
){
if
(
ns_remove
(
nspid
,
KI
(
p
->
pid
),
p
)
==
0
)
panic
(
"allocproc: ns_remove"
);
gc_delayed
(
p
,
kmfree
);
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论