亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 7974 | 回復(fù): 13
打印 上一主題 下一主題

[CPU及多核] arm上這個pv_stub有什么用? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-08-18 07:26 |只看該作者 |倒序?yàn)g覽
arm上這個pv_stub有什么用?

看著咋定義CONFIG_ARM_PATCH_PHYS_VIRT之后virt_to_phys偏移就加錯了,算錯了呢,有了解這個的大俠不?

-------------------------------------------------------------------------------------------------------------------------------------------------------
include/asm/memory.h  
-------------------------------------------------------------------------------------------------------------------------------------------------------
146/*
147 * Physical vs virtual RAM address space conversion.  These are
148 * private definitions which should NOT be used outside memory.h
149 * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
150 */
151#ifndef __virt_to_phys
152#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
153
154/*
155 * Constants used to force the right instruction encodings and shifts
156 * so that all we need to do is modify the 8-bit constant field.
157 */
158#define __PV_BITS_31_24 0x81000000
159
160extern unsigned long __pv_phys_offset;
161#define PHYS_OFFSET __pv_phys_offset
162
163#define __pv_stub(from,to,instr,type)                   \
164        __asm__("@ __pv_stub\n"                         \
165        "1:     " instr "       %0, %1, %2\n"           \
166        "       .pushsection .pv_table,\"a\"\n"         \
167        "       .long   1b\n"                           \
168        "       .popsection\n"                          \
169        : "=r" (to)                                     \
170        : "r" (from), "I" (type))
171
172static inline unsigned long __virt_to_phys(unsigned long x)
173{
174        unsigned long t;
175        __pv_stub(x, t, "add", __PV_BITS_31_24);
176        return t;
177}
178
179static inline unsigned long __phys_to_virt(unsigned long x)
180{
181        unsigned long t;
182        __pv_stub(x, t, "sub", __PV_BITS_31_24);
183        return t;
184}
185#else
186#define __virt_to_phys(x)       ((x) - PAGE_OFFSET + PHYS_OFFSET)
187#define __phys_to_virt(x)       ((x) - PHYS_OFFSET + PAGE_OFFSET)
188#endif
189#endif
190#endif /* __ASSEMBLY__ */
191
192#ifndef PHYS_OFFSET
193#ifdef PLAT_PHYS_OFFSET
194#define PHYS_OFFSET     PLAT_PHYS_OFFSET
195#else
196#define PHYS_OFFSET     UL(CONFIG_PHYS_OFFSET)
197#endif
198#endif

------------------------------------------------------------------------------------------------------------------------------------------------------
arch/arm/kernel/vmlinux.lds.S
------------------------------------------------------------------------------------------------------------------------------------------------------
197        .init.pv_table : {
198                __pv_table_begin = .;
199                *(.pv_table)
200                __pv_table_end = .;
201        }
------------------------------------------------------------------------------------------------------------------------------------------------------
arch/arm/kernel/module.c
------------------------------------------------------------------------------------------------------------------------------------------------------
319#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
320        s = find_mod_section(hdr, sechdrs, ".pv_table");
321        if (s)
322                fixup_pv_table((void *)s->sh_addr, s->sh_size);
323#endif
------------------------------------------------------------------------------------------------------------------------------------------------------
arch/arm/kernel/head.S
------------------------------------------------------------------------------------------------------------------------------------------------------
541#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
542
543/* __fixup_pv_table - patch the stub instructions with the delta between
544 * PHYS_OFFSET and PAGE_OFFSET, which is assumed to be 16MiB aligned and
545 * can be expressed by an immediate shifter operand. The stub instruction
546 * has a form of '(add|sub) rd, rn, #imm'.
547 */
548        __HEAD
549__fixup_pv_table:
550        adr     r0, 1f
551        ldmia   r0, {r3-r5, r7}
552        sub     r3, r0, r3      @ PHYS_OFFSET - PAGE_OFFSET
553        add     r4, r4, r3      @ adjust table start address
554        add     r5, r5, r3      @ adjust table end address
555        add     r7, r7, r3      @ adjust __pv_phys_offset address
556        str     r8, [r7]        @ save computed PHYS_OFFSET to __pv_phys_offset
557        mov     r6, r3, lsr #24 @ constant for add/sub instructions
558        teq     r3, r6, lsl #24 @ must be 16MiB aligned
559THUMB(  it      ne              @ cross section branch )
560        bne     __error
561        str     r6, [r7, #4]    @ save to __pv_offset
562        b       __fixup_a_pv_table
563ENDPROC(__fixup_pv_table)
564
565        .align
5661:      .long   .
567        .long   __pv_table_begin
568        .long   __pv_table_end
5692:      .long   __pv_phys_offset
570
571        .text
572__fixup_a_pv_table:
573#ifdef CONFIG_THUMB2_KERNEL
574        lsls    r6, #24
575        beq     2f
576        clz     r7, r6
577        lsr     r6, #24
578        lsl     r6, r7
579        bic     r6, #0x0080
580        lsrs    r7, #1
581        orrcs   r6, #0x0080
582        orr     r6, r6, r7, lsl #12
583        orr     r6, #0x4000
584        b       2f
5851:      add     r7, r3
586        ldrh    ip, [r7, #2]
587        and     ip, 0x8f00
588        orr     ip, r6  @ mask in offset bits 31-24
589        strh    ip, [r7, #2]
5902:      cmp     r4, r5
591        ldrcc   r7, [r4], #4    @ use branch for delay slot
592        bcc     1b
593        bx      lr
594#else
595        b       2f
5961:      ldr     ip, [r7, r3]
597        bic     ip, ip, #0x000000ff
598        orr     ip, ip, r6      @ mask in offset bits 31-24
599        str     ip, [r7, r3]
6002:      cmp     r4, r5
601        ldrcc   r7, [r4], #4    @ use branch for delay slot
602        bcc     1b
603        mov     pc, lr
604#endif
605ENDPROC(__fixup_a_pv_table)
606
607ENTRY(fixup_pv_table)
608        stmfd   sp!, {r4 - r7, lr}
609        ldr     r2, 2f                  @ get address of __pv_phys_offset
610        mov     r3, #0                  @ no offset
611        mov     r4, r0                  @ r0 = table start
612        add     r5, r0, r1              @ r1 = table size
613        ldr     r6, [r2, #4]            @ get __pv_offset
614        bl      __fixup_a_pv_table
615        ldmfd   sp!, {r4 - r7, pc}
616ENDPROC(fixup_pv_table)
617
618        .align
6192:      .long   __pv_phys_offset
620
621        .data
622        .globl  __pv_phys_offset
623        .type   __pv_phys_offset, %object
624__pv_phys_offset:
625        .long   0
626        .size   __pv_phys_offset, . - __pv_phys_offset
627__pv_offset:
628        .long   0
629#endif

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-08-23 19:10 |只看該作者
知道答案了,用來支持動態(tài)重定位的

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2014-12-17 14:15 |只看該作者
回復(fù) 2# unbutun


有那為高手可以解釋一下嗎?

為什麼可以做到動態(tài)轉(zhuǎn)換?


我目前卡在
  1. #define __pv_stub(from,to,instr,type)           \
  2.     __asm__("@ __pv_stub\n"             \
  3.     "1: " instr "   %0, %1, %2\n"       \
  4. [b]    "   .pushsection .pv_table,\"a\"\n"     \
  5.     "   .long   1b\n"               \
  6.     "   .popsection\n"              \[/b]
  7.     : "=r" (to)                 \
  8.     : "r" (from), "I" (type))
復(fù)制代碼
粗體字那幾行看不太懂為何這樣做

   

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [報(bào)告]
發(fā)表于 2014-12-17 16:36 |只看該作者
本帖最后由 arm-linux-gcc 于 2014-12-26 20:27 編輯

回復(fù) 3# wth0722


    內(nèi)核啟動過程中會去根據(jù)實(shí)際物理地址修改這個段中的指令,所以代碼中看到的是寫成的一個固定的數(shù)字,但是實(shí)際運(yùn)行時(shí)會去修改指令中的參數(shù)域,

由于這個參數(shù)域size有特殊的限制,所以內(nèi)核放置的物理地址必須按照16M對齊


論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2014-12-19 13:42 |只看該作者
回復(fù) 4# arm-linux-gcc


首先先感謝你的回復(fù)

我想要問的是下面那三行是代表什麼意思

"   .pushsection .pv_table,\"a\"\n"     \
"   .long   1b\n"               \
"   .popsection\n"

   

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2014-12-19 13:45 |只看該作者
我從readelf是有看到pv_table那section,但那是代表什麼意思?

[21] .init.pv_table    PROGBITS        c047b5ac 4835ac 000624 00   A  0   0  1

   

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
7 [報(bào)告]
發(fā)表于 2014-12-20 17:20 |只看該作者
本帖最后由 arm-linux-gcc 于 2014-12-20 17:22 編輯
wth0722 發(fā)表于 2014-12-19 13:42
回復(fù) 4# arm-linux-gcc



在這個.o文件中插入一個段,段名為.pv_table
段的內(nèi)容是個long型的,其值是個地址,即前面標(biāo)號為1處的地址



163#define __pv_stub(from,to,instr,type)                   \
164        __asm__("@ __pv_stub\n"                         \
165        "1:     " instr "       %0, %1, %2\n"           \    插入一條指令到當(dāng)前文件中,由于__pv_stub這個宏是在代碼中被調(diào)用的,所以這一條插入的指令是在當(dāng)前.o文件的text段,這里還定義了標(biāo)號1
166        "       .pushsection .pv_table,\"a\"\n"         \   在當(dāng)前.o文件的.text里插入一個名為.pv_table的段
167        "       .long   1b\n"                           \            這個段的內(nèi)容是個地址,這個地址指向的前面的標(biāo)號1(1b表示backword 1,1f表示forword 1,1b就表示在本句之前找到標(biāo)號1,假如這里的1b改成1f,那么就會在本句后面去找標(biāo)號1)
168        "       .popsection\n"                          \          .pv_table結(jié)束,之后的仍然歸于.text段
169        : "=r" (to)                                     \
170        : "r" (from), "I" (type))





197        .init.pv_table : {
198                __pv_table_begin = .;
199                *(.pv_table)
200                __pv_table_end = .;
201        }
會將所有.o文件中的.pv_table段抓出來放在vmlinux的.init.pv_table段中,這個段中每一個long型都是指向一個地址,位于這些地址處的內(nèi)容就是各個標(biāo)號1處的指令
于是在內(nèi)核啟動時(shí)就能夠通過__pv_table_begin找到所有的這些標(biāo)號1處的指令,然后就可以修改這些指令的操作數(shù)了


論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2014-12-22 14:24 |只看該作者
你的意思是不是在編譯時(shí), 把 "1:     " instr "       %0, %1, %2\n"  所在的位址儲存到.init.pv_table section裡面 ?

如果是的話,請問一下儲存他有何意義?

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2014-12-22 14:33 |只看該作者
還有Run time時(shí),當(dāng)呼叫了y=virt_to_phys(x)之後,那個y跟所儲存的那資訊有什麼關(guān)係

感謝你的回答

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
10 [報(bào)告]
發(fā)表于 2014-12-22 17:43 |只看該作者
回復(fù) 8# wth0722


    是為了能夠找到這些指令,內(nèi)核啟動時(shí)會修改這個指令的參數(shù)域,如果不記錄地址,那么如何找到這些指令?
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP