- 論壇徽章:
- 0
|
比如我寫(xiě)個(gè)驅(qū)動(dòng) ,有個(gè)ioctl ,該iocontrol 里有寫(xiě)user data 8K 到kernel
那我就在iocontrol 該item 下實(shí)現(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 ,雖然沒(méi)有缺頁(yè)情況,
但是vmalloc 只更新主內(nèi)核頁(yè)表, 而當(dāng)前進(jìn)程使用ioctrl 系統(tǒng)調(diào)用切入
內(nèi)核時(shí),進(jìn)程在內(nèi)核態(tài)使用的是進(jìn)程當(dāng)前的頁(yè)表,那么3G 以上表項(xiàng)開(kāi)始
是空的,那么訪問(wèn)tbuf ,就是寫(xiě)到tbuf 時(shí)應(yīng)該會(huì)引起頁(yè)表異常,
根據(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
照道理說(shuō)這樣的異常應(yīng)該可以修復(fù)的,就是修復(fù)當(dāng)前進(jìn)程頁(yè)表3g 以上的內(nèi)存和主內(nèi)核頁(yè)表3G以上的一樣,這樣就可以繼續(xù)執(zhí)行了
但是fixup 的代碼沒(méi)有看出有這樣的處理
不知道我那步理解不對(duì),請(qǐng)教 |
|