Skip to content

Commit 41f1268

Browse files
committed
docs
1 parent a6c8a2b commit 41f1268

10 files changed

+44
-4
lines changed

Makefile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ SRC := arch/x86/boot kernel mm drivers
55
all: clean iso
66

77
iso: build
8-
ld -b elf64-x86-64 -z muldefs -o kernel.elf -T link.lds $(shell find $(SRC) -name "*.o")
8+
ld -b elf64-x86-64 -z muldefs -o kernel.elf -Map=./kernel.map -T link.lds $(shell find $(SRC) -name "*.o")
99
@bash build_iso.sh
1010

1111
build: $(SRC)
@@ -17,4 +17,7 @@ clean: $(SRC)
1717
@for s in $(SRC); do \
1818
make -C $$s clean || exit 1; \
1919
done
20-
rm -rf *.elf *.iso
20+
rm -rf *.elf *.iso *.map
21+
22+
qemu-run:
23+
qemu-system-x86_64 -m 2G HelloOS.iso

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
1. 安装依赖
88

99
```bash
10-
$ apt install -y make gcc grub git
10+
$ apt install -y make gcc grub git xorriso
1111
```
1212

1313
2. 代码拉取
7.49 MB
Binary file not shown.
137 KB
Binary file not shown.

docs/resources/memory_addr.png

13 KB
Loading

docs/resources/seg_gdtr.png

20.7 KB
Loading
190 KB
Binary file not shown.

docs/resources/segment_selector.webp

204 KB
Binary file not shown.

docs/分段分页.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
## 内存地址
2+
![](./resources/memory_addr.png)
3+
4+
* 逻辑地址:程序代码指令中的地址,可以认为是虚拟地址;
5+
* 线性地址:逻辑地址经过分段计算后得到。在现代 x86-64 位操作系统中,线性地址和逻辑地址是一样的;
6+
* 物理地址:线性地址经过 MMU 后,得到物理上真正地址;
7+
8+
9+
10+
## 分段
11+
12+
段描述符:用于描述一个段的信息。在长模式下,其格式是:
13+
14+
<img src="./resources/segment_descriptor.webp" style="zoom:13%;" />
15+
16+
在操作系统中,多个段描述符组成一个描述符表。通过 gdtr(全局描述符寄存器)指向表的基地址。
17+
18+
> 还有一个 ldtr(局部描述符寄存器),现代操作系统都是通过分页来管理内存,分段处理只是为了兼容,ldtr 用的比较少,所以也不讨论 ldtr。
19+
20+
段选择子:通过段选择子可以确定该使用哪个段描述符:
21+
22+
<img src="./resources/segment_selector.webp" style="zoom:23%;" />
23+
24+
通过分段来计算线性地址流程:
25+
26+
![](./resources/seg_gdtr.png)
27+
28+
同理,在长模式下中断门描述符格式:
29+
30+
<img src="./resources/interceptor_descriptor.webp" style="zoom:13%;" />
31+
32+
33+
34+
35+
36+
37+

mm/mm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void page_bitmap_init(uint_t start_addr) {
5252

5353
gmdsc.total_mem_length = total_mem;
5454
gmdsc.page_bits = (uint_t*)start_addr;
55-
gmdsc.page_bits_size = total_mem >> PAGE_4K_SHIFT;
55+
gmdsc.page_bits_size = total_mem >> PAGE_4K_SHIFT;
5656
gmdsc.page_bits_length = (((uint_t)(total_mem >> PAGE_4K_SHIFT) + sizeof(uint_t) * 8 - 1) / 8) & ( ~ (sizeof(uint_t) - 1));
5757
kinfo("page_bitmap start_addr:%x page_bits_size:%d page_bits_length:%d\n", gmdsc.page_bits, gmdsc.page_bits_size, gmdsc.page_bits_length);
5858
memset(gmdsc.page_bits, 0xff, gmdsc.page_bits_length);

0 commit comments

Comments
 (0)