日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行...

發布時間:2024/3/26 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

★PART1:32位保護模式下內核簡易模型

1. 內核的結構,功能和加載

?????? 每個內核的主引導程序都會有所不同,因為內核都會有不同的結構。有時候主引導程序的一些段和內核段是可以共用的(事實上加載完內核以后就不需要主引導程序了),和加載一般的用戶程序一樣,主引導程序也是需要從硬盤中讀取程序到指定的內存空間中。

?????? 同時,作為一個內核,也是一個程序,而且是一個具有管理全局的能力的程序,應該有固定的段,一般來說,內核應該包括以下幾個部分:

?????? 1. 公用例程段(實現API功能)

?????? 2. 內核數據區(用于預讀一些數據和一些內核內置的保留的內容)

?????? 3. 內核代碼區(用于執行內核自己的代碼…)

?????? PS:上述段都應該具有特權0級,特權級在教材的14章講述

?????? 在主引導程序中,為了加載內核,首先應該在GDT中加載內核的所有的描述符。但是內核的描述符是不確定的(因為段界限和段的線性基地址不知道),所以要根據內核頭部的信息來確定,內核的頭部和普通的程序是一樣的,也是應該把各個段的信息和入口點的相對地址列出來,同時還需要具有段的選擇子(因為內核是固定的,選擇子也應該固定)。然后主引導程序構建這些段的描述符(需要重定位,不過不需要再把段信息寫入內核頭部了,因為選擇子有了),并且把描述符寫入GDT并且重新加載GDT即可(主要是刷新GDT的大小)。

??

?????? 那怎么根據內核所給出的信息構建內核的描述符呢?教材給出了一種方法。(edi的內容是內核頭部的地址)

? ? ? ? ? ??

  

?????? 其實原理很簡單,就是給出需要加載的段的屬性(因為加載什么段我們是知道的),然后只要填充好描述符的高32位和低32位就完了,教材這里用到了一個bswap(bswap r32)命令,簡單來說這個命令就是將以某個寄存器中8位為一個段的首尾交換,如圖:

?

2. 保護模式下的用戶程序的重定位和加載

?????? 首先要明白一個事情,在保護模式下(特別是在有權限管理的情況下),程序是很難進行自我加載的,必須通過內核來加載。當然了,用戶程序必須符合固定的格式,才能被內核識別和加載。一般來說,內核需要給用戶程序提供3個段,這三個段一般是:

?????? ????????????? 1. 代碼段,

???????????????????? 2. 數據段(這里應該有兩個區域:用戶程序頭部和文字常量區),

???????????????????? 3. 棧段,其中棧段要根據用戶程序的建議的棧段大小來定(一般不建議用戶自己創建棧段)。

???????????????????? (正常來講還要有堆和BSS段,但是先不搞那么復雜)

?????? 內核從硬盤讀取了用戶程序并加載到相應位置的時候,就讀取用戶的程序頭。我們知道,內核有公用程序段,是專門用來給用戶程序提供公用例程的,這就是現代操作系統的API(Application Programming Interface),更直觀來說就是就是一堆庫函數名(比如C中的scanf,printf…)。早期的系統,API是通過中斷號的方式公布的(也就是要通過軟中斷進入),現在常用方法是使用符號名。正常來講,一個現代的操作系統應該是具有一個專門的鏈接器(Linker)來構建文件頭的。教材用一個比較原始的方式來構建文件頭了,其實這只是一個簡單的字符串的匹配的過程而已。

(內核數據區的符號表的樣貌)

?????? 在我們的規定中,用戶程序的符號表固定是256個字符,同時每個符號還需要預留一個區域來保存符號對應過程的選擇子(本章過程的調用是通過GDT進行的,下一章將會介紹調用門)。兩個字符串的比較可以使用cmpsb(字節比較),cmpsw(字比較),cmpsd(雙字比較),在16為模式下,源字符串的首地址由DS:SI指定,目的字符串的首地址由ES:DI指定,在32位模式下,則分別是DS:ESI和ES:EDI,在處理器內部,cmps指令的操作是把兩個操作數相減,然后根據結果設置標志寄存器中的標志位。

?????? 單純的cmps(指令族)只比較一次,需要通過rep前綴來不斷驅動(直到ecx為0),但是這里不能單純地使用rep指令,否則就無法比較了

?

?????? 重定位符號表后,我們就要對用戶程序的段進行重定位和內存的分配,當然了,理論上在讀取用戶頭部的時候就應該開辟一個內存放置用戶程序,但是內核的做法是,先預讀頭部到內核數據區,然后再給用戶程序分配內存,在現代操作系統中,內存分配是一個很重要的工作。內存管理程序不僅要把內存分塊管理以便給應用程序分配內存,還要負責回收,還要進行虛擬內存管理的工作,非常復雜。這里教材用的是一個非常簡單的分配demo,沒有檢測內存是否越界的功能,而且也沒有內存回收。我往上加了一點東西。

? ? ??

?????? 接下來就是段的重定位和描述符的創建了,當然這一章沒有講特權級,所以教材呢就直接把所有的程序都按特權0級的權限加載了。當然這是一種很不好的做法,教材在14章會介紹如何用特權3級來加載程序。其實也不難,懂怎么加載內核就知道怎么怎么加載用戶程序了,主要是棧段的分配要用到內存分配函數而已。

??

??

?????? 這里要注意的地方是Set_New_GDT這個過程,要在GDT中安裝描述符,必須知道他的物理地址和大小,要知道這些消息,可以用sdgt指令(Store Global Descriptor Table Regiser)它用于將GDT軍訓器的基地址和邊界信息保存到指定的內存位置,sgdt的指令格式是sgdt m/48,這個指令不會影響任何標志位。另外還有一個新的指令movzx

?????? movzx是一個帶零拓展的傳送(Move With Zero-Extend)指令格式為(其實就是相當于先xor一下16/32位寄存器再寫入低位的寄存器)

movzx r16,r/m8

movzx r32,r/m8

movzx r32,r/m16

?????? 注意movzx的指令目的操作數只能是16位或者是32位的通用寄存器,源操作數只能是8位或者16位的寄存器或者內存地址,而且目的操作數和源操作數的大小是不一樣的。和movzx指令差不多的指令是movsx指令,他是帶符號的傳送,這個指令就不像movzx一樣只會拓展0了,而是根據數的最高位來拓展。

?????? GDTR的界限部分在初始化的時候會初始化為0xFFFF,當+1時,如果看成16位數,則會是0x0000,如果看成32位數,則會變成0x00010000,為了避免不必要的麻煩,直接寫成inc bx,那這樣的話開始填充描述符的時候就不是從0x00010000這個偏移地址開始了,而是0x00000000開始了。

?????? 因為應用程序給出的都是棧的建議大小,所以一般都是直接給出的是建議大小,所以我們直接按建議大小來乘以4KB的大小來分配內存,要注意的是棧段是向下拓展的,高地址才是棧段的線性基地址。? ? ??

2. 用戶程序的執行

?????? 一旦加載了用戶程序,那么我們就可以直接直接一個跳轉指令跳轉到用戶程序了

??

?????? 此時ds應該指向用戶程序頭部。0x10剛好是偏移地址(32位)+選擇子(16位),接下來就是在用戶程序執行一系列操作了,因為我們已經在用戶程序填入了公用例程段的選擇子,所以我們直接用fs指向用戶頭部,然后執行這些公用例程就可以了。

?

?????? TerminateProgram是返回內核的公用例程,返回內核后就可以回收用戶程序用的內存和創建的GDT了。

? ? ??

?????? 方法簡單粗暴,當然學了14,15章以后我們就能學習到正確的任務切換方法了。

?????? 最后,教材還給出一種調試程序的方法,其實個人感覺沒有什么用,還不如直接在bochs看呢。應該就是為了講xlat這個查表指令而寫的,該指令要求事先在DS:(E)BX出定義一個用于轉換編碼的表格,在16位下使用bx,在32位下使用ebx。指令執行的時候,處理器訪問該表格,用AL寄存器作為偏移量,從表格中取出一個字節,傳回AL寄存器。教材上寫了一個調試函數。

? ? ??

?? 每次將edx移動4次,總共需要移動8次,而且每次只取4位,Core_Data_Segement段的bin_hex中有16進制的對照表。Xlat不影響任何標志位。

★PART2:13章的代碼

1. 源代碼:

1 ;========================保護模式主引導扇區代碼======================== 2 core_phy_base: equ 0x00040000 ;內核加載地址 3 core_sector_address: equ 0x00000001 ;內核所在扇區 4 5 mov ax,cs 6 mov ss,ax 7 mov sp,0x7c00 8 9 mov eax,[cs:pgdt_base+0x7c00+0x02] 10 xor edx,edx 11 mov ebx,0x10 12 div ebx 13 14 mov ds,eax ;讓ds指向gdt位置進行操作 15 mov ebx,edx ;別忘了還有可能出現偏移地址 16 17 ;---------------------描述符#0--------------------- 18 mov dword [ebx+0x00],0x00000000 ;空描述符 19 mov dword [ebx+0x04],0x00000000 20 ;---------------------描述符#1--------------------- 21 mov dword [ebx+0x08],0x0000ffff ;4GB向上拓展數據段 22 mov dword [ebx+0x0c],0x00cf9200 23 ;---------------------描述符#2--------------------- 24 mov dword [ebx+0x10],0x7c0001ff ;代碼段 25 mov dword [ebx+0x14],0x00409800 26 ;---------------------描述符#3--------------------- 27 mov dword [ebx+0x18],0x7c00fffe ;棧段 28 mov dword [ebx+0x1c],0x00cf9600 29 ;---------------------描述符#4--------------------- 30 mov dword [ebx+0x20],0x80007fff ;屏幕顯示段 31 mov dword [ebx+0x24],0x0040920b 32 33 mov word[cs:pgdt_base+0x7c00],39 ;加載gdt 34 lgdt [cs:pgdt_base+0x7c00] 35 36 in al,0x92 ;快速開啟A20 37 or al,0x02 ;是寫入2,不要搞錯了,寫入1就是重啟了 38 out 0x92,al 39 cli ;關掉BIOS中斷 40 41 mov eax,cr0 42 or eax,0x01 ;設置PE位 43 mov cr0,eax 44 45 jmp dword 0x0010:flush ;進入保護模式 46 47 [bits 32] 48 flush: 49 mov eax,0x0008 ;選擇4GB的代碼段直接給ds 50 mov ds,eax 51 mov eax,0x0018 52 mov ss,eax ;設置棧段 53 xor esp,esp 54 55 ;接下來開始讀取內核頭部 56 mov esi,core_sector_address 57 mov edi,core_phy_base 58 call read_harddisk_0 59 60 mov eax,[core_phy_base] ;讀取用戶總長度 61 xor edx,edx 62 mov ebx,512 63 div ebx 64 65 cmp edx,0 66 jne @read_last_sector 67 dec eax 68 @read_last_sector: 69 cmp eax,0 70 je @setup 71 mov ecx,eax 72 .read_last: 73 inc esi 74 call read_harddisk_0 75 loop .read_last 76 @setup: 77 mov edi,core_phy_base 78 mov esi,[pgdt_base+0x7c00+0x02] 79 80 ;重新構建描述符#1 81 mov eax,[edi+0x04] ;eax線性地址,ebx是下一個線性地址 82 mov ebx,[edi+0x08] 83 sub ebx,eax ;得到段的總長度 84 dec ebx ;段長度-1就是段界限 85 add eax,edi ;得到真正的段的加載地址 86 mov ecx,0x00409800 ;公用例程段 87 call make_gdt_descriptor 88 mov [esi+0x28],eax ;gdt低32位 89 mov [esi+0x2c],edx ;gdt高32位 90 91 ;重新構建描述符#2 92 mov eax,[edi+0x08] ;eax線性地址,ebx是下一個線性地址 93 mov ebx,[edi+0x0c] 94 sub ebx,eax ;得到段的總長度 95 dec ebx ;段長度-1就是段界限 96 add eax,edi ;得到真正的段的加載地址 97 mov ecx,0x00409200 ;內核數據段 98 call make_gdt_descriptor 99 mov [esi+0x30],eax ;gdt低32位 100 mov [esi+0x34],edx ;gdt高32位 101 102 ;重新構建描述符#3 103 mov eax,[edi+0x0c] ;eax線性地址,ebx是下一個線性地址 104 mov ebx,[edi+0x00] ;注意這里是程序的總長度(很容易搞錯變成0x10) 105 sub ebx,eax ;得到段的總長度 106 dec ebx ;段長度-1就是段界限 107 add eax,edi ;得到真正的段的加載地址 108 mov ecx,0x00409800 ;內核代碼段 109 call make_gdt_descriptor 110 mov [esi+0x38],eax ;gdt低32位 111 mov [esi+0x3c],edx ;gdt高32位 112 113 mov word[pgdt_base+0x7c00],63 ;現在ds指向的就是4GB的內存,不可以用cs(會引發中斷的) 114 lgdt [pgdt_base+0x7c00] 115 116 jmp far [edi+0x10] ;可以這樣跳的原因是因為在內核中,選擇子都是固定的,所以不用自己操心 117 118 ;=============================函數部分================================= 119 read_harddisk_0: ;esi存了28位的硬盤號 120 push ecx 121 122 mov edx,0x1f2 ;讀取一個扇區 123 mov al,0x01 124 out dx,al 125 126 mov eax,esi ;0~7位,0x1f3端口 127 inc edx 128 out dx,al 129 130 mov al,ah ;8~15位,0x1f4端口 131 inc edx 132 out dx,al 133 134 shr eax,16 ;16-23位,0x1f5端口 135 inc edx 136 out dx,al 137 138 mov al,ah ;24-28位,LBA模式主硬盤 139 inc edx 140 and al,0x0f 141 or al,0xe0 142 out dx,al 143 144 inc edx ;讀命令,0x1f7端口 145 mov al,0x20 146 out dx,al 147 148 .wait: 149 in al,dx 150 and al,0x88 151 cmp al,0x08 152 jne .wait 153 154 mov dx,0x1f0 155 mov ecx,256 156 .read: 157 in ax,dx 158 mov [edi],ax 159 add edi,2 160 loop .read 161 162 pop ecx 163 164 ret 165 ;---------------------------------------------------------------------- 166 make_gdt_descriptor: 167 ;eax:線性基地址 168 ;ebx:段界限 169 ;ecx:屬性 170 mov edx,eax 171 and edx,0xffff0000 ;得到線性基地址的16-31位 172 rol edx,8 173 bswap edx ;強行把0-7位和16-23位互換 174 or edx,ecx ;裝載屬性 175 176 shl eax,16 177 or ax,bx ;配好段界限低16位 178 179 and ebx,0x000f0000 180 or edx,ebx ;裝載段界限的16-19位 181 182 ret 183 ;====================================================================== 184 pgdt_base dw 0 185 dd 0x00007e00 ;GDT的物理地址 186 ;====================================================================== 187 times 510-($-$$) db 0 188 dw 0xaa55 1 ;===============================內核程序================================= 2 ;定義內核所要用到的選擇子 3 All_4GB_Segment equ 0x0008 ;4GB的全內存區域 4 Stack_Segement equ 0x0018 ;內核棧區 5 Print_Segement equ 0x0020 ;顯存映射區 6 Sys_Routine_Segement equ 0x0028 ;公用例程段 7 Core_Data_Segement equ 0x0030 ;內核數據區 8 Core_Code_Segement equ 0x0038 ;內核代碼段 9 ;---------------------------------------------------------------- 10 User_Program_Address equ 50 ;用戶程序所在邏輯扇區 11 ;=============================內核程序頭部=============================== 12 SECTION header vstart=0 13 Program_Length dd Program_end ;內核總長度 14 Sys_Routine_Seg dd section.Sys_Routine.start ;公用例程段線性地址 15 Core_Data_Seg dd section.Core_Data.start ;內核數據區線性地址 16 Core_Code_Seg dd section.Core_Code.start ;內核代碼區線性地址 17 Code_Entry dd start ;注意偏移地址一定是32位的 18 dw Core_Code_Segement 19 ;---------------------------------------------------------------- 20 [bits 32] 21 ;========================================================================= 22 ;============================公用例程區=================================== 23 ;========================================================================= 24 SECTION Sys_Routine align=16 vstart=0 25 ReadHarddisk: ;esi:28位磁盤號 26 ;ebx:偏移地址 27 pushad 28 29 mov dx,0x1f2 30 mov al,0x01 ;讀一個扇區 31 out dx,al 32 33 inc edx ;0-7位 34 mov eax,esi 35 out dx,al 36 37 inc edx ;8-15位 38 mov al,ah 39 out dx,al 40 41 inc edx ;16-23位 42 shr eax,16 43 out dx,al 44 45 inc edx ;24-28位,主硬盤,LBA模式 46 mov al,ah 47 and al,0x0f 48 or al,0xe0 49 out dx,al 50 51 inc edx 52 mov al,0x20 53 out dx,al 54 55 _wait: 56 in al,dx 57 and al,0x88 58 cmp al,0x08 59 jne _wait 60 61 mov dx,0x1f0 62 mov ecx,256 63 64 _read: 65 in ax,dx 66 mov [ebx],ax 67 add ebx,2 68 loop _read 69 70 popad 71 retf 72 ;---------------------------------------------------------------- 73 put_string: ;ebx:偏移地址 74 pushad 75 76 _print: 77 mov cl,[ebx] 78 cmp cl,0 79 je _exit 80 call put_char 81 inc ebx 82 jmp _print 83 _exit: 84 popad 85 retf ;段間返回 86 ;-------------------------------------------------------------- 87 put_char: ;cl就是要顯示的字符 88 push ebx 89 push es 90 push ds 91 92 mov dx,0x3d4 93 mov al,0x0e ;高8位 94 out dx,al 95 mov dx,0x3d5 96 in al,dx 97 mov ah,al ;先把高8位存起來 98 mov dx,0x3d4 99 mov al,0x0f ;低8位 100 out dx,al 101 mov dx,0x3d5 102 in al,dx ;現在ax就是當前光標的位置 103 104 _judge: 105 cmp cl,0x0a 106 je _set_0x0a 107 cmp cl,0x0d 108 je _set_0x0d 109 _print_visible: 110 mov bx,ax 111 mov eax,Print_Segement 112 mov es,eax 113 shl bx,1 ;注意這里一定要把ebx變成原來的兩倍,實際位置是光標位置的兩倍 114 mov [es:bx],cl ;注意這里是屏幕! 115 mov byte[es:bx+1],0x07 116 add bx,2 117 shr bx,1 118 jmp _roll_screen 119 _set_0x0d: ;回車 120 mov bl,80 121 div bl 122 mul bl 123 mov bx,ax 124 jmp _set_cursor 125 _set_0x0a: ;換行 126 mov bx,ax 127 add bx,80 128 jmp _roll_screen 129 _roll_screen: 130 cmp bx,2000 131 jl _set_cursor 132 mov eax,Print_Segement 133 mov ds,eax 134 mov es,eax 135 136 cld 137 mov edi,0x00 138 mov esi,0xa0 139 mov ecx,1920 140 rep movsw 141 _cls: 142 mov bx,3840 143 mov ecx,80 144 _print_blank: 145 mov word[es:bx],0x0720 146 add bx,2 147 loop _print_blank 148 mov bx,1920 ;別總是忘了光標的位置! 149 _set_cursor: ;改變后的光標位置在bx上 150 mov dx,0x3d4 151 mov al,0x0f ;低8位 152 out dx,al 153 154 mov al,bl 155 mov dx,0x3d5 156 out dx,al 157 158 mov dx,0x3d4 159 mov al,0x0e ;高8位 160 out dx,al 161 162 mov al,bh 163 mov dx,0x3d5 164 out dx,al 165 166 pop ds 167 pop es 168 pop ebx 169 ret 170 ;---------------------------------------------------------------- 171 allocate_memory: ;簡易內存分配策略 172 ;輸入ecx:想要分配的總字節數 173 ;輸出ecx:分配的線性基地址 174 push ds 175 push eax 176 push ebx 177 178 mov eax,Core_Data_Segement 179 mov ds,eax 180 mov eax,[ram_alloc] 181 mov edx,eax ;edx暫存一下eax 182 add eax,ecx 183 184 cmp eax,edx ;發現新分配的現地址比原來的還小,說明已經溢出 185 jge _alloc 186 mov ebx,mem_alloc_fail 187 call Sys_Routine_Segement:put_string 188 mov ecx,0 ;分配為0說明已經分配失敗 189 jmp _exit1 190 _alloc: 191 192 mov ebx,eax 193 and ebx,0xfffffffc 194 add ebx,4 ;強行向上取整 195 test eax,0x00000003 196 cmovnz eax,ebx 197 mov ecx,[ram_alloc] ;要返回要分配的初始地址 198 mov [ram_alloc],eax ;下一次分配的線性基地址 199 add [ram_recycled],eax 200 sub [ram_recycled],ecx ;記錄大小 201 202 _exit1: 203 pop ebx 204 pop eax 205 pop ds 206 207 retf 208 ;---------------------------------------------------------------- 209 recycled_memory_and_gdt: 210 mov eax,[ram_recycled] 211 sub [ram_alloc],eax 212 mov dword[ram_recycled],0 ;因為我們還沒學到多任務,先這樣簡單地清零 213 214 sgdt [pgdt_base_tmp] 215 sub word[pgdt_base_tmp],32 ;應用程序的4個段全部減掉 216 lgdt [pgdt_base_tmp] ;重新加載內核 217 retf 218 ;---------------------------------------------------------------- 219 PrintDword: ;顯示edx內容的一個調試函數 220 pushad 221 push ds 222 223 mov eax,Core_Data_Segement 224 mov ds,eax 225 226 mov ebx,bin_hex 227 mov ecx,8 228 229 _query: 230 rol edx,4 231 mov eax,edx 232 and eax,0x0000000f 233 xlat 234 235 push ecx 236 mov cl,al 237 call put_char 238 pop ecx 239 240 loop _query 241 242 pop ds 243 popad 244 245 retf 246 ;---------------------------------------------------------------- 247 Make_Descriptor: ;構造描述符 248 ;輸入: 249 ;eax:線性基地址 250 ;ebx:段界限 251 ;ecx:屬性 252 ;輸出: 253 ;eax:描述符低32位 254 ;edx:描述符高32位 255 mov edx,eax 256 and edx,0xffff0000 257 rol edx,8 258 bswap edx 259 or edx,ecx 260 261 shl eax,16 262 or ax,bx 263 and ebx,0x000f0000 264 or edx,ebx 265 retf 266 ;---------------------------------------------------------------- 267 Set_New_GDT: ;裝載新的描述符 268 ;輸入:edx:eax描述符 269 ;輸出:cx選擇子 270 push ds 271 push es 272 273 mov ebx,Core_Data_Segement 274 mov ds,ebx 275 276 mov ebx,All_4GB_Segment 277 mov es,ebx 278 279 sgdt [pgdt_base_tmp] 280 281 movzx ebx,word[pgdt_base_tmp] 282 inc bx ;注意這里要一定是inc bx而不是inc ebx,因為gdt段地址初始化是0xffff的 283 ;要用到回繞特性 284 add ebx,[pgdt_base_tmp+0x02] ;得到pgdt的線性基地址 285 286 mov [es:ebx],eax 287 mov [es:ebx+0x04],edx ;裝載新的gdt符 288 ;裝載描述符要裝載到實際位置上 289 290 add word[pgdt_base_tmp],8 ;給gdt的段界限加上8(字節) 291 292 lgdt [pgdt_base_tmp] ;加載gdt到gdtr的位置和實際表的位置無關 293 294 mov ax,[pgdt_base_tmp] ;得到段界限 295 xor dx,dx 296 mov bx,8 ;得到gdt大小 297 div bx 298 mov cx,ax 299 shl cx,3 ;得到選擇子,ti=0(全局描述符),rpl=0(申請特權0級) 300 301 pop es 302 pop ds 303 retf 304 ;========================================================================= 305 ;===========================內核數據區==================================== 306 ;========================================================================= 307 SECTION Core_Data align=16 vstart=0 308 ;------------------------------------------------------------------------------- 309 pgdt_base_tmp: dw 0 ;這一章的用戶程序都是從GDT中加載的 310 dd 0 311 312 ram_alloc: dd 0x00100000 ;下次分配內存時的起始地址(直接暴力從0x00100000開始分配了) 313 ram_recycled dd 0 ;這里儲存程序實際用的大小 314 salt: 315 salt_1: db '@Printf' ;@Printf函數(公用例程) 316 times 256-($-salt_1) db 0 317 dd put_string 318 dw Sys_Routine_Segement 319 320 salt_2: db '@ReadHarddisk' ;@ReadHarddisk函數(公用例程) 321 times 256-($-salt_2) db 0 322 dd ReadHarddisk 323 dw Sys_Routine_Segement 324 325 salt_3: db '@PrintDwordAsHexString' ;@PrintDwordAsHexString函數(公用例程) 326 times 256-($-salt_3) db 0 327 dd PrintDword 328 dw Sys_Routine_Segement 329 330 salt_4: db '@TerminateProgram' ;@TerminateProgram函數(內核例程) 331 times 256-($-salt_4) db 0 332 dd _return_point 333 dw Core_Code_Segement 334 335 salt_length: equ $-salt_4 336 salt_items_sum equ ($-salt)/salt_length ;得到項目總數 337 338 message_1 db ' If you seen this message,that means we ' 339 db 'are now in protect mode,and the system ' 340 db 'core is loaded,and the video display ' 341 db 'routine works perfectly.',0x0d,0x0a,0 342 343 message_5 db ' Loading user program...',0 344 345 do_status db 'Done.',0x0d,0x0a,0 346 347 message_6 db 0x0d,0x0a,0x0d,0x0a,0x0d,0x0a 348 db ' User program terminated,control returned.',0 349 message_7 db 0x0d,0x0a,0x0d,0x0a 350 db ' We have been backed to kernel.',0 351 message_8 db 0x0d,0x0a 352 db ' The GDT and memory have benn recycled.',0 353 354 bin_hex db '0123456789ABCDEF' 355 ;put_hex_dword子過程用的查找表 356 core_buf times 2048 db 0 ;內核用的緩沖區(2049個字節(2MB)) 357 358 esp_pointer dd 0 ;內核用來臨時保存自己的棧指針 359 360 cpu_brnd0 db 0x0d,0x0a,' ',0 361 cpu_brand times 52 db 0 362 cpu_brnd1 db 0x0d,0x0a,0x0d,0x0a,0 363 mem_alloc_fail db 'The Program is too large to load' 364 ;========================================================================= 365 ;===========================內核代碼區==================================== 366 ;========================================================================= 367 SECTION Core_Code align=16 vstart=0 368 load_program: ;輸入esi:磁盤號 369 ;輸出ax: 用戶程序頭部選擇子 370 push esi 371 push ds 372 push es 373 374 mov eax,Core_Data_Segement 375 mov ds,eax ;切換到內核數據段 376 377 mov ebx,core_buf ;ebx要在內核數據緩沖區(先讀取頭部在緩沖區,esi已經是有扇區號了) 378 call Sys_Routine_Segement:ReadHarddisk 379 380 mov eax,[core_buf] ;讀取用戶程序長度 381 382 mov ebx,eax ;給ebx一個副本 383 and ebx,0xfffffe00 ;清空低9位(強制對齊512) 384 add ebx,512 ;加上512 385 test eax,0x000001ff 386 cmovnz eax,ebx ;低9位不為0則使用向上取整的結果 387 388 mov ecx,eax ;eax是整個程序的向上取整的大小 389 call Sys_Routine_Segement:allocate_memory ;先分配內存給整個程序,再分配內存給棧區 390 mov ebx,ecx ;這個才是真正的程要用到的線性基地址 391 392 push ebx ;ebx就是用戶程序加載到內存的地址 393 xor edx,edx 394 mov ecx,512 ;千萬不要改掉ebx 395 div ecx 396 mov ecx,eax 397 398 mov eax,All_4GB_Segment ;切換到4GB段區域(平坦模式) 399 mov ds,eax 400 401 _loop_read: 402 call Sys_Routine_Segement:ReadHarddisk ;esi還是User_Program_Address 403 inc esi 404 add ebx,512 405 loop _loop_read 406 407 ;加載用戶程序頭部段(下面的所有段的地址都要轉化為選擇子) 408 pop edi ;程序被裝載的基地址 409 mov eax,edi 410 mov ebx,[edi+0x04] ;用戶程序頭部的長度 411 dec ebx ;段界限 412 mov ecx,0x00409200 413 call Sys_Routine_Segement:Make_Descriptor 414 call Sys_Routine_Segement:Set_New_GDT 415 mov [edi+0x04],cx ;放入選擇子 416 417 ;加載用戶程序代碼段 418 mov eax,edi 419 add eax,[edi+0x14] ;別忘記重定位了 420 mov ebx,[edi+0x18] ;用戶程序代碼段的長度 421 dec ebx ;段界限 422 mov ecx,0x00409800 423 call Sys_Routine_Segement:Make_Descriptor 424 call Sys_Routine_Segement:Set_New_GDT 425 mov [edi+0x14],cx ;放入選擇子 426 427 ;加載用戶程序數據段 428 mov eax,edi 429 add eax,[edi+0x1c] ;別忘記重定位了 430 mov ebx,[edi+0x20] ;用戶程序數據段的長度 431 dec ebx ;段界限 432 mov ecx,0x00409200 433 call Sys_Routine_Segement:Make_Descriptor 434 call Sys_Routine_Segement:Set_New_GDT 435 mov [edi+0x1c],cx ;放入選擇子 436 437 ;加載用戶程序棧段(用戶程序給出的建議大小) 438 mov ecx,[edi+0x0c] ;確定棧段的建議大小 439 mov ebx,0x000fffff 440 sub ebx,ecx ;這就是段界限了 441 mov eax,4096 ;4KB 442 mul ecx 443 add [ram_recycled],eax ;加上分配的內存 444 445 mov ecx,eax ;這個時候eax是大小 446 call Sys_Routine_Segement:allocate_memory ;分到內存 447 add eax,ecx ;eax線性基地址,ebx段界限 448 mov ecx,0x00c09600 ;4KB粒度向下拓展數據段 449 call Sys_Routine_Segement:Make_Descriptor 450 call Sys_Routine_Segement:Set_New_GDT 451 mov [edi+0x08],cx 452 453 ;現在開始重定位API符號表 454 ;--------------------------------------------------------------------- 455 mov eax,[edi+0x04] ;先設es再ds,不要搞反了,現在es的0x04這個地方是頭部的選擇子 456 mov es,eax 457 mov eax,Core_Data_Segement 458 mov ds,eax 459 460 cld 461 mov ecx,[es:0x24] ;得到用戶程序符號表的條數 462 mov edi,0x28 ;用戶符號表的偏移地址是0x28 463 464 _loop_U_SALT: 465 push edi 466 push ecx 467 468 mov ecx,salt_items_sum 469 mov esi,salt 470 471 _loop_C_SALT: 472 push edi 473 push esi 474 push ecx 475 476 mov ecx,64 ;比較256個字節 477 repe cmpsd 478 jne _re_match ;如果成功匹配,那么esi和edi剛好會在數據區之后的 479 480 mov eax,[esi] ;偏移地址 481 mov [es:edi-256],eax ;把偏移地址填入用戶程序的符號區 482 mov ax,[esi+0x04] ;段的選擇子 483 mov [es:edi-252],ax ;把段的選擇子填入用戶程序的段選擇區 484 485 _re_match: 486 pop ecx 487 pop esi 488 add esi,salt_length 489 pop edi 490 loop _loop_C_SALT 491 492 pop ecx 493 pop edi 494 add edi,256 495 loop _loop_U_SALT 496 ;--------------------------------------------------------------------- 497 mov ax,[es:0x04] ;把頭部的段選擇子給ax 498 499 pop es 500 pop ds 501 pop esi 502 ret 503 start: 504 mov eax,Core_Data_Segement 505 mov ds,eax 506 507 mov ebx,message_1 508 call Sys_Routine_Segement:put_string 509 510 mov eax,0 511 cpuid 512 cmp eax,0x80000004 ;判斷是否有0x80000002-0x80000004功能 513 jl _@load 514 515 ;顯示處理器品牌信息,從80486的后期版本開始引入 516 mov eax,0x80000002 517 cpuid 518 mov [cpu_brand+0x00],eax 519 mov [cpu_brand+0x04],ebx 520 mov [cpu_brand+0x08],ecx 521 mov [cpu_brand+0x0c],edx 522 523 mov eax,0x80000003 524 cpuid 525 mov [cpu_brand+0x10],eax 526 mov [cpu_brand+0x14],ebx 527 mov [cpu_brand+0x18],ecx 528 mov [cpu_brand+0x1c],edx 529 530 mov eax,0x80000004 531 cpuid 532 mov [cpu_brand+0x20],eax 533 mov [cpu_brand+0x24],ebx 534 mov [cpu_brand+0x28],ecx 535 mov [cpu_brand+0x2c],edx 536 537 mov ebx,cpu_brnd0 538 call Sys_Routine_Segement:put_string 539 mov ebx,cpu_brand 540 call Sys_Routine_Segement:put_string 541 mov ebx,cpu_brnd1 542 call Sys_Routine_Segement:put_string 543 544 _@load: 545 mov ebx,message_5 546 call Sys_Routine_Segement:put_string 547 mov esi,User_Program_Address 548 call load_program 549 550 mov ebx,do_status 551 call Sys_Routine_Segement:put_string 552 553 mov [esp_pointer],esp ;臨時保存一下棧指針 554 mov ds,ax ;使ds指向用戶程序頭部 555 556 jmp far [0x10] 557 558 _return_point: 559 560 mov eax,Core_Data_Segement 561 mov ds,eax 562 mov eax,Stack_Segement 563 mov ss,eax ;重新設置數據段和棧段 564 mov esp,[esp_pointer] 565 mov ebx,message_7 566 call Sys_Routine_Segement:put_string 567 568 call Sys_Routine_Segement:recycled_memory_and_gdt 569 mov ecx,[ram_alloc] 570 571 mov ebx,message_8 572 call Sys_Routine_Segement:put_string 573 cli 574 hlt 575 ;========================================================================= 576 SECTION core_trail 577 ;---------------------------------------------------------------- 578 Program_end: 1 ;==============================用戶程序======================================= 2 SECTION header vstart=0 3 4 program_length dd program_end ;程序總長度#0x00 5 6 head_len dd header_end ;程序頭部的長度#0x04 7 8 stack_seg dd 0 ;用于接收堆棧段選擇子#0x08 9 stack_len dd 1 ;程序建議的堆棧大小#0x0c 10 ;以4KB為單位 11 12 prgentry dd start ;程序入口#0x10 13 code_seg dd section.code.start ;代碼段位置#0x14 14 code_len dd code_end ;代碼段長度#0x18 15 16 data_seg dd section.data.start ;數據段位置#0x1c 17 data_len dd data_end ;數據段長度#0x20 18 ;------------------------------------------------------------------------------- 19 ;符號地址檢索表 20 salt_items dd (header_end-salt)/256 ;#0x24 21 22 salt: ;#0x28 23 Printf: db '@Printf' 24 times 256-($-Printf) db 0 25 26 TerminateProgram:db '@TerminateProgram' 27 times 256-($-TerminateProgram) db 0 28 29 ReadHarddisk: db '@ReadHarddisk' 30 times 256-($-ReadHarddisk) db 0 31 32 header_end: 33 ;=============================================================================== 34 SECTION data align=16 vstart=0 35 36 buffer times 1024 db 0 ;緩沖區 37 38 message_1 db 0x0d,0x0a,0x0d,0x0a 39 db '**********User program is runing**********' 40 db 0x0d,0x0a,0 41 message_2 db ' Disk data:',0x0d,0x0a,0 42 43 data_end: 44 45 ;=============================================================================== 46 [bits 32] 47 ;=============================================================================== 48 SECTION code align=16 vstart=0 49 start: 50 User_Data_File equ 100 ;數據文件存放地點 51 mov eax,ds 52 mov fs,eax 53 54 mov eax,[stack_seg] 55 mov ss,eax 56 mov esp,0 57 58 mov eax,[data_seg] 59 mov ds,eax 60 61 mov ebx,message_1 62 call far [fs:Printf] 63 64 mov esi,User_Data_File 65 mov ebx,buffer ;緩沖區偏移地址 66 call far [fs:ReadHarddisk] ;相當于調用函數 67 68 mov ebx,message_2 69 call far [fs:Printf] 70 71 mov ebx,buffer 72 call far [fs:Printf] 73 74 jmp far [fs:TerminateProgram] ;將控制權返回到系統 75 76 code_end: 77 78 ;=============================================================================== 79 SECTION trail 80 ;------------------------------------------------------------------------------- 81 program_end:

2. 課后習題

?????? 其實這一章的課后習題很無聊的,就是把棧段那里改一下就好了,用戶程序按照第八章那樣自己填一個區域。

? ?

1 ;加載用戶程序棧段 2 mov eax,edi 3 add eax,[edi+0x08] 4 mov ebx,[edi+0x0c] ;用戶程序棧段的長度 5 add eax,ebx ;得到棧段的線性基地址 6 mov edx,0xffffffff 7 sub edx,ebx 8 mov ebx,edx ;得到段界限 9 10 mov ecx,0x00409600 11 call Sys_Routine_Segement:Make_Descriptor 12 call Sys_Routine_Segement:Set_New_GDT 13 mov [edi+0x08],cx ;放入選擇子 1 ;==============================用戶程序======================================= 2 SECTION header vstart=0 3 4 program_length dd program_end ;程序總長度#0x00 5 6 head_len dd header_end ;程序頭部的長度#0x04 7 8 stack_seg dd section.stack.start ;棧段位置#0x08 9 stack_len dd stack_end ;棧段長度#0x0c 10 11 12 prgentry dd start ;程序入口#0x10 13 code_seg dd section.code.start ;代碼段位置#0x14 14 code_len dd code_end ;代碼段長度#0x18 15 16 data_seg dd section.data.start ;數據段位置#0x1c 17 data_len dd data_end ;數據段長度#0x20 18 ;------------------------------------------------------------------------------- 19 ;符號地址檢索表 20 salt_items dd (header_end-salt)/256 ;#0x24 21 22 salt: ;#0x28 23 Printf: db '@Printf' 24 times 256-($-Printf) db 0 25 26 TerminateProgram:db '@TerminateProgram' 27 times 256-($-TerminateProgram) db 0 28 29 ReadHarddisk: db '@ReadHarddisk' 30 times 256-($-ReadHarddisk) db 0 31 32 header_end: 33 ;=============================================================================== 34 SECTION data align=16 vstart=0 35 36 buffer times 1024 db 0 ;緩沖區 37 38 message_1 db 0x0d,0x0a,0x0d,0x0a 39 db '**********User program is runing**********' 40 db 0x0d,0x0a,0 41 message_2 db ' Disk data:',0x0d,0x0a,0 42 43 data_end: 44 45 ;=============================================================================== 46 [bits 32] 47 ;=============================================================================== 48 SECTION code align=16 vstart=0 49 start: 50 User_Data_File equ 100 ;數據文件存放地點 51 mov eax,ds 52 mov fs,eax 53 54 mov eax,[stack_seg] 55 mov ss,eax 56 mov esp,0 57 58 mov eax,[data_seg] 59 mov ds,eax 60 61 mov ebx,message_1 62 call far [fs:Printf] 63 64 mov esi,User_Data_File 65 mov ebx,buffer ;緩沖區偏移地址 66 call far [fs:ReadHarddisk] ;相當于調用函數 67 68 mov ebx,message_2 69 call far [fs:Printf] 70 71 mov ebx,buffer 72 call far [fs:Printf] 73 74 jmp far [fs:TerminateProgram] ;將控制權返回到系統 75 76 code_end: 77 ;=============================================================================== 78 SECTION stack align=16 vstart=0 79 times 4096 db 0 80 stack_end: 81 ;=============================================================================== 82 SECTION trail 83 ;------------------------------------------------------------------------------- 84 program_end:

?

?

?

轉載于:https://www.cnblogs.com/Philip-Tell-Truth/p/5226696.html

總結

以上是生活随笔為你收集整理的ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

婷婷色影院 | 日韩视频在线不卡 | 久久国产精品一国产精品 | 天天爽天天做 | 97夜夜澡人人爽人人免费 | 黄色a一级视频 | 久久在线看 | 日韩有码网站 | 成人av观看 | 国产精品青青 | 天天色欧美 | 国产精品区一区 | 国产主播大尺度精品福利免费 | 在线不卡a | 免费观看一区二区三区视频 | www在线免费观看 | 久久av电影| 中文字幕日韩在线播放 | 91久久久国产精品 | 欧美色久 | 中文字幕欧美日韩va免费视频 | 一区精品在线 | 一本一本久久a久久精品牛牛影视 | av888.com| 国产成人61精品免费看片 | 在线观看日韩国产 | 91精品国产乱码在线观看 | 91视频-88av| 91精品老司机久久一区啪 | 日韩午夜高清 | 有码中文字幕在线观看 | 国产精品夜夜夜一区二区三区尤 | 日日夜夜网 | 国产一区电影在线观看 | 日韩精品一区二区不卡 | 婷婷丁香六月 | 欧美精品在线视频 | 亚洲精品在线免费看 | 国产精品成人a免费观看 | 99在线观看精品 | av青草| 黄色av一级片 | 97超碰站| 日本大尺码专区mv | 久久成人麻豆午夜电影 | 99久久国产免费免费 | 精品国产一区二区三区四区在线观看 | 欧美精品在线视频观看 | 九热精品 | 免费av网址在线观看 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 国产精品一区电影 | 国产在线播放一区 | 在线 日韩 av | 91日本在线播放 | 国产美女在线免费观看 | 亚欧日韩av | 国产在线无 | 亚洲激情综合 | 国产精品视频免费观看 | 六月婷婷色 | 婷婷av电影| 久久久久久久久久网站 | 欧美精品在线观看免费 | 欧洲精品久久久久毛片完整版 | 国产+日韩欧美 | 一二三区av| 69亚洲乱| 国产一区二区久久 | 免费看搞黄视频网站 | 天天色天天综合网 | 成人91视频 | 综合久久一本 | 日日干综合 | 一区二区精品在线视频 | 日韩欧美精品在线观看视频 | 成年人免费在线观看网站 | 国产一区欧美一区 | 91精品国产一区二区在线观看 | 男女激情免费网站 | 国产色在线观看 | 中文字幕日韩伦理 | 黄色午夜| 精品国产一区二区三区免费 | 97成人免费视频 | 国产精品高潮呻吟久久av无 | 中文字幕 国产专区 | 91精品久久久久久久99蜜桃 | 一区二区三区在线观看免费视频 | 国产精品久久久久久影院 | 国产又粗又猛又色 | 国产精品白丝jk白祙 | 亚洲精品乱码久久久久久写真 | 欧美激情xxxx性bbbb | 色噜噜在线观看视频 | 日韩欧美在线观看一区 | 91精品视频在线观看免费 | 国产一区二区三区四区在线 | 日日夜夜精品视频天天综合网 | 中文字幕的 | 91精选在线| 五月天亚洲综合 | 久久综合五月天 | 在线观看中文字幕 | www.精选视频.com | 国产资源精品在线观看 | 麻豆传媒视频观看 | 视频高清| 日本狠狠干 | 精品久久久久一区二区国产 | 狠狠的操狠狠的干 | 久久99久| 午夜精品久久久久久中宇69 | 欧美午夜视频在线 | av在线看片 | 欧美精品久久久久久久亚洲调教 | 国产一级片播放 | 天天干天天做天天爱 | 国产成人在线网站 | 婷婷在线精品视频 | 日韩精品免费一区 | 中文字幕一区二区三区久久蜜桃 | 国产免费亚洲高清 | 一区二区视频在线播放 | 99久久精| 国产伦精品一区二区三区高清 | 日韩大陆欧美高清视频区 | 五月天久久激情 | 中文字幕精品久久 | 日韩电影精品一区 | 91成人免费视频 | 久久黄色网页 | 亚洲精品久久久久久国 | 国产中文在线字幕 | 国产亚洲无| 久久久五月婷婷 | 婷婷六月网| 天天做综合网 | 91九色国产在线 | 日日爱网址 | 91成人网在线 | 久久精品官网 | 狠狠躁日日躁 | 日韩一区精品 | 伊人天堂久久 | 亚洲一级免费观看 | 亚洲国产三级在线观看 | 免费黄色av | 中文字幕中文字幕中文字幕 | 日日草视频 | 亚洲欧美国产日韩在线观看 | 九九欧美视频 | 爱情影院aqdy鲁丝片二区 | 日韩高清在线不卡 | 毛片无卡免费无播放器 | 免费日韩一区二区三区 | 免费亚洲一区二区 | 久久草网站 | 九九热久久免费视频 | 青青河边草观看完整版高清 | 国产日韩在线播放 | 国产精品一区二区三区四区在线观看 | 久久久久久久久久久久影院 | 中文字幕观看视频 | 成人av教育| 激情xxxx| 国产中文视频 | 亚洲 综合 国产 精品 | 日韩最新在线视频 | 久久久久久美女 | 日本精品中文字幕 | www黄com| 婷婷激情在线观看 | 亚洲免费公开视频 | 免费高清在线观看成人 | 亚洲综合视频在线观看 | 日韩欧美99 | 日韩在线观看第一页 | 三级黄色大片在线观看 | 国产精品一区二区免费在线观看 | 国产精品一区二区免费看 | 国产手机视频在线播放 | www黄色com| 99视频偷窥在线精品国自产拍 | 成人h在线 | 中文在线字幕免费观 | 日韩免费高清 | 黄色小说视频网站 | 亚洲久草在线视频 | 亚洲成人精品在线观看 | 婷婷久操 | 最近中文字幕大全 | 五月婷婷播播 | 99re热精品视频 | 亚洲精品乱码久久久久久久久久 | 91私密视频 | 午夜在线免费观看 | www.天天色 | 视频国产一区二区三区 | 激情综合色播五月 | 欧美在线视频一区二区三区 | 午夜精品在线看 | 欧美性爽爽 | 国产一级免费视频 | 成人久久综合 | 四虎永久视频 | 午夜久久成人 | 国产视频久久久 | 日产乱码一二三区别免费 | 911免费视频 | 免费黄色在线播放 | 成人av在线一区二区 | 成人av资源网 | 亚洲一级性 | 婷婷激情综合 | 国产精品 欧美 日韩 | 国内成人av| 日韩av偷拍 | 黄色亚洲大片免费在线观看 | 国产中文字幕视频在线观看 | 91国内在线 | 久久大片 | 国产又粗又猛又黄又爽视频 | 亚洲欧美日韩一区二区三区在线观看 | 欧美日韩精品久久久 | 97成人资源站 | 日韩精品久久久久久久电影竹菊 | 深爱五月激情五月 | 97精品国产 | 五月天中文字幕mv在线 | 欧美一区免费观看 | 中文字幕在线观看视频一区二区三区 | 黄色成人免费电影 | 久草在线视频国产 | 国产日韩精品在线 | 丝袜美腿一区 | 香蕉视频一级 | 亚洲精品乱码久久久久 | 久草网站在线 | 中文字幕在线观看资源 | 果冻av在线 | 国产一级大片免费看 | 91视频亚洲 | 日韩av网站在线播放 | av电影在线免费 | 精品一区二区免费在线观看 | 人人爽人人做 | 九九久久电影 | 欧美日韩高清一区二区三区 | 韩国一区视频 | 草久在线播放 | 麻豆小视频在线观看 | 国产成人精品综合久久久 | 高清av免费看 | 97在线视频免费播放 | 91视频久久久久久 | 成人黄色资源 | 国产日韩精品在线 | 黄色一二级片 | 日韩专区一区二区 | 国产999精品久久久久久绿帽 | 国产精品1区2区3区 久久免费视频7 | 亚洲欧美视频在线 | 欧美电影黄色 | 日韩sese| 不卡中文字幕在线 | 中文字幕在线日 | 国产精品美乳一区二区免费 | 久草网站在线 | 麻豆传媒电影在线观看 | 天天射天天搞 | 日本精品久久久久影院 | 日韩综合精品 | 日本中文字幕网站 | 婷婷丁香色综合狠狠色 | 91一区二区三区久久久久国产乱 | 国产高清中文字幕 | 人人澡人人模 | av一二三区 | 69视频在线播放 | 久久视讯 | 香蕉视频啪啪 | 亚洲欧美日韩一区二区三区在线观看 | 久久久国产精品视频 | 激情电影在线观看 | 免费看的国产视频网站 | 天天插狠狠插 | 亚洲午夜久久久久久久久久久 | 国产精品一区在线观看你懂的 | 亚洲综合一区二区精品导航 | 日韩电影在线观看一区二区三区 | 又粗又长又大又爽又黄少妇毛片 | 麻豆免费视频网站 | 91网址在线观看 | 亚洲六月丁香色婷婷综合久久 | 婷婷网站天天婷婷网站 | 国产精品美女免费视频 | 国产拍在线 | 美女视频黄是免费的 | 亚洲欧美日韩精品久久久 | 国产精品九九九九九九 | 玖玖国产精品视频 | 91人人干| 色综合久久综合网 | 亚洲热久久 | 天天操综| 五月婷婷久 | 亚洲精品中文字幕视频 | 国产免费资源 | 国产一区免费在线 | 99在线视频免费观看 | 国产精品乱码一区二三区 | 五月天视频网 | 中文资源在线播放 | 蜜臀精品久久久久久蜜臀 | 欧美巨大 | 99久久99久久精品国产片 | 欧美专区国产专区 | 人人爱在线视频 | 日韩欧美aaa| 亚洲电影网站 | 国产91成人在在线播放 | 精品一区二区三区四区在线 | 天天玩天天干天天操 | 在线观看视频99 | 手机看片99 | 制服丝袜在线 | 国产一区私人高清影院 | 超碰在线中文字幕 | 日本成人a | 激情偷乱人伦小说视频在线观看 | 99精品成人 | 欧美性性网 | 欧美日韩高清在线 | 在线观看一区视频 | 在线亚洲欧美日韩 | 亚洲精品在线播放视频 | 日本h视频在线观看 | 丁香影院在线 | 色综合久久久久综合99 | 在线成人看片 | 欧美a在线看| 国产精品嫩草影院9 | 天堂成人在线 | av电影久久 | 最近日本mv字幕免费观看 | 黄色在线成人 | 婷婷丁香激情五月 | 国产精品久久久久久久久久尿 | 欧美日韩国产色综合一二三四 | 色橹橹欧美在线观看视频高清 | 国产xxxx做受性欧美88 | 日韩城人在线 | 91激情在线视频 | 日本在线观看中文字幕 | 亚洲高清久久久 | 99热精品视 | 成片免费观看视频大全 | 欧美综合在线视频 | 日韩在线观看a | 99久久99视频只有精品 | 91亚洲精品乱码久久久久久蜜桃 | 在线影视 一区 二区 三区 | 久久99精品久久久久久久久久久久 | 久久亚洲在线 | 伊人av综合| 日韩中文幕 | 日韩性片 | 婷婷中文字幕在线观看 | 色永久免费视频 | 日本韩国精品在线 | 国产精品一区二区三区视频免费 | 欧美大片大全 | 成人精品一区二区三区中文字幕 | 九色91在线 | 超碰人人舔 | 99久久精品国产一区二区成人 | 91精品视频在线免费观看 | 91日韩在线专区 | 91桃花视频 | 最近中文字幕在线播放 | 欧美日韩精品区 | 欧美一级看片 | 2019天天干夜夜操 | 99在线观看免费视频精品观看 | 五月天久久激情 | 天天爱天天射 | 夜夜视频 | 中文在线字幕观看电影 | 日本一区二区三区免费看 | 日韩在线中文字幕 | 国产精品永久免费 | 欧美在线free | 久久国产精品视频免费看 | 五月天伊人 | 国产无遮挡又黄又爽在线观看 | 人人澡人摸人人添学生av | 伊人中文网 | 99免费在线视频观看 | 天天躁日日躁狠狠躁av麻豆 | 97超碰免费在线 | 国产精品久久久久久久久久久杏吧 | 日韩在线观看第一页 | wwwwwww色| 99在线观看视频网站 | 国产一级一级国产 | 国产看片免费 | 久久久综合九色合综国产精品 | 爱色av.com | 久久久国产精品久久久 | 亚洲精品美女久久 | 国产高清av在线播放 | 日韩欧美在线观看 | 超碰在线成人 | 国产剧在线观看片 | 一区二区欧美日韩 | 天天插天天爽 | 97超碰资源网 | 狠狠五月天 | 日韩午夜高清 | 91麻豆精品久久久久久 | 中文字幕一二三区 | 91久久精品日日躁夜夜躁国产 | 国产精品永久在线观看 | 国产精品成人免费精品自在线观看 | 亚一亚二国产专区 | 中文字幕在线不卡国产视频 | 天天插夜夜操 | 天天干天天综合 | 久久字幕精品一区 | 亚洲理论片在线观看 | 久久深夜福利免费观看 | 99久久精品费精品 | 久久精品毛片 | 在线激情影院一区 | 国产成人福利在线观看 | 色姑娘综合天天 | 久久久久久久久久久电影 | 久久理论电影 | 欧美精品xx | 久久久成人精品 | 久久久久久蜜桃一区二区 | 欧美国产不卡 | 1区2区3区在线观看 三级动图 | 狠狠色狠狠色综合系列 | 亚洲国产美女久久久久 | 国产精品亚洲视频 | 免费在线观看的av网站 | 色婷婷国产精品 | 欧美伊人网| 国产精品高清一区二区三区 | 国产成人精品av | 国产99久久久国产精品免费看 | 国产精品a久久久久 | 成人在线网站观看 | 欧美日本在线观看视频 | 操操操av | 日本性xxx| 久久免费看毛片 | 91av小视频 | 免费观看福利视频 | 国产黄网在线 | 麻豆91在线观看 | 日韩久久视频 | 久久久亚洲精华液 | 免费日韩三级 | 国产 亚洲 欧美 在线 | av综合av| 日韩成人黄色av | 久久久久 免费视频 | 亚洲 av网站 | 中文字幕免费高清 | 麻豆视频国产 | 永久黄网站色视频免费观看w | 91精品导航 | 探花视频在线观看 | 国产成人久久av977小说 | 在线看成人 | 免费视频久久久久久久 | 日韩大片免费在线观看 | 欧美久久综合 | 偷拍视频一区 | 91在线色| 亚洲高清av| 在线视频中文字幕一区 | 亚洲精品视频在线观看网站 | 欧美日韩中文在线视频 | 国产区av在线 | 国产日产av | 五月婷婷在线播放 | 成人av在线播放网站 | 免费亚洲成人 | 国产小视频在线观看免费 | 狠狠躁夜夜a产精品视频 | 亚洲va欧美va国产va黑人 | 国产伦理一区二区三区 | 欧美亚洲一级片 | 啪啪精品 | 免费精品人在线二线三线 | 91片黄在线观 | 99麻豆视频 | 99爱国产精品 | 亚洲在线| 久久av观看| 久久久久久久久久久网 | 国产一区精品在线 | 久久99精品国产麻豆宅宅 | av在线免费播放 | 国产破处在线播放 | 中文在线字幕观看电影 | 狂野欧美激情性xxxx | 四虎最新域名 | www.大网伊人| 美女亚洲精品 | 九九综合九九 | 天天射天天舔天天干 | 99国产精品久久久久久久久久 | 一本一道久久a久久综合蜜桃 | 免费看黄色小说的网站 | 欧美久草在线 | 国产最新在线视频 | 久久久久久网站 | www.com操| 在线观看国产 | 国产一区免费看 | 成人小电影在线看 | 国产一线二线三线性视频 | 精品国内| 国产精品久久久久久久午夜 | 欧美精品一级视频 | 四虎在线观看视频 | 成人黄视频 | 国产一级一片免费播放放 | 亚洲精品男人天堂 | 日韩欧美视频在线免费观看 | 精品国产一区二区三区不卡 | 狠狠色丁香九九婷婷综合五月 | 国产精品 999 | 中文字幕在线播放av | 国产一级免费视频 | 91在线免费播放视频 | 国产福利专区 | 在线中文字幕播放 | 久久黄色影院 | 国产色综合 | av黄色免费在线观看 | 免费国产视频 | 成人午夜免费剧场 | 探花视频在线观看 | 免费av大片| 天堂中文在线播放 | 草久视频在线观看 | 一区二区三区视频在线 | 怡红院av久久久久久久 | 国产四虎在线 | 97超碰国产精品女人人人爽 | 国产视频1区2区 | 国产精品久久久久av福利动漫 | 一级欧美一级日韩 | 丁香婷婷在线观看 | 国产精品欧美久久久久无广告 | 久久精品国产亚洲精品2020 | 国产亚洲情侣一区二区无 | 色午夜影院 | 欧美电影黄色 | 在线播放 日韩专区 | 国产伦精品一区二区三区无广告 | 91成人蝌蚪 | 久艹在线播放 | 欧洲在线免费视频 | 97超视频免费观看 | 国产一区二区精 | 久久精品影视 | 521色香蕉网站在线观看 | 天天操天天曰 | 四虎影视4hu4虎成人 | 欧美日韩视频在线观看一区二区 | 成人av地址| 亚洲狠狠婷婷 | 国产精品99久久久精品免费观看 | 国产一区二区在线免费观看 | 亚洲国产午夜精品 | 久久视频一区二区 | 韩日精品在线观看 | 超碰在97 | 天天爱天天爽 | 人人干,人人爽 | 欧美日韩久久久 | 日本韩国欧美在线观看 | 在线视频中文字幕一区 | av三级在线看 | 欧美一区二区三区在线 | 国产一区免费看 | 日韩免费av网址 | 国产在线观看一 | 91九色视频国产 | 视频一区亚洲 | 亚洲日本欧美在线 | 成年人视频在线 | 亚洲美女精品区人人人人 | 久久成人福利 | 美女久久久久久久久久 | av电影 一区二区 | 五月综合婷 | 国产区在线视频 | 国产成人在线网站 | 97超碰网| 久久影视网 | 天天av资源| 丁香久久婷婷 | 色婷婷成人网 | 亚洲精品免费在线观看视频 | 91高清视频在线 | 国产精品成人国产乱一区 | 欧美成人xxx | 蜜臀久久99精品久久久无需会员 | 一区免费观看 | 久久久久9999亚洲精品 | 中国成人一区 | 日韩欧美在线播放 | 成人免费视频播放 | 992tv在线观看 | 99在线精品视频在线观看 | 午夜精品久久久久久久久久久久久久 | 精品视频9999| 国产成人一区二区在线观看 | 欧美午夜性 | 久久久久久福利 | 久久成年人 | 国产美女免费观看 | 国产一级黄色免费看 | 99久久久久久国产精品 | 五月激情丁香婷婷 | 免费人成网ww44kk44 | 国产短视频在线播放 | 一区二区三区日韩在线 | 亚洲欧洲中文日韩久久av乱码 | 国产一区精品在线 | 国产一级性生活 | 亚洲精品网址在线观看 | 亚洲永久字幕 | 99久久精品国产一区二区成人 | 日韩欧美精品在线 | 久久国产精品免费看 | 亚洲精品乱码久久久久久久久久 | 在线观看黄色小视频 | 西西444www大胆高清视频 | 中文字幕电影高清在线观看 | 日本成人黄色片 | 久久久久黄 | 中文成人字幕 | 日韩视频免费观看高清完整版在线 | 日本久草电影 | 亚洲精品午夜久久久久久久 | 午夜 久久 tv | 国产精品自产拍在线观看网站 | 国产剧情一区二区在线观看 | 91亚洲精品久久久中文字幕 | 日韩免费高清 | 亚洲欧美999| 激情五月婷婷综合 | 国产精品久久久久久久99 | 欧美一区免费在线观看 | 日韩在线视频免费播放 | 狠狠干网| 日韩久久视频 | 激情偷乱人伦小说视频在线观看 | 在线之家免费在线观看电影 | 欧洲精品亚洲精品 | 日韩在线视频观看免费 | 毛片网在线观看 | 午夜a区 | 国产区网址 | 欧美aa一级片| 精品视频不卡 | 国产精品嫩草影院9 | 国产手机在线 | 国产女教师精品久久av | 免费婷婷 | 欧美成年人在线视频 | 黄色小说视频网站 | 国产麻豆精品一区二区 | 91视频91蝌蚪 | 国产中文视频 | 久久这里只有精品视频99 | 丁香六月欧美 | 国产精品久久久免费 | 国产流白浆高潮在线观看 | 99精品在线免费视频 | 国产精品网红直播 | 国产一级片免费观看 | 91网址在线 | 久久精品影片 | 国产91国语对白在线 | 99婷婷狠狠成为人免费视频 | 色婷婷色 | 色播激情五月 | 成人免费在线视频 | 国产精品日韩久久久久 | 久草网视频 | 五月综合网 | 久久国产精品一区二区三区 | 日韩免费网站 | 97精品免费视频 | 国产电影一区二区三区四区 | 久久精品亚洲一区二区三区观看模式 | 97小视频| 国产黄色片在线 | 国产1级视频| 在线观看91精品国产网站 | 色婷婷天天干 | 96国产精品视频 | 麻豆91在线播放 | 久久国产热视频 | 91你懂的| 美女国产在线 | www.夜夜爽 | 美女视频一区二区 | 在线观看国产www | www.狠狠| 国产一区二区免费看 | 精品久久美女 | 亚洲免费一级 | 99久久精品国产欧美主题曲 | 天天干天天射天天操 | 欧美日韩一二三四区 | 欧美美女视频在线观看 | 国产成人久久精品一区二区三区 | 国产精品99久久久久久人免费 | 日韩大片在线 | 免费看短 | 欧美在线视频不卡 | 成人免费精品 | 亚洲精品视频二区 | 日本二区三区在线 | 美女视频一区 | 欧美一区二区免费在线观看 | 米奇四色影视 | 色婷婷a| 五月婷婷六月丁香 | 日韩国产在线观看 | 国产精品久久久久影院日本 | 亚洲精品一区二区三区在线观看 | 国产黄色片免费 | 99精彩视频在线观看免费 | 人人射网站 | av天天色 | 国产在线视频一区二区三区 | 色欧美成人精品a∨在线观看 | 亚洲精品乱码久久久久久写真 | 久久精品婷婷 | 玖玖在线播放 | 日韩狠狠操 | 免费观看mv大片高清 | 91丨九色丨蝌蚪丨老版 | 精品一区 在线 | 婷婷国产精品 | 久久综合九色99 | 日韩免费电影 | 色偷偷av男人天堂 | 91精品国自产在线观看 | 18av在线视频| 色婷婷综合久色 | 欧美在线视频一区二区三区 | 99精品一级欧美片免费播放 | 最近字幕在线观看第一季 | 国产美女网站视频 | 亚洲综合色播 | 99久热在线精品视频 | 久久色在线观看 | 日本中文乱码卡一卡二新区 | 国内小视频在线观看 | 中文字幕日韩国产 | 超碰在线97观看 | 久久久久久久久爱 | 免费日韩视频 | 99精品视频免费在线观看 | 色综合久久综合中文综合网 | 在线免费观看黄色 | 2022久久国产露脸精品国产 | 婷婷伊人五月 | 日韩影视在线观看 | 色综合天天 | 999久久久精品视频 日韩高清www | 黄色软件网站在线观看 | 日日操天天操狠狠操 | 色偷偷网站视频 | 黄色一级大片免费看 | 国产精品永久久久久久久www | 中文国产在线观看 | 国产精品久久久久久久午夜 | 最新中文字幕在线观看视频 | 亚洲在线视频免费观看 | 中文字幕在线看视频国产中文版 | 国产精品成人免费一区久久羞羞 | 成人中文字幕+乱码+中文字幕 | 精品亚洲va在线va天堂资源站 | 欧美一级电影免费观看 | 99久久久国产精品 | 99精品在这里 | 伊人狠狠色丁香婷婷综合 | 国产不卡一区二区视频 | 国产成人精品亚洲精品 | 亚洲一一在线 | 天天鲁一鲁摸一摸爽一爽 | 美女视频黄免费网站 | 中文字幕亚洲情99在线 | 美女免费视频一区 | 国产理伦在线 | 西西大胆免费视频 | 久久精品播放 | 国模视频一区二区三区 | 欧美极品xxxxx | 日韩久久久久久久久久 | 亚洲电影第一页av | 久久看片 | 一二三区高清 | 激情伊人五月天久久综合 | 日本黄色大片免费 | 99免费国产 | 91麻豆免费看 | 久久久久久久国产精品 | 久久人人97超碰国产公开结果 | 最新日韩中文字幕 | 蜜桃视频成人在线观看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 一本一道波多野毛片中文在线 | 免费观看成人网 | 九九国产精品视频 | 欧美日韩国产二区三区 | 精品在线小视频 | av福利第一导航 | 国产h片在线观看 | 免费成人在线网站 | 成人三级网址 | 久久伊人婷婷 | 青青草国产成人99久久 | 视频精品一区二区三区 | 久草网免费 | 在线观看www. | 狠狠色丁香婷综合久久 | 麻豆av电影 | 狠狠色综合网站久久久久久久 | 91人人插| 最近av在线| 91精品久久久久久粉嫩 | 黄色网www | 亚洲综合情 | 91免费看片黄 | 黄色软件在线观看视频 | 亚洲精品乱码久久久久久 | 精品96久久久久久中文字幕无 | 亚洲区另类春色综合小说校园片 | 国产精品久久久一区二区三区网站 | 色91在线视频| 日韩欧美在线播放 | 特级西西www44高清大胆图片 | 一级免费黄色 | 香蕉影视在线观看 | 久章草在线观看 | 九九九热精品免费视频观看网站 | 日韩久久激情 | 国产精品一区二区av日韩在线 | 日韩在线播放视频 | 日日天天av| 中文字幕国产亚洲 | 国产美女在线精品免费观看 | 国产一二三四在线视频 | 日韩在线欧美在线 | 亚洲免费在线视频 | 免费精品在线视频 | 国产特级毛片aaaaaa高清 | 九九免费观看视频 | 国产精品一区二区三区四区在线观看 | 91精品国自产在线观看 | 五月天婷婷狠狠 | 久久久国产精品成人免费 | 国产久草在线 | 最近2019年日本中文免费字幕 | 99精品国产在热久久下载 | 亚洲综合精品在线 | 午夜国产一区二区三区四区 | 中文字幕在线观看免费观看 | 成人中文字幕在线观看 | 色悠悠久久综合 | www.av在线.com | 91精品国产99久久久久 | 免费三级网| 超碰在线94| 亚洲码国产日韩欧美高潮在线播放 | 成人在线观看免费 | 日韩午夜电影网 | 欧美污在线观看 | 337p日本大胆噜噜噜噜 | www.夜夜操| 久久国产欧美日韩 | 天天操夜夜操 | 免费视频国产 | 日韩免费视频线观看 | 在线观看国产一区 | 亚洲欧洲成人精品av97 | 日韩av偷拍| 五月婷丁香网 | 日日碰狠狠躁久久躁综合网 | 免费开视频| 插插插色综合 | 成年人免费电影 | 日本中文一级片 | 欧美人人爱 | 日韩a级黄色片 | 一区二区视频电影在线观看 | 麻豆视频大全 | 五月婷婷综合色拍 | 中文字幕在线乱 | 亚洲va韩国va欧美va精四季 | 免费日韩视频 | 国产精品99在线观看 | 成人免费视频播放 | 在线观看免费黄色 | 97超碰色 | 中文在线8资源库 | 久久国产高清视频 | 亚洲成aⅴ人在线观看 | 亚洲自拍偷拍色图 | 精品国产激情 | 69国产精品视频免费观看 | 日本公乱妇视频 | 国产高清视频免费观看 | 久久美女高清视频 | 国内久久视频 | 久久不卡视频 | 色婷婷久久一区二区 | 九九热在线免费观看 | 色五月色开心色婷婷色丁香 | 国产一二区精品 | 在线国产视频 | 亚洲91精品 | 91大片网站 | 美女免费视频一区二区 | 亚洲午夜久久久综合37日本 | 午夜免费福利视频 | 视频一区视频二区在线观看 | 国内精品久久久久久久影视简单 | 久久精品牌麻豆国产大山 | 成年人免费观看国产 | 国产第一页在线观看 | 亚洲a网 | 免费看黄电影 | 久久精品资源 | 精品福利在线视频 | 久久国产精品免费一区二区三区 | 欧美在线视频一区二区 | 欧美小视频在线 | 在线看av的网址 | 免费高清在线一区 | 99精品99 | 91成人免费| 91手机视频在线 | 亚洲九九精品 | 精品日韩在线 | 国产高清视频在线观看 | 91亚洲精品在线观看 | 网站在线观看你们懂的 | 国产精品二区在线观看 | 在线免费观看羞羞视频 | 欧美一级欧美一级 | 国产激情电影综合在线看 | 婷婷久久网站 | 天天干天天搞天天射 | 黄色一级免费网站 | 24小时日本在线www免费的 | 在线香蕉视频 | 久久99久久精品国产 | www.久久色.com | 久久久久久久久久久久影院 | 国产香蕉视频在线观看 | 亚洲视频免费在线 | 毛片网站观看 | 三级动图| 国产精品麻豆视频 | av一级二级| 欧美精品久久久久久久久久白贞 | 92精品国产成人观看免费 | 亚洲欧美日韩国产一区二区三区 | 色99色 | h网站免费在线观看 | 国产精品av在线免费观看 | 九九免费精品视频在线观看 | 在线免费国产视频 | 不卡的av片 | 美女视频免费精品 | 久久99精品久久久久久久久久久久 | 国产精品 欧美 日韩 | 欧美日韩高清一区二区三区 | 在线va网站 | 国产精品激情偷乱一区二区∴ | 欧美性色黄 | 人人精品久久 |