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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux系统调用在glibc中的实现

發布時間:2025/3/20 linux 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统调用在glibc中的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

How system calls work in Linux

轉自:http://12000.org/my_notes/system_calls_in_linux/system_call_in_linux.htm

Nasser M. Abbasi


May 29, 2000???page compiled on June?28, 2015 at 4:55am

These are notes I wrote while learning how system calls work on a Linux system.

To help show this how system call works, I show ?ow of a typical system call such as?fopen().

fopen()?is a function call de?ned in the C standard library. I use glibc-2.1 as an implementation.

From the UNIX98 standard, fopen() is de?ned as

??#include?<stdio.h>
??
??????FILE?*fopen(const?char?*filename,?const?char?*mode);
???
???DESCRIPTION
??
??????The?fopen()?function?opens?the?file?whose?pathname?is?the?string?pointed?
??????to?by?filename,?and?associates?a?stream?with?it.
???
??????The?argument?mode?points?to?a?string?beginning?with?one?of?the?following?sequences:
??
??????r?or?rb?
??????????Open?file?for?reading.
??????w?or?wb
??????????Truncate?to?zero?length?or?create?file?for?writing.?
??????a?or?ab
??????????Append;?open?or?create?file?for?writing?at?end-of-file.?
??????r+?or?rb+?or?r+b
??????????Open?file?for?update?(reading?and?writing).
??????w+?or?wb+?or?w+b?
??????????Truncate?to?zero?length?or?create?file?for?update.
??????a+?or?ab+?or?a+b?
??????????Append;?open?or?create?file?for?update,?writing?at?end-of-file.

Create the following t.c C program to use to test with:

??#include?<stdio.h>
??
??int?main(int?argc,?char?*argv[])
??{
????FILE?*f;
???
????f?=?fopen("test.txt","r");
??
????return?0;
??}

To step into fopen(), glibc 2.1 was build in debug and the new build libc.a was linked against instead of the default installed libc on my linux box.

To build glibc, the following are steps performed. A good reference is the glibc2 HOWTO,?http://www.linux.ps.pl/doc/other/LDP/HOWTO/Glibc2-HOWTO.html

First, I downloaded the glibc tar ?le to?/usr/src/packages/SOURCES. Extracted It and it created?glibc-2.1/?directory. Then copied the crypt tar ?le into?glibc-2.1/?and extracted that. It created?crypt/?directory under?glibc-2.1/. Next I did

????cd?glibc-2.1
????./configure?--enable-add-ons
????make
????make?check

Next, I installed the library into a direcory called?INSTALL_LIB?under glibc-2.1.

??????make?install?install_root=/usr/src/packages/SOURCES/glibc-2.1/INSTALL_LIB

OK, now glibc-2.1 is compiled and ready to use. Back to the little C program we have above. Lets now compile it and link it to the above library.

???gcc?-static?-g?-I?/usr/src/packages/SOURCES/glibc-2.1/INSTALL_LIB/usr/local/include?\?
??????-L/usr/src/packages/SOURCES/glibc-2.1/INSTALL_LIB/usr/local/lib?t.c

Ok, now lets step through it.

??$gdb?./a.out
??GNU?gdb?4.18
??(gdb)?break?main
??Breakpoint?1?at?0x80481b6:?file?t.c,?line?7.?
??
??(gdb)?run
??Starting?program:?/export/g/nabbasi/data/my_misc_programs/my_c/./a.out
???
??Breakpoint?1,?main?(argc=1,?argv=0xbffff434)?at?t.c:7
??7?????????f?=?fopen("test.txt","r");?
??(gdb)?list
??2
??3???????int?main(int?argc,?char?*argv[])
??4???????{
??5?????????FILE?*f;
??6?
??7?????????f?=?fopen("test.txt","r");
??8
??9?????????return?0;
??10??????}
??
??(gdb)?disassemble?main?
??Dump?of?assembler?code?for?function?main:
??0x80481b0?<main>:???????push???%ebp?
??0x80481b1?<main+1>:?????mov????%esp,%ebp
??0x80481b3?<main+3>:?????sub????$0x4,%esp?
??0x80481b6?<main+6>:?????push???$0x8071ba8
??0x80481bb?<main+11>:????push???$0x8071baa?
??0x80481c0?<main+16>:????call???0x8048710?<_IO_new_fopen>
??0x80481c5?<main+21>:????add????$0x8,%esp?
??0x80481c8?<main+24>:????mov????%eax,%eax
??0x80481ca?<main+26>:????mov????%eax,0xfffffffc(%ebp)?
??0x80481cd?<main+29>:????xor????%eax,%eax
??0x80481cf?<main+31>:????jmp????0x80481e0?<main+48>?
??0x80481d1?<main+33>:????jmp????0x80481e0?<main+48>
??0x80481e0?<main+48>:????mov????%ebp,%esp?
??0x80481e2?<main+50>:????pop????%ebp
??0x80481e3?<main+51>:????ret
??End?of?assembler?dump.

Humm... what happened to?printf?call? you will notice, it is now a call to?_IO_new_fopen. But I was calling?fopen, not?_IO_new_fopen?.

Lets step into?_IO_new_fopen?and see what happened.

??(gdb)?s
??_IO_new_fopen?(filename=0x8071baa?"test.txt",?mode=0x8071ba8?"r")?at?iofopen.c:42?
??42????????}?*new_f?=?(struct?locked_FILE?*)?malloc?(sizeof?(struct?locked_FILE));

So,?_IO_new_fopen?is an entry in?iofopen.c. Where is this ?le?

??cd?glibc-2.1
??find?.?-name?iofopen.c

will show it as?glibc-2.1/libio/iofopen.c?Lets look at it

??#include?"libioP.h"
??#ifdef?__STDC__
??#include?<stdlib.h>
??#endif
??_IO_FILE?*?
??_IO_new_fopen?(filename,?mode)
???????const?char?*filename;
???????const?char?*mode;
??{?
????struct?locked_FILE
????{
??????struct?_IO_FILE_plus?fp;
??#ifdef?_IO_MTSAFE_IO
??????_IO_lock_t?lock;?
??#endif
????}?*new_f?=?(struct?locked_FILE?*)?malloc?(sizeof?(struct?locked_FILE));?
????if?(new_f?==?NULL)
??????return?NULL;
??#ifdef?_IO_MTSAFE_IO
????new_f->fp.file._lock?=?&new_f->lock;?
??#endif
????_IO_init?(&new_f->fp.file,?0);
????_IO_JUMPS?(&new_f->fp)?=?&_IO_file_jumps;?
????_IO_file_init?(&new_f->fp.file);
??#if??!_IO_UNIFIED_JUMPTABLES
????new_f->fp.vtable?=?NULL;
??#endif?
????if?(_IO_file_fopen?(&new_f->fp.file,?filename,?mode,?1)?!=?NULL)
??????return?(_IO_FILE?*)?&new_f->fp;?
????_IO_un_link?(&new_f->fp.file);
????free?(new_f);
????return?NULL;
??}
??#if?defined?PIC?&&?DO_VERSIONING?
??strong_alias?(_IO_new_fopen,?__new_fopen)
??default_symbol_version?(_IO_new_fopen,?_IO_fopen,?GLIBC_2.1);?
??default_symbol_version?(__new_fopen,?fopen,?GLIBC_2.1);
??#else
??#?ifdef?weak_alias?
??weak_alias?(_IO_new_fopen,?_IO_fopen)
??weak_alias?(_IO_new_fopen,?fopen)
??#?endif
??#endif

Notice at the end what it says, it says?weak_alias?(_IO_new_fopen,?fopen). This tells gcc that?_IO_new_fopen?is an alias to?fopen. (weak alias). Let me make sure. Looking at?libc.a?now

??cd?/usr/src/packages/SOURCES/glibc-2.1/INSTALL_LIB/usr/local/lib
??nm?libc.a
??...
??iofopen.o:?
???????????U?_IO_file_fopen
???????????U?_IO_file_init
???????????U?_IO_file_jumps
??00000000?W?_IO_fopen?
???????????U?_IO_init
??00000000?T?_IO_new_fopen
???????????U?_IO_un_link
???????????U?__pthread_atfork?
???????????U?__pthread_getspecific
???????????U?__pthread_initialize
???????????U?__pthread_key_create?
???????????U?__pthread_mutex_destroy
???????????U?__pthread_mutex_init
???????????U?__pthread_mutex_lock?
???????????U?__pthread_mutex_trylock
???????????U?__pthread_mutex_unlock
???????????U?__pthread_mutexattr_destroy?
???????????U?__pthread_mutexattr_init
???????????U?__pthread_mutexattr_settype?
???????????U?__pthread_once
???????????U?__pthread_setspecific
???????????U?_pthread_cleanup_pop_restore?
???????????U?_pthread_cleanup_push_defer
??00000000?W?fopen
???????????U?free
???????????U?malloc
??...

Notice?fopen?has W next to it, meaning a Weak symbol. So, the linker when it sees a call to?fopen?will bind the call to?_IO_new_fopen.

It is just a di?erent name for?fopen. This way, library can create di?erent implementations for calls without the user program having to change.

Ok, now, lets continue to see where we will end up. back to gdb.

??(gdb)?disassemble?fopen
??Dump?of?assembler?code?for?function?_IO_new_fopen:?
??0x8048710?<_IO_new_fopen>:??????push???%ebp
??0x8048711?<_IO_new_fopen+1>:????mov????%esp,%ebp?
??0x8048713?<_IO_new_fopen+3>:????push???%ebx
??0x8048714?<_IO_new_fopen+4>:????push???$0xb0?
??0x8048719?<_IO_new_fopen+9>:????call???0x804b020?<__libc_malloc>
??0x804871e?<_IO_new_fopen+14>:???mov????%eax,%ebx?
??0x8048720?<_IO_new_fopen+16>:???add????$0x4,%esp
??0x8048723?<_IO_new_fopen+19>:???test???%ebx,%ebx?
??0x8048725?<_IO_new_fopen+21>:???jne????0x8048730?<_IO_new_fopen+32>
??0x8048727?<_IO_new_fopen+23>:???xor????%eax,%eax?
??0x8048729?<_IO_new_fopen+25>:???jmp????0x8048782?<_IO_new_fopen+114>
??0x804872b?<_IO_new_fopen+27>:???nop?
??0x804872c?<_IO_new_fopen+28>:???lea????0x0(%esi,1),%esi
??0x8048730?<_IO_new_fopen+32>:???lea????0x98(%ebx),%edx?
??0x8048736?<_IO_new_fopen+38>:???mov????%edx,0x48(%ebx)
??0x8048739?<_IO_new_fopen+41>:???push???$0x0?
??0x804873b?<_IO_new_fopen+43>:???push???%ebx
??0x804873c?<_IO_new_fopen+44>:???call???0x804a030?<_IO_init>?
??0x8048741?<_IO_new_fopen+49>:???movl???$0x807a360,0x94(%ebx)
??0x804874b?<_IO_new_fopen+59>:???push???%ebx?
??0x804874c?<_IO_new_fopen+60>:???call???0x80487a0?<_IO_new_file_init>
??0x8048751?<_IO_new_fopen+65>:???push???$0x1?
??0x8048753?<_IO_new_fopen+67>:???mov????0xc(%ebp),%eax
??0x8048756?<_IO_new_fopen+70>:???push???%eax?
??0x8048757?<_IO_new_fopen+71>:???mov????0x8(%ebp),%eax
??0x804875a?<_IO_new_fopen+74>:???push???%eax?
??0x804875b?<_IO_new_fopen+75>:???push???%ebx
??0x804875c?<_IO_new_fopen+76>:???call???0x80488e0?<_IO_new_file_fopen>?
??0x8048761?<_IO_new_fopen+81>:???add????$0x1c,%esp
??0x8048764?<_IO_new_fopen+84>:???test???%eax,%eax?
??0x8048766?<_IO_new_fopen+86>:???jne????0x8048780?<_IO_new_fopen+112>
??0x8048768?<_IO_new_fopen+88>:???push???%ebx?
??0x8048769?<_IO_new_fopen+89>:???call???0x80497a0?<_IO_un_link>
??0x804876e?<_IO_new_fopen+94>:???push???%ebx?
??0x804876f?<_IO_new_fopen+95>:???call???0x804b9f0?<__libc_free>
??0x8048774?<_IO_new_fopen+100>:??xor????%eax,%eax?
??0x8048776?<_IO_new_fopen+102>:??jmp????0x8048782?<_IO_new_fopen+114>
??0x8048778?<_IO_new_fopen+104>:??nop?
??0x8048779?<_IO_new_fopen+105>:??lea????0x0(%esi,1),%esi
??0x8048780?<_IO_new_fopen+112>:??mov????%ebx,%eax?
??0x8048782?<_IO_new_fopen+114>:??mov????0xfffffffc(%ebp),%ebx
??0x8048785?<_IO_new_fopen+117>:??mov????%ebp,%esp?
??0x8048787?<_IO_new_fopen+119>:??pop????%ebp
??0x8048788?<_IO_new_fopen+120>:??ret
??End?of?assembler?dump.

The call I am interested in is?_IO_new_file_fopen. The earlier calls were calls that create and initialize data structures. I am interested in ?nding the call that will result in interrupt?0x80. So, lets step to?_IO_new_file_fopen.

??(gdb)?break?_IO_new_file_fopen
??Breakpoint?3?at?0x80488ec:?file?fileops.c,?line?204.
??(gdb)?continue
??Continuing.
???
??Breakpoint?3,?_IO_new_file_fopen?(fp=0x807c838,?filename=0x8071baa?"test.txt",?mode=0x8071ba8?"r",?is32not64=1)?at?fileops.c:204?
??204???????int?oflags?=?0,?omode;
??(gdb)

The ?le?fileops.c?is located in?glibc-2.1/libio/, lets look at the source code for?_IO_file_fopen()?in that ?le:

??_IO_FILE?*
??_IO_new_file_fopen?(fp,?filename,?mode,?is32not64)
???????_IO_FILE?*fp;?
???????const?char?*filename;
???????const?char?*mode;
???????int?is32not64;
??{
????int?oflags?=?0,?omode;?
????int?read_write;
????int?oprot?=?0666;
????int?i;
????if?(_IO_file_is_open?(fp))
??????return?0;
????switch?(*mode)?
??????{
??????case?'r':
????????omode?=?O_RDONLY;
????????read_write?=?_IO_NO_WRITES;
????????break;?
??????case?'w':
????????omode?=?O_WRONLY;
????????oflags?=?O_CREAT|O_TRUNC;
????????read_write?=?_IO_NO_READS;?
????????break;
??????case?'a':
????????omode?=?O_WRONLY;
????????oflags?=?O_CREAT|O_APPEND;?
????????read_write?=?_IO_NO_READS|_IO_IS_APPENDING;
????????break;
??????default:
????????__set_errno?(EINVAL);?
????????return?NULL;
??????}
????for?(i?=?1;?i?<?4;?++i)
??????{
????????switch?(*++mode)
?? {
?? case?'\0':?
?????break;
?? case?'+':
?????omode?=?O_RDWR;
?????read_write?&=?_IO_IS_APPENDING;?
?????continue;
?? case?'x':
?????oflags?|=?O_EXCL;
?????continue;
?? case?'b':?
?? default:
?????/*?Ignore.??*/
?????continue;
?? }
????????break;
??????}?
??
????return?_IO_file_open?(fp,?filename,?omode|oflags,?oprot,?read_write,??---->?step?here?
?? is32not64);
??}

Let us assume the ?le is not allready open, the next call will be?_IO_file_open()

Setting a break point there. But notice, looking at source code in?fileops.c, the above call to?_IO_file_open?is inlined (for performance?)

??#if?defined?__GNUC__?&&?__GNUC__?>=?2
??__inline__
??#endif
??_IO_FILE?*?
??_IO_file_open?(fp,?filename,?posix_mode,?prot,?read_write,?is32not64)
???????_IO_FILE?*fp;?
???????const?char?*filename;
???????int?posix_mode;
???????int?prot;
???????int?read_write;?
???????int?is32not64;
??{
????int?fdesc;
??#ifdef?_G_OPEN64
????fdesc?=?(is32not64?
????????open?(filename,?posix_mode,?prot)
??????:?_G_OPEN64?(filename,?posix_mode,?prot));?
??#else
????fdesc?=?open?(filename,?posix_mode,?prot);
??#endif
????if?(fdesc?<?0)
??????return?NULL;?
????fp->_fileno?=?fdesc;
????_IO_mask_flags?(fp,?read_write,_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);?
????if?(read_write?&?_IO_IS_APPENDING)
??????if?(_IO_SEEKOFF?(fp,?(_IO_off64_t)0,?_IO_seek_end,?_IOS_INPUT|_IOS_OUTPUT)?
?? ==?_IO_pos_BAD?&&?errno?!=?ESPIPE)
????????return?NULL;
????_IO_link_in?(fp);
????return?fp;
??}

Setting a break point at the call to?open?above.

??(gdb)?where?
??#0??_IO_new_file_fopen?(fp=0x807c838,?filename=0x8071baa?"test.txt",?mode=0x8071ba8?"r",?is32not64=1)?at?fileops.c:179?
??#1??0x8048761?in?_IO_new_fopen?(filename=0x8071baa?"test.txt",?mode=0x8071ba8?"r")?at?iofopen.c:55?
??#2??0x80481c5?in?main?(argc=1,?argv=0xbffff434)?at?t.c:7
??(gdb)?list
??174??????????int?read_write;?
??175??????????int?is32not64;
??176?????{
??177???????int?fdesc;
??178?????#ifdef?_G_OPEN64?
??179???????fdesc?=?(is32not64
??180??????????????????open?(filename,?posix_mode,?prot)???------->?This?is?call?we?need?
??181????????????????:?_G_OPEN64?(filename,?posix_mode,?prot));
??182?????#else?
??183???????fdesc?=?open?(filename,?posix_mode,?prot);
??(gdb)?break?open
??Breakpoint?2?at?0x804df80
??(gdb)

Since?_IO_file_fopen?is inlined inside?_IO_new_file_fopen, we can look at the assembler call to?open?above by disassembly of?_IO_new_file_fopen().

I'll show only the part where the call to?open?is made

??(gdb)?disassemble?_IO_new_file_fopen
??Dump?of?assembler?code?for?function?_IO_new_file_fopen:
??...?
??0x80489e4?<_IO_new_file_fopen+260>:?????push???$0x1b6
??0x80489e9?<_IO_new_file_fopen+265>:?????push???%eax?
??0x80489ea?<_IO_new_file_fopen+266>:?????mov????0xc(%ebp),%edi
??0x80489ed?<_IO_new_file_fopen+269>:?????push???%edi?
??0x80489ee?<_IO_new_file_fopen+270>:?????call???0x804df80?<__libc_open>??---->?this?is?open
??...

Ok, back to gdb, setting a breakpoint at?open?and stepping into it

??(gdb)?where?
??#0??_IO_new_file_fopen?(fp=0x807c838,?filename=0x8071baa?"test.txt",?mode=0x8071ba8?"r",?is32not64=1)?at?fileops.c:179?
??#1??0x8048761?in?_IO_new_fopen?(filename=0x8071baa?"test.txt",?mode=0x8071ba8?"r")?at?iofopen.c:55?
??#2??0x80481c5?in?main?(argc=1,?argv=0xbffff434)?at?t.c:7
??(gdb)?s
??
??Breakpoint?2,?0x804df80?in?__libc_open?()?
??(gdb)?disassemble
??Dump?of?assembler?code?for?function?__libc_open:
??0x804df80?<__libc_open>:????????push???%ebx?
??0x804df81?<__libc_open+1>:??????mov????0x10(%esp,1),%edx
??0x804df85?<__libc_open+5>:??????mov????0xc(%esp,1),%ecx?
??0x804df89?<__libc_open+9>:??????mov????0x8(%esp,1),%ebx
??0x804df8d?<__libc_open+13>:?????mov????$0x5,%eax?
??0x804df92?<__libc_open+18>:?????int????$0x80????----->?to?kernel?mode.?
??0x804df94?<__libc_open+20>:?????pop????%ebx
??0x804df95?<__libc_open+21>:?????cmp????$0xfffff001,%eax?
??0x804df9a?<__libc_open+26>:?????jae????0x804e450?<__syscall_error>?
??0x804dfa0?<__libc_open+32>:?????ret
??End?of?assembler?dump.
??(gdb)

We are ?nally there. The?open()?call being made from?_IO_file_open(), is translated to?__libc_open()?and?__libc_open()?will issue the interupt?0x80, which will turn the processor to run in kernel more, and the interrupt handler will locate the kernel system call to process?open().

But before jumping into kernel mode, lets see how did the call to?open()?become a call to?__libc_open()?It turns out that when building glibc-2.1, there is a ?le called?glibc-2.1/sysdeps/unix/syscalls.list

This ?le is used by the glibc build system to generate the wrapper for?open()?and call it?__libc_open.

??>cat?glibc-2.1/sysdeps/unix/syscalls.list
??#?File?name?????Caller??Syscall?name????#?args??Strong?name?????Weak?names?
??
??access??????????-???????access??????????2???????__access????????access?
??acct????????????-???????acct????????????1???????acct?
??chdir???????????-???????chdir???????????1???????__chdir?????????chdir?
??chmod???????????-???????chmod???????????2???????__chmod?????????chmod?
??chown???????????-???????chown???????????3???????__chown?????????chown?
??chroot??????????-???????chroot??????????1???????chroot?
??close???????????-???????close???????????1???????__libc_close????__close?close?
??dup?????????????-???????dup?????????????1???????__dup???????????dup?
??dup2????????????-???????dup2????????????2???????__dup2??????????dup2?
??fchdir??????????-???????fchdir??????????1???????__fchdir????????fchdir?
??fcntl???????????-???????fcntl???????????3???????__libc_fcntl????__fcntl?fcntl?
??fstatfs?????????-???????fstatfs?????????2???????__fstatfs???????fstatfs?
??fsync???????????-???????fsync???????????1???????__libc_fsync????fsync?
??getdomain???????-???????getdomainname???2???????getdomainname?
??getgid??????????-???????getgid??????????0???????__getgid????????getgid?
??getgroups???????-???????getgroups???????2???????__getgroups?????getgroups?
??getitimer???????-???????getitimer???????2???????__getitimer?????getitimer?
??getpid??????????-???????getpid??????????0???????__getpid????????getpid?
??getpriority?????-???????getpriority?????2???????getpriority?
??getrlimit???????-???????getrlimit???????2???????__getrlimit?????getrlimit?
??getuid??????????-???????getuid??????????0???????__getuid????????getuid?
??ioctl???????????-???????ioctl???????????3???????__ioctl?????????ioctl?
??kill????????????-???????kill????????????2???????__kill??????????kill?
??link????????????-???????link????????????2???????__link??????????link?
??lseek???????????-???????lseek???????????3???????__libc_lseek????__lseek?lseek?
??mkdir???????????-???????mkdir???????????2???????__mkdir?????????mkdir?
??open????????????-???????open????????????3???????__libc_open?????__open?open?
??profil??????????-???????profil??????????4???????profil
??ptrace??????????-???????ptrace??????????4???????ptrace?
??read????????????-???????read????????????3???????__libc_read?????__read?read?
??readlink????????-???????readlink????????3???????__readlink??????readlink?
??readv???????????-???????readv???????????3???????__readv?????????readv?
??reboot??????????-???????reboot??????????1???????reboot
??rename??????????-???????rename??????????2???????rename?
??rmdir???????????-???????rmdir???????????1???????__rmdir?????????rmdir?
??select??????????-???????select??????????5???????__select????????select?
??setdomain???????-???????setdomainname???2???????setdomainname?
??setegid?????????-???????setegid?????????1???????__setegid???????setegid?
??seteuid?????????-???????seteuid?????????1???????__seteuid???????seteuid?
??setgid??????????-???????setgid??????????1???????__setgid????????setgid?
??setgroups???????-???????setgroups???????2???????setgroups?
??setitimer???????-???????setitimer???????3???????__setitimer?????setitimer?
??setpriority?????-???????setpriority?????3???????setpriority
??setrlimit???????-???????setrlimit???????2???????setrlimit?
??setsid??????????-???????setsid??????????0???????__setsid????????setsid?
??settimeofday????-???????settimeofday????2???????__settimeofday??settimeofday?
??setuid??????????-???????setuid??????????1???????__setuid????????setuid?
??sigsuspend??????-???????sigsuspend??????1???????sigsuspend
??sstk????????????-???????sstk????????????1???????sstk?
??statfs??????????-???????statfs??????????2???????__statfs????????statfs?
??swapoff?????????-???????swapoff?????????1???????swapoff
??swapon??????????-???????swapon??????????1???????swapon?
??symlink?????????-???????symlink?????????2???????__symlink???????symlink?
??sync????????????-???????sync????????????0???????sync
??sys_fstat???????fxstat??fstat???????????2???????__syscall_fstat?
??sys_mknod???????xmknod??mknod???????????3???????__syscall_mknod?
??sys_stat????????xstat???stat????????????2???????__syscall_stat?
??umask???????????-???????umask???????????1???????__umask?????????umask?
??uname???????????-???????uname???????????1???????uname?
??unlink??????????-???????unlink??????????1???????__unlink????????unlink?
??utimes??????????-???????utimes??????????2???????__utimes????????utimes?
??write???????????-???????write???????????3???????__libc_write????__write?write?
??writev??????????-???????writev??????????3???????__writev????????writev

I extraced?open.o?from libc.a and dumped the open.o

??
??use?ar?-x?libc.a,?in?some?temp?dir.
??
??>objdump?--show-raw-insn?open.o?
??open.o:?????file?format?elf32-i386
??>objdump??--disassemble?open.o?
??open.o:?????file?format?elf32-i386
??Disassembly?of?section?.text:
??00000000?<__libc_open>:?
?????0:???53??????????????????????pushl??%ebx
?????1:???8b?54?24?10?????????????movl???0x10(%esp,1),%edx?
?????5:???8b?4c?24?0c?????????????movl???0xc(%esp,1),%ecx
?????9:???8b?5c?24?08?????????????movl???0x8(%esp,1),%ebx?
?????d:???b8?05?00?00?00??????????movl???$0x5,%eax
????12:???cd?80???????????????????int????$0x80?
????14:???5b??????????????????????popl???%ebx
????15:???3d?01?f0?ff?ff??????????cmpl???$0xfffff001,%eax?
????1a:???0f?83?fc?ff?ff?ff???????jae????1c?<__libc_open+0x1c>
????20:???c3??????????????????????ret

How does the glibc build system generate the wrapper call to?open()? It happens when the?glibc-2.1/io?directory is build. This is the output where it happens:

??make[1]:?Entering?directory?‘/export/g/src/packages/SOURCES/glibc-2.1/io'
??(echo?'#include?<sysdep.h>';?\?
???echo?'PSEUDO?(__libc_open,?open,?3)';?\
???echo?'?ret';?\
???echo?'PSEUDO_END(__libc_open)';?\?
???echo?'weak_alias?(__libc_open,?__open)';?\
???echo?'weak_alias?(__libc_open,?open)';?\?
??)?|?gcc?-c??-I../include?-I.??-I..?-I../libio??-I../sysdeps/i386/elf
??-I../crypt/sysdeps/unix?-I../linuxthreads/?
??sysdeps/unix/sysv/linux?-I../linuxthreads/sysdeps/pthread
??-I../linuxthreads/sysdeps/unix/sysv?-I../linuxthreads?
??/sysdeps/unix?-I../linuxthreads/sysdeps/i386/i686?-I../linuxthreads/sysdeps/i386
??-I../sysdeps/unix/sysv/linux/i?
??386/i686?-I../sysdeps/unix/sysv/linux/i386?-I../sysdeps/unix/sysv/linux
??-I../sysdeps/gnu?-I../sysdeps/unix/comm?
??on?-I../sysdeps/unix/mman?-I../sysdeps/unix/inet?-I../sysdeps/unix/sysv/i386?
??-I../sysdeps/unix/sysv?-I../sysdeps/unix/i386?-I../sysdeps/unix?-I../sysdeps/posix?
??-I../sysdeps/i386/i686?-I../sysdeps/i386/i486?-I../sysdeps/lib?
??m-i387/i686?-I../sysdeps/i386/fpu?-I../sysdeps/libm-i387?-I../sysdeps/i386?
??-I../sysdeps/wordsize-32?-I../sysdeps/ieee754?-I../sysdeps/libm-ieee754?
??-I../sysdeps/generic/elf?-I../sysdeps/generic???-D_LIBC_REENTRANT?
??-include?../include/libc-symbols.h?????-DASSEMBLER??-DGAS_SYNTAX??-x?assembler-with-cpp?
??-o?open.o?-echo?'io/utime.o?io/mkfifo.o?io/stat.o?io/fstat.o?io/lstat.o?
??io/mknod.o?io/stat64.o?io/fstat64.o?io/lstat64.o?io/xstat.o?io/fxstat.o?
??io/lxstat.o?io/xmknod.o?io/xstat64.o?io/fxstat64.o?io/lxstat64.o?io/statfs.o?io/fstatfs.o?
???io/statfs64.o?io/fstatfs64.o?io/statvfs.o?io/fstatvfs.o?io/statvfs64.o?
??io/fstatvfs64.o?io/umask.o?io/chmod.o?io/fchmod.o?io/mkdir.o?io/open.o?
??io/open64.o?io/close.o?io/read.o?io/write.o?io/lseek.o?io/lseek64.o?io/access.o?
???io/euidaccess.o?io/fcntl.o?io/flock.o?io/lockf.o?io/lockf64.o?io/dup.o?io/dup2.o?
??io/pipe.o?io/creat.o?io/creat64.o?io/chdir.o?io/fchdir.o?io/getcwd.o?
??io/getwd.o?io/getdirname.o?io/chown.o?io/fchown.o?io/lchown.o?io/ttyname.o?
??io/ttyname_r.o?io/isatty.o?io/link.o?io/symlink.o?io/readlink.o?io/unlink.o?
??io/rmdir.o?io/ftw.o?io/ftw64.o?io/fts.o?io/poll.o'?>?stamp.oT
??mv?-f?stamp.oT?stamp.o

I do not understand the above, as I do not see where is the C source code for the call wrapper. Maybe one day I will understand the above.

But as a result of the above, we get?open.o?in libc.a, with the?__libc_open?entry there as an alias for 'open'. OK, now let me look more at the code generated in?__libc_open.

Here it is again

??>objdump??--disassemble?open.o
??open.o:?????file?format?elf32-i386?
??Disassembly?of?section?.text:
??00000000?<__libc_open>:
?????0:???53??????????????????????pushl??%ebx?
?????1:???8b?54?24?10?????????????movl???0x10(%esp,1),%edx?
?????5:???8b?4c?24?0c?????????????movl???0xc(%esp,1),%ecx
?????9:???8b?5c?24?08?????????????movl???0x8(%esp,1),%ebx?
?????d:???b8?05?00?00?00??????????movl???$0x5,%eax
????12:???cd?80???????????????????int????$0x80?
????14:???5b??????????????????????popl???%ebx
????15:???3d?01?f0?ff?ff??????????cmpl???$0xfffff001,%eax?
????1a:???0f?83?fc?ff?ff?ff???????jae????1c?<__libc_open+0x1c>
????20:???c3??????????????????????ret

Notice that?open()?takes 3 arguments

????open?(filename,?posix_mode,?prot)

Notice the asembler shows using registers?eds, ecx, and?ebx?to pass the data, then it moves 5 to?eax. What is 5? This got to be the number that kernel uses to identify which system call it is.

Actually this will end up as an index used by the interrupt handler to locate the system call. Lets look around.

??cd?glibc-2.1
??>find?.?-name?'*.h'?|?grep?syscal
??./include/syscall.h
??./misc/syscall.h
??./misc/syscall-list.h?
??./sysdeps/generic/sys/syscall.h
??./sysdeps/mach/sys/syscall.h
??./sysdeps/unix/sysv/linux/mips/sys/syscall.h?
??./sysdeps/unix/sysv/linux/sys/syscall.h
??./sysdeps/unix/sysv/sco3.2.4/sys/syscall.h?
??./sysdeps/unix/sysv/sysv4/solaris2/sys/syscall.h
??./INSTALL_LIB/usr/local/include/sys/syscall.h?
??./INSTALL_LIB/usr/local/include/bits/syscall.h
??./INSTALL_LIB/usr/local/include/syscall.h
???
??>more?./include/syscall.h
??#include?<misc/syscall.h>
??
??>more?./misc/syscall.h
??#include?<sys/syscall.h>
??>

Ok, getting closer, lets look at?/usr/include/sys/syscall.h

??
??>more?/usr/include/sys/syscall.h
??/*?Copyright?(C)?1995,?1996,?1997?Free?Software?Foundation,?Inc.?
?????This?file?is?part?of?the?GNU?C?Library.
??
?????The?GNU?C?Library?is?free?software;?you?can?redistribute?it?and/or?
?????modify?it?under?the?terms?of?the?GNU?Library?General?Public?License?as?
?????published?by?the?Free?Software?Foundation;?either?version?2?of?the?
?????License,?or?(at?your?option)?any?later?version.
???
?????The?GNU?C?Library?is?distributed?in?the?hope?that?it?will?be?useful,?
?????but?WITHOUT?ANY?WARRANTY;?without?even?the?implied?warranty?of?
?????MERCHANTABILITY?or?FITNESS?FOR?A?PARTICULAR?PURPOSE.??See?the?GNU?
?????Library?General?Public?License?for?more?details.
???
?????You?should?have?received?a?copy?of?the?GNU?Library?General?Public?
?????License?along?with?the?GNU?C?Library;?see?the?file?COPYING.LIB.??If?not,?
?????write?to?the?Free?Software?Foundation,?Inc.,?59?Temple?Place?-?Suite?330,?
?????Boston,?MA?02111-1307,?USA.??*/
??
??#ifndef?_SYSCALL_H
??#define?_SYSCALL_H??????1?
??
??/*?This?file?should?list?the?numbers?of?the?system?the?system?knows.?
?????But?instead?of?duplicating?this?we?use?the?information?available
?????from?the?kernel?sources.??*/?
??#include?<asm/unistd.h>
??
??#ifndef?_LIBC
??/*?The?Linux?kernel?header?file?defines?macros?‘__NR_<name>',?but?some?
?????programs?expect?the?traditional?form?‘SYS_<name>'.??So?in?building?libc?
?????we?scan?the?kernel's?list?and?produce?<bits/syscall.h>?with?macros?for?
?????all?the?‘SYS_'?names.??*/
??#?include?<bits/syscall.h>
??#endif
??
??#endif

Ok, I am getting really close now.

??
??>more?/usr/include/asm/unistd.h
??#ifndef?_ASM_I386_UNISTD_H_
??#define?_ASM_I386_UNISTD_H_
???
??/*
???*?This?file?contains?the?system?call?numbers.
???*/
??
??#define?__NR_exit?????????????????1?
??#define?__NR_fork?????????????????2
??#define?__NR_read?????????????????3?
??#define?__NR_write????????????????4
??#define?__NR_open?????????????????5??------>?HERE?IT?IS?!!!
??....
??

yahoo! found it. So, 5 is moved to register eax, and interrupt?0x80?is invoked.

When interrupt returns, system call is complete. It does not seem that the syscall macros de?ned in?/usr/inlcude/asm/unistd.h?are used in glibc?

OK, so far so good, now I'll switch hats, and jump into kernel mode to see how the?open()?call is processed. I need to ?nd the code for that processes the interrupt?0x80.

The interrupt routine that is bound to interrupt?0x80?is found in

/usr/src/linux/arch/i386/kernel/entry.S

the entry point is called?ENTRY(system_call).

Lets look at the code for the interrupt routine:

??ENTRY(system_call)
?? pushl?%eax #?save?orig_eax
?? SAVE_ALL
?? GET_CURRENT(%ebx)?
?? cmpl?$(NR_syscalls),%eax????----------->?Notice,?eax?is?where?the?system?call?number?is?saved.?
?? jae?badsys
?? testb?$0x20,flags(%ebx) #?PF_TRACESYS
?? jne?tracesys?
?? call?*SYMBOL_NAME(sys_call_table)(,%eax,4)??----->?Here?we?index?into?the?sys_call_table?using?the?above?number.?
?? movl?%eax,EAX(%esp) #?save?the?return?value
??ENTRY(ret_from_sys_call)
??#ifdef?__SMP__?
?? movl?processor(%ebx),%eax
?? shll?$5,%eax
?? movl?SYMBOL_NAME(softirq_state)(,%eax),%ecx?
?? testl?SYMBOL_NAME(softirq_state)+4(,%eax),%ecx
??#else
?? movl?SYMBOL_NAME(softirq_state),%ecx?
?? testl?SYMBOL_NAME(softirq_state)+4,%ecx
??#endif
?? jne???handle_softirq
??
??ret_with_reschedule:?
?? cmpl?$0,need_resched(%ebx)
?? jne?reschedule
?? cmpl?$0,sigpending(%ebx)?
?? jne?signal_return
??restore_all:
?? RESTORE_ALL
??
?? ALIGN
??signal_return:?
?? sti #?we?can?get?here?from?an?interrupt?handler?
?? testl?$(VM_MASK),EFLAGS(%esp)
?? movl?%esp,%eax
?? jne?v86_signal_return?
?? xorl?%edx,%edx
?? call?SYMBOL_NAME(do_signal)
?? jmp?restore_all
??
?? ALIGN?
??v86_signal_return:
?? call?SYMBOL_NAME(save_v86_state)
?? movl?%eax,%esp
?? xorl?%edx,%edx?
?? call?SYMBOL_NAME(do_signal)
?? jmp?restore_all
??
?? ALIGN
??tracesys:?
?? movl?$-ENOSYS,EAX(%esp)
?? call?SYMBOL_NAME(syscall_trace)
?? movl?ORIG_EAX(%esp),%eax?
?? cmpl?$(NR_syscalls),%eax
?? jae?tracesys_exit
?? call?*SYMBOL_NAME(sys_call_table)(,%eax,4)?
?? movl?%eax,EAX(%esp) #?save?the?return?value
??tracesys_exit:?
?? call?SYMBOL_NAME(syscall_trace)
?? jmp?ret_from_sys_call
??badsys:?
?? movl?$-ENOSYS,EAX(%esp)
?? jmp?ret_from_sys_call
??
?? ALIGN
??ret_from_exception:?
??#ifdef?__SMP__
?? GET_CURRENT(%ebx)
?? movl?processor(%ebx),%eax
?? shll?$5,%eax?
?? movl?SYMBOL_NAME(softirq_state)(,%eax),%ecx
?? testl?SYMBOL_NAME(softirq_state)+4(,%eax),%ecx?
??#else
?? movl?SYMBOL_NAME(softirq_state),%ecx
?? testl?SYMBOL_NAME(softirq_state)+4,%ecx?
??#endif
?? jne???handle_softirq
??
??ENTRY(ret_from_intr)
?? GET_CURRENT(%ebx)?
?? movl?EFLAGS(%esp),%eax #?mix?EFLAGS?and?CS
?? movb?CS(%esp),%al?
?? testl?$(VM_MASK?|?3),%eax #?return?to?VM86?mode?or?non-supervisor?
?? jne?ret_with_reschedule?
?? jmp?restore_all
??
?? ALIGN
??handle_softirq:
?? call?SYMBOL_NAME(do_softirq)?
?? jmp?ret_from_intr
??
?? ALIGN
??reschedule:
?? call?SYMBOL_NAME(schedule)????#?test?
?? jmp?ret_from_sys_call
??
??ENTRY(divide_error)
?? pushl?$0 #?no?error?code?
?? pushl?$?SYMBOL_NAME(do_divide_error)
?? ALIGN
??error_code:
?? pushl?%ds
?? pushl?%eax?
?? xorl?%eax,%eax
?? pushl?%ebp
?? pushl?%edi
?? pushl?%esi
?? pushl?%edx?
?? decl?%eax #?eax?=?-1
?? pushl?%ecx
?? pushl?%ebx
?? cld?
?? movl?%es,%ecx
?? xchgl?%eax,?ORIG_EAX(%esp) #?orig_eax?(get?the?error?code.?)?
?? movl?%esp,%edx
?? xchgl?%ecx,?ES(%esp) #?get?the?address?and?save?es.?
?? pushl?%eax #?push?the?error?code
?? pushl?%edx?
?? movl?$(__KERNEL_DS),%edx
?? movl?%edx,%ds
?? movl?%edx,%es?
?? GET_CURRENT(%ebx)
?? call?*%ecx
?? addl?$8,%esp
?? jmp?ret_from_exception

The?sys_call_table?itself is located in?.data?segment in entry.S, this is the start of the table

??
??.data
??ENTRY(sys_call_table)
?? .long?SYMBOL_NAME(sys_ni_syscall) /*?0??-??old?"setup()"?system?call*/?
?? .long?SYMBOL_NAME(sys_exit)
?? .long?SYMBOL_NAME(sys_fork)
?? .long?SYMBOL_NAME(sys_read)?
?? .long?SYMBOL_NAME(sys_write)
?? .long?SYMBOL_NAME(sys_open) /*?5?*/?
?? .long?SYMBOL_NAME(sys_mincore)
?? .long?SYMBOL_NAME(sys_madvise)
???
??.....
??
?? /*
????*?NOTE!!?This?doesn't?have?to?be?exact?-?we?just?have?
????*?to?make?sure?we?have?_enough_?of?the?"sys_ni_syscall"?
????*?entries.?Don't?panic?if?you?notice?that?this?hasn't?
????*?been?shrunk?every?time?we?add?a?new?system?call.
????*/?
?? .rept?NR_syscalls-219
?? .long?SYMBOL_NAME(sys_ni_syscall)
?? .endr

Ok, lets follow the system call. I see from the dispatch table above, that the?open()?call is implemented in kernel using?sys_open.

Where is?sys_open()???All the sys calls related to IO are locatd in?linux/fs/. Looking at?linux/fs/open.c, this is the?sys_open?function.

??
??asmlinkage?long?sys_open(const?char?*?filename,?int?flags,?int?mode)
??{
?? char?*?tmp;?
?? int?fd,?error;
??
??#if?BITS_PER_LONG?!=?32
?? flags?|=?O_LARGEFILE;
??#endif?
?? tmp?=?getname(filename);
?? fd?=?PTR_ERR(tmp);
?? if?(!IS_ERR(tmp))?{?
?? fd?=?get_unused_fd();
?? if?(fd?>=?0)?{
?? struct?file?*?f;?
?? lock_kernel();
?? f?=?filp_open(tmp,?flags,?mode);?
?? unlock_kernel();
?? error?=?PTR_ERR(f);?
?? if?(IS_ERR(f))
?? goto?out_error;?
?? fd_install(fd,?f);
?? }
??out:
?? putname(tmp);
?? }?
?? return?fd;
??
??out_error:
?? put_unused_fd(fd);
?? fd?=?error;
?? goto?out;
??}

The function?filp_open()?is in the same above ?le as?sys_open(). Here is the function

??struct?file?*filp_open(const?char?*?filename,?int?flags,?int?mode)
??{
?? int?namei_flags,?error;?
?? struct?nameidata?nd;
??
?? namei_flags?=?flags;
?? if?((namei_flags+1)?&?O_ACCMODE)?
?? namei_flags++;
?? if?(namei_flags?&?O_TRUNC)
?? namei_flags?|=?2;?
??
?? error?=?open_namei(filename,?namei_flags,?mode,?&nd);
?? if?(!error)?
?? return?dentry_open(nd.dentry,?nd.mnt,?flags);
??
?? return?ERR_PTR(error);
??}

Notice the call to?open_namei(), this is the interface to the virtual ?le system. calls into VFS are named?_namei?(verify?).

open_namei()?is de?ned in?linux/fs/namei.c.

After some access checking, and pathname checking, and possibly allocating an inode, a kernel internal struct ?le is allocated for the ?le. The ?le struct contains a pointer to?file_operations?struct, which contains the address of functions to process operations on this ?lesystem, that must have been initialized when the ?le system was mounted.

??
??struct?file?{
??456?????????struct?list_head????????f_list;
??457?????????struct?dentry???????????*f_dentry;?
??458?????????struct?vfsmount?????????*f_vfsmnt;
??459?????????struct?file_operations??*f_op;?
??460?????????atomic_t????????????????f_count;
??461?????????unsigned?int????????????f_flags;?
??462?????????mode_t??????????????????f_mode;
??463?????????loff_t??????????????????f_pos;?
??464?????????unsigned?long???????????f_reada,?f_ramax,?f_raend,?f_ralen,?f_rawin;?
??465?????????struct?fown_struct??????f_owner;
??466?????????unsigned?int????????????f_uid,?f_gid;?
??467?????????int?????????????????????f_error;
??468
??469?????????unsigned?long???????????f_version;?
??470
??471?????????/*?needed?for?tty?driver,?and?maybe?others?*/?
??472?????????void????????????????????*private_data;
??473?};
??

??struct?file_operations?{
??693?????????loff_t?(*llseek)?(struct?file?*,?loff_t,?int);?
??694?????????ssize_t?(*read)?(struct?file?*,?char?*,?size_t,?loff_t?*);?
??695?????????ssize_t?(*write)?(struct?file?*,?const?char?*,?size_t,?loff_t?*);?
??696?????????int?(*readdir)?(struct?file?*,?void?*,?filldir_t);?
??697?????????unsigned?int?(*poll)?(struct?file?*,?struct?poll_table_struct?*);?
??698?????????int?(*ioctl)?(struct?inode?*,?struct?file?*,?unsigned?int,?unsigned?long);?
??699?????????int?(*mmap)?(struct?file?*,?struct?vm_area_struct?*);?
??700?????????int?(*open)?(struct?inode?*,?struct?file?*);
??701?????????int?(*flush)?(struct?file?*);?
??702?????????int?(*release)?(struct?inode?*,?struct?file?*);?
??703?????????int?(*fsync)?(struct?file?*,?struct?dentry?*);
??704?????????int?(*fasync)?(int,?struct?file?*,?int);?
??705?????????int?(*lock)?(struct?file?*,?int,?struct?file_lock?*);?
??706?????????ssize_t?(*readv)?(struct?file?*,?const?struct?iovec?*,?unsigned?long,?loff_t?*);?
??707?????????ssize_t?(*writev)?(struct?file?*,?const?struct?iovec?*,?unsigned?long,?loff_t?*);
??708?};

Ok, time to go sleep now.


轉載于:https://my.oschina.net/flylxl/blog/626084

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Linux系统调用在glibc中的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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

黄色成人在线观看 | 成人av中文字幕在线观看 | 视频在线观看入口黄最新永久免费国产 | 国产资源在线观看 | 国产69熟 | 人人爽网站| 久久精品99国产精品日本 | 久久天天躁狠狠躁夜夜不卡公司 | 国产99一区 | 欧美激情第十页 | 久久这里只有精品首页 | 久久精品专区 | 天天操天天操天天操天天操天天操 | 久久97久久97精品免视看 | 久草在线免费资源站 | 狠狠色网| 久久高清av | 久久精品www人人爽人人 | 天天综合网在线观看 | 日韩免费三区 | 国产精品久久久久一区二区三区共 | h久久| 狠狠的操狠狠的干 | 国产精品福利av | 欧美另类人妖 | 天天做日日爱夜夜爽 | 欧美精品久久 | 久久在线精品 | 久久亚洲综合国产精品99麻豆的功能介绍 | 久久大视频 | 99国产一区二区三精品乱码 | 欧美成亚洲 | 国产精品2区 | 91精品在线视频 | 91久久精品一区二区三区 | a电影在线观看 | www.av中文字幕.com | 成人性生交大片免费观看网站 | 国产在线精品国自产拍影院 | 人人插人人看 | 五月婷婷丁香 | 91视频高清 | 亚洲精品久久久蜜桃直播 | 久久精品91视频 | 深夜免费福利网站 | 九九热免费在线观看 | 亚洲国产精品资源 | 99视频一区二区 | 99re视频在线观看 | 中文字幕麻豆 | 久久这里只有精品视频99 | 国产国语在线 | 在线观看黄色的网站 | 网站在线观看日韩 | 亚洲天堂自拍视频 | 最近的中文字幕大全免费版 | 国产日韩视频在线观看 | 午夜视频在线观看一区二区三区 | 丁香六月天 | 麻豆免费在线视频 | 色多多在线观看 | 99riav1国产精品视频 | 超碰在线色| 久久久亚洲国产精品麻豆综合天堂 | 日韩精品一区二区三区中文字幕 | 国产高清视频免费最新在线 | 成年人视频在线 | 国色综合 | 久久不射网站 | 91黄色成人| 国产精品久久久久影院日本 | 国产亚洲aⅴaaaaaa毛片 | 成人avav| 九九九在线观看视频 | 亚洲成年片 | 国产精品 国内视频 | 五月婷久久 | 免费观看性生交大片3 | 亚洲永久精品在线 | 成人久久18免费 | 久久香蕉国产精品麻豆粉嫩av | 99久高清在线观看视频99精品热在线观看视频 | 欧美日韩视频 | 免费国产在线精品 | 久草网在线视频 | 在线看中文字幕 | 久久精美视频 | 经典三级一区 | 欧美 另类 交 | 九九在线视频 | 中文字幕欧美日韩va免费视频 | 日韩精品大片 | av先锋中文字幕 | 伊人天堂网| 国产日韩欧美自拍 | 欧美天天综合 | 久久久影院一区二区三区 | 亚洲成人999 | 国产成人不卡 | 欧美精品免费在线 | 偷拍久久久 | 成人a在线观看高清电影 | 丁香在线观看完整电影视频 | 欧美色图30p| 国产精品黑丝在线观看 | 手机在线小视频 | 成人免费视频免费观看 | 福利一区二区三区四区 | 成人午夜性影院 | 亚洲成aⅴ人在线观看 | 亚洲视频综合在线 | 婷婷 中文字幕 | 亚洲网站在线 | 精品 激情| 国产精品999久久久 久产久精国产品 | 日韩免费不卡视频 | 91av视屏| 日韩国产欧美视频 | 97操操| 国产精品福利小视频 | 天天摸夜夜操 | 中文字幕国语官网在线视频 | 人人澡人 | av网站在线免费观看 | 色吊丝在线永久观看最新版本 | 国产成人免费网站 | 青青久视频 | 午夜91在线 | 久久a久久| 久久久九色精品国产一区二区三区 | 国产精品男女 | 中文字幕一区二区三区在线观看 | 精品国产观看 | 久久久久国产成人精品亚洲午夜 | 亚洲影院天堂 | 蜜臀av性久久久久av蜜臀妖精 | 在线99| 日韩高清一二三区 | 日韩精品免费一区二区三区 | 中文字幕123区 | 久久91久久久久麻豆精品 | 在线观看亚洲成人 | 91色综合 | 黄色91在线 | 亚洲激情在线播放 | 亚洲精品在线观看不卡 | 日韩高清无线码2023 | 日本一区二区不卡高清 | 亚洲成av人影片在线观看 | 国产 在线 高清 精品 | 久久综合婷婷综合 | 久久在线免费视频 | 黄色av网站在线免费观看 | 狠狠色丁香婷婷 | 黄色片免费电影 | 免费观看一级视频 | 国产高清中文字幕 | 免费精品视频在线观看 | 欧美小视频在线 | 久久成人国产精品 | 国产69精品久久app免费版 | 国产裸体无遮挡 | 久久久毛片 | 国产精品第2页 | 91人人视频在线观看 | 人人射人人插 | 中文字幕影视 | 日韩av免费观看网站 | 婷婷久久亚洲 | 亚洲欧美综合精品久久成人 | 日本韩国在线不卡 | 五月婷婷综合色拍 | 色综合天| 亚洲我射av | 亚洲狠狠丁香婷婷综合久久久 | 视频在线一区二区三区 | 日韩免费在线观看网站 | 91热| 久久免费看 | 国产粉嫩在线观看 | 欧美一区在线观看视频 | 精品国产亚洲日本 | 婷婷午夜天 | 久草在线手机视频 | 欧美精品九九99久久 | 色婷婷在线播放 | 久久视频这里有久久精品视频11 | 美女av在线免费 | 人人插超碰 | 中文字幕中文字幕中文字幕 | 欧美精选一区二区三区 | 日韩在线免费不卡 | 日本3级在线观看 | 欧美日韩电影在线播放 | 精品视频999 | 久久精品中文字幕免费mv | 欧美一级黄色片 | 一级久久久 | 亚洲精品大片www | 亚洲精品在线视频网站 | 在线韩国电影免费观影完整版 | 91禁看片| 国模精品在线 | 色婷婷在线观看视频 | 激情片av | 91看片淫黄大片91 | 干av在线| 久久综合五月天 | 深爱激情综合 | 97视频人人免费看 | 免费看一级一片 | 特级西西444www高清大视频 | 成年人视频在线观看免费 | 中文字幕在线视频精品 | 成人av资源网站 | av电影免费观看 | 久久成人在线 | 久99精品| 人人澡人人添人人爽一区二区 | 精品国产免费人成在线观看 | 碰天天操天天 | 欧美一级片在线播放 | 欧美日韩一区二区三区在线观看视频 | 久草在线在线视频 | 午夜久久影视 | 国产91大片 | 天天综合网久久综合网 | 日韩电影中文 | 97激情影院 | 日日婷婷夜日日天干 | 久久伊99综合婷婷久久伊 | 人人爽人人片 | www.国产精品 | 日韩久久精品一区 | 免费成视频| 成人动漫一区二区 | 一区二区三区电影大全 | 五月激情站 | 久久精品一区二区三区视频 | 久久精品国产v日韩v亚洲 | 免费看的毛片 | 人人插人人草 | 日韩理论电影在线观看 | 91在线你懂的 | 少妇按摩av | 97香蕉超级碰碰久久免费软件 | 日本三级全黄少妇三2023 | 在线观看免费版高清版 | 日韩理论影院 | 人人射人人插 | 免费91麻豆精品国产自产在线观看 | 国产日产精品一区二区三区四区的观看方式 | 天天干,天天射,天天操,天天摸 | 亚洲色图美腿丝袜 | 亚洲欧美成人综合 | 91久久爱热色涩涩 | 欧洲精品视频一区二区 | av成人亚洲 | 丁香九月婷婷综合 | 午夜a区| 精品麻豆入口免费 | 97精品国产91久久久久久久 | 成年人视频在线免费 | 欧美性粗大hdvideo | 国产中文a | 91禁看片 | 麻豆播放| 色婷婷亚洲婷婷 | 人人爱人人添 | 国产片网站 | 国产99一区二区 | 在线视频欧美精品 | 91伊人久久大香线蕉蜜芽人口 | 在线黄色av | 亚洲激情免费 | 在线观看成人小视频 | 欧美日韩视频在线播放 | 亚洲婷婷丁香 | 91精品国产九九九久久久亚洲 | 午夜精品久久久久久99热明星 | 91网址在线 | 永久免费在线 | 日韩大片免费观看 | 18久久久 | 日韩av高清 | 国产成人一区二区三区影院在线 | 亚洲国产电影在线观看 | 国产午夜精品理论片在线 | 青青草在久久免费久久免费 | 日韩av影视在线观看 | 黄色精品视频 | 黄色网大全 | 免费在线观看黄网站 | 天堂av在线 | 五月婷色 | 欧美一级片在线观看视频 | 国内精品久久久久久久久久 | 成人国产精品入口 | 字幕网在线观看 | 久草在线视频资源 | 日韩视频精品在线 | 九九精品毛片 | 精品一区二区电影 | www操操操 | 00av视频 | 久久成人国产 | 久草免费在线观看 | 一本—道久久a久久精品蜜桃 | 91精品在线免费观看视频 | 国产四虎在线 | 国产999视频在线观看 | 免费特级黄毛片 | 国产高清综合 | 国产在线va | 91九色综合 | 91av手机在线观看 | 黄色成年网站 | 国产成人精品a | www.香蕉视频在线观看 | 成人动漫精品一区二区 | 亚洲精品在线国产 | 久久夜视频 | 丁香六月婷 | 欧洲色吧 | 久久综合久久综合这里只有精品 | 国产96在线视频 | aa级黄色大片 | 日韩高清dvd| av免费观看在线 | 激情电影影院 | 亚洲国内精品 | 丰满少妇在线观看 | 色婷婷综合在线 | 久久久久久久久久网站 | 天天综合网天天 | 麻豆一区在线观看 | 久久久亚洲精品 | 鲁一鲁影院 | 欧美激情精品久久久久久免费 | 日韩av一区二区在线 | 亚洲国产精品一区二区久久hs | 日本在线观看一区二区三区 | 亚洲午夜精品一区 | 91精品色 | 久久免费a | 91麻豆高清视频 | 在线免费三级 | 久久久久黄| 天天操天天干天天综合网 | 在线看黄色的网站 | 91福利视频在线 | 91精品国产91 | 色播五月激情综合网 | 日韩在线视频线视频免费网站 | 五月天丁香综合 | 一级欧美黄 | 西西444www大胆高清视频 | 五月婷婷综合激情网 | 精品视频123区在线观看 | 伊人久久av | 国产最新视频在线 | 日本精品免费看 | 国产精品婷婷 | 福利片视频区 | 国产999精品久久久久久绿帽 | 国产亚洲欧美在线视频 | 国产美女主播精品一区二区三区 | 日韩免费在线观看视频 | 国产一区二区中文字幕 | 国产黄色精品在线观看 | 日韩精品免费在线播放 | 国产一级片毛片 | 婷婷久月 | 黄色a在线观看 | 日韩免费二区 | 手机av电影在线 | 日韩国产精品久久久久久亚洲 | 9999亚洲| 国产日韩高清在线 | 国产精品99在线观看 | 日韩三级视频在线看 | www成人精品 | 欧美日韩久久一区 | 在线观看国产一区二区 | 亚洲少妇天堂 | 韩国av一区二区三区在线观看 | 99热这里精品| 国产资源网站 | 精品国产综合区久久久久久 | 激情开心 | 6080yy午夜一二三区久久 | 最新精品视频在线 | 在线观看久草 | 69久久99精品久久久久婷婷 | av在线网站大全 | 91视频久久 | 国产精品麻豆三级一区视频 | 免费97视频 | 欧美激情第一页xxx 午夜性福利 | 丁香花在线观看免费完整版视频 | 人人超碰人人 | 天天天天色射综合 | 成人免费ⅴa | 成人久久精品视频 | 亚洲一区美女视频在线观看免费 | 久久精品—区二区三区 | 午夜视频不卡 | 中文一区在线 | av成人黄色 | 黄色a在线观看 | 奇米影视8888在线观看大全免费 | 91成人免费看 | 久久午夜精品 | 又爽又黄在线观看 | 小草av在线播放 | 99视频在线看 | 精品久久久成人 | 国产精品日韩欧美 | 日韩资源在线观看 | 在线观看中文字幕 | 久久婷亚洲五月一区天天躁 | 国产一级做a爱片久久毛片a | 视频在线99re | 成年人在线 | 激情影院在线观看 | 国产高清久久久久 | 在线视频免费观看 | 亚洲欧美日韩国产一区二区三区 | 久久精品黄 | 91精品一区二区三区蜜臀 | 亚洲国产成人精品在线观看 | 99欧美| 2020天天干天天操 | 日韩免费在线播放 | 91视频久久久 | av软件在线观看 | 久久任你操 | 激情五月综合网 | 成人午夜在线电影 | 国产精品久久久久永久免费观看 | 亚洲欧美日韩国产精品一区午夜 | 免费观看久久 | 外国av网 | 狠狠色网 | 色综合天天在线 | 国产精品色 | 日韩乱理 | 亚洲成人av片在线观看 | 91重口视频 | 中文字幕在线观看视频一区二区三区 | www亚洲一区 | 国产精品va在线观看入 | 国产精品一区二区免费看 | 九九视频免费观看视频精品 | 国产精品一区二区久久精品爱微奶 | 五月婷婷综 | 亚洲精品视频免费在线 | 毛片.com| 五月天久久激情 | 欧美日韩中文视频 | 一区二区三区在线免费观看视频 | 日韩欧美视频一区二区三区 | 欧美嫩草影院 | 天天天天爱天天躁 | www.色五月.com | 日韩在线观看不卡 | 欧美午夜性 | 欧美一二区视频 | 成人午夜片av在线看 | 在线播放一区 | 国产欧美精品在线观看 | 永久免费的啪啪网站免费观看浪潮 | 国产日产亚洲精华av | 一级黄色毛片 | 99免费在线视频观看 | 亚洲精色 | 中文字幕黄色 | 亚洲视频免费在线看 | 日韩免费av在线 | 国产在线观看你懂得 | 久久99久久久久久 | 91香蕉视频污在线 | 亚洲视频资源在线 | 欧美视频日韩视频 | 激情影音先锋 | 夜添久久精品亚洲国产精品 | 国产尤物在线视频 | 国产精品专区一 | 超碰人人射 | 亚洲综合情 | 97超级碰碰碰视频在线观看 | 99精品在线免费观看 | 人人爽久久久噜噜噜电影 | 91大片网站 | 在线免费观看黄网站 | 国产精品福利av | 成 人 黄 色 视频 免费观看 | 久久精品一 | 高清精品视频 | 久久草在线视频国产 | 日本成人中文字幕在线观看 | 国产中文字幕久久 | 国产免费叼嘿网站免费 | 国产成人精品av久久 | 天天艹日日干 | 国产中文字幕一区二区 | 91中文视频 | 香蕉视频免费在线播放 | 国内精品视频在线 | 久久国产精品二国产精品中国洋人 | www.久久久.com | 91麻豆视频 | 免费色av | 91少妇精拍在线播放 | 成人资源在线播放 | 日韩精品一区电影 | 国产精品夜夜夜一区二区三区尤 | 国产精品久久片 | 91在线国产观看 | 亚洲精品视频在线观看免费视频 | 日韩超碰在线 | 国产亚洲无 | 成年人免费在线播放 | 国产精品永久免费 | 91人人插| 亚洲精品午夜久久久久久久久久久 | 狠狠色丁香久久综合网 | 久久精品导航 | 黄色av成人在线 | 久久人人爽人人 | 97国产精品一区二区 | 一区二区三区高清在线 | 亚洲综合一区二区精品导航 | av丝袜美腿 | 久久久亚洲影院 | 97成人资源站 | www激情com | 国产一级大片免费看 | 国产亚洲精品久久久久秋 | 日韩av电影中文字幕在线观看 | 色婷婷精品大在线视频 | 国产精品久久久久久久久久久久久久 | 五月婷婷一区二区三区 | 天天综合日日夜夜 | 国产精品久久精品国产 | 精品久久久国产 | 国产精品午夜av | 狠狠躁夜夜a产精品视频 | 精品国产视频在线观看 | 国产涩涩在线观看 | 韩国中文三级 | 国产成人一区二区三区电影 | 欧美日韩在线视频一区二区 | 伊人av综合 | 国内精品久久久久久久久久清纯 | 五月婷婷久草 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 久久精品国产一区 | 亚洲aⅴ久久精品 | 99久久99久久精品免费 | 国内精品久久久久影院日本资源 | 亚洲精品资源 | 久草在线久 | 欧美极度另类性三渗透 | 肉色欧美久久久久久久免费看 | 在线电影日韩 | 亚洲精品一区二区三区四区高清 | 不卡的av在线播放 | 亚洲电影一级黄 | 中文字幕高清在线 | 亚洲成av人片 | 黄色小网站免费看 | 黄污视频网站大全 | 色综合久久久久久久久五月 | 亚洲欧洲在线视频 | 免费看的国产视频网站 | 亚洲精品国产精品国自产观看浪潮 | 天天翘av | 人人超碰在线 | 国产亚洲va综合人人澡精品 | 久热免费 | 日韩在线观看电影 | 激情综合五月网 | 日韩电影精品 | 黄色视屏免费在线观看 | 中文字幕久久网 | 国模视频一区二区 | 色综合久久88色综合天天人守婷 | 麻豆av一区二区三区在线观看 | 国产一区私人高清影院 | 日韩欧美精品免费 | 国产精品99久久久久久人免费 | 996久久国产精品线观看 | 九九久久免费视频 | 精品久久久久久久久中文字幕 | 亚洲干| 久久99影院 | 在线黄色免费 | 成人av播放 | 精品欧美一区二区三区久久久 | 成人高清在线 | 国产精品不卡在线 | 天天色天天射综合网 | 999久久久欧美日韩黑人 | 91在线最新 | 中文字幕日韩国产 | 四虎在线观看 | 国产精品网址在线观看 | 亚洲黄色在线观看 | a色视频 | 欧美激情第十页 | 丁香六月五月婷婷 | 99亚洲精品在线 | 99精品久久只有精品 | a成人v | 又黄又爽的视频在线观看网站 | 国产 日韩 在线 亚洲 字幕 中文 | 伊人小视频 | 3d黄动漫免费看 | av免费福利 | 国产五十路毛片 | 久久在线观看 | 欧美在线日韩在线 | 夜夜爽夜夜操 | 99国产精品视频免费观看一公开 | 成人9ⅰ免费影视网站 | 亚洲美女精品区人人人人 | 成人av免费| 在线免费亚洲 | 成人av在线资源 | 婷婷亚洲综合五月天小说 | 久久久久国产精品午夜一区 | 欧美-第1页-屁屁影院 | 黄色片网站 | 欧美va天堂va视频va在线 | 五月婷在线观看 | 亚洲日本中文字幕在线观看 | 国产字幕在线观看 | 18网站在线观看 | 少妇av片 | av免费网页 | 欧美成人一区二区 | 国产精品视频最多的网站 | 99视频在线看 | 欧美一二三视频 | 欧美五月婷婷 | 一区二区三区免费在线观看视频 | 青青河边草观看完整版高清 | 国产在线一区二区三区播放 | 成人激情开心网 | 免费视频一级片 | 91免费观看网站 | 久草视频免费观 | 中文字幕影视 | 欧美日韩国产在线一区 | 深夜激情影院 | 日韩二三区 | 九九视频在线播放 | www日韩在线观看 | 亚洲国产精品影院 | av一区二区三区在线 | 亚洲一级二级 | 国产精品99免视看9 国产精品毛片一区视频 | 国产精品久久99综合免费观看尤物 | 久久精品人 | 九九爱免费视频 | 日韩亚洲在线视频 | 久久影视一区 | 五月香视频在线观看 | 国产精品短视频 | 天天操天天操天天操天天操天天操 | 欧美精品一二 | 成人久久久久久久久久 | 中文字幕乱码电影 | 在线视频欧美亚洲 | 亚洲午夜精品一区二区三区电影院 | 国产高清精品在线观看 | 国产1区2区 | 午夜久久福利影院 | 色婷婷免费 | 免费日韩电影 | 久久毛片网 | 久久艹在线观看 | 91手机电影 | 久久成人午夜视频 | 亚洲日本一区二区在线 | 日韩成人在线一区二区 | 国产经典 欧美精品 | 天天草天天干天天 | 日本老少交 | 日韩手机视频 | 96视频免费在线观看 | 国产免费观看高清完整版 | 久久久久久99精品 | 午夜精品一区二区三区在线视频 | 欧美日韩久久不卡 | 人人搞人人搞 | 日韩精品免费在线视频 | 国产成人三级在线观看 | 狠狠干激情 | www.久久久精品 | 亚洲免费a| 美女国内精品自产拍在线播放 | 99久久精品国产亚洲 | 精品一区av | 国产一区二区三区午夜 | 丁香花在线观看免费完整版视频 | 亚洲电影第一页av | 狠狠色丁香婷婷综合久小说久 | 亚洲va综合va国产va中文 | 999一区二区三区 | 成年人免费电影在线观看 | 中文字幕日韩伦理 | 亚洲一区二区黄色 | 亚洲久草网 | 亚洲永久精品在线观看 | 视色网站| 久久99久久精品 | 亚洲香蕉视频 | 久久九九视频 | 国产精品一区二区三区在线播放 | 五月天中文在线 | 91精品国产欧美一区二区成人 | 国产在线一区二区三区播放 | 超碰免费av| 日韩在线理论 | 伊人www22综合色 | 999在线视频 | 久久国产精品免费一区二区三区 | 深爱激情婷婷网 | 在线观看成人小视频 | 不卡的av在线 | 黄色成人免费电影 | 五月天色婷婷丁香 | 欧美俄罗斯性视频 | 国产裸体永久免费视频网站 | 日韩激情视频 | 日韩色视频在线观看 | 久久久国产精品人人片99精片欧美一 | 91香蕉视频黄 | av免费福利 | av福利网址导航 | 2023亚洲精品国偷拍自产在线 | 欧美午夜剧场 | 久久久久久久久久久久99 | 免费观看www小视频的软件 | 国产成人黄色av | 欧美三级高清 | 伊色综合久久之综合久久 | 91在线操| 国产不卡av在线 | 九九热99视频 | 91亚洲精品久久久蜜桃网站 | 人人超碰免费 | 亚洲五月 | www.91av在线| 天天碰天天操视频 | 涩涩在线| 午夜在线国产 | 天天插日日操 | 69av视频在线观看 | 最新精品视频在线 | 成年人在线观看网站 | 中文字幕不卡在线88 | 91免费高清 | 超碰97成人 | 在线观看免费av网 | 97超碰免费在线观看 | 国模视频一区二区三区 | 欧美极品一区二区三区 | 看片网站黄 | 亚洲国产偷 | 国产精品初高中精品久久 | 在线观看成年人 | 看片的网址 | 久久精品精品 | 亚洲国产精品激情在线观看 | 337p日本欧洲亚洲大胆裸体艺术 | 婷婷综合伊人 | 五月激情丁香图片 | 成人午夜在线观看 | 亚洲精品久| 天天干天天做天天爱 | 日韩mv欧美mv国产精品 | 狠狠操狠狠干天天操 | 97精品电影院 | 国产精品一区二区免费 | 亚洲综合视频在线 | 在线观看视频国产一区 | 婷婷色在线播放 | 国产系列精品av | 国产99久久九九精品免费 | 色噜噜日韩精品一区二区三区视频 | 色婷婷狠狠干 | 久久久久欧美精品 | 免费在线观看午夜视频 | 最新日本中文字幕 | 在线国产一区二区 | 97视频一区| 精品一区二区三区在线播放 | 三级黄色网址 | 91传媒免费在线观看 | 国产区精品| 韩日电影在线免费看 | 亚洲伦理一区二区 | caobi视频| 国产一区二区三精品久久久无广告 | 国产乱视频 | 99精品视频免费看 | 99热这里只有精品国产首页 | 99人成在线观看视频 | 免费网站观看www在线观看 | 爱情影院aqdy鲁丝片二区 | 81国产精品久久久久久久久久 | 亚洲国产精品成人精品 | 国产精品一区二区中文字幕 | 日日噜噜噜噜夜夜爽亚洲精品 | www.com操| av免费网| 五月婷婷综合激情网 | 国产91在线观 | 在线观看一区 | 五月婷久 | av资源在线看 | 蜜桃视频在线视频 | 日韩午夜精品福利 | 视频在线精品 | 婷婷综合成人 | 中文字幕一区二区三区在线观看 | 综合网天天色 | 在线看欧美 | 日日爽日日操 | 国产免费亚洲高清 | 四虎成人精品 | 91在线免费观看网站 | 在线观看av免费 | 久久精品艹 | 成人一区二区三区在线 | 亚洲成av人片在线观看无 | 麻豆久久久| 曰韩精品 | 久久国产精品免费一区 | 性色av免费观看 | 欧美作爱视频 | 91片在线观看 | 久久综合色天天久久综合图片 | 亚洲精品视频免费在线观看 | 亚洲黄电影 | 久久99精品波多结衣一区 | 欧美日韩一区二区在线 | 高潮毛片无遮挡高清免费 | 国产一区视频在线观看免费 | 欧美男男tv网站 | 久久久国产精品一区二区中文 | 视频二区在线 | 日韩一二三在线 | 久影院 | 深夜视频久久 | 久久看毛片 | 玖玖在线资源 | 亚洲成人黄色av | 亚洲人成人天堂h久久 | 亚洲精品88欧美一区二区 | 亚洲第一成网站 | www.久久久精品 | 一区二区三区在线电影 | 亚洲最新视频在线 | 久久蜜臀一区二区三区av | 99精品国产一区二区三区不卡 | 亚洲成av人影院 | 国产精品入口麻豆www | 激情综合网婷婷 | 国产精品嫩草影院9 | 午夜国产一区 | 五月开心激情网 | 丁香久久 | www激情网| 成人毛片一区 | 超碰伊人网 | av电影在线观看完整版一区二区 | 国产在线观看不卡 | 最近中文字幕视频完整版 | 午夜精品视频在线 | 激情婷婷 | 欧美日韩一区三区 | 日韩免| 亚洲综合色婷婷 | 日韩网站在线看片你懂的 | 视频 国产区 | 日韩专区在线观看 | 久久久久福利视频 | 国产成人精品一区在线 | 黄在线免费观看 | 四虎成人精品在永久免费 | 91在线看网站 | 欧美日韩视频在线播放 | 狠狠干夜夜 | 亚洲一区精品人人爽人人躁 | 国产精品永久免费观看 | 2000xxx影视| 在线观看网站黄 | 又黄又刺激的视频 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 97免费在线观看 | 免费在线精品视频 | 99这里只有精品视频 | 中文字幕有码在线播放 | 91在线视频一区 | 91精品视频免费观看 | 国产精品久久久久久久久久久久久久 | 国产视频网站在线观看 | 成人午夜影院在线观看 | 精品一区中文字幕 | 色av婷婷 | 国产99久久久精品 | 五月花激情 | 国产色就色 | 18pao国产成视频永久免费 | 天天色天| 美女久久久久久久 | 缴情综合网五月天 | 免费手机黄色网址 | 国内免费久久久久久久久久久 | 在线香蕉视频 | 一级一片免费观看 | 欧美在线一二 | 最近中文字幕完整高清 | 久久人人爽人人爽 | 欧美亚洲国产一卡 | 亚洲精品视频免费观看 | 81国产精品久久久久久久久久 | 精品久久久久久亚洲综合网站 | 91av视频免费在线观看 | 色综合久久精品 | 97超碰成人 | 在线观看国产v片 | 中文字幕久久精品亚洲乱码 | 亚洲成人资源在线观看 | 天天操狠狠操网站 | 久久久免费播放 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产手机av在线 | www..com黄色片 | 五月天综合在线 | 色综合天天天天做夜夜夜夜做 | 成人中文字幕av | 成人av日韩 | 一级黄色网址 | 日韩激情免费视频 | 在线视频精品播放 | 国产精品成人aaaaa网站 | a黄色一级 | 亚洲精品国产精品国自产观看 | 日p视频在线观看 | 亚洲国产精品小视频 | 免费观看成人 | 国产黄a三级三级三级三级三级 | 免费亚洲视频在线观看 | 亚洲91中文字幕无线码三区 | 亚洲欧美视频网站 | 最近日韩中文字幕中文 | 狠狠操影视 | 99亚洲国产精品 | 国产亚洲精品久久久久久网站 | 色婷婷狠狠 | 日日夜夜精品免费 | 深爱五月网 | 免费看污在线观看 | 有码中文在线 | 国产无限资源在线观看 | 欧美日韩久久一区 | 国产高清黄 | 人人爽人人乐 | 六月激情网| 一区二区三区在线免费观看 | 国产精品毛片久久久 | 中文字幕亚洲综合久久五月天色无吗'' | 久久久久9999亚洲精品 | 日本免费久久高清视频 | 天天要夜夜操 | 97人人模人人爽人人少妇 | 9免费视频| 国产精品精品久久久 | 亚洲电影图片小说 | 久久tv| 人人爽人人爽人人爽人人爽 | 日日夜夜噜 | 国产黄色片一级 | 在线日韩中文 | 国产在线免费观看 | 国产精品18久久久久久久久久久久 | 国产精品综合在线观看 | 深爱婷婷网 | 91精品国产91久久久久福利 | 成人免费在线观看入口 | 成年人黄色免费看 | 欧美 日韩 国产 中文字幕 | 99re久久资源最新地址 |