or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
載入,連結與重配置
延續學習實作小型作業系統筆記,目標是學習 Implementing Loadable Kernel Modules for Linux 這份 Journal, 並實做出能動態載入的 component
printf
這個功能在 kernel 裡面,我們先編譯但不連結,使用指令:aarch64-linux-gnu-gcc -c -I./include ksym.c -o ksym.o
ksym.c
printf.h
: 在前處理時載入.rodata
的字串和tfp_printf
還未填入值。ksym.o
檔的以上 4個 section ,放置在913c8
,因為這份裡只有.text
和.rodata
,com
是我寫的指令,主要是做搬到 kernel mode 的記憶體空間並執行。.rela.text
裡有三個 entry 要重填,為了方邊觀看,利用readelf -r file
:90000000
如果不改,就是由當前 page00091000
出發,也就是 add 要填要找的.rodata
offset 為 3e8,910fa000
<3e8 * 4 = fa0>, bl 為相對位置填入97fdd405
(bl 解說)printf
出Read kernel module!
組語和機器碼 adrp, add, bl
adrp
adrp
反組譯後的 objcode (機器碼) 不太理解,因為他的 offset 總跟我算起來的不太一樣,因此去查了Armv8 規格書 p225, 發現 immediate 被分成immhi:immlow
並分散於23-5
bits,30-29
bits,是相對於當前的 page 數,並乘上 4096:adrp
舉例,例子來自於我 kernel 內的反組譯的程式碼,有開 MMU 因此為地址base(0xffff000000000000) + offset,而在ffff000000007224
行,相對的 Page 為 0x93(目標page) - 0x7(pc所在page) = 0x8c, 46(immhi):0(immlo)也等於 8c,0-4 bits 為通用暫存器,這裡使用x0
,及填入為90000460
:add
91008000
,bl
913d8
,而要 jump 的數在0x63ec
<tfp_printf>,因為是往回跳,會用到 2補數,且此指令也是 pc-relative 所以用減的,913d8 - 63ec = 8afec
, 指令 4 byte:8afec/4 = 22bfb
, 二補數:3ffffff (0-25 bit 都為 1) - 22bfb = 3fdd404, 3fdd404 + 1 =3fdd405
,再把 imidiate 放進以下格式,為97fdda05
完整 objcode