gngshn的博客

专注, 平静

这篇内容讲讲页表的配置, 为了kernel运行速度加快, 我们需要启动cache, 启动cache需要先启动MMU让CPU运行到虚拟地址上, 那么我们就需要启动一个能覆盖KERNEL内存区域的页表.

本篇内容假设在您对MMU有一定的了解的基础上来讲述的.

我们假设使用4K页来管理内存, 同时虚拟地址使用48位地址

阅读全文 »

这篇内容主要是说一下KASLR

KASLR是让内核在一个随机的地址上运行的技术, 就是说内核的运行时地址是随机的, 每次启动会变化. 这样内核的符号对应的地址会变化并不是链接地址从而加强安全性. 这里画一个图

1
2
3
4
5
6
7
8
9
10
+---------------+-------+-------------+----------------------
| | | |
| 2M align resv | KASLR | TEXT_OFFSET | KERNEL IMAGE
| | | |
+---------------+-------+-------------+----------------------
| | |
| | +----内核在DDR中的位置.
| +----------------- ARM64规定的KERNEL运行前必须放在 2M对齐地址+TEXT_OFFSET 的地方
| 这里是经过KASLR技术relocate之后的位置.
+----------------------------------------- DDR起始地址.
阅读全文 »

接下来看el2_setup

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ENTRY(el2_setup)
msr SPsel, #1 // We want to use SP_EL{1,2}
mrs x0, CurrentEL
cmp x0, #CurrentEL_EL2
b.eq 1f
mrs x0, sctlr_el1
CPU_BE( orr x0, x0, #(3 << 24) ) // Set the EE and E0E bits for EL1
CPU_LE( bic x0, x0, #(3 << 24) ) // Clear the EE and E0E bits for EL1
msr sctlr_el1, x0
mov w0, #BOOT_CPU_MODE_EL1 // This cpu booted in EL1
isb
ret

1: mrs x0, sctlr_el2
......省略......
阅读全文 »

解上节, 我们先来看看bl preserve_boot_args

1
2
3
4
5
6
7
8
9
10
11
12
13
preserve_boot_args:
mov x21, x0 // x21=FDT

adr_l x0, boot_args // record the contents of
stp x21, x1, [x0] // x0 .. x3 at kernel entry
stp x2, x3, [x0, #16]

dmb sy // needed before dc ivac with
// MMU off

mov x1, #0x20 // 4 x 8 bytes
b __inval_dcache_area // tail call
ENDPROC(preserve_boot_args)
阅读全文 »

本次分析使用的linux内核的版本时 4.14.2, 读者可以自己下载了对照分析

首先看链接文件如下:

1
2
3
4
5
6
7
8
9
10
11
ENTRY(_text)
SECTIONS
{
.....省略部分无关内容....

. = KIMAGE_VADDR + TEXT_OFFSET;

.head.text : {
_text = .;
HEAD_TEXT
}
阅读全文 »

by gngshn gngshn@gmail.com

从这里开始我将从linux的角度来看看libuv的工作原理, 如果您希望看到libuv跨平台的实现方式, 那你可能要失望了. 因为这一系列文章都将从linux的角度来写.

我们知道如果需要使用libuv的event loop需要通过uv_default_loop或者uv_loop_init来获得一个loop, 前者也是会调用后者的. 所以我们来看看uv_loop_init到底做了些什么, 我将在source code中进行直接写注释来描述相关字段的含义.

阅读全文 »
0%