日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux第一条指令地址,arm-linux 启动代码分析——stage1 (1)

發布時間:2023/12/1 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux第一条指令地址,arm-linux 启动代码分析——stage1 (1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文針對arm linux, 從kernel的第一條指令開始分析,一直分析到進入start_kernel()函數.

我們當前以linux-2.6.19內核版本作為范例來分析,本文中所有的代碼,前面都會加上行號以便于和源碼進行對照.

例:

在文件init/main.c中:

00478: asmlinkage void __init start_kernel(void)

前面的"00478:" 表示478行,冒號后面的內容就是源碼了.

在分析代碼的過程中,我們使用縮進來表示各個代碼的調用層次.

由于啟動部分有一些代碼是平臺特定的,雖然大部分的平臺所實現的功能都比較類似,但是為了更好的對code進行說明,對于平臺相關的代碼,我們選擇at91(ARM926EJS)平臺進行分析.

另外,本文是以uncompressed kernel開始講解的.對于內核解壓縮部分的code,在

arch/arm/boot/compressed中,本文不做討論.

一. 啟動條件

通常從系統上電到執行到linux kenel這部分的任務是由boot

loader來完成.

關于boot loader的內容,本文就不做過多介紹.

這里只討論進入到linux kernel的時候的一些限制條件,這一般是boot

loader在最后跳轉到kernel之前要完成的:

1.

CPU必須處于SVC(supervisor)模式,并且IRQ和FIQ中斷都是禁止的;

2. MMU(內存管理單元)必須是關閉的, 此時虛擬地址對物理地址;

3. 數據cache(Data cache)必須是關閉的

4. 指令cache(Instruction

cache)可以是打開的,也可以是關閉的,這個沒有強制要求;

5. CPU 通用寄存器0 (r0)必須是 0;

6. CPU 通用寄存器1 (r1)必須是 ARM Linux machine

type (關于machine type, 我們后面會有講解)

7. CPU 通用寄存器2 (r2) 必須是 kernel parameter

list 的物理地址(parameter list 是由boot

loader傳遞給kernel,用來描述設備信息屬性的列表,詳細內容可參考"Booting ARM Linux"文檔).

二. starting kernel

首先,我們先對幾個重要的宏進行說明(我們針對有MMU的情況):

宏?位置?默認值?說明

KERNEL_RAM_ADDR?arch/arm/kernel/head.S

+26?0xc0008000?kernel在RAM中的的虛擬地址

PAGE_OFFSET?include/asm-arm/memeory.h

+50?0xc0000000?內核空間的起始虛擬地址

TEXT_OFFSET?arch/arm/Makefile

+137?0x00008000?內核相對于存儲空間的偏移

TEXTADDR?arch/arm/kernel/head.S

+49

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Linux第一条指令地址,arm-linux 启动代码分析——stage1 (1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。