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

Chinaunix

標(biāo)題: 有個arm copy form user的情景沒想通 [打印本頁]

作者: liu090    時間: 2011-05-24 11:05
標(biāo)題: 有個arm copy form user的情景沒想通
比如我寫個驅(qū)動 ,有個ioctl ,該iocontrol 里有寫user data 8K 到kernel
  那我就在iocontrol 該item 下實現(xiàn)
        
          tbuf = vmalloc(tbuf_size);    /* 在內(nèi)核分配8K  非連續(xù)區(qū)*/
        if (!tbuf)
                return -ENOMEM;

        err = copy_from_user(tbuf, buf, len);     /*然后call copy from user 去讀user buf 到tbuf */

但是tbuf 是vmalloc 在kernel 非連續(xù)區(qū)分配的page ,雖然沒有缺頁情況,
但是vmalloc 只更新主內(nèi)核頁表, 而當(dāng)前進(jìn)程使用ioctrl 系統(tǒng)調(diào)用切入
內(nèi)核時,進(jìn)程在內(nèi)核態(tài)使用的是進(jìn)程當(dāng)前的頁表,那么3G 以上表項開始
是空的,那么訪問tbuf ,就是寫到tbuf 時應(yīng)該會引起頁表異常,
根據(jù)
        .macro ldr1w ptr reg abort
100:        ldrt \reg, [\ptr], #4
        .section __ex_table, "a"
        .long 100b, \abort
        .previous
        .endm

        異常處理在abort 處

      .section .fixup,"ax"   
        .align 0
        copy_abort_preamble
        ldmfd        sp!, {r1, r2}
        sub        r3, r0, r1
        rsb        r1, r3, r2
        str        r1, [sp]
        bl        __memzero
        ldr        r0, [sp], #4
        copy_abort_end
        .previous

照道理說這樣的異常應(yīng)該可以修復(fù)的,就是修復(fù)當(dāng)前進(jìn)程頁表3g 以上的內(nèi)存和主內(nèi)核頁表3G以上的一樣,這樣就可以繼續(xù)執(zhí)行了
但是fixup 的代碼沒有看出有這樣的處理
不知道我那步理解不對,請教
作者: liu090    時間: 2011-05-24 15:35
兄弟們也沒想通?
作者: ioriyw    時間: 2011-05-25 10:54
本帖最后由 ioriyw 于 2011-05-25 10:57 編輯

所有進(jìn)程3g以上的頁表(768以上)是共享的(指針方式 ,一個頁目錄項其實就是個指針,指向內(nèi)核頁表項,也就是共享),也就是內(nèi)核頁表。
至于何時共享,是頁面異常處理過程中逐步設(shè)置的?蓞⒖柬撁娈惓L幚砗瘮(shù)。
作者: liu090    時間: 2011-05-26 10:50
你沒理解我問的意思,我的理解是會發(fā)生異常,并修復(fù),但是fixup 應(yīng)該跳到原來發(fā)生的指令再執(zhí)行一下,但是fixup 的代碼沒看出來,比如b 100 去重新執(zhí)行
作者: marsbible    時間: 2011-05-26 21:25
估計沒在fixup返回吧,異常處理函數(shù)中返回的吧




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2