Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
你说什么
0SKernel2024-你说什么
Commits
4c5b3dff
Commit
4c5b3dff
authored
5 months ago
by
你说什么
Browse files
Options
Download
Patches
Plain Diff
技术文档
parent
753dc1ea
main
main-patch-8163
No related merge requests found
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
README.md
+1
-1
README.md
kernel/main.c
+31
-10
kernel/main.c
kernel/pmem.h
+2
-5
kernel/pmem.h
kernel/print.c
+1
-1
kernel/print.c
kernel/vmem.c
+2
-2
kernel/vmem.c
kernel/vmem.h
+1
-1
kernel/vmem.h
技术文档.pdf
+0
-0
技术文档.pdf
with
38 additions
and
20 deletions
+38
-20
README.md
+
1
−
1
View file @
4c5b3dff
...
...
@@ -51,7 +51,7 @@
### 工具链
riscv64-linux-gnu-
工具链
,例:
riscv64-linux-gnu-
toolchain
,例:
riscv64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04)11.4.0
...
...
This diff is collapsed.
Click to expand it.
kernel/main.c
+
31
−
10
View file @
4c5b3dff
...
...
@@ -20,8 +20,6 @@ void main() {
int
cpuid
=
r_tp
();
print_init
();
printf
(
"Enter main, cpuid: %d
\n
"
,
cpuid
);
...
...
@@ -37,33 +35,56 @@ void main() {
kvm_init
();
kvm_hartinit
();
printf
(
"----------------physical memorry test ----------------
\n
"
);
int
*
mem
[
16
];
for
(
int
i
=
0
;
i
<
16
;
i
++
)
{
mem
[
i
]
=
pmem_alloc
(
1
);
memset
(
mem
[
i
],
1
,
PAGESIZE
);
printf
(
"mem[%d]: %p alloced ,data= %d
\n
"
,
i
,
mem
[
i
],
mem
[
i
][
0
]);
}
for
(
int
i
=
0
;
i
<
16
;
i
++
)
{
pmem_free
(
1
,
mem
[
i
]);
printf
(
"mem[%d]: %p free
\n
"
,
i
,
mem
[
i
]);
}
printf
(
"----------------Page table test ----------------
\n
"
);
pgtbl_t
test_pgtbl
=
pmem_alloc
(
true
);
uint64
mem
[
5
];
uint64
mem
2
[
5
];
for
(
int
i
=
0
;
i
<
5
;
i
++
)
mem
[
i
]
=
(
uint64
)
pmem_alloc
(
false
);
mem
2
[
i
]
=
(
uint64
)
pmem_alloc
(
false
);
vm_map_pages
(
test_pgtbl
,
PAGESIZE
*
10
,
mem
[
1
],
PAGESIZE
/
2
,
PTE_R
|
PTE_W
);
vm_map_pages
(
test_pgtbl
,
PAGESIZE
*
512
,
mem
[
2
],
PAGESIZE
-
1
,
PTE_R
|
PTE_X
);
vm_map_pages
(
test_pgtbl
,
0
,
mem
[
0
],
PAGESIZE
,
PTE_R
);
vm_map_pages
(
test_pgtbl
,
PAGESIZE
*
512
*
512
,
mem
[
2
],
PAGESIZE
,
PTE_R
|
PTE_X
);
vm_map_pages
(
test_pgtbl
,
PAGESIZE
*
10
,
mem
2
[
1
],
PAGESIZE
/
2
,
PTE_R
|
PTE_W
);
vm_map_pages
(
test_pgtbl
,
PAGESIZE
*
512
,
mem
2
[
2
],
PAGESIZE
-
1
,
PTE_R
|
PTE_X
);
vm_map_pages
(
test_pgtbl
,
0
,
mem
2
[
0
],
PAGESIZE
,
PTE_R
);
vm_map_pages
(
test_pgtbl
,
PAGESIZE
*
512
*
512
,
mem
2
[
2
],
PAGESIZE
,
PTE_R
|
PTE_X
);
vm_map_pages
(
test_pgtbl
,
VA_MAX
-
PAGESIZE
,
mem
[
4
],
PAGESIZE
,
PTE_W
);
vm_map_pages
(
test_pgtbl
,
VA_MAX
-
PAGESIZE
,
mem
2
[
4
],
PAGESIZE
,
PTE_W
);
vm_print
(
test_pgtbl
);
//
while (1) {} // 无限循环
while
(
1
)
{}
// 无限循环
}
This diff is collapsed.
Click to expand it.
kernel/pmem.h
+
2
−
5
View file @
4c5b3dff
...
...
@@ -6,15 +6,12 @@
#include
"memlayout.h"
typedef
struct
page_node
{
struct
page_node
*
next
;
}
page_node_t
;
typedef
struct
alloc_zone
{
uint64
start
;
...
...
@@ -26,16 +23,16 @@ typedef struct alloc_zone
page_node_t
alloc_head
;
}
alloc_zone_t
;
static
alloc_zone_t
kernel_zone
,
user_zone
;
void
memset
(
void
*
begin
,
uint8
value
,
uint32
n
);
void
pmem_init
();
void
*
pmem_alloc
(
bool
inkernel
);
void
*
pmem_alloc
(
bool
inkernel
);
void
pmem_free
(
bool
inkernel
,
uint64
addr
);
...
...
This diff is collapsed.
Click to expand it.
kernel/print.c
+
1
−
1
View file @
4c5b3dff
...
...
@@ -211,7 +211,7 @@ void printf(char *fmt, ...)
ptr
++
;
}
va_end
(
args
);
spinlock_release
(
&
print_lk
);
...
...
This diff is collapsed.
Click to expand it.
kernel/vmem.c
+
2
−
2
View file @
4c5b3dff
...
...
@@ -107,7 +107,7 @@ void vm_map_pages(pgtbl_t pgtbl, uint64 va, uint64 pa, uint64 length, int perm)
}
// 解除
pgtbl中[va, va+len)区域的
映射
// 解除映射
// 如果freeit == true则释放对应物理页, 默认是用户的物理页
void
vm_unmap_pages
(
pgtbl_t
pgtbl
,
uint64
va
,
uint64
len
,
bool
freeit
)
{
...
...
@@ -150,7 +150,7 @@ void vm_unmap_pages(pgtbl_t pgtbl, uint64 va, uint64 len, bool freeit)
}
// 完成 UART CLINT PLIC 内核代码区 内核数据区 可分配区域 的映射
//
相当于
填充kernel_pgtbl
// 填充kernel_pgtbl
void
kvm_init
()
{
kernel_pgtbl
=
(
pgtbl_t
)
pmem_alloc
(
true
);
...
...
This diff is collapsed.
Click to expand it.
kernel/vmem.h
+
1
−
1
View file @
4c5b3dff
...
...
@@ -85,7 +85,7 @@ pte_t* vm_get_pte(pgtbl_t pgtbl,uint64 va,bool alloc);
void
vm_map_pages
(
pgtbl_t
pgtbl
,
uint64
va
,
uint64
pa
,
uint64
len
,
int
perm
);
void
vm_unmap_pages
(
pgtbl_t
pgtbl
,
uint64
va
,
uint64
len
,
bool
free
);
void
vm_unmap_pages
(
pgtbl_t
pgtbl
,
uint64
va
,
uint64
len
,
bool
free
it
);
void
kvm_init
();
void
kvm_hartinit
();
...
...
This diff is collapsed.
Click to expand it.
技术文档.pdf
0 → 100755
+
0
−
0
View file @
4c5b3dff
File added
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets