arm64_linux启动流程分析05_配置内核启动的临时页表
这篇内容讲讲页表的配置, 为了kernel运行速度加快, 我们需要启动cache, 启动cache需要先启动MMU让CPU运行到虚拟地址上, 那么我们就需要启动一个能覆盖KERNEL内存区域的页表.
本篇内容假设在您对MMU有一定的了解的基础上来讲述的.
我们假设使用4K页来管理内存, 同时虚拟地址使用48位地址
这篇内容讲讲页表的配置, 为了kernel运行速度加快, 我们需要启动cache, 启动cache需要先启动MMU让CPU运行到虚拟地址上, 那么我们就需要启动一个能覆盖KERNEL内存区域的页表.
本篇内容假设在您对MMU有一定的了解的基础上来讲述的.
我们假设使用4K页来管理内存, 同时虚拟地址使用48位地址
这篇内容主要是说一下KASLR
KASLR是让内核在一个随机的地址上运行的技术, 就是说内核的运行时地址是随机的, 每次启动会变化. 这样内核的符号对应的地址会变化并不是链接地址从而加强安全性. 这里画一个图
1 | +---------------+-------+-------------+---------------------- |
接下来看el2_setup
1 | ENTRY(el2_setup) |
解上节, 我们先来看看bl preserve_boot_args
1 | preserve_boot_args: |
本次分析使用的linux内核的版本时 4.14.2, 读者可以自己下载了对照分析
首先看链接文件如下:
1 | ENTRY(_text) |
by gngshn gngshn@gmail.com
上一篇, 我们讲到了libuv的工作队列, 这一篇我们讲到的文件操作刚好就用到了工作队列. 刚好复习一下.
先来看一段libuv文件操作的代码
by gngshn gngshn@gmail.com
libuv通过uv_work_queue
来交付任务给工作队列的, 这个api也是libuv实现文件异步操作的基础:
1 | UV_EXTERN int uv_queue_work(uv_loop_t* loop, |
by gngshn gngshn@gmail.com
上一篇, 我们将到libuv的event loop过程, 其中留了个悬念, 下面我们来解除这个悬念, 直接上函数, 这个函数特别长, 我们依旧直接在函数里面写注释把~
by gngshn gngshn@gmail.com
上一篇文章我们讲到了 libuv的初始化, 现在乘热打铁, 我们接着看看 libuv的 event loop是如何运转的.
对于 event loop的运转在其官方的文档中有详细的描述
libuv design overview
event loop的流程图如下
by gngshn gngshn@gmail.com
从这里开始我将从linux的角度来看看libuv的工作原理, 如果您希望看到libuv跨平台的实现方式, 那你可能要失望了. 因为这一系列文章都将从linux的角度来写.
我们知道如果需要使用libuv的event loop需要通过uv_default_loop
或者uv_loop_init
来获得一个loop, 前者也是会调用后者的. 所以我们来看看uv_loop_init
到底做了些什么, 我将在source code中进行直接写注释来描述相关字段的含义.