在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux匯編啟動relocate重定向分析

麥辣雞腿堡 ? 來源:嵌入式Linux充電站 ? 作者:Vincent ? 2023-10-08 11:32 ? 次閱讀

relocate

relocate重定向,就是在開啟mmu。開啟mmu的操作就是將一級頁表的地址以及權(quán)限寫到satp寄存器中,這就算開啟mmu了。

#ifdef CONFIG_MMU
    la a0, early_pg_dir //跳轉(zhuǎn)到relocate前,先把第一級頁表early_pg_dir的地址存入a0
    call relocate		//跳轉(zhuǎn)到relocate,開啟MMU
#endif

relocate有兩次開啟mmu的操作,第一次開啟mmu使用的是setup_vm()建立的trampoline_gd_dir頁表,這頁表保存的是kernel的前2M內(nèi)存。第二次開啟MMU使用的是early_pg_dir頁表,這個頁表映射了整個kernel內(nèi)存以及dtb的4M空間。

如果trampoline_pg_dir或者early_pg_dir這兩個頁表的映射沒弄好的話,開啟MMU的時候就會失敗,所以頁表的建立十分關(guān)鍵。頁表創(chuàng)建后續(xù)再深究,下面分析relocate匯編代碼。

  • 計算返回地址
    返回地址就是ra加上虛擬地址和物理地址之間的偏移量,這個是固定偏移量。PAGE_OFFSETkernel入口地址對應(yīng)的虛擬地址,_start就是kernel入口地址的虛擬地址,PAGE_OFFSET - _start就得到它們之間的偏移,然后再和ra相加,就是返回地址。
/* Relocate return address */
	li a1, PAGE_OFFSET
	la a2, _start
	sub a1, a1, a2
	add ra, ra, a1
  • 將異常入口1f的虛擬地址寫入stvec寄存器
    因?yàn)橐坏╅_啟MMU,地址都變成了虛擬地址,原來訪問的都是物理地址,開啟MMU時,地址發(fā)生了改變,VA != PA,從而進(jìn)入異常,所以要先設(shè)置異常入口地址,此時的異常入口為1f
/* Point stvec to virtual address of intruction after satp write */
	la a2, 1f
	add a2, a2, a1
	csrw CSR_TVEC, a2
  • 提前計算切換到early_pg_dir頁表要寫入satp的值

再進(jìn)入relocate之前,就已經(jīng)把early_pg_dir賦值給a0了,所以a0是early_pg_dir。srl是邏輯右移,mmu使用的是sv39,虛擬地址39位,物理地址56位:

圖片低12位是偏移量,所以PAGE_SHIFT等于12,將early_pg_dir地址右移12位存到a2。根據(jù)satp寄存器定義:

圖片

MODE等于0x8代表使用sv39 mmu0x0代表不進(jìn)行地址翻譯,即不開啟MMU。這里STAP_MODEsv39,即0x8。將early_pg_dir地址和SATP_MODE進(jìn)行或運(yùn)算后,即可得到寫入satp寄存器的值,最后保存到a2

/* Compute satp for kernel page tables, but don't load it yet */
	srl a2, a0, PAGE_SHIFT
	li a1, SATP_MODE	//sv39 mmu
	or a2, a2, a1
  • 第一次開啟MMU,使用trampoline_pg_dir頁表

satp值的計算和上述是一樣的。開啟MMU之前,通過sfence.vma命令先刷新TLB。此時開啟MMU,就會進(jìn)入下面的標(biāo)號為1的匯編段

la a0, trampoline_pg_dir
	srl a0, a0, PAGE_SHIFT
	or a0, a0, a1
	sfence.vma	
	csrw CSR_SATP, a0

進(jìn)入異常1f段,重新設(shè)置異常入口為.Lsecondary_park,然后切換到early_pg_dir頁表,相當(dāng)于第二次開啟MMU。此時,如果之前建立的early_pg_dir頁表不對,則會就進(jìn)入.Lsecondary_park.Lsecondary_park里面是個wfi指令,是個死循環(huán)。

完整relocate匯編代碼:

relocate:
	/* Relocate return address */
	li a1, PAGE_OFFSET
	la a2, _start
	sub a1, a1, a2
	add ra, ra, a1

	/* Point stvec to virtual address of intruction after satp write */
	la a2, 1f
	add a2, a2, a1
	csrw CSR_TVEC, a2

	/* Compute satp for kernel page tables, but don't load it yet */
	srl a2, a0, PAGE_SHIFT
	li a1, SATP_MODE
	or a2, a2, a1

	/*
	 * Load trampoline page directory, which will cause us to trap to
	 * stvec if VA != PA, or simply fall through if VA == PA.  We need a
	 * full fence here because setup_vm() just wrote these PTEs and we need
	 * to ensure the new translations are in use.
	 */
	la a0, trampoline_pg_dir
	srl a0, a0, PAGE_SHIFT
	or a0, a0, a1
	sfence.vma
	csrw CSR_SATP, a0
.align 2
1:
	/* Set trap vector to spin forever to help debug */
	la a0, .Lsecondary_park
	csrw CSR_TVEC, a0

	/* Reload the global pointer */
.option push
.option norelax
	la gp, __global_pointer$
.option pop

	/*
	 * Switch to kernel page tables.  A full fence is necessary in order to
	 * avoid using the trampoline translations, which are only correct for
	 * the first superpage.  Fetching the fence is guarnteed to work
	 * because that first superpage is translated the same way.
	 */
	csrw CSR_SATP, a2
	sfence.vma

	ret
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11419

    瀏覽量

    212281
  • 匯編
    +關(guān)注

    關(guān)注

    2

    文章

    214

    瀏覽量

    26337
  • MMU
    MMU
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    18568
  • 地址表
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    881
收藏 人收藏

    評論

    相關(guān)推薦

    Linux后臺程序重定向的問題

    目前有一種方法是在程序后臺啟動的時候,直接重定向到某個shell或telnet。方法如下:如tty命令查看目標(biāo)shell為 /dev/pts/0./yourapp & > /dev
    發(fā)表于 08-22 13:54

    linux shell數(shù)據(jù)重定向(輸入重定向與輸出重定向)詳細(xì)分析

    在了解重定向之前,我們先來看看linux 的文件描述符。linux文件描述符:可以理解為linux跟蹤打開文件,而分配的一個數(shù)字,這個數(shù)字有點(diǎn)類似c語言操作文件時候的句柄,通過句柄就可
    發(fā)表于 03-02 13:59

    Linux Shell系列教程之(十六) Shell輸入輸出重定向

      一、Shell輸入輸出重定向概述  在了解重定向相關(guān)知識之前,我們先來看看Linux的文件描述符。  Linux的文件描述符可以理解為linux
    發(fā)表于 09-12 15:53

    如何對Linux Bash輸入輸出重定向

    Linux - Bash - 輸入輸出重定向
    發(fā)表于 04-27 09:01

    Linux輸入與輸出的重定向介紹

    Linux輸入與輸出的重定向
    發(fā)表于 06-12 14:54

    實(shí)現(xiàn)printf函數(shù)的重定向

    目錄重定向函數(shù)屬性設(shè)置重定向函數(shù)在配置好串口之后需要在相關(guān)文件中添加以下函數(shù)以實(shí)現(xiàn)printf函數(shù)的重定向//注意添加頭文件#include "stdio.h"#ifdef
    發(fā)表于 08-24 07:09

    MDK的重定向與printf的重定向有什么不一樣?

    MDK的重定向與printf的重定向有什么不一樣?
    發(fā)表于 12-01 06:05

    串口重定向是什么意思?

    串口重定向是什么意思?
    發(fā)表于 12-08 06:57

    DNS 重定向的缺陷

    DNS 重定向的缺陷 這一種路由解決方案,由于充分利用了現(xiàn)有的網(wǎng)絡(luò)結(jié)構(gòu),結(jié)構(gòu)簡單,因而被人們認(rèn)為是一種有效的技術(shù),是現(xiàn)階段CDN 應(yīng)用中主
    發(fā)表于 03-25 10:25 ?2350次閱讀

    實(shí)現(xiàn)重定向printf()和scanf() 函數(shù)案例分析

    要想printf()和scanf() 函數(shù)工作,我們需要把printf()和scanf() 重新定向到串口中。重定向是指用戶可以自己重寫C 的庫函數(shù),當(dāng)連接器檢查到用戶編寫了與C 庫函數(shù)相同
    發(fā)表于 06-23 08:26 ?9549次閱讀
    實(shí)現(xiàn)<b class='flag-5'>重定向</b>printf()和scanf() 函數(shù)案例<b class='flag-5'>分析</b>

    ICMP重定向抓包分析 什么情況下路由器要向源發(fā)送ICMP重定向

    轉(zhuǎn)發(fā)。 ICMP重定向抓包分析 ICMP-Wiresharek抓包-PC端抓包 1.主機(jī)A發(fā)送ARPbroadcast報文,判斷目標(biāo)地址非本端網(wǎng)絡(luò),廣播尋找網(wǎng)關(guān); 2.主機(jī)A收到ARP報文關(guān)于網(wǎng)關(guān)
    的頭像 發(fā)表于 08-24 15:43 ?5754次閱讀
    ICMP<b class='flag-5'>重定向</b>抓包<b class='flag-5'>分析</b> 什么情況下路由器要向源發(fā)送ICMP<b class='flag-5'>重定向</b>

    Keil下使用STlink重定向printf的配置

    Keil下使用STlink重定向printf的配置1. printf 重定向Keil默認(rèn)下使用Micro LIB庫,該庫調(diào)用 fputs 實(shí)現(xiàn) printf,所以需要重新定義fputs函數(shù),以重定向
    發(fā)表于 12-27 18:43 ?18次下載
    Keil下使用STlink<b class='flag-5'>重定向</b>printf的配置

    Linux I/O重定向詳解

    Linux I/O重定向可以定義為,更改從命令讀取輸入到命令發(fā)送輸出的方式。你可以重定向命令的輸入和輸出。對于重定向符號,可以是 或者 | 。
    的頭像 發(fā)表于 05-04 14:34 ?982次閱讀

    2分鐘搞懂輸出重定向

    視頻最后我們通過重定向把標(biāo)準(zhǔn)輸出寫到了文件中,但是錯誤輸出還是留在了屏幕上。
    的頭像 發(fā)表于 01-15 16:41 ?701次閱讀

    全面掌握Linux重定向技巧:讓命令行操作效率翻倍的秘密

    #1 linux輸出重定向 $ command > file 2>1 這里的 ,表示重定向的目標(biāo)不是一個 文件 ,而是一個 文件描述符 ,內(nèi)置的文件描述符如下 1 => stdout2
    的頭像 發(fā)表于 01-08 10:19 ?404次閱讀
    主站蜘蛛池模板: 免费公开视频人人人人人人人 | 伊人精品视频在线 | 欧美zoozzooz性欧美 | 欧美夜夜 | 天堂在线观看免费视频 | 香港三澳门三日本三级 | 涩多多在线观看 | 中文字幕天天躁夜夜狠狠综合 | 99国产精品久久久久久久成人热 | a毛片免费观看完整 | 免费观看视频网站 | 久久久久久久久久久观看 | 精品国产一二三区在线影院 | 在线观看亚洲一区 | 日本污全彩肉肉无遮挡彩色 | 97av在线| 亚洲 欧洲 日产 韩国在线 | 神马福利 | 天堂网www中文在线资源 | 人人射人人插 | 亚洲你懂得| 国产va免费精品观看 | 日韩毛片大全免费高清 | 欧美一区二区三区免费高 | 免费在线你懂的 | 亚洲区中文字幕 | 9999毛片免费看 | 五月天婷婷爱 | 天天色综| 末发育女一区二区三区 | 亚洲精品福利视频 | 国内精品一区二区在线观看 | 亚洲成人综合在线 | 美女天天操| 国产精品久久在线观看 | 看全色黄大色大片免费久久 | 青楼社区51在线视频视频 | 偷偷狠狠的日日2020 | 激情综合五月亚洲婷婷 | 人操人| 永久免费的啪啪免费的网址 |