Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
19f389d9
提交
19f389d9
2月 16, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
kalloc.c -> kalloc.cc
上级
63976a43
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
54 行增加
和
37 行删除
+54
-37
bootdata.c
bootdata.c
+25
-0
kalloc.cc
kalloc.cc
+14
-30
kalloc.h
kalloc.h
+9
-0
kernel.h
kernel.h
+2
-7
main.cc
main.cc
+2
-0
proc.cc
proc.cc
+1
-0
sampler.cc
sampler.cc
+1
-0
没有找到文件。
bootdata.c
浏览文件 @
19f389d9
#include "types.h"
#include "mmu.h"
#include "spinlock.h"
#include "kalloc.h"
/*
* Data structures that use C99 designated initializers,
* which aren't avialable in C++11.
*/
struct
segdesc
__attribute__
((
aligned
(
16
)))
bootgdt
[
NSEGS
]
=
{
// null
...
...
@@ -18,3 +25,21 @@ struct segdesc __attribute__((aligned(16))) bootgdt[NSEGS] = {
[
7
]
=
SEGDESC
(
0
,
0
,
SEG_R
|
SEG_CODE
|
SEG_S
|
SEG_DPL
(
3
)
|
SEG_P
|
SEG_L
|
SEG_G
),
};
struct
kmem
slabmem
[
slab_type_max
][
NCPU
]
=
{
[
slab_stack
][
0
...
NCPU
-
1
]
=
{
.
name
=
" kstack"
,
.
size
=
KSTACKSIZE
,
.
ninit
=
CPUKSTACKS
,
},
[
slab_perf
][
0
...
NCPU
-
1
]
=
{
.
name
=
" kperf"
,
.
size
=
PERFSIZE
,
.
ninit
=
1
,
},
[
slab_kshared
][
0
...
NCPU
-
1
]
=
{
.
name
=
" kshared"
,
.
size
=
KSHAREDSIZE
,
.
ninit
=
CPUKSTACKS
,
},
};
kalloc.c
→
kalloc.c
c
浏览文件 @
19f389d9
...
...
@@ -3,6 +3,7 @@
// Slab allocator, for chunks larger than one page.
//
extern
"C"
{
#include "types.h"
#include "mmu.h"
#include "kernel.h"
...
...
@@ -11,29 +12,12 @@
#include "mtrace.h"
#include "cpu.h"
#include "multiboot.h"
}
static
struct
Mbmem
mem
[
128
];
static
u64
nmem
;
static
u64
membytes
;
struct
kmem
kmems
[
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
,
},
[
slab_kshared
][
0
...
NCPU
-
1
]
=
{
.
name
=
" kshared"
,
.
size
=
KSHAREDSIZE
,
.
ninit
=
CPUKSTACKS
,
},
};
extern
char
end
[];
// first address after kernel loaded from ELF file
char
*
newend
;
...
...
@@ -50,7 +34,7 @@ memsearch(paddr pa)
for
(
e
=
&
mem
[
0
];
e
<
q
;
e
++
)
if
((
e
->
base
<=
pa
)
&&
((
e
->
base
+
e
->
length
)
>
pa
))
return
e
;
return
NULL
;
return
0
;
}
static
u64
...
...
@@ -93,11 +77,11 @@ initmem(u64 mbaddr)
struct
Mbmem
*
mbmem
;
u8
*
p
,
*
ep
;
mb
=
p2v
(
mbaddr
);
mb
=
(
Mbdata
*
)
p2v
(
mbaddr
);
if
(
!
(
mb
->
flags
&
(
1
<<
6
)))
panic
(
"multiboot header has no memory map"
);
p
=
p2v
(
mb
->
mmap_addr
);
p
=
(
u8
*
)
p2v
(
mb
->
mmap_addr
);
ep
=
p
+
mb
->
mmap_length
;
while
(
p
<
ep
)
{
...
...
@@ -121,7 +105,7 @@ pgalloc(void)
void
*
p
=
(
void
*
)
PGROUNDUP
((
uptr
)
newend
);
memset
(
p
,
0
,
PGSIZE
);
newend
=
newend
+
PGSIZE
;
return
p
;
return
(
char
*
)
p
;
}
// Free the page of physical memory pointed at by v,
...
...
@@ -210,7 +194,7 @@ kalloc(void)
}
void
*
ksalloc
(
slab_
t
slab
)
ksalloc
(
in
t
slab
)
{
return
kalloc_pool
(
slabmem
[
slab
]);
}
...
...
@@ -225,7 +209,7 @@ slabinit(struct kmem *k, char **p, u64 *off)
if
(
memsize
(
p
)
<
k
->
size
)
panic
(
"slabinit: memsize"
);
kfree_pool
(
k
,
*
p
);
*
p
=
memnext
(
*
p
,
k
->
size
);
*
p
=
(
char
*
)
memnext
(
*
p
,
k
->
size
);
*
off
=
*
off
+
k
->
size
;
}
}
...
...
@@ -247,7 +231,7 @@ initkalloc(u64 mbaddr)
kmems
[
c
].
size
=
PGSIZE
;
}
for
(
int
i
=
0
;
i
<
NELEM
(
slabmem
)
;
i
++
)
{
for
(
int
i
=
0
;
i
<
slab_type_max
;
i
++
)
{
for
(
int
c
=
0
;
c
<
NCPU
;
c
++
)
{
slabmem
[
i
][
c
].
name
[
0
]
=
(
char
)
c
+
'0'
;
initlock
(
&
slabmem
[
i
][
c
].
lock
,
...
...
@@ -269,7 +253,7 @@ initkalloc(u64 mbaddr)
slabinit
(
&
slabmem
[
i
][
c
],
&
p
,
&
k
);
// The rest goes to the page allocator
for
(;
k
!=
n
;
k
+=
PGSIZE
,
p
=
memnext
(
p
,
PGSIZE
))
{
for
(;
k
!=
n
;
k
+=
PGSIZE
,
p
=
(
char
*
)
memnext
(
p
,
PGSIZE
))
{
if
(
p
==
(
void
*
)
-
1
)
panic
(
"initkalloc: e820next"
);
kfree_pool
(
&
kmems
[
c
],
p
);
...
...
@@ -285,14 +269,14 @@ initkalloc(u64 mbaddr)
void
kfree
(
void
*
v
)
{
verifyfree
(
v
,
mykmem
()
->
size
);
kfree_pool
(
mykmem
(),
v
);
verifyfree
(
(
char
*
)
v
,
mykmem
()
->
size
);
kfree_pool
(
mykmem
(),
(
char
*
)
v
);
}
void
ksfree
(
slab_
t
slab
,
void
*
v
)
ksfree
(
in
t
slab
,
void
*
v
)
{
kfree_pool
(
slabmem
[
slab
],
v
);
kfree_pool
(
slabmem
[
slab
],
(
char
*
)
v
);
}
void
...
...
kalloc.h
浏览文件 @
19f389d9
...
...
@@ -11,4 +11,13 @@ struct kmem {
u64
nfree
;
}
__mpalign__
;
enum
{
slab_stack
,
slab_perf
,
slab_kshared
,
slab_type_max
};
extern
struct
kmem
kmems
[
NCPU
];
extern
struct
kmem
slabmem
[
slab_type_max
][
NCPU
];
kernel.h
浏览文件 @
19f389d9
...
...
@@ -125,15 +125,10 @@ void iderw(struct buf*);
void
ioapicenable
(
int
irq
,
int
cpu
);
// kalloc.c
typedef
enum
{
slab_stack
,
slab_perf
,
slab_kshared
,
}
slab_t
;
char
*
kalloc
(
void
);
void
kfree
(
void
*
);
void
*
ksalloc
(
slab_t
);
void
ksfree
(
slab_t
,
void
*
);
void
*
ksalloc
(
int
slabtype
);
void
ksfree
(
int
slabtype
,
void
*
);
void
*
kmalloc
(
u64
);
void
kmfree
(
void
*
);
int
kmalign
(
void
**
p
,
int
align
,
u64
size
);
...
...
main.cc
浏览文件 @
19f389d9
...
...
@@ -2,6 +2,8 @@ extern "C" {
#include "types.h"
#include "multiboot.h"
#include "kernel.h"
#include "spinlock.h"
#include "kalloc.h"
#include "cpu.h"
#include "amd64.h"
}
...
...
proc.cc
浏览文件 @
19f389d9
...
...
@@ -11,6 +11,7 @@ extern "C" {
#include "bits.h"
#include "kmtrace.h"
#include "sched.h"
#include "kalloc.h"
}
#include "vm.hh"
...
...
sampler.cc
浏览文件 @
19f389d9
...
...
@@ -5,6 +5,7 @@ extern "C" {
#include "fs.h"
#include "kernel.h"
#include "stat.h"
#include "kalloc.h"
}
#include "file.hh"
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论