亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? exception.txt

?? ARM 嵌入式 系統 設計與實例開發 實驗教材 二源碼
?? TXT
字號:
     Kernel level exception handling in Linux 2.1.8  Commentary by Joerg Pommnitz <joerg@raleigh.ibm.com>When a process runs in kernel mode, it often has to access user mode memory whose address has been passed by an untrusted program. To protect itself the kernel has to verify this address.In older versions of Linux this was done with the int verify_area(int type, const void * addr, unsigned long size) function.This function verified that the memory area starting at address addr and of size size was accessible for the operation specified in type (read or write). To do this, verify_read had to look up the virtual memory area (vma) that contained the address addr. In the normal case (correctly working program), this test was successful. It only failed for a few buggy programs. In some kernel profilingtests, this normally unneeded verification used up a considerableamount of time.To overcome this situation, Linus decided to let the virtual memory hardware present in every Linux-capable CPU handle this test.How does this work?Whenever the kernel tries to access an address that is currently not accessible, the CPU generates a page fault exception and calls the page fault handler void do_page_fault(struct pt_regs *regs, unsigned long error_code)in arch/i386/mm/fault.c. The parameters on the stack are set up by the low level assembly glue in arch/i386/kernel/entry.S. The parameterregs is a pointer to the saved registers on the stack, error_code contains a reason code for the exception.do_page_fault first obtains the unaccessible address from the CPU control register CR2. If the address is within the virtual address space of the process, the fault probably occurred, because the page was not swapped in, write protected or something similar. However, we are interested in the other case: the address is not valid, there is no vma that contains this address. In this case, the kernel jumps to the bad_area label. There it uses the address of the instruction that caused the exception (i.e. regs->eip) to find an address where the execution can continue (fixup). If this search is successful, the fault handler modifies the return address (again regs->eip) and returns. The execution will continue at the address in fixup.Where does fixup point to?Since we jump to the contents of fixup, fixup obviously points to executable code. This code is hidden inside the user access macros. I have picked the get_user macro defined in include/asm/uaccess.h as anexample. The definition is somewhat hard to follow, so let's peek at the code generated by the preprocessor and the compiler. I selectedthe get_user call in drivers/char/console.c for a detailed examination.The original code in console.c line 1405:        get_user(c, buf);The preprocessor output (edited to become somewhat readable):(  {            long __gu_err = - 14 , __gu_val = 0;            const __typeof__(*( (  buf ) )) *__gu_addr = ((buf));            if (((((0 + current_set[0])->tss.segment) == 0x18 )  ||        (((sizeof(*(buf))) <= 0xC0000000UL) &&        ((unsigned long)(__gu_addr ) <= 0xC0000000UL - (sizeof(*(buf)))))))              do {        __gu_err  = 0;                switch ((sizeof(*(buf)))) {                  case 1:             __asm__ __volatile__(                      "1:      mov" "b" " %2,%" "b" "1\n"                      "2:\n"                      ".section .fixup,\"ax\"\n"                      "3:      movl %3,%0\n"                      "        xor" "b" " %" "b" "1,%" "b" "1\n"                      "        jmp 2b\n"                      ".section __ex_table,\"a\"\n"                      "        .align 4\n"                      "        .long 1b,3b\n"                      ".text"        : "=r"(__gu_err), "=q" (__gu_val): "m"((*(struct __large_struct *)                            (   __gu_addr   )) ), "i"(- 14 ), "0"(  __gu_err  )) ;               break;                  case 2:             __asm__ __volatile__(              "1:      mov" "w" " %2,%" "w" "1\n"                      "2:\n"                      ".section .fixup,\"ax\"\n"                      "3:      movl %3,%0\n"                      "        xor" "w" " %" "w" "1,%" "w" "1\n"                      "        jmp 2b\n"                      ".section __ex_table,\"a\"\n"                      "        .align 4\n"                      "        .long 1b,3b\n"                      ".text"        : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)                            (   __gu_addr   )) ), "i"(- 14 ), "0"(  __gu_err  ));               break;                  case 4:             __asm__ __volatile__(                      "1:      mov" "l" " %2,%" "" "1\n"                      "2:\n"                      ".section .fixup,\"ax\"\n"                      "3:      movl %3,%0\n"                      "        xor" "l" " %" "" "1,%" "" "1\n"                      "        jmp 2b\n"                      ".section __ex_table,\"a\"\n"                      "        .align 4\n"        "        .long 1b,3b\n"                      ".text"        : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)                            (   __gu_addr   )) ), "i"(- 14 ), "0"(__gu_err));               break;                  default:             (__gu_val) = __get_user_bad();                }              } while (0) ;            ((c)) = (__typeof__(*((buf))))__gu_val;            __gu_err;  });WOW! Black GCC/assembly magic. This is impossible to follow, so let'ssee what code gcc generates: >         xorl %edx,%edx >         movl current_set,%eax >         cmpl $24,788(%eax)         >         je .L1424         >         cmpl $-1073741825,64(%esp) >         ja .L1423                 > .L1424: >         movl %edx,%eax                         >         movl 64(%esp),%ebx > #APP > 1:      movb (%ebx),%dl                /* this is the actual user access */ > 2: > .section .fixup,"ax" > 3:      movl $-14,%eax >         xorb %dl,%dl >         jmp 2b > .section __ex_table,"a" >         .align 4 >         .long 1b,3b > .text > #NO_APP > .L1423: >         movzbl %dl,%esiThe optimizer does a good job and gives us something we can actually understand. Can we? The actual user access is quite obvious. Thanks to the unified address space we can just access the address in user memory. But what does the .section stuff do?????To understand this we have to look at the final kernel: > objdump --section-headers vmlinux >  > vmlinux:     file format elf32-i386 >  > Sections: > Idx Name          Size      VMA       LMA       File off  Algn >   0 .text         00098f40  c0100000  c0100000  00001000  2**4 >                   CONTENTS, ALLOC, LOAD, READONLY, CODE >   1 .fixup        000016bc  c0198f40  c0198f40  00099f40  2**0 >                   CONTENTS, ALLOC, LOAD, READONLY, CODE >   2 .rodata       0000f127  c019a5fc  c019a5fc  0009b5fc  2**2 >                   CONTENTS, ALLOC, LOAD, READONLY, DATA >   3 __ex_table    000015c0  c01a9724  c01a9724  000aa724  2**2 >                   CONTENTS, ALLOC, LOAD, READONLY, DATA >   4 .data         0000ea58  c01abcf0  c01abcf0  000abcf0  2**4 >                   CONTENTS, ALLOC, LOAD, DATA >   5 .bss          00018e21  c01ba748  c01ba748  000ba748  2**2 >                   ALLOC >   6 .comment      00000ec4  00000000  00000000  000ba748  2**0 >                   CONTENTS, READONLY >   7 .note         00001068  00000ec4  00000ec4  000bb60c  2**0 >                   CONTENTS, READONLYThere are obviously 2 non standard ELF sections in the generated objectfile. But first we want to find out what happened to our code in thefinal kernel executable: > objdump --disassemble --section=.text vmlinux > > c017e785 <do_con_write+c1> xorl   %edx,%edx > c017e787 <do_con_write+c3> movl   0xc01c7bec,%eax > c017e78c <do_con_write+c8> cmpl   $0x18,0x314(%eax) > c017e793 <do_con_write+cf> je     c017e79f <do_con_write+db> > c017e795 <do_con_write+d1> cmpl   $0xbfffffff,0x40(%esp,1) > c017e79d <do_con_write+d9> ja     c017e7a7 <do_con_write+e3> > c017e79f <do_con_write+db> movl   %edx,%eax > c017e7a1 <do_con_write+dd> movl   0x40(%esp,1),%ebx > c017e7a5 <do_con_write+e1> movb   (%ebx),%dl > c017e7a7 <do_con_write+e3> movzbl %dl,%esiThe whole user memory access is reduced to 10 x86 machine instructions.The instructions bracketed in the .section directives are no longerin the normal execution path. They are located in a different section of the executable file: > objdump --disassemble --section=.fixup vmlinux >  > c0199ff5 <.fixup+10b5> movl   $0xfffffff2,%eax > c0199ffa <.fixup+10ba> xorb   %dl,%dl > c0199ffc <.fixup+10bc> jmp    c017e7a7 <do_con_write+e3>And finally: > objdump --full-contents --section=__ex_table vmlinux >  >  c01aa7c4 93c017c0 e09f19c0 97c017c0 99c017c0  ................ >  c01aa7d4 f6c217c0 e99f19c0 a5e717c0 f59f19c0  ................ >  c01aa7e4 080a18c0 01a019c0 0a0a18c0 04a019c0  ................or in human readable byte order: >  c01aa7c4 c017c093 c0199fe0 c017c097 c017c099  ................ >  c01aa7d4 c017c2f6 c0199fe9 c017e7a5 c0199ff5  ................                               ^^^^^^^^^^^^^^^^^                               this is the interesting part! >  c01aa7e4 c0180a08 c019a001 c0180a0a c019a004  ................What happened? The assembly directives.section .fixup,"ax".section __ex_table,"a"told the assembler to move the following code to the specifiedsections in the ELF object file. So the instructions3:      movl $-14,%eax        xorb %dl,%dl        jmp 2bended up in the .fixup section of the object file and the addresses        .long 1b,3bended up in the __ex_table section of the object file. 1b and 3bare local labels. The local label 1b (1b stands for next label 1 backward) is the address of the instruction that might fault, i.e. in our case the address of the label 1 is c017e7a5:the original assembly code: > 1:      movb (%ebx),%dland linked in vmlinux     : > c017e7a5 <do_con_write+e1> movb   (%ebx),%dlThe local label 3 (backwards again) is the address of the code to handlethe fault, in our case the actual value is c0199ff5:the original assembly code: > 3:      movl $-14,%eaxand linked in vmlinux     : > c0199ff5 <.fixup+10b5> movl   $0xfffffff2,%eaxThe assembly code > .section __ex_table,"a" >         .align 4 >         .long 1b,3bbecomes the value pair >  c01aa7d4 c017c2f6 c0199fe9 c017e7a5 c0199ff5  ................                               ^this is ^this is                               1b       3b c017e7a5,c0199ff5 in the exception table of the kernel.So, what actually happens if a fault from kernel mode with no suitablevma occurs?1.) access to invalid address: > c017e7a5 <do_con_write+e1> movb   (%ebx),%dl2.) MMU generates exception3.) CPU calls do_page_fault4.) do page fault calls search_exception_table (regs->eip == c017e7a5);5.) search_exception_table looks up the address c017e7a5 in the    exception table (i.e. the contents of the ELF section __ex_table)     and returns the address of the associated fault handle code c0199ff5.6.) do_page_fault modifies its own return address to point to the fault     handle code and returns.7.) execution continues in the fault handling code.8.) 8a) EAX becomes -EFAULT (== -14)    8b) DL  becomes zero (the value we "read" from user space)    8c) execution continues at local label 2 (address of the        instruction immediately after the faulting user access).The steps 8a to 8c in a certain way emulate the faulting instruction.That's it, mostly. If you look at our example, you might ask whywe set EAX to -EFAULT in the exception handler code. Well, theget_user macro actually returns a value: 0, if the user access wassuccessful, -EFAULT on failure. Our original code did not test thisreturn value, however the inline assembly code in get_user tries toreturn -EFAULT. GCC selected EAX to return this value.NOTE:Due to the way that the exception table is built and needs to be ordered,only use exceptions for code in the .text section.  Any other sectionwill cause the exception table to not be sorted correctly, and theexceptions will fail.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人福利视频在线| 丰满亚洲少妇av| 亚洲精品一二三区| 1区2区3区精品视频| 国产精品免费视频网站| 亚洲欧洲国产日本综合| 中文字幕一区日韩精品欧美| 国产精品毛片大码女人| 最新热久久免费视频| 国产精品久久99| 亚洲女人的天堂| 亚洲中国最大av网站| 亚洲成人精品一区二区| 日韩av网站免费在线| 久久99国产精品久久99果冻传媒| 日韩av中文字幕一区二区| 麻豆一区二区三区| 国产成人精品1024| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 色天使色偷偷av一区二区| 欧美在线看片a免费观看| 欧美日韩一区 二区 三区 久久精品| 欧美性受极品xxxx喷水| 91麻豆精品国产自产在线| 日韩欧美国产综合| 日本一区二区三区dvd视频在线| 18成人在线视频| 免费看黄色91| 成人午夜电影小说| 欧美午夜电影在线播放| 精品国精品国产尤物美女| 国产亚洲人成网站| 亚洲一区二区三区免费视频| 久久99精品国产| 色噜噜夜夜夜综合网| 欧美大片在线观看一区二区| 国产精品美女久久久久av爽李琼| 亚洲电影你懂得| 国产精品羞羞答答xxdd| 在线观看亚洲精品| 国产情人综合久久777777| 一区二区三区四区中文字幕| 免费视频一区二区| 色妞www精品视频| 国产性色一区二区| 日韩经典中文字幕一区| jizz一区二区| 国产日韩三级在线| 日韩av高清在线观看| 91原创在线视频| 国产欧美日韩精品在线| 欧美aa在线视频| 色系网站成人免费| 国产欧美一区二区在线观看| 日韩**一区毛片| 91国产免费观看| 国产精品国产三级国产aⅴ原创| 美女视频黄久久| 欧美性受xxxx| 亚洲男人都懂的| 国产一区二区不卡在线| 欧美一区午夜精品| 日韩精品亚洲一区二区三区免费| 91麻豆免费看| 1000精品久久久久久久久| 从欧美一区二区三区| 精品va天堂亚洲国产| 免费看黄色91| 欧美大片在线观看| 国模套图日韩精品一区二区 | 久久精品日韩一区二区三区| 日日摸夜夜添夜夜添精品视频| 91年精品国产| 亚洲精品中文字幕在线观看| 99久久99久久免费精品蜜臀| 国产精品久久久久久久久快鸭| 国产精品综合二区| 久久精品一区二区三区不卡 | 中日韩免费视频中文字幕| 老司机免费视频一区二区三区| 欧美一区二区三区成人| 日韩精品电影在线观看| 56国语精品自产拍在线观看| 视频一区视频二区在线观看| 在线不卡一区二区| 欧美aⅴ一区二区三区视频| 日韩美女一区二区三区四区| 理论电影国产精品| 欧美国产精品久久| 91原创在线视频| 亚洲h精品动漫在线观看| 欧美一三区三区四区免费在线看| 精品一区二区精品| 国产精品视频麻豆| 91蝌蚪porny九色| 性做久久久久久| 日韩美女天天操| 不卡一区二区三区四区| 亚洲高清视频中文字幕| 欧美大片拔萝卜| jizz一区二区| 视频一区中文字幕| 欧美高清在线视频| 在线看不卡av| 国产一区二区三区黄视频 | 精品成人a区在线观看| 不卡视频在线观看| 视频一区中文字幕| 国产精品色呦呦| 欧美日韩激情一区二区| 国产麻豆午夜三级精品| 亚洲啪啪综合av一区二区三区| 欧美一级久久久| 91在线观看成人| 国产精品一区二区在线看| 一二三四社区欧美黄| 久久久高清一区二区三区| 91国产福利在线| 懂色av中文一区二区三区| 午夜精品在线看| 一区精品在线播放| 精品av久久707| 欧美日韩中文字幕一区二区| 成人av资源在线观看| 另类中文字幕网| 亚洲成在线观看| 亚洲欧美色综合| 久久精品亚洲一区二区三区浴池| 欧美亚州韩日在线看免费版国语版| 国产福利一区二区三区视频| 日韩av一二三| 亚洲成人av中文| 一区二区三区产品免费精品久久75| 精品国产乱码久久久久久牛牛| 欧美色中文字幕| 色天使色偷偷av一区二区 | 最新成人av在线| 国产视频一区二区在线| 日韩欧美一区在线观看| 在线免费观看日韩欧美| 97精品国产露脸对白| 国产精品一卡二卡| 精品亚洲国产成人av制服丝袜 | 成人免费视频caoporn| 毛片av一区二区| 琪琪一区二区三区| 婷婷国产v国产偷v亚洲高清| 亚洲一二三区不卡| 亚洲一区二区精品3399| 亚洲免费视频中文字幕| 国产精品丝袜一区| 国产精品丝袜久久久久久app| 国产欧美一区二区在线观看| 久久久久久久久久久久久夜| 久久久影院官网| 国产午夜亚洲精品不卡| 久久久99精品免费观看不卡| 久久久久国产成人精品亚洲午夜 | 99麻豆久久久国产精品免费优播| 丁香五精品蜜臀久久久久99网站| 高清国产一区二区| 不卡av免费在线观看| 99天天综合性| 欧美最新大片在线看| 欧美人伦禁忌dvd放荡欲情| 欧美一二三在线| 亚洲精品一区二区三区福利| 久久新电视剧免费观看| 2023国产精品| 国产精品人人做人人爽人人添| 综合激情成人伊人| 视频一区二区三区中文字幕| 免费观看成人av| 国产伦理精品不卡| 99精品久久免费看蜜臀剧情介绍| 91在线视频官网| 欧美日韩免费观看一区二区三区 | 一区二区在线观看不卡| 五月婷婷久久丁香| 韩日欧美一区二区三区| 波多野结衣一区二区三区| 91蝌蚪国产九色| 日韩免费高清电影| 亚洲欧洲av在线| 日韩激情一区二区| 国产精品888| 欧美日韩aaaaaa| 中文字幕免费不卡在线| 亚洲一区二区三区小说| 九九视频精品免费| 91视频91自| 精品黑人一区二区三区久久| 亚洲国产精品成人综合色在线婷婷| 亚洲色图在线播放| 美女久久久精品| 在线观看网站黄不卡| 久久久亚洲国产美女国产盗摄| 亚洲一二三区在线观看| 风间由美中文字幕在线看视频国产欧美| 色94色欧美sute亚洲线路一ni |