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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux系统调用的封装格式,ARM Linux系统调用的原理

發布時間:2023/12/1 linux 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux系统调用的封装格式,ARM Linux系统调用的原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ARM Linux系統調用的原理ARM Linux系統調用的原理

操作系統為在用戶態運行的進程與硬件設備進行交互提供了一組接口。在應用程序和硬件之間設置一個額外層具有很多優點。首先,這使得編程更加容易,把用戶從學習硬件設備的低級編程特性中解放出來。其次,這極大地提高了系統的安全性,因為內核在試圖滿足某個請求之前在接口級就可以檢查這種請求的正確性。最后,更重要的是這些接口使得程序具有可移植性,因為只要內核所提供的一組接口相同,那么在任一內核之上就可以正確地編譯和執行程序。

Unix系統通過向內核發出系統調用(system call)實現了用戶態進程和硬件設備之間的大部分接口。系統調用是操作系統提供的服務,用戶程序通過各種系統調用,來引用內核提供的各種服務,系統調用的執行讓用戶程序陷入內核,該陷入動作由swi軟中斷完成。

應用編程接口(API)與系統調用的不同在于,前者只是一個函數定義,說明了如何獲得一個給定的服務,而后者是通過軟件中斷向內核發出的一個明確的請求。POSIX標準針對API,而不針對系統調用。Unix系統給程序員提供了很多API庫函數。libc的標準c庫所定義的一些API引用了封裝例程(wrapper routine)(其唯一目的就是發布系統調用)。通常情況下,每個系統調用對應一個封裝例程,而封裝例程定義了應用程序使用的API。反之則不然,一個API沒必要對應一個特定的系統調用。從編程者的觀點看,API和系統調用之間的差別是沒有關系的:唯一相關的事情就是函數名、參數類型及返回代碼的含義。然而,從內核設計者的觀點看,這種差別確實有關系,因為系統調用屬于內核,而用戶態的庫函數不屬于內核。

大部分封裝例程返回一個整數,其值的含義依賴于相應的系統調用。返回-1通常表示內核不能滿足進程的請求。系統調用處理程序的失敗可能是由無效參數引起的,也可能是因為缺乏可用資源,或硬件出了問題等等。在libc庫中定義的errno變量包含特定的出錯碼,每個出錯碼定義為一個常量宏。

當用戶態的進程調用一個系統調用時,CPU切換到內核態并開始執行一個內核函數。因為內核實現了很多不同的系統調用,因此進程必須傳遞一個名為系統調用號(system call number)的參數來識別所需的系統調用。所有的系統調用核都返回一個整數值。這些返回值與封裝例程返回值的約定是不同的。在內中,整數或0表示系統調用成功結束,而負數表示一個出錯條件。在后一種情況下,這個值就是存放在errno變量中必須返回給應用程序的負出錯碼。

ARM Linux系統利用SWI指令來從用戶空間進入內核空間,還是先讓我們了解下這個SWI指令吧。SWI指令用于產生軟件中斷,從而實現從用戶模式到管理模式的變換,CPSR保存到管理模式的SPSR,執行轉移到SWI向量。在其他模式下也可使用SWI指令,處理器同樣地切換到管理模式。指令格式如下:

SWI{cond} immed_24

其中:

immed_2424位立即數,值為從0——16777215之間的整數。

使用SWI指令時,通常使用以下兩種方法進行參數傳遞,SWI異常處理程序可以提供相關的服務,這兩種方法均是用戶軟件協定。

1)、指令中24位的立即數指定了用戶請求的服務類型,參數通過通用寄存器傳遞。SWI異常處理程序要通過讀取引起軟件中斷的SWI指令,以取得24為立即數。如:

MOV R0,#34

SWI 12

2)、指令中的24位立即數被忽略,用戶請求的服務類型由寄存器R0的值決定,參數通過其他的通用寄存器傳遞。如:

MOV R0, #12

MOV R1, #34

SWI 0

在SWI異常處理程序中,取出SWI立即數的步驟為:首先確定引起軟件中斷的SWI指令是ARM指令還是Thumb指令,這可通過對SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出指令,分解出立即數(低24位)。

由用戶空間進入系統調用

通常情況下,我們寫的用戶空間應用程序都是通過封裝的C lib來調用系統調用的。以0.9.30版uClibc中的open為例,來追蹤一下這個封裝的函數是如何一步一步的調用系統調用的。在include/fcntl.h中有定義:

#define open open64

open實際上只是open64的一個別名而已。

在libc/sysdeps/linux/common/open64.c中可以看到:

extern __typeof(open64) __libc_open64;

extern __typeof(open) __libc_open;

可見open64也只不過是__libc_open64的別名,而__libc_open64函數在同一個文件中定義:

libc_hidden_proto(__libc_open64)

int __libc_open64 (const char *file, int oflag, ...)

{

mode_t mode = 0;

if (oflag & O_CREAT)

{

va_list arg;

va_start (arg, oflag);

mode = va_arg (arg, mode_t);

va_end (arg);

}

return __libc_open(file, oflag | O_LARGEFILE, mode);

}

libc_hidden_def(__libc_open64)

最終__libc_open64又調用了__libc_open函數,這個函數在文件libc/sysdeps/linux/common/open.c中定義:

libc_hidden_proto(__libc_open)

int __libc_open(const char *file, int oflag, ...)

{

mode_t mode = 0;

if (oflag & O_CREAT) {

va_list arg;

va_start (arg, oflag);

mode = va_arg (arg, mode_t);

va_end (arg);

}

return __syscall_open(file, oflag, mode);

}

libc_hidden_def(__libc_open)

這個函數,也是僅僅根據打開標志oflag的值,來判斷是否有第三個參數,若由,則獲得其值。之后,便用獲得的參數來調用__syscall_open(file, oflag, mode)。

__syscall_open在同一個文件中定義:

static __inline__ _syscall3(int, __syscall_open, const char *, file,

int, flags, __kernel_mode_t, mode)

在文件libc/sysdeps/linux/arm/bits/syscalls.h文件中可以看到:

#undef _syscall3

#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \

type name(type1 arg1,type2 arg2,type3 arg3) \

{ \

return (type) (INLINE_SYSCALL(name, 3, arg1, arg2, arg3)); \

}

這個宏實際上完成定義一個函數的工作,宏的第一個參數是函數的返回值類型,第二個參數是函數名,之后的參數就如同它們的參數名所表明的那樣,分別是函數的參數類型及參數名。__syscall_open實際上為:

int __syscall_open (const char * file,int flags, __kernel_mode_t mode)

{

return (int) (INLINE_SYSCALL(__syscall_open, 3, file, flags, mode));

}

INLINE_SYSCALL為同一個文件中定義的宏:

#undef INLINE_SYSCALL

#define INLINE_SYSCALL(name, nr, args...)\

({ unsigned int _inline_sys_result = INTERNAL_SYSCALL (name, , nr, args);\

if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_inline_sys_result, ), 0))\

{\

__set_errno (INTERNAL_SYSCALL_ERRNO (_inline_sys_result, ));\

_inline_sys_result = (unsigned int) -1;\

}\

(int) _inline_sys_result; })

INLINE_SYSCALL宏中最值得注意的是INTERNAL_SYSCALL,其定義如下:

#undef INTERNAL_SYSCALL

#if !defined(__thumb__)

#if defined(__ARM_EABI__)

#define INTERNAL_SYSCALL(name, err, nr, args...)\

({unsigned int __sys_result;\

{\

register int _a1 __asm__ ("r0"), _nr __asm__ ("r7");\

LOAD_ARGS_##nr (args)\

_nr = SYS_ify(name);\

__asm__ __volatile__ ("swi0x0@ syscall " #name\

: "=r" (_a1)\

: "r" (_nr) ASM_ARGS_##nr\

: "memory");\

__sys_result = _a1;\

}\

(int) __sys_result; })

#else /* defined(__ARM_EABI__) */

#define INTERNAL_SYSCALL(name, err, nr, args...)\

({ unsigned int __sys_result;\

{\

register int _a1 __asm__ ("a1");\

LOAD_ARGS_##nr (args)\

__asm__ __volatile__ ("swi%1@ syscall " #name\

: "=r" (_a1)\

: "i" (SYS_ify(name)) ASM_ARGS_##nr\

: "memory");\

__sys_result = _a1;\

}\

(int) __sys_result; })

#endif

這里也將同文件中的LOAD_ARGS宏的定義貼出來:

#define LOAD_ARGS_0()

#define ASM_ARGS_0

#define LOAD_ARGS_1(a1)\

_a1 = (int) (a1);\

LOAD_ARGS_0 ()

#define ASM_ARGS_1ASM_ARGS_0, "r" (_a1)

#define LOAD_ARGS_2(a1, a2)\

register int _a2 __asm__ ("a2") = (int) (a2);\

LOAD_ARGS_1 (a1)

#define ASM_ARGS_2ASM_ARGS_1, "r" (_a2)

#define LOAD_ARGS_3(a1, a2, a3)\

register int _a3 __asm__ ("a3") = (int) (a3);\

LOAD_ARGS_2 (a1, a2)

這幾個宏用來在寄存器中加載相應的參數,參數傳遞的方式和普通的C函數也沒有什么太大的區別,同樣都是將參數列表中的參數依次放入寄存器r0、r1、r2、r3…中。

上面的SYS_ify(name)宏,是用來獲得系統調用號的。

#define SYS_ify(syscall_name)(__NR_##syscall_name)

也就是__NR___syscall_open,在libc/sysdeps/linux/common/open.c中可以看到這個宏的定義:

#define __NR___syscall_open __NR_open

__NR_open在內核代碼的頭文件中有定義。

在這里我們忽略定義__thumb__的情況,而假設我們編譯出來的庫函數使用的都是ARM指令集。在上面的代碼中,我們看到,根據是否定義宏__ARM_EABI__,INTERNAL_SYSCALL會被展開為兩種不同的版本。關于這一點,與應用二進制接口ABI有關,不同的ABI,則會有不同的傳遞系統調用號的方法。對于比較新的EABI,則在r7寄存器保存系統調用號,通過swi0x0來陷入內核。否則,通過swi指令的24位立即數參數來傳遞系統調用號。后面還會有內核中關于這個問題的更詳細的說明。

同時這兩種調用方式的系統調用號也是存在這區別的,在內核的文件arch/arm/inclue/asm/unistd.h中可以看到:

#define __NR_OABI_SYSCALL_BASE0x900000

#if defined(__thumb__) || defined(__ARM_EABI__)

#define __NR_SYSCALL_BASE0

#else

#define __NR_SYSCALL_BASE__NR_OABI_SYSCALL_BASE

#endif

/*

* This file contains the system call numbers.

*/

#define __NR_restart_syscall(__NR_SYSCALL_BASE+0)

#define __NR_exit(__NR_SYSCALL_BASE+1)

#define __NR_fork(__NR_SYSCALL_BASE+2)

#define __NR_read(__NR_SYSCALL_BASE+3)

#define __NR_write(__NR_SYSCALL_BASE+4)

#define __NR_open(__NR_SYSCALL_BASE+5)

……

接下來來看操作系統對系統調用的處理。我們回到ARM Linux的異常向量表,因為當執行swi時,會從異常向量表中取例程的地址從而跳轉到相應的處理程序中。在文件arch/arm/kernel/entry-armv.S中我們看到SWI異常向量:

W(ldr)pc, .LCvswi + stubs_offset

而.LCvswi在同一個文件中定義為:

.LCvswi:

.wordvector_swi

也就是最終會執行例程vector_swi來完成對系統調用的處理,接下來我們來看下在arch/arm/kernel/entry-common.S中定義的vector_swi例程(刪去一些和我們的示例平臺無關的代碼):

.align5

ENTRY(vector_swi)

subsp, sp, #S_FRAME_SIZE

stmiasp, {r0 - r12}@ Calling r0 - r12

ARM(addr8, sp, #S_PC)

ARM(stmdbr8, {sp, lr}^)@ Calling sp, lr

mrsr8, spsr@ called from non-FIQ mode, so ok.

strlr, [sp, #S_PC]@ Save calling PC

strr8, [sp, #S_PSR]@ Save CPSR

strr0, [sp, #S_OLD_R0]@ Save OLD_R0

zero_fp

/* Get the system call number. */

#if defined(CONFIG_OABI_COMPAT)

/*

* If we have CONFIG_OABI_COMPAT then we need to look at the swi

* value to determine if it is an EABI or an old ABI call.

*/

ldrr10, [lr, #-4]@ get SWI instruction

#ifdef CONFIG_CPU_ENDIAN_BE8

//rev指令的功能是反轉字中的字節序

revr10, r10@ little endian instruction

#endif

#elif defined(CONFIG_AEABI)

#else

/* Legacy ABI only. */

ldrscno, [lr, #-4]@ get SWI instruction

#endif

#ifdef CONFIG_ALIGNMENT_TRAP

ldrip, __cr_alignment

ldrip, [ip]

mcrp15, 0, ip, c1, c0@ update control register

#endif

enable_irq

// tsk是寄存器r9的別名,在arch/arm/kernel/entry-header.S中定義:// tsk.reqr9@ current thread_info

//獲得線程對象的基地址。

get_thread_info tsk

// tbl是r8寄存器的別名,在arch/arm/kernel/entry-header.S中定義:

// tbl.reqr8@ syscall table pointer,

//用來存放系統調用表的指針,系統調用表在后面調用

adrtbl, sys_call_table@ load syscall table pointer

ldrip, [tsk, #TI_FLAGS]@ check for syscall tracing

#if defined(CONFIG_OABI_COMPAT)

/*

* If the swi argument is zero, this is an EABI call and we do nothing.

*

* If this is an old ABI call, get the syscall number into scno and

* get the old ABI syscall table address.

*/

bicsr10, r10, #0xff000000

eornescno, r10, #__NR_OABI_SYSCALL_BASE

ldrnetbl, =sys_oabi_call_table

#elif !defined(CONFIG_AEABI)

// scno是寄存器r7的別名

bicscno, scno, #0xff000000@ mask off SWI op-code

eorscno, scno, #__NR_SYSCALL_BASE@ check OS number

#endif

stmdbsp!, {r4, r5}@ push fifth and sixth args

tstip, #_TIF_SYSCALL_TRACE@ are we tracing syscalls?

bne__sys_trace

cmpscno, #NR_syscalls@ check upper syscall limit

adrlr, BSYM(ret_fast_syscall)@ return address

ldrccpc, [tbl, scno, lsl #2]@ call sys_* routine

addr1, sp, #S_OFF

// why也是r8寄存器的別名

2:movwhy, #0@ no longer a real syscall

cmpscno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE)

eorr0, scno, #__NR_SYSCALL_BASE@ put OS number back

bcsarm_syscall

bsys_ni_syscall@ not private func

ENDPROC(vector_swi)

上面的zero_fp是一個宏,在arch/arm/kernel/entry-header.S中定義:

.macrozero_fp

#ifdef CONFIG_FRAME_POINTER

movfp, #0

#endif

.endm

而fp位寄存器r11。

像每一個異常處理程序一樣,要做的第一件事當然就是保護現場了。緊接著是獲得系統調用的系統調用號。然后以系統調用號作為索引來查找系統調用表,如果系統調用號正常的話,就會調用相應的處理例程來處理,就是上面的那個ldrccpc, [tbl, scno, lsl #2]語句,然后通過例程ret_fast_syscall來返回。

在這個地方我們接著來討論ABI的問題。現在,我們首先來看兩個宏,一個是CONFIG_OABI_COMPAT意思是說與old ABI兼容,另一個是CONFIG_AEABI意思是說指定現在的方式為EABI。這兩個宏可以同時配置,也可以都不配,也可以配置任何一種。我們來看一下內核是怎么處理這一問題的。我們知道,sys_call_table在內核中是個跳轉表,這個表中存儲的是一系列的函數指針,這些指針就是系統調用函數的指針,如(sys_open)。內核是根據一個系統調用號(對于EABI來說為系統調用表的索引)找到實際該調用內核哪個函數,然后通過運行該函數完成系統調用的。

首先,對于old ABI,內核給出的處理是為它建立一個單獨的system call table,叫sys_oabi_call_table。這樣,兼容方式下就會有兩個system call table,以old ABI方式的系統調用會執行old_syscall_table表中的系統調用函數,EABI方式的系統調用會用sys_call_table中的函數指針。配置無外乎以下4中:第一、兩個宏都配置行為就是上面說的那樣。第二、只配置CONFIG_OABI_COMPAT,那么以old ABI方式調用的會用sys_oabi_call_table,以EABI方式調用的用sys_call_table,和1實質上是相同的。只是情況1更加明確。第三、只配置CONFIG_AEABI系統中不存在sys_oabi_call_table,對old ABI方式調用不兼容。只能 以EABI方式調用,用sys_call_table。

第四、兩個都沒有配置,系統默認會只允許old ABI方式,但是不存在old_syscall_table,最終會通過sys_call_table完成函數調用

系統會根據ABI的不同而將相應的系統調用表的基地址加載進tbl寄存器,也就是r8寄存器。接下來來看系統調用表,如前面所說的那樣,有兩個,同樣都在文件arch/arm/kernel/entry-armv.S中:

#define ABI(native, compat) native

#ifdef CONFIG_AEABI

#define OBSOLETE(syscall) sys_ni_syscall

#else

#define OBSOLETE(syscall) syscall

#endif

.typesys_call_table, #object

ENTRY(sys_call_table)

#include "calls.S"

#undef ABI

#undef OBSOLETE

另外一個為:

#define ABI(native, compat) compat

#define OBSOLETE(syscall) syscall

.typesys_oabi_call_table, #object

ENTRY(sys_oabi_call_table)

#include "calls.S"

#undef ABI

#undef OBSOLETE

這樣看來貌似兩個系統調用表是完全一樣的。這里預處理指令include的獨特用法也挺有意思,系統調用表的內容就是整個arch/arm/kernel/calls.S文件的內容(由于太長,這里就不全部列出了):

/* 0 */CALL(sys_restart_syscall)

CALL(sys_exit)

CALL(sys_fork_wrapper)

CALL(sys_read)

CALL(sys_write)

/* 5 */CALL(sys_open)

CALL(sys_close)

……

上面的CALL()是個宏,它同樣在文件arch/arm/kernel/entry-armv.S中定義:

#define CALL(x) .equ NR_syscalls,NR_syscalls+1

#include "calls.S"

#undef CALL

#define CALL(x) .long x

在定義宏CALL()的地方,我們看到calls.S已經被包含了一次,只不過在這里,不是為了建立系統調用表,而僅僅是為了獲得系統的系統調用的數量,并保存在宏NR_syscalls中。在SWI向量中,我們也看到,是使用了這個宏的。

最后再羅嗦一點,如果用sys_open來搜的話,是搜不到系統調用open的定義的,系統調用函數都是用宏來定義的,比如對于open,有這樣的定義:

---------------------------------------------------------------------

fs/open.c

1066 SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)

1067 {

1068long ret;

1069

1070if (force_o_largefile())

1071flags |= O_LARGEFILE;

1072

1073ret = do_sys_open(AT_FDCWD, filename, flags, mode);

1074/* avoid REGPARM breakage on x86: */

1075asmlinkage_protect(3, ret, filename, flags, mode);

1076return ret;

1077 }

---------------------------------------------------------------------

繼續回到vector_swi,如果系統調用號不正確,則會調用arm_syscall函數來進行處理,這個函數定義如下:

---------------------------------------------------------------------

arch/arm/kernel/traps.c

465 #define NR(x) ((__ARM_NR_##x) - __ARM_NR_BASE)

466 asmlinkage int arm_syscall(int no, struct pt_regs *regs)

467 {

468struct thread_info *thread = current_thread_info();

469siginfo_t info;

470

471if ((no >> 16) != (__ARM_NR_BASE>> 16))

472return bad_syscall(no, regs);

473

474switch (no & 0xffff) {

475case 0: /* branch through 0 */

476info.si_signo = SIGSEGV;

477info.si_errno = 0;

478info.si_code= SEGV_MAPERR;

479info.si_addr= NULL;

480

481arm_notify_die("branch through zero", regs, &info, 0, 0);

482return 0;

483

484case NR(breakpoint): /* SWI BREAK_POINT */

485regs->ARM_pc -= thumb_mode(regs) ? 2 : 4;

486ptrace_break(current, regs);

487return regs->ARM_r0;

488

489/*

490* Flush a region from virtual address 'r0' to virtual address 'r1'

491 * _exclusive_.There is no alignment requirement on either address;

492* user space does not need to know the hardware cache layout.

493*

494* r2 contains flags.It should ALWAYS be passed as ZERO until it

495* is defined to be something else.For now we ignore it, but may

496* the fires of hell burn in your belly if you break this rule. ;)

497*

498* (at a later date, we may want to allow this call to not flush

499* various aspects of the cache.Passing '' will guarantee that

500* everything necessary gets flushed to maintain consistency in

501* the specified region).

502*/

503case NR(cacheflush):

504do_cache_op(regs->ARM_r0, regs->ARM_r1, regs->ARM_r2);

505return 0;

506

507case NR(usr26):

508if (!(elf_hwcap & HWCAP_26BIT))

509break;

510regs->ARM_cpsr &= ~MODE32_BIT;

511return regs->ARM_r0;

512

513case NR(usr32):

514if (!(elf_hwcap & HWCAP_26BIT))

515break;

516regs->ARM_cpsr |= MODE32_BIT;

517return regs->ARM_r0;

518

519case NR(set_tls):

520thread->tp_value = regs->ARM_r0;

521 #if defined(CONFIG_HAS_TLS_REG)

522asm ("mcr p15, 0, %0, c13, c0, 3" : : "r" (regs->ARM_r0) );

523 #elif !defined(CONFIG_TLS_REG_EMUL)

524/*

525* User space must never try to access this directly.

526* Expect your app to break eventually if you do so.

527* The user helper at 0xffff0fe0 must be used instead.

528* (see entry-armv.S for details)

529*/

530*((unsigned int *)0xffff0ff0) = regs->ARM_r0;

531 #endif

532return 0;

533

534 #ifdef CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG

535/*

536* Atomically store r1 in *r2 if *r2 is equal to r0 for user space.

537* Return zero in r0 if *MEM was changed or non-zero if no exchange

538* happened.Also set the user C flag accordingly.

539* If access permissions have to be fixed up then non-zero is

540* returned and the operation has to be re-attempted.

541*

542* *NOTE*: This is a ghost syscall private to the kernel.Only the

543* __kuser_cmpxchg code in entry-armv.S should be aware of its

544* existence.Don't ever use this from user code.

545*/

546case NR(cmpxchg):

547for (;;) {

548extern void do_DataAbort(unsigned long addr, unsigned int fsr,

549struct pt_regs *regs);

550unsigned long val;

551unsigned long addr = regs->ARM_r2;

552struct mm_struct *mm = current->mm;

553pgd_t *pgd; pmd_t *pmd; pte_t *pte;

554spinlock_t *ptl;

555

556regs->ARM_cpsr &= ~PSR_C_BIT;

557down_read(&mm->mmap_sem);

558pgd = pgd_offset(mm, addr);

559if (!pgd_present(*pgd))

560goto bad_access;

561pmd = pmd_offset(pgd, addr);

562if (!pmd_present(*pmd))

563goto bad_access;

564pte = pte_offset_map_lock(mm, pmd, addr, &ptl);

565if (!pte_present(*pte) || !pte_dirty(*pte)) {

566pte_unmap_unlock(pte, ptl);

567goto bad_access;

568}

569val = *(unsigned long *)addr;

570val -= regs->ARM_r0;

571if (val == 0) {

572*(unsigned long *)addr = regs->ARM_r1;

573regs->ARM_cpsr |= PSR_C_BIT;

574}

575pte_unmap_unlock(pte, ptl);

576up_read(&mm->mmap_sem);

577return val;

578

579bad_access:

580up_read(&mm->mmap_sem);

581/* simulate a write access fault */

582do_DataAbort(addr, 15 + (1 << 11), regs);

583}

584 #endif

585

586default:

587/* Calls 9f00xx..9f07ff are defined to return -ENOSYS

588if not implemented, rather than raising SIGILL.This

589way the calling program can gracefully determine whether

590afeature is supported.*/

591if ((no & 0xffff) <= 0x7ff)

592return -ENOSYS;

593break;

594}

595 #ifdef CONFIG_DEBUG_USER

596/*

597* experience shows that these seem to indicate that

598* something catastrophic has happened

599*/

600if (user_debug & UDBG_SYSCALL) {

601printk("[%d] %s: arm syscall %d\n",

602task_pid_nr(current), current->comm, no);

603dump_instr("", regs);

604if (user_mode(regs)) {

605__show_regs(regs);

606c_backtrace(regs->ARM_fp, processor_mode(regs));

607}

608}

609 #endif

610info.si_signo = SIGILL;

611info.si_errno = 0;

612info.si_code = ILL_ILLTRP;

613info.si_addr= (void __user *)instruction_pointer(regs) -

614(thumb_mode(regs) ? 2 : 4);

615

616arm_notify_die("Oops - bad syscall(2)", regs, &info, no, 0);

617return 0;

618 }

---------------------------------------------------------------------

這個函數處理所有的辨別不出來的系統調用。系統調用號正確也好不正確也好,最終都是通過ret_fast_syscall例程來返回,因為我們看到,在進入系統調用處理函數之前,先加載了符號ret_fast_syscall進lr寄存器。ret_fast_syscall定義如下:

---------------------------------------------------------------------

arch/arm/kernel/entry-common.S

ret_fast_syscall:

UNWIND(.fnstart)

UNWIND(.cantunwind)

disable_irq@ disable interrupts

ldrr1, [tsk, #TI_FLAGS]

tstr1, #_TIF_WORK_MASK

bnefast_work_pending

/* perform architecture specific actions before user return */

arch_ret_to_user r1, lr

restore_user_regs fast = 1, offset = S_OFF

UNWIND(.fnend)

fast_work_pending:

strr0, [sp, #S_R0+S_OFF]!@ returned r0

work_pending:

tstr1, #_TIF_NEED_RESCHED

bnework_resched

tstr1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME

beqno_work_pending

movr0, sp@ 'regs'

movr2, why@ 'syscall'

bldo_notify_resume

bret_slow_syscall@ Check work again

work_resched:

blschedule

/*

* "slow" syscall return path."why" tells us if this was a real syscall.

*/

ENTRY(ret_to_user)

ret_slow_syscall:

disable_irq@ disable interrupts

ldrr1, [tsk, #TI_FLAGS]

tstr1, #_TIF_WORK_MASK

bnework_pending

no_work_pending:

/* perform architecture specific actions before user return */

arch_ret_to_user r1, lr

restore_user_regs fast = 0, offset = 0

ENDPROC(ret_to_user)

---------------------------------------------------------------------

對于我們的平臺來說,上面的arch_ret_to_user為空。restore_user_regs宏用于恢復現場并返回,restore_user_regs宏定義如下:

---------------------------------------------------------------------

arch/arm/kernel/entry-header.S

.macrorestore_user_regs, fast = 0, offset = 0

ldrr1, [sp, #\offset + S_PSR]@ get calling cpsr

ldrlr, [sp, #\offset + S_PC]!@ get pc

msrspsr_cxsf, r1@ save in spsr_svc

#if defined(CONFIG_CPU_32v6K)

clrex@ clear the exclusive monitor

#elif defined (CONFIG_CPU_V6)

strexr1, r2, [sp]@ clear the exclusive monitor

#endif

.if\fast

ldmdbsp, {r1 - lr}^@ get calling r1 - lr

.else

ldmdbsp, {r0 - lr}^@ get calling r0 - lr

.endif

movr0, r0@ ARMv5T and earlier require a nop

@ after ldm {}^

addsp, sp, #S_FRAME_SIZE - S_PC

movspc, lr@ return & move spsr_svc into cpsr

.endm

---------------------------------------------------------------------

添加新的系統調用

第一、打開arch/arm/kernel/calls.S,在最后添加系統調用的函數原型的指針,例如:

CALL(sys_set_senda)

補充說明一點關于NR_syscalls的東西,這個常量表示系統調用的總的個數,在較新版本的內核中,文件arch/arm/kernel/entry-common.S中可以找到:

.equ NR_syscalls,0

#define CALL(x) .equ NR_syscalls,NR_syscalls+1

#include "calls.S"

#undef CALL

#define CALL(x) .long x

相當的巧妙,不是嗎?在系統調用表中每添加一個系統調用,NR_syscalls就自動增加一。在這個地方先求出NR_syscalls,然后重新定義CALL(x)宏,這樣也可以不影響文件后面系統調用表的建立。

第二、打開include/asm-arm/unistd.h,添加系統調用號的宏,感覺這步可以省略,因為這個地方定義的系統調用號主要是個C庫,比如uClibc、Glibc用的。例如:

#define __NR_plan_set_senda???????????? (__NR_SYSCALL_BASE+365)

為了向后兼容,系統調用只能增加而不能減少,這里的編號添加時,也必須按順序來。否則會導致核心運行錯誤。

第三,實例化該系統調用,即編寫新添加系統調用的實現例如:

SYSCALL_DEFINE1(set_senda, int,iset)

{

if(iset)

UART_PUT_CR(&at91_port[2],AT91C_US_SENDA);

else

UART_PUT_CR(&at91_port[2],AT91C_US_RSTSTA);

return 0;

}

第四、打開include/linux/syscalls.h添加函數聲明

asmlinkage long sys_set_senda(int iset);

第五、在應用程序中調用該系統調用,可以參考uClibc的實現。

第六、結束。

參考文檔:

總結

以上是生活随笔為你收集整理的linux系统调用的封装格式,ARM Linux系统调用的原理的全部內容,希望文章能夠幫你解決所遇到的問題。

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

中文字幕在线精品 | 亚洲女在线 | 日日碰夜夜爽 | 国产成人l区 | 成人综合婷婷国产精品久久免费 | 午夜视频在线观看一区二区 | 一区二区精品在线视频 | 五月丁色 | 夜夜操夜夜干 | 视频国产区| 色婷婷午夜| 久久久人人爽 | 婷婷综合成人 | 国产在线精品区 | 午夜色场| 中文字幕一区二区三区乱码在线 | 国产中文字幕在线免费观看 | 国产伦理久久精品久久久久_ | 久草在线视频国产 | 精品视频久久久 | 天天干天天射天天爽 | 免费亚洲黄色 | 国产精品99在线观看 | 91精品久久久久 | 中文字幕免费高清av | 综合网成人 | 麻豆视频观看 | 一区二区三区动漫 | 日韩电影中文字幕在线 | 久久伊人精品一区二区三区 | 久久视讯 | 999国内精品永久免费视频 | 欧美有色 | 操操综合网 | 天天视频色版 | 日韩视频一区二区三区 | 国产精品久久久777 成人手机在线视频 | 国产精品免费一区二区三区 | av官网| 久久久久国产精品www | 欧美日韩在线免费观看视频 | 丁香久久激情 | 青青河边草观看完整版高清 | 久久综合九色综合久久久精品综合 | 蜜臀久久99精品久久久酒店新书 | 亚洲综合色丁香婷婷六月图片 | 久久人人爽爽人人爽人人片av | 日韩专区一区二区 | 日日夜夜网 | 亚洲精品在线视频 | 欧美精品久久久久 | 免费网站看av片 | 97色在线观看 | 奇米四色影狠狠爱7777 | 日日草夜夜操 | 日本韩国精品一区二区在线观看 | 免费观看www小视频的软件 | 亚洲精品国产精品久久99热 | 一 级 黄 色 片免费看的 | 波多野结衣网址 | 日韩av在线资源 | 国产中文字幕av | 水蜜桃亚洲一二三四在线 | 亚洲 中文 欧美 日韩vr 在线 | 毛片永久免费 | 国产高清久久久 | www日日| 99国产在线 | 日韩免费高清在线观看 | 在线视频app | 国产成人av综合色 | 国产精品亚洲人在线观看 | 久久久精品国产一区二区电影四季 | 一区二区三区 亚洲 | 日本在线观看黄色 | 特级西西www44高清大胆图片 | 免费看片黄色 | 99久久99| .精品久久久麻豆国产精品 亚洲va欧美 | 日韩影视在线观看 | 91亚洲欧美激情 | 91看片看淫黄大片 | 亚洲精品国产精品久久99热 | 国产精品 久久 | 中文字幕高清在线 | 日韩一二区在线观看 | 日韩在线免费视频观看 | 亚洲视频观看 | 亚洲国产精品成人综合 | 欧美日韩一区二区三区视频 | 免费看黄视频 | 在线观看的a站 | 国产精品aⅴ | 国产一级一片免费播放放 | 久久字幕精品一区 | 成人久久综合 | 亚洲1区在线 | 国产一区二区精品久久91 | 国产精品色| 人人澡人 | 国产精品高清免费在线观看 | 亚洲国产精品激情在线观看 | 久久婷综合 | 狠狠躁18三区二区一区ai明星 | 免费看的黄色小视频 | 久久九九影视网 | 国产精品久久99 | 中文字幕在线观看第三页 | 夜色在线资源 | 久久激情视频 久久 | 国产一在线精品一区在线观看 | 一区二区三区精品在线视频 | 精品国产亚洲在线 | 欧美国产亚洲精品久久久8v | 五月天狠狠操 | 日韩在线视频网站 | 国产第一福利 | 亚洲免费av在线播放 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 在线观看免费视频你懂的 | 五月天激情婷婷 | 欧美在线视频一区二区三区 | 夜夜躁日日躁狠狠久久av | 婷婷六月综合网 | 亚洲成人精品久久 | 国产小视频在线观看免费 | 久久人人插 | 免费av高清 | 国产视频精选 | 色吊丝在线永久观看最新版本 | 精品人人人 | 激情婷婷| 91av在线免费播放 | 日韩精选在线 | 欧美成人基地 | 日日夜夜天天操 | a视频免费在线观看 | 91精选| 精品视频免费在线 | 中文字幕在线视频精品 | 久久免费看av | 96亚洲精品久久久蜜桃 | 精品国产诱惑 | 久久久久免费视频 | 91精品人成在线观看 | 国产又粗又硬又长又爽的视频 | 久久国产精品免费观看 | 久久艹国产视频 | 久久综合婷婷国产二区高清 | 99久久精品免费 | 婷婷在线免费 | 亚洲国产精品999 | 日韩高清一二区 | av超碰在线 | 亚洲免费黄色 | 国产精品久久久久久久久搜平片 | 97色在线视频 | 欧美激情视频在线免费观看 | 五月婷婷综合激情网 | 天堂av一区二区 | 免费麻豆视频 | 综合色久 | 黄色小说在线观看视频 | 日日草夜夜操 | 国产精品久久久久婷婷 | 日韩激情小视频 | 亚洲精品国产精品国自产在线 | 欧美最猛性xxxxx免费 | 日本精品中文字幕 | 日韩xxxbbb | 91人人在线 | av成年人电影 | 国产丝袜高跟 | 97超碰免费在线观看 | 综合天天色 | 亚洲视频axxx| 日韩午夜在线播放 | a级片久久久 | 婷婷激情在线 | 欧美成人按摩 | 欧美美女视频在线观看 | 久久午夜影院 | 特级黄色视频毛片 | 日韩av成人在线观看 | 亚洲 欧美 成人 | 欧美国产大片 | 久久久久久久久久国产精品 | 国产视频一区在线播放 | 97精品国产97久久久久久免费 | 欧美精品久久久久性色 | 狠狠色丁香婷婷综合久小说久 | 色婷婷伊人| 久久九九国产精品 | 免费福利在线视频 | 一级黄色片网站 | 亚洲精品一区中文字幕乱码 | 91伊人久久大香线蕉蜜芽人口 | 久久99久久99免费视频 | av在线电影免费观看 | zzijzzij亚洲日本少妇熟睡 | 九九色综合 | 久久成人人人人精品欧 | 成人动漫一区二区 | 久久综合九色综合97婷婷女人 | 日本中文字幕在线一区 | 国内精品视频一区二区三区八戒 | 麻豆果冻剧传媒在线播放 | 日韩理论片中文字幕 | 久久区二区| 成人免费视频观看 | 精品国产一区二区三区日日嗨 | 国产a级片免费观看 | 欧美日韩国产色综合一二三四 | 日韩中文字幕视频在线观看 | 欧美一级在线观看视频 | 久章操 | 免费观看91| 国产日韩欧美综合在线 | 久久看视频 | 精品在线看| 国产精品免费看久久久8精臀av | 日本久久免费电影 | 久久精品国亚洲 | 久久久久高清毛片一级 | 久久免费福利 | 亚洲经典视频 | av在线免费观看不卡 | 久久久久久高潮国产精品视 | 91经典在线 | 久久色网站 | 在线观看中文字幕第一页 | 五月婷婷综合久久 | 黄色网址av | 在线观看黄污 | 日韩在线不卡视频 | av丁香| 高清av不卡 | avav99| 日韩在线观看小视频 | 国产成人99久久亚洲综合精品 | 又黄又爽又色无遮挡免费 | 综合中文字幕 | 最近中文字幕视频完整版 | 91网站在线视频 | a√资源在线 | 91在线观看欧美日韩 | 国产黄色资源 | av高清不卡 | 免费久久网站 | 国产高清不卡av | 99精品视频免费观看视频 | av一区在线播放 | 中文字幕国语官网在线视频 | 黄色毛片视频免费观看中文 | 超碰资源在线 | 五月天丁香 | 国产香蕉av| 91插插插免费视频 | 成人aⅴ视频 | 国产精品免费不卡 | 成人a免费 | 久久艹精品 | 国产成人黄色av | 玖玖国产精品视频 | 狠狠干我| 久久成人国产精品一区二区 | 日韩一区二区三区视频在线 | 中文字幕免费高清在线 | 免费在线观看中文字幕 | 精品久久久精品 | 18国产精品福利片久久婷 | 美女网站视频一区 | 99久久精品免费看国产一区二区三区 | 色诱亚洲精品久久久久久 | 伊人春色电影网 | 日日夜夜噜噜噜 | 亚a在线 | 精品1区2区 | av在线电影播放 | 天天操天天色天天射 | 久久看片网 | 婷婷在线免费 | 欧美日韩有码 | 色狠狠久久av五月综合 | 日韩一级精品 | 久久在视频| 国产va在线观看免费 | 国产韩国精品一区二区三区 | av在线等| 日本中文字幕网址 | 日本精品中文字幕在线观看 | 激情五月在线视频 | 黄色录像av| 天天操夜夜操天天射 | 国产视频一区二区三区在线 | 国产精品高清一区二区三区 | 国内久久久久久 | 成人av在线直播 | 久久久综合九色合综国产精品 | 精品亚洲免a | 天天亚洲| 国产精品精品国产色婷婷 | 在线久久 | 久久色视频 | 国产成人一二三 | 久艹视频免费观看 | 97在线视| 久久免费看av| 五月婷婷丁香在线观看 | 开心激情五月网 | 人人看看人人 | 亚洲精品网址在线观看 | 4hu视频 | 激情综合网五月激情 | 国产亚洲精品久久19p | 四虎在线观看网址 | 香蕉久久国产 | 国产黄色片免费观看 | 美女黄视频免费看 | 日韩在线观看 | 精品久久久久免费极品大片 | 成人国产精品久久久春色 | 一区二区三区手机在线观看 | 国产又粗又长又硬免费视频 | 国产视频一区在线播放 | 天天色天天射天天综合网 | 人人射人人 | 日本3级在线观看 | 免费看的黄网站 | 国产.精品.日韩.另类.中文.在线.播放 | 久久综合久久八八 | 国产黄色精品在线 | 欧美久久久久久久久 | 久久久在线观看 | 成年人在线电影 | 久久免费av | 国产日韩欧美综合在线 | 欧美激情视频在线观看免费 | 久精品视频免费观看2 | 成人午夜影院 | www五月天com| 欧美最猛性xxx | 日本一区二区三区视频在线播放 | 国产精品毛片一区二区在线看 | 国产无套精品久久久久久 | 丝袜美腿在线视频 | 在线免费色视频 | 深爱激情综合 | 久热免费在线 | 亚洲激情精品 | 国产精品久久久av久久久 | 操操操av| 国产做爰视频 | 激情综合网五月婷婷 | 日韩免费电影一区二区 | 亚洲一区二区三区精品在线观看 | 国产老太婆免费交性大片 | 五月天天在线 | 五月天狠狠操 | 999视频精品 | 色综合中文综合网 | 在线免费91 | 91香蕉国产在线观看软件 | 亚洲精品色视频 | 成年人免费在线观看 | 色狠狠一区二区 | 黄色片毛片 | 国产999在线观看 | 欧洲成人免费 | 91人人爽人人爽人人精88v | 中文字幕在线看 | 免费成人av在线 | www免费| 日韩精品欧美精品 | 米奇四色影视 | 在线看国产 | 91资源在线播放 | 国产流白浆高潮在线观看 | 午夜aaaa | 久久九九精品 | 成年一级片 | 午夜视频一区二区三区 | www.一区二区三区 | 99久久精品久久亚洲精品 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 成人黄色小说在线观看 | 成人av资源在线 | 91在线一区二区 | 日韩在线观看视频免费 | 国产一区二区三区四区大秀 | 毛片基地黄久久久久久天堂 | 亚洲另类在线视频 | 亚洲欧美激情精品一区二区 | 国产福利精品视频 | 亚洲91中文字幕无线码三区 | 免费亚洲片 | 中文字幕日韩在线播放 | 免费视频 你懂的 | 99精品视频一区 | 天天干天天操天天操 | 黄色特级片 | 免费观看版 | 中文字幕在线日亚洲9 | 国产一级做a爱片久久毛片a | 国产女人18毛片水真多18精品 | 亚欧日韩成人h片 | 中文字幕电影在线 | 91porny九色在线播放 | 在线看成人 | 亚洲国产69 | 亚洲视频一级 | 久久久电影网站 | 成人毛片a | 色吊丝在线永久观看最新版本 | 国产亚洲午夜高清国产拍精品 | 高潮久久久久久久久 | 99在线视频免费观看 | 天天综合视频在线观看 | 国产精品色婷婷视频 | av免费片 | 精品一区二区在线播放 | av电影免费观看 | 美女视频a美女大全免费下载蜜臀 | 超碰99在线 | av一区二区三区在线播放 | 婷婷丁香六月 | 久久久免费在线观看 | 亚洲在线视频免费 | 国产日产在线观看 | 欧美日韩综合在线 | www一起操 | 欧美日韩不卡一区二区 | 国产在线精品福利 | 亚洲精品久久久久久中文传媒 | 日韩欧美精品在线 | 免费成人结看片 | 欧美一级电影片 | 91在线视频免费91 | 久久国产美女视频 | 国产色视频网站2 | 黄色特级一级片 | 亚洲国产97在线精品一区 | 99亚洲精品视频 | 国产自在线 | 最新日韩中文字幕 | 国产免码va在线观看免费 | 中文在线www | 日本韩国中文字幕 | 国产不卡在线观看视频 | 91超级碰 | 中文字幕视频网 | 国产人成一区二区三区影院 | 久久精品视频4 | 国内免费的中文字幕 | 亚洲专区在线视频 | 手机av电影在线观看 | 91视频高清完整版 | 99视频在线精品 | 免费的国产精品 | 激情中文字幕 | 五月婷久久 | 久久免费在线观看 | av一区二区在线观看中文字幕 | 国产精品一区二区免费视频 | 亚洲最大在线视频 | 97成人在线视频 | 99精品黄色片免费大全 | 69国产精品视频免费观看 | 国产中文字幕视频在线观看 | 国产精品原创av片国产免费 | 日韩精品中文字幕在线不卡尤物 | 亚洲精品美女久久久 | 精品国产乱码久久久久 | 国产精品视频大全 | 中文字幕在线观看不卡 | 天天做天天爱天天爽综合网 | 久久精品老司机 | 国产糖心vlog在线观看 | 国产精品 999 | 欧美特一级 | www.色午夜,com | 午夜精品在线看 | 婷婷在线精品视频 | 色婷婷视频在线 | 不卡电影免费在线播放一区 | 黄色一级大片在线免费看产 | 国产精品久久久 | 91精品国自产在线 | 精品国产一区二区三区久久久蜜月 | 日韩xxx视频 | 国产91精品高清一区二区三区 | 黄色毛片在线看 | 国产精品一区二区三区在线看 | 久久露脸国产精品 | 国精产品一二三线999 | 久久国产精品99国产精 | 国产精品久久久久久久久久久久午夜 | wwxxx日本| 五月婷婷六月丁香在线观看 | 久久夜色电影 | 日韩免费在线视频观看 | 亚洲女欲精品久久久久久久18 | 欧美福利视频 | 久久精品这里都是精品 | 97精品在线视频 | 天天射天天干天天爽 | 亚洲性少妇性猛交wwww乱大交 | 在线看黄网站 | 99色婷婷 | 久久国产免费看 | japanesefreesexvideo高潮 | 成年人免费av | 日日操夜夜操狠狠操 | 81国产精品久久久久久久久久 | av在线看片 | 精品v亚洲v欧美v高清v | 黄色精品网站 | 天天操人人要 | 九九热久久免费视频 | 91在线精品观看 | 欧美福利网址 | 高清国产午夜精品久久久久久 | 免费观看全黄做爰大片国产 | 国产精品成人a免费观看 | 欧美另类重口 | 亚洲女欲精品久久久久久久18 | 精精国产xxxx视频在线播放 | 在线看片一区 | 成人影片在线免费观看 | 91日韩在线 | 在线视频婷婷 | 成人国产网址 | 伊人天天狠天天添日日拍 | 婷婷深爱网 | 亚洲天堂激情 | 色综合网在线 | 香蕉视频网站在线观看 | 国产精品美女久久久 | 日韩美精品视频 | 久久精品一级片 | 欧美综合在线视频 | 久久久久久久久久久影视 | 日韩小视频网站 | 91夫妻视频 | 欧美一区二区三区在线观看 | 日韩激情久久 | 久青草视频在线观看 | 91亚洲精品久久久中文字幕 | 日韩欧美在线一区二区 | 国产成人精品久久久久 | 欧美精品亚州精品 | www.天天综合 | 免费观看丰满少妇做爰 | 在线播放国产一区二区三区 | 国产精品麻 | 亚洲精品国产视频 | 成人久久 | 91在线视频观看 | 国产精品不卡视频 | 亚洲综合在| 国产在线不卡精品 | 欧美日韩一区二区三区不卡 | 五月天久久综合网 | 成年人免费在线观看网站 | 免费韩国av | 国产精品久久久久国产a级 激情综合中文娱乐网 | 91成年人在线观看 | 国产五十路毛片 | 美女视频一区 | 免费黄色小网站 | 色姑娘综合天天 | 欧美黄色高清 | 欧美激情视频一区二区三区 | 亚洲第一区精品 | 国产中文字幕免费 | 成人免费视频观看 | 婷婷综合伊人 | 久草在线视频看看 | 欧美一二三视频 | 国产精选在线观看 | 粉嫩一区二区三区粉嫩91 | 在线免费观看黄色大片 | 91麻豆精品久久久久久 | 天天干干| 99一区二区三区 | 欧美成人999| 日韩精品欧美视频 | 日本aaaa级毛片在线看 | 久草电影在线观看 | a天堂一码二码专区 | 深爱激情综合网 | 成年人免费看片 | 久久a v电影 | 天天综合网天天综合色 | 888av| 97在线看 | 96国产精品视频 | 亚州精品在线视频 | 国产视频资源在线观看 | 免费色视频在线 | 国产精品自在线拍国产 | 激情视频一区二区 | 亚洲视频免费在线看 | 久久99久久99精品免观看粉嫩 | 国产一区二区三区 在线 | 中文字幕中文字幕中文字幕 | 日韩中文在线电影 | 亚洲 欧美 国产 va在线影院 | 在线观看片 | 丁香五月亚洲综合在线 | 日本久久中文字幕 | 日韩欧美在线视频一区二区 | 人人爽人人干 | 午夜精品一区二区三区视频免费看 | 97免费在线观看视频 | 国产精品美女久久久久久久网站 | 天天草天天草 | 激情网五月婷婷 | 国产精品久久久久久久久久 | 午夜精品久久一牛影视 | 综合影视 | 国产不卡毛片 | 国产精品国内免费一区二区三区 | 日韩精品91偷拍在线观看 | 日韩av影视在线 | 久久精品亚洲精品国产欧美 | 又紧又大又爽精品一区二区 | 欧美亚洲另类在线视频 | 欧美日韩国产一二三区 | 天天色综合1 | 免费的黄色的网站 | 色五丁香 | 人人看人人做人人澡 | 欧美日韩高清一区 | 国产精品久久久免费看 | 欧美成人区 | 激情久久久久久久久久久久久久久久 | 亚洲精品久久久蜜桃 | 在线91视频| 久草免费在线观看 | 2022中文字幕在线观看 | 一级黄色免费 | 五月婷在线播放 | 安徽妇搡bbbb搡bbbb | 91黄在线看| 久久国产精彩视频 | 亚洲欧美成人网 | 黄色av三级在线 | 91成人午夜 | 国产精品一区久久久久 | 久久久国产一区 | 精品国产1区 | 91精品视频在线看 | 九九涩涩av台湾日本热热 | 国产成人一二三 | 欧美午夜精品久久久久久孕妇 | 国产99久久久精品 | 国产精品久久久久久久久久不蜜月 | 天天干夜夜想 | 日批视频国产 | 国内免费久久久久久久久久久 | 亚洲污视频 | 黄色美女免费网站 | 99久热在线精品 | 成人av资源 | 亚洲国产影院av久久久久 | 久草久草久草久草 | 免费在线国产 | 波多野结衣在线观看视频 | 久久你懂得 | 成人黄色av免费在线观看 | 欧美精品久久久久久久久久丰满 | 久久r精品| 91污视频在线观看 | 天天操狠狠操网站 | 久久久久久欧美二区电影网 | 日韩精品久久久久久久电影竹菊 | 福利一区二区三区四区 | 天天干亚洲 | 国产精品国产三级国产aⅴ入口 | 婷婷久久精品 | 69国产精品成人在线播放 | 97超碰资源总站 | 欧美激情精品久久久久久免费印度 | 国产日本高清 | 国产精在线 | 欧美视频www | 狠狠干狠狠艹 | 日韩久久精品一区 | 久久尤物电影视频在线观看 | 国产欧美精品xxxx另类 | 精品一二三区视频 | 四虎永久视频 | 狠狠插狠狠操 | 91成人免费在线视频 | 日韩成人在线免费观看 | 久久精品免视看 | 91一区在线观看 | 久久老司机精品视频 | 中文在线最新版天堂 | 亚洲国产三级在线观看 | 成人不用播放器 | 精品国产精品国产偷麻豆 | 免费观看视频的网站 | www天天干com | 久久久久黄 | 不卡av免费在线观看 | 亚洲国产午夜精品 | 97视频入口免费观看 | 视频91 | 狠狠躁夜夜躁人人爽超碰91 | 97超碰伊人| 免费h在线观看 | 麻豆视传媒官网免费观看 | 欧美一级高清片 | 日本中文字幕在线视频 | 欧美一区二区伦理片 | 久久99久久精品国产 | 成人国产精品入口 | 九九热在线免费观看 | 西西大胆啪啪 | av中文字幕在线观看网站 | 精品福利在线视频 | 国产女人18毛片水真多18精品 | 久久久久久视频 | 日韩在线观看av | 久久毛片视频 | 欧美日韩一区二区在线观看 | 97av超碰| 波多在线视频 | 欧美日韩一区二区在线观看 | 亚洲艳情 | 久草香蕉在线视频 | 精品一区二区三区四区在线 | 91亚洲精 | 久久高清精品 | 亚洲精品福利在线 | 天天躁天天躁天天躁婷 | 中文字幕麻豆 | 国产精品美女999 | av永久网址 | 三级av免费观看 | 国产第一页精品 | 日韩三级视频在线观看 | 免费黄a大片| 麻豆一二 | 9797在线看片亚洲精品 | 日日夜夜干 | 人人躁| 国内免费的中文字幕 | 国产色秀视频 | www.91av在线| 欧洲一区二区在线观看 | 久久精品亚洲综合专区 | 免费看v片 | 激情五月亚洲 | 97在线成人 | 精品在线观看一区二区三区 | 中文字幕乱码一区二区 | 极品美女被弄高潮视频网站 | 夜夜操网 | 久久精品—区二区三区 | 国产精品24小时在线观看 | 欧美日韩国产综合一区二区 | 香蕉在线视频观看 | 国产成人三级一区二区在线观看一 | 国产日韩精品一区二区 | 99久久婷婷国产综合亚洲 | 国产黄色免费观看 | 日韩高清毛片 | 欧美日韩高清一区二区三区 | 91九色综合 | 日韩精品综合在线 | 国产精品久久毛片 | 美女视频永久黄网站免费观看国产 | 亚洲国产中文字幕在线观看 | 国产一区二区三精品久久久无广告 | 精品一区二区三区香蕉蜜桃 | 免费看国产一级片 | 国产.精品.日韩.另类.中文.在线.播放 | 成人午夜电影网站 | 999成人网| 99久久影视| 99视频在线免费观看 | 久久精品视频在线 | 探花视频在线观看+在线播放 | 丁香六月中文字幕 | 十八岁以下禁止观看的1000个网站 | 国产系列精品av | 欧美亚洲成人xxx | 激情狠狠干 | 中文字幕中文字幕在线中文字幕三区 | 成年人在线看片 | 国产黄在线 | 国产一区二区精品 | 国产精品毛片一区二区在线 | 91丨九色丨高潮 | 四虎国产精品成人免费4hu | 国产999精品久久久影片官网 | 久久久久高清毛片一级 | 国产成人精品女人久久久 | 超碰成人免费电影 | 一区二区丝袜 | 久久韩国免费视频 | 91免费视频网站在线观看 | 国产精品欧美久久久久三级 | 亚洲四虎影院 | 狠狠色噜噜狠狠狠狠2022 | 夜夜高潮夜夜爽国产伦精品 | 最近免费中文视频 | 国产香蕉视频在线观看 | 五月婷婷综合激情网 | 免费视频97 | 视频在线精品 | 久久久久久久18 | 国产视频二区三区 | 久久国产亚洲精品 | 四虎天堂| 黄色免费观看 | 黄色av免费| 久久久久久久久久亚洲精品 | 国产精品99久久久久久小说 | 精品视频专区 | 日韩影视大全 | 超碰免费成人 | 国产日产精品一区二区三区四区的观看方式 | 中文字幕免费一区二区 | 狠狠躁天天躁综合网 | 国产情侣一区 | 久久久久久久久久电影 | 精品国产乱码久久久久久1区二区 | 精品久久久久免费极品大片 | 久久婷婷国产色一区二区三区 | av福利超碰网站 | 91九色视频在线 | 99久久激情视频 | 国产福利中文字幕 | 丁香九月激情综合 | 91国内产香蕉 | 成年人在线观看 | 亚洲女欲精品久久久久久久18 | 久久久精选 | 操久久网| 久久久国产精品久久久 | 91精选| 最新日韩在线观看视频 | 在线观看视频一区二区三区 | 久久国产精品一区二区三区四区 | 女人18毛片90分钟 | 九九九在线观看视频 | 黄色网址在线播放 | 91中文字幕永久在线 | 亚洲欧美国内爽妇网 | 精品视频专区 | 日韩有码专区 | 超碰97人人干 | 国产一线二线三线在线观看 | 最新日韩视频 | 黄色美女免费网站 | 毛片888| 日韩三级精品 | 黄色av一区二区 | 亚洲精品高清在线 | 五月天丁香 | 国产亚洲精品av | 手机看国产毛片 | 日韩区欧美久久久无人区 | 国产不卡精品视频 | 日韩xxx视频 | 欧美不卡在线 | 婷婷激情综合五月天 | 亚洲电影成人 | 国产一区二三区好的 | .国产精品成人自产拍在线观看6 | 国产中出在线观看 | 国产精品综合久久久久 | 日韩久久久久久久久 | 天天视频色版 | 91大神精品视频在线观看 | 日韩在线视频线视频免费网站 | 亚洲 中文字幕av | 天天综合网在线观看 | 西西4444www大胆艺术 | 国产一区二区三区免费视频 | 国产日韩中文字幕在线 | 国产无套一区二区三区久久 | 在线观看的av | 91日韩在线视频 | 国产欧美三级 | 激情综合一区 | 国产精品专区在线观看 | 日韩欧美国产成人 | 久草免费在线视频 | 久久国产精品免费一区二区三区 | 欧美日韩电影在线播放 | 国产精品视频永久免费播放 | 成在人线av | 亚洲 在线 | 在线www色| 国产在线精品一区 | 视频精品一区二区三区 | 成人在线免费av | 久久国产精品一二三区 | 91九色性视频 | 日韩精品一卡 | 久久永久视频 | 国产一区二区三区高清播放 | 黄色a在线观看 | 欧美黑人性猛交 | 亚洲国产网址 | 久久久免费看视频 | 色综合天 | 亚洲一区二区天堂 | 国产一级免费电影 | 日韩中文字幕第一页 | 91尤物国产尤物福利在线播放 | 91女神的呻吟细腰翘臀美女 | av在线成人 | 久久久久综合精品福利啪啪 | 日本久久久久久科技有限公司 | 97在线免费观看 | 91成人短视频在线观看 | 日日夜夜综合网 | 欧美一级特黄高清视频 | 激情综合色图 | 亚洲国产剧情 | 日韩在线观看网站 | 日韩精品一区二区三区视频播放 | 91视频88av| 天天干天天草 | 99精品福利 | 久草在线视频在线 | 丁香婷婷色综合亚洲电影 | 亚欧日韩成人h片 | 伊人丁香 | 黄色录像av| 亚洲国产中文在线 | 国产黄色观看 | 久久伊人爱 | 亚洲激情影院 | 黄色小网站在线 | 欧美精品久久久久久久久免 | 亚洲一二区精品 | 久久久电影| 99热精品视 | 嫩草av在线 | 日本字幕网 | 黄色大全免费观看 | 免费看污片 | 欧美久久久久久久久久 | 亚洲经典精品 | 久久免费视频4 | 久久视频免费在线观看 | 亚洲成人精品国产 | 欧美一级视频在线观看 | 日韩在线中文字幕 | 日本中文字幕在线电影 | 欧美日韩精品影院 | 国产午夜不卡 | 最近中文字幕完整视频高清1 | 中国精品少妇 | 国产精品二区三区 | 人人爽久久涩噜噜噜网站 | 在线免费观看一区二区三区 | www.五月婷婷.com | 最近2019年日本中文免费字幕 | 天天干夜夜爱 | 91九色在线 | 色香天天| 国产成人精品区 | 日本系列中文字幕 | 天天激情站 | 国产黄色一级片在线 | 日韩亚洲精品电影 | 亚洲最大在线视频 | www.天天色.com | 日韩资源在线播放 | 欧美色操 | 97在线观看免费高清 | 国产高清不卡 | 午夜国产福利在线 | 狠狠色综合网站久久久久久久 | 九九99靖品 | 国产99自拍 | 中文字幕在线免费 | 欧美日韩久久不卡 | 国产一级片久久 | 国产只有精品 | 97在线视频免费播放 | 日韩免费电影网站 | 久久精品成人 | 日本中文字幕免费观看 | 992tv在线成人免费观看 | 精品亚洲国产视频 | 91av欧美 | 高清av网 | 青青草国产免费 | 99久热在线精品视频成人一区 |