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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux内核调度 0号进程,Linux内核源代码情景分析---第四章 进程与进程调度

發(fā)布時間:2025/3/8 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核调度 0号进程,Linux内核源代码情景分析---第四章 进程与进程调度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

4.1 進程四要素

什么是進程?

1:有一段代碼段供其執(zhí)行,這代碼段不一定是進程所專用,可以與其他進程公用。

2:每個進程有其專用的系統(tǒng)空間的堆棧(棧)【這個棧是進程起碼的“私有財產”】

3:在內核中,要有task_struct 進程控制塊【task_struct

進程控制塊就是像是進程的財產登記卡,記錄著進程所擁有的各項資源,只有有了task_struct,進程才能被內核所調度】

4:擁有專有的用戶空間【各進程的用戶空間是相互獨立的,但是各進程共享系統(tǒng)空間,且各進程不能直接(不通過系統(tǒng)調用)改變系統(tǒng)空間的內容】

如果有 1 2 3,完全沒有用戶空間 ==>

內核線程(kernel thread,比如kswapd)

如果有 1 2 3,沒有獨立的用戶空間 ==>因為有用戶空間但不是獨立的,所以稱為用戶線程

linux 系統(tǒng)中,進程(process)和任務(task)是同一個意思;

Unix系統(tǒng)的進程在Intel 的技術資料中則稱為“任務”;linux源自Unix和i386系統(tǒng)結構;

linux系統(tǒng)運行時的第一個進程是在系統(tǒng)初始化階段“捏造”出來的,而此后的進程或線程則都是由一個已存在的進程像細胞分裂那樣通過系統(tǒng)調用復制出來的,稱為fork

或 clone

Intel的i386 通過任務門 和

進程的TSS段(任務狀態(tài)段,TSS位于GDT中,包含了該進程的關鍵的狀態(tài)信息【控制信息】,但linux卻沒有使用任務門)來在硬件上實現(xiàn)任務的切換;【但其實因為該處理器的CISC架構以及這種切換方式,不是特別的效率高的,其實任務切換可以做的更加的簡單,i386的這個切換可以理解為一種“高級語言”,而我們在做操作系統(tǒng)時,往往使用效率更高的“低級語言

匯編等”】;

i386 CPU 要求軟件去設置TR 與 TSS,TR指向CPU當前正在執(zhí)行的任務進程的TSS,Intel的設計意圖是

隨著任務的切換而走馬燈似的設置TR的內容;

CPU因中斷或系統(tǒng)調用從用戶空間進入系統(tǒng)空間時,會由于運行級別的變換而導致自動更換棧,不同的棧指針來自于當前任務的TSS中包含的棧指針(SS

ESP);因為Linux系統(tǒng)中只用到了兩個運行級別,即0級與3級,所以對于內核來說,TSS中只剩下0級的堆棧指針 即SS0

ESP0

Linux

系統(tǒng)在任務的切換過程中,因為效率的考慮,并不根據(jù)任務的切換去設置TR,而是直接修改TSS(Linux內核只使用這樣一個TSS,用來保存當前任務的狀態(tài))中的SS0

ESP0==》鐵打的營盤流水的兵,就一個TSS,就像一座營盤,建立后就不再動了,而里面的內容,也就是當前任務的系統(tǒng)堆棧指針,則隨著進程的調度切換而流水似地變動。這是因為改變TSS中的SS0

ESP0所花的開銷比通過裝入TR以更換一個TSS要小得多。

Linux中TSS不是某個進程所獨占的,他而是全局性的公共資源。內核中雖然有多個TSS,但是每個CPU就只有(使用)一個TSS,一經裝入就不再變了。

Unix

Linux系統(tǒng)中任務的切換只發(fā)生在系統(tǒng)空間中,這點很好理解,因為共享的系統(tǒng)空間中擁有各個進程的各種資源;

每個進程都有一個task_struct數(shù)據(jù)結構和一片用作系統(tǒng)空間棧的存儲空間。內核在為每個進程分配一個task_struct結構時,實際上分配兩個連續(xù)的物理頁面(共8192個字節(jié)),這兩個頁面的底部用作進程的task_struct結構,而在結構的上面就用作進程的系統(tǒng)空間堆棧、

數(shù)據(jù)結構task_struct的大小約為1K字節(jié),所以進程的系統(tǒng)空間的堆棧的大小約為7K字節(jié),注意:系統(tǒng)空間堆棧的空間不像用戶空間堆棧那樣可以在運行時動態(tài)的擴展,如第2章所述,而是靜態(tài)的確定了的,所以,在中斷服務程序中、內核軟中斷服務程序以及其他設備驅動程序的設計中,應注意不能讓這些函數(shù)嵌套太深【避免嵌套太深,導致棧的溢出】,同時在這些函數(shù)中也不適宜使用太多、太大的局部變量。

一個進程必定又是一個內核線程(內核線程的要求是

1.有代碼段 2.有專用的系統(tǒng)棧

3.有task_struct數(shù)據(jù)接否);

內核中有一個宏操作current,它指向當前進程task_struct結構的指針。

接下來,可具體分析下task_struct結構,

struct task_struct

{

volatile long state;

unsigned

long flags;

int

sigpending;

mm_segment_t

addr_limit;

struct

exec_domain *exec_domain;==>除personality外,應用程序還有一些其他的版本間的差異,從而形成了不同的“執(zhí)行域”,這個指針就是指向描述本進程所屬的執(zhí)行域的數(shù)據(jù)結構

volatile

long need_resched;

unsigned long

ptrace;

int lock_depth;

long

counter;

long nice;

unsigned

long policy;==>適用于本進程的調度政策,詳見進程的調度與切換

struct mm_struct

*mm;

int has_cpu,

processor;

unsigned long

cpus_allowed;

struct list_head

run_list;

unsigned long

sleep_time;

struct task_struct *next_task,

*prev_task;

struct mm_struct

*active_mm;

struct

linux_binfmt *binfmt;

int

exit_code, exit_signal;

int

pdeath_signal;==>這三個詳見系統(tǒng)調用exit()與wait4()

unsigned

long personality;

int dumpable:1;

int did_exec:1;

pid_t

pid;==>進程號

pid_t

pgrp;

pid_t

tty_old_pgrp;

pid_tpgrp;

pid_t tgid;

int

leader;

//pgrppgrpleader

當一個用戶登陸到系統(tǒng)時,就開始一個進程組(session),此后創(chuàng)建的進程都屬于這同一個session。此外,若干進程可以通過“管道”組合在一起,如

ls | wc -l,從而形成進程組,詳見“系統(tǒng)調用exec”一節(jié)

struct task_struct *p_opptr,

*p_pptr, *p_cptr, *p_ysptr, *p_osptr;

struct list_head

thread_group;

struct task_struct

*pidhash_next;

struct task_struct

**pidhash_pprev;

wait_queue_head_t

wait_chldexit;

struct semaphore

*vfork_sem;

unsigned long rt_priority;==>優(yōu)先級別以及“實時”優(yōu)先級別,詳見進程的調度與切換

unsigned long it_real_value,

it_prof_value, it_virt_value;

unsigned long it_real_incr,

it_prof_incr, it_virt_incr;

struct timer_list

real_timer;

struct tms times;

unsigned long

start_time;

long per_cpu_utime[NR_CPUS],

per_cpu_stime[NR_CPUS];

unsigned long min_flt, maj_flt,

nswap, cmin_flt, cmaj_flt, cnswap;

int swappable:1;

uid_t

uid,euid,suid,fsuid;

gid_t

gid,egid,sgid,fsgid;==>這8個主要與文件操作權限有關,見文件系統(tǒng)一章

int ngroups;

gid_t

groups[NGROUPS];

kernel_cap_t

cap_effective, cap_inheritable, cap_permitted;

==>一般進程都不能"為所欲為",而是各自被賦予了

各種不同的權限。例如,一個進程是否可以通過系統(tǒng)調用ptrace()跟蹤另一個進程,就是由該進程是否具有CAP_SYS_PTRACE授權決定的;一個進程是否有權重新引導操作系統(tǒng),則取決于該進程是否具有CAP_SYS_BOOT授權。這樣,就把進程的各種權限分細了,而不再是籠統(tǒng)地取決于一個進程是否是"特權用戶"進程。每一種權限都由一個標志位代表,內核中提供了一個inline函數(shù)capable(),用來檢驗當前進程是否具有某種權限。如capable(CAP_SYS_BOOT)就是檢查當前進程是否有權重引導操作系統(tǒng)〔返回非0表示有權)。值得注意的是,對操作權限的這種劃分與文件訪問權限結合在一起,形成了系統(tǒng)安全性的基礎。在現(xiàn)今的網絡時代,這種安全性正在變得愈來愈重要,而這方面的研究與發(fā)展也是一個重要的課題。

int

keep_capabilities:1;

struct

user_struct *user;==>指向一個user_struct結構,該數(shù)據(jù)結構代表著進程所屬的用戶。注意這跟Unix內核中每個進程的user結構時兩碼事。Linux內核中user結構是非常簡單的,詳見“系統(tǒng)調用fork()”一節(jié)。

struct

rlimit rlim[RLIM_NLIMITS];==>這是一個結構數(shù)組,表明進程對各種資源的使用數(shù)量所受的限制,

struct rlimit {

unsigned long rlim_cur;

unsigned long rlim_max;

};

unsigned short

used_math;

char comm[16];

int link_count;

struct tty_struct

*tty;

unsigned int

locks;

struct sem_undo

*semundo;

struct sem_queue

*semsleeping;

struct thread_struct

thread;

struct fs_struct

*fs;

struct files_struct

*files;

spinlock_t

sigmask_lock;

struct signal_struct

*sig;

sigset_t blocked;

struct sigpending

pending;

unsigned long

sas_ss_sp;

size_t

sas_ss_size;

int (*notifier)(void

*priv);

void

*notifier_data;

sigset_t

*notifier_mask;

u32

parent_exec_id;

u32

self_exec_id;

//parent_exec_idself_exec_id

==>與進程組session有關,詳見系統(tǒng)調用exit()與wait4()

spinlock_t

alloc_lock;

}

主要可分為狀態(tài)、性質、資源、和組織等幾大類;

volatile long state;表示進程當前運行的狀態(tài)

#define TASK_RUNNING ?0==>進程處于就緒態(tài)(),而不是表達該進程就是當前正在運行的進程;當進程處于這個狀態(tài)時,內核就將該進程的task_struct結構通過其隊列頭run_list掛入一個“運行隊列”

#define

TASK_INTERRUPTIBLE ?1==>進程處于睡眠狀態(tài),因信號的到來而被喚醒。interruptible_sleep_on()

和 ?wake_up_interruptible()用于淺度睡眠;

#define TASK_UNINTERRUPTIBLE

2==>進程處于深度睡眠狀態(tài),不受信號(signal,也稱軟中斷)的打擾;sleep_on()

和wake_up()用于深度睡眠;深度睡眠一般只用于臨界區(qū)和關鍵性的部位,而“可中斷”的睡眠那就是通用的,特別當進程在“阻塞性”的系統(tǒng)調用中等待某一事件的發(fā)生時,就不應該進入深度睡眠,否則就不能對別的事件作出反應,別的進程就不能通過發(fā)一個信號來殺掉這個進程;這里的INTERRUPTIBLE與UNINTERRUPTIBLE與”中斷“毫無關系,而是說睡眠能否因其他事件而中斷即喚醒,不過其他事件主要指”信號“,而信號的概率實際上與中斷的概率是相同的,所以這里所謂的INTERRUPTIBLE也是指這種”軟中斷“。

#define TASK_ZOMBIE ?4==>進程已經去世(exit),但是其戶口尚未注銷

#define TASK_STOPPED ?8==>進程處于就緒態(tài)(),主要用于調試目的,進程接收到一個SIGSTOP信號后就將運行狀態(tài)改為TASK_STOPPED而進入掛起狀態(tài),然后在接收到一個SIGCONT信號后,又恢復繼續(xù)運行。

unsigned

long flags;;反映進程狀態(tài)的信息,但不是運行狀態(tài),而是與管理有關的其他信息 ,見下面的注釋

#define PF_ALIGNWARN

0x00000001

#define PF_STARTING

0x00000002

#define PF_EXITING

0x00000004

#define PF_FORKNOEXEC

0x00000040

#define PF_SUPERPRIV

0x00000100

#define PF_DUMPCORE

0x00000200

#define PF_SIGNALED

0x00000400

#define PF_MEMALLOC

0x00000800

#define PF_VFORK

0x00001000

#define PF_USEDFPU

0x00100000

再看下task_struct除上述外的其他的一下狀態(tài)信息變量:

int

sigpending==>表示進程收到了信號,但尚未處理,詳見進程間通信中的信號一節(jié)

mm_segment_t addr_limit==>虛擬地址空間的上限。對進程而言是其用戶空間的上限,所以是0XBFFFFFFF,對內核線程而言則

是系統(tǒng)空間的上限,所以是0XFFFFFFFF。

volatile long

need_resched==>與調度有關,表示CPU從系統(tǒng)空間返回用戶空間前夕要進行一次調度。

long counter==>與調度有關,詳見進程的調度與切換一節(jié)

unsigned long personality==>由于Unix有許多不同的版本和變種,應用程序也就有了適用的范圍,所以根據(jù)執(zhí)行程序的不

同,每個進程都有其個性。

其他的直接看上面的結構里面的注釋

最后,每一個進程都不是孤立地存在于系統(tǒng)中,而總是根據(jù)不同的目的、關系和需要與其它的進程相聯(lián)系。從內核的角度看,則是要按不同的目的和性質將每個進程納入不同的組織中。第一個組織是由每個進程的"家庭與社會關系"形成的"宗族"或"家譜"。這是一種樹型的組織,通過指針p_opptr、p_pptr、p_cptr、p_ysptr和p_osptr構成。其中p_opptr和p_pptr指向父進程的task_struct結構,p_cptr指向最"年輕"的子進程,而p_ysptr和p_osptr則分別指向其"弟弟"和"哥哥",從而形成一個子進程鏈。這些指針確定了一個進程在其"宗族"中的上、下、左、右關系,詳見本章中對fork()和exit()的敘述。

【三個靜態(tài)隊列描述?第一個組織第二個組織第三個組織】

這個組織雖然確定了每個進程的"宗族"關系,涵蓋了系統(tǒng)中所有的進程,但是,要在這個組織中根據(jù)進程號pid找到一個進程卻非易事。進程號的分配是相當隨機的,在進程號中并不包含任何可以用來找到一個進程的路徑信息,而給定一個進程號要求找到該進程的task_struct結構卻又是常常要用到的一種操作。于是,就有了第二個組織,那就是一個以雜湊表為基礎的進程隊列的陣列。當給定一個pid要找到該進程時,先對pid施行雜湊計算,以計算的結果為下標在雜湊表中找到一個隊列,再順著該隊列就可以較容易地找到特定的進程了。雜湊表pidhash是在kernel/fork.c中定義的:struct

task_struct *pidhash[PIDHASH_SZ];

雜湊表的大小PIDHASH_SZ為1024。由于每個指針的大小是4個字節(jié),所以整個雜湊表(不包括各個隊列)正好占一個頁面。每個進程的task_struct數(shù)據(jù)結構都通過其pidhash_next和pidhash_pprev兩個指針放入

到雜湊表中的某個隊列中,同一隊列中所有進程的pid都具有相同的雜湊值。由于雜湊表的使用,要找到pid為某個給定值的進程就很迅速了。

當內核需要對每一個進程做點什么事情時,還需要將系統(tǒng)中所有的進程都組織成一個線性的隊列,這樣就可以通過一個簡單的for循環(huán)或while循環(huán)遍歷所有進程的task_struct結構。所以,第三個組織就是這么一個線性隊列。系統(tǒng)中第一個建立的進程為init_task,這個進程就是所有進程的總根,所以這個線性隊列就是以init_task為起點(也可以把它看成是一個隊列頭〕,后繼每創(chuàng)建一個進程就通過其init_task結構中的next_task和prev_task兩個指針鏈入這個線性隊列中。

每個進程都必然同時身處這三個隊列之中,直到進程消亡時才從這三個隊列中摘除,所以這三個隊列都是靜態(tài)的。

在運行的過程中,一個進程還可以動態(tài)地鏈接進"可執(zhí)行隊列"接受系統(tǒng)的調度。實際上,這是最重要的隊列,一個進程只有在可執(zhí)行隊列中才有可能受到調度而投入運行。與前幾個隊列不同的是,

一個進程的task_struct是通過其list_head數(shù)據(jù)結構run_list、而不是個別的指針,鏈接進可執(zhí)行隊列的。以前說過,這是用于雙向鏈接的通用數(shù)據(jù)結構,具有一些與之配套的函數(shù)或宏操作,處理的效率比較高,也使代碼得以簡化??蓤?zhí)行隊列的變化是非常頻繁的,一個進程進入睡眠時就從隊列中脫鏈,被喚醒時則又鏈入到該隊列中,在調度的過程中也有可能會改變一個進程在此隊列中的位置。詳見本章"進程調度與進程切換"以及"系統(tǒng)調用nanosleep()"中的有關敘述。

4.2 進程三部曲:創(chuàng)建、執(zhí)行與消亡

就像世上萬物都有產生、發(fā)展與消亡的過程一樣,每個進程也有被創(chuàng)建、執(zhí)行某段程序以及最后消亡的過程。

在linux系統(tǒng)中,第一個進程是系統(tǒng)固有的、與生倶來的或者說是由內核的設計者安排好了的(系統(tǒng)中第一個建立的進程為init_task,這個進程就是所有進程的總根)。內核在引導并完成了基本的初始化以后,就有了系統(tǒng)的第一進程(實際上是內核線程)。除此之外,所有其它的進程和內核線程都由這個原始進程或其子孫進程所創(chuàng)建,都是這個原始進程的"后代"。在linux系統(tǒng)中,一個新的進程一定要由一個已經存在的進程"復制"出來,而不是"創(chuàng)造"出來(而所謂"創(chuàng)建"實際就是復制)。所以,linux系統(tǒng)(unix也一樣)并不向用戶(即進程)提供類似這樣的系統(tǒng)調用:

int creat_pro(int (*fn)(void

*), void *arg, unsigned long options);

可是在很多操作系統(tǒng)(包括一些unix的變種)中都采用了

"一攬子"的方法。它"創(chuàng)造"出一個進程,并使該進程從函數(shù)指針數(shù)指針fn所指的地方開始執(zhí)行。根據(jù)不同的情況和設計,參數(shù)fn也可以換成一個可執(zhí)行程序的文名。這里所謂"創(chuàng)造",包括為進程分配所需的資源、包括屬于最低限度的task_struct

數(shù)據(jù)結構和系統(tǒng)空間堆棧,并初始化這些資源;還要設置其系統(tǒng)空間堆棧,使得這個新進程看起來就好像是一個本來就已經存在而正在睡眠的進程。當這個進程被調度運行的時候,其"返回地址",也就是"恢復"運行時的下一條指令,則就在fn指的地方(uc/os就是這樣的)。這個"子進程"生下來時兩手空空,卻可以完全獨立,并不與其父進程共享資源。

但是,linux系統(tǒng)(unix也一樣)采用的方法卻不同。

linux將進程的創(chuàng)建與目標程序的執(zhí)行分成兩步:

第一步是從已經存在的"父進程"中像細胞分裂一樣地復制出一個"子進程"。這里所謂像"細胞分裂一樣",只是打個比方,實際上,復制出來的子進程有自已的task_struct?結構和系統(tǒng)空間堆棧,但與父進程共享其它所有的資源。例如,要是父進程打開了五個文件,那么子進程也有五個打開的文件,而且這些文件的當前讀寫指針也停在相同的地方。所以,這一步所做的是"復制"。linux為此提供了兩個系統(tǒng)調用,一個是fork(),另一個是clone()。兩者的區(qū)別在于fork()是全部復制,父進程所有的資源全都通過數(shù)據(jù)結構的復制"遺傳"給子進程。而clone()則可以將資源有選擇地復制給子進程,而沒有復制的數(shù)據(jù)結構則通過指針的復制讓子進程共享。在極端的情況下,一個進程可以clone()出一個線程。所以,系統(tǒng)調用fork()是無參數(shù)的,而clone()則帶有參數(shù)。讀者也許已經意識到,fork()其實比clone()更接近本來意義上的"克隆"。確實是這樣,原因在于fork()在unix初期即已存在,那時候"克隆"這個詞還不像現(xiàn)在這么流行,而既然業(yè)已存在,就不宜更改了。否則,也許應該互換一下名字。后來,又增設了

一個系統(tǒng)調用vfork(),也不帶參數(shù),但是除task_struct結構和系統(tǒng)空間堆棧以外的資源全都通過數(shù)據(jù)結構指針的復制"遺傳",所以vfork()出來的是線程而不是進程。讀者將會看到,vfork()主要是出于效率的考慮而設計并提供的。

第二步是目標程序的執(zhí)行。一般來說,創(chuàng)建一個新的進程是因為有不同的目標程序要讓新的程序去執(zhí)行(但也不一定),所以,復制完成以后,子進程通常要與父進程分道揚鑣,走自己的路。為此提供了一個系統(tǒng)調用execve(),讓一個進程執(zhí)行以文件形式存在的一個可執(zhí)行程序的映象。

讀者也許要問:這兩種方案到底哪一種好?應該說是各有利弊。但是更應該說,Linux從unix繼承下來的這種分兩步走,并且在第一步中采取復制方式的方案,利遠大于弊。從效率的角度看,分兩步走很有好處。所謂復制,只是進程的基本資源的復制,如task_struct數(shù)據(jù)結構、系統(tǒng)空間堆棧、頁面表等等,對父進程的代碼及全局變量則并不需要復制,而只是通過只讀訪問的形式實現(xiàn)共享,僅在需要寫的時候才通過copy_on_write的手段為所涉及的頁面建立一個新的副本。所以,總的來說復制的代價是很低的,但是通過復制而繼承下來的資源則往往對子進程很有用。讀者以后會看到,在計算機網絡的實現(xiàn)中,以及在client/server系統(tǒng)中的server—方的實現(xiàn)中,fork()或clone()常常是最自然、最有效、最適宜的手段。更重要的好處是,這樣有利于父、子進程間通過pipe來建立起一種簡單有效的進程間通信管道,并且從而產生了操作系統(tǒng)的用戶界面即shell的"管道"機制。這一點,對于unix的發(fā)展和推廣應用,對于unix程序設計環(huán)境的形成,對于unix程序設計風格的形成,都有著非常深遠的影響??梢哉f,這是一項天才的發(fā)明,它在很大程度上改變了操作系統(tǒng)的發(fā)展方向。

當然,從另一角度,也就是從程序設計界面的角度來看,則"一攬子"的方案更為簡潔。不過fork()加execve()的方案也并不復雜很多。進一步說,這也像練武或演戲一樣有個固定的"招式",一旦掌握了以后就不覺得復雜,也很少變化了。再說,如果有必要也可以通過程序庫提供一個"一攬子"的庫函數(shù),將這兩步包裝在一起。

創(chuàng)建了子進程以后,父進程有三個選擇:

第一是繼續(xù)走自己的路,與子進程分道揚鑣。只是如果子進程先于父進程"去世",則由內核給父進程發(fā)一個報喪的信號。

第二是停下來,也就是進入睡眠狀態(tài),等待子進程完成其使命而最終去世,然后父進程再繼續(xù)運行。Linux為此提供了兩個系統(tǒng)調用,

wait4()和wait3()。兩個系統(tǒng)調用基本相同,wait4()等待某個特定的子進程去世,而wait3()則等待任何一個子進程去世。

第三個選擇是"自行退出歷史舞臺",結束自己的生命。為此設置了一個系統(tǒng)調用exit()。這里的第三個選擇其實不過是第一個選擇的一種特例,

所以從本質上說是兩種選擇:一種是父進程不受阻的(non_blocking)方式,也稱為"異步"的方式;另一種是父進程受阻的(blocking)方式,或者稱為"同步"的方式。

4.3 系統(tǒng)調用fork()

vfork() clone()

fork()與clone()的區(qū)別:

pid_t fork(void);

int clone(int (*fn)(void *arg),

void *child_stack, int flags, void *arg);

系統(tǒng)調用__clone()的主要用途是創(chuàng)建一個線程,這個線程可以是內核線程,也可以是用戶線程。

創(chuàng)建用戶空間線程時,可以給定子線程用戶空間堆棧的位置,還可以指定子進程運行的起點。

__clone()也可以創(chuàng)建進程,有選擇地復制父進程的資源。而fork()則是全面地復制。還有一個系統(tǒng)調用vfork()其作用也是創(chuàng)建一個線程,但主要只是作為創(chuàng)建進程的中間步驟,目的在于提高創(chuàng)建時的效率,減少系統(tǒng)開銷,其程序設計接口則與fork相同。

asmlinkage int sys_fork(unsigned long r4, unsigned long

r5,unsigned long r6, unsigned long r7,

struct

pt_regs regs)

{

return do_fork(SIGCHLD, regs.regs[15], &regs, 0);

}

asmlinkage int sys_clone(unsigned long clone_flags, unsigned

long newsp,

unsigned long r6, unsigned long r7,struct pt_regs

regs)

{

if (!newsp)

newsp = regs.regs[15];

return do_fork(clone_flags, newsp, &regs, 0);

}

asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,

unsigned long r6, unsigned long r7,

struct pt_regs regs)

{

return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,

regs.regs[15], &regs, 0);

}

這三個系統(tǒng)調用 都是 通過調用

do_fork()來完成的,do_fork()通過不同的參數(shù)

在函數(shù)體內實現(xiàn)相關資源的拷貝;

下面來解讀下這個函數(shù)

int do_fork(unsigned long clone_flags, unsigned long

stack_start,struct pt_regs *regs, unsigned

long stack_size)

{

======================函數(shù)內解釋部分===================================

參數(shù)clone_flags由兩部分組成,其最低的字節(jié)為信號類型,用以規(guī)定子進程去世時應該向父進程發(fā)出的信號。我們已經看到,對于fork()和vfork()這個信號就是SIGCHILD,而對__clone()則該位段可由調用者決定。第二部分是一些表示資源和特性的標志位(通過這些標志位來采取相應的拷貝動作),對于fork(),這一部分為全0,表對有關的資源都要復制而不是通過指針共享[位為0表示要復制

位為1表示父子先共享]。而對vfork(),則為(CLONE_VFORK

|CLONE_VM),表示父、子進程共用(用戶)虛存區(qū)間,并且當子進程釋放其虛存區(qū)間時要喚醒父進程,至于__clone(),則這一部分完全由調用者設定而作為參數(shù)傳遞下來。其中標志位CLONE_PID有特殊的作用,當這個標志位為1時,父、子進程〔線程)共用同一個進程號,也就是說,子進程雖然有其自己的task_structt數(shù)據(jù)結構,卻使用父進程的pid。但是,只有0號進程,也就是系統(tǒng)中的原始進程(實際上是線程),才允許這樣來調用__clone(),所以564行對此加以檢查。

接著,通過alloc_task_struct()為子進程分配兩個連續(xù)的物理頁面,低端用作子進程的task_struct結構,高端則用作其系統(tǒng)空間堆棧。

注意574行的賦值為整個數(shù)據(jù)結構的賦值。這樣,父進程的整個task_struct就被復制到了子進程的數(shù)據(jù)結構中。經編譯以后,這樣的賦值是用memcpy()實現(xiàn)的,所以效率很高。

#define CSIGNAL 0x000000ff

#define CLONE_VM 0x00000100

#define CLONE_FS 0x00000200

#define CLONE_FILES 0x00000400

#define CLONE_SIGHAND 0x00000800

#define CLONE_PID 0x00001000

#define CLONE_PTRACE 0x00002000

#define CLONE_VFORK 0x00004000

#define CLONE_PARENT 0x00008000

#define CLONE_THREAD 0x00010000

#define CLONE_SIGNAL (CLONE_SIGHAND |

CLONE_THREAD)

============================================================

int retval =

-ENOMEM;

struct task_struct

*p;

DECLARE_MUTEX_LOCKED(sem);

if (clone_flags &

CLONE_PID) {

if

(current->pid)

return -EPERM;

}

current->vfork_sem =

&sem;

p =

alloc_task_struct();

if (!p)

goto fork_out;

*p = *current;

retval = -EAGAIN;

if

(atomic_read(&p->user->processes) >=

p->rlim[RLIMIT_NPROC].rlim_cur)

goto

bad_fork_free;

atomic_inc(&p->user->__count);

atomic_inc(&p->user->processes);

if (nr_threads >=

max_threads)

goto

bad_fork_cleanup_count;

get_exec_domain(p->exec_domain);

if (p->binfmt &&

p->binfmt->module)

__MOD_INC_USE_COUNT(p->binfmt->module);

p->did_exec =

0;

p->swappable =

0;

p->state =

TASK_UNINTERRUPTIBLE;

copy_flags(clone_flags,

p);

p->pid =

get_pid(clone_flags);

======================函數(shù)內解釋部分===================================

task_struct結構中有個指針user,用來指向一個user_struct結構。

一個用戶常常有許多個進程,所以有關用戶的一些信息并不專屬于某一個進程。這樣,屬于同一用戶的進程就可以通過指針user共享這些信息。

顯然,每個用戶有且只有一個user_struct結構。結構中有個計數(shù)器__count對屬于該用戶的進程數(shù)量計數(shù)。

可想而知,內核線程并不屬于某個用戶,所以其task_struct中的user指引為0。

#define UIDHASH_BITS 8

#define UIDHASH_SZ

(1 << UIDHASH_BITS)

static struct

user_struct *uidhash_table[UIDHASH_SZ];

這是一個雜湊(hash)表。對用戶名施以雜湊運算,就可以計算出一個下標而找到該用戶的user_struct結構。各進程的task_struct結構中還有個數(shù)組rlim,對該進程占用各種資源的數(shù)量作出限制,而rlim[RLIMIT_NPROC]就規(guī)定了該進程所屬的用戶可以擁有的進程數(shù)量。所以,如果當前進程是一個用戶進程,并且該用戶擁有的進程數(shù)量已經達到了規(guī)定的限制值,就再不允許它fork()了.那么,對于不屬于任何用戶的內核線程怎么辦呢?

587行中的兩個計數(shù)器就是為進程的總量而設的。

一個進程除了屬于某一個用戶之外,還屬于某個"執(zhí)行域"??偟膩碚f,Linux是Unix的一個變種,并且符合POSIX的規(guī)定。但是,有很多版本的操作系統(tǒng)同樣是Unix變種,同樣符合POSIX規(guī)定,互相之間在實現(xiàn)細節(jié)上卻仍然有明顯的不同。這就形成了不同的執(zhí)行域。如果一個進程所執(zhí)行的程序是為Solaris開發(fā)的,那么這個進程就屬于Solaris執(zhí)行域PER_SOLARIS。當然,在Linux上運行的絕大多數(shù)程序都屬于Linux執(zhí)行域。在task_struct結構中有一個指針exec_domain,可以指向一個exec_domain數(shù)據(jù)結構。

常數(shù)PID_MAX定義為0X8000??梢?#xff0c;進程號的最大值是0X7FFF

即32767。進程號0?299是為系統(tǒng)進程(包括內核線程)保留的,主要用于各種"保護神"進程。以上這段代碼的邏輯并不復雜,我們就不多加解釋了。

====================================================================

p->run_list.next =

NULL;

p->run_list.prev =

NULL;

if ((clone_flags &

CLONE_VFORK) || !(clone_flags & CLONE_PARENT)) {

p->p_opptr =

current;

if (!(p->ptrace &

PT_PTRACED))

p->p_pptr =

current;

}

p->p_cptr =

NULL;

init_waitqueue_head(&p->wait_chldexit);

p->vfork_sem =

NULL;

spin_lock_init(&p->alloc_lock);

p->sigpending =

0;

init_sigpending(&p->pending);

p->it_real_value =

p->it_virt_value = p->it_prof_value = 0;

p->it_real_incr =

p->it_virt_incr = p->it_prof_incr = 0;

init_timer(&p->real_timer);

p->real_timer.data =

(unsigned long) p;

p->leader = 0;

p->tty_old_pgrp =

0;

p->times.tms_utime =

p->times.tms_stime = 0;

p->times.tms_cutime =

p->times.tms_cstime = 0;

#ifdef CONFIG_SMP

{

int i;

p->has_cpu = 0;

p->processor =

current->processor;

for(i = 0; i < smp_num_cpus;

i++)

p->per_cpu_utime[i] =

p->per_cpu_stime[i] = 0;

spin_lock_init(&p->sigmask_lock);

}

#endif

p->lock_depth =

-1;

p->start_time =

jiffies;

======================函數(shù)內解釋部分===================================

====================================================================

retval = -ENOMEM;

if (copy_files(clone_flags,

p))

goto

bad_fork_cleanup;

if (copy_fs(clone_flags,

p))

goto

bad_fork_cleanup_files;

if (copy_sighand(clone_flags,

p))

goto

bad_fork_cleanup_fs;

if (copy_mm(clone_flags,

p))

goto

bad_fork_cleanup_sighand;

retval = copy_thread(0,

clone_flags, stack_start, stack_size, p, regs);

if (retval)

goto

bad_fork_cleanup_sighand;

p->semundo =

NULL;

p->parent_exec_id =

p->self_exec_id;

p->swappable =

1;

p->exit_signal = clone_flags

& CSIGNAL;

p->pdeath_signal =

0;

p->counter =

(current->counter + 1) >> 1;

current->counter >>=

1;

if

(!current->counter)

current->need_resched =

1;

retval =

p->pid;

p->tgid =

retval;

INIT_LIST_HEAD(&p->thread_group);

write_lock_irq(&tasklist_lock);

if (clone_flags &

CLONE_THREAD) {

p->tgid =

current->tgid;

list_add(&p->thread_group,

&current->thread_group);

}

SET_LINKS(p);

hash_pid(p);

nr_threads++;

write_unlock_irq(&tasklist_lock);

if (p->ptrace &

PT_PTRACED)

send_sig(SIGSTOP, p,

1);

wake_up_process(p);

++total_forks;

fork_out:

if ((clone_flags &

CLONE_VFORK) && (retval >

0))

down(&sem);

return retval;

bad_fork_cleanup_sighand:

exit_sighand(p);

bad_fork_cleanup_fs:

exit_fs(p);

bad_fork_cleanup_files:

exit_files(p);

bad_fork_cleanup:

put_exec_domain(p->exec_domain);

if (p->binfmt &&

p->binfmt->module)

__MOD_DEC_USE_COUNT(p->binfmt->module);

bad_fork_cleanup_count:

atomic_dec(&p->user->processes);

free_uid(p->user);

bad_fork_free:

free_task_struct(p);

goto fork_out;

}

4.4 系統(tǒng)調用execve()

在大多數(shù)情況下,如果復制出來的子進程不能與父進程分道揚鑣,走自己的路,那就沒有多大的意思,所以執(zhí)行一個新的可執(zhí)行程序是進程生命歷程中關鍵性的一步。linux為此提供了一個系統(tǒng)調用execve(),而在C語言的程序庫中又在此基礎上向應用程序提供一整套的庫函數(shù),包括execl()

execlp() execleo() execv() execvp()

系統(tǒng)調用execve()內核入口是sys_execve()。sys_execve()就調用do_execve(),

以完成其主體部分的工作。

顯然,先要將給定的可執(zhí)行程序文件找到并打開,do_execve()就是為此而調用的.

當目標文件已經打開,下一步就要從文件中裝入可執(zhí)行程序了。內核中為可執(zhí)行程序的裝入定義了一個數(shù)據(jù)結構linux_binprm,這個數(shù)據(jù)結構將運行一個可執(zhí)行文件時所需的信息組織在一起。

struct

linux_binprm{

char buf[BINPRM_BUF_SIZE];

struct page *page[MAX_ARG_PAGES];

unsigned long p;

int sh_bang;

struct file * file;

int e_uid, e_gid;

kernel_cap_t cap_inheritable, cap_permitted,

cap_effective;

int argc, envc;

char * filename;

unsigned long loader, exec;

}

int do_execve(char * filename, char ** argv, char ** envp,

struct pt_regs * regs)

{

struct ?linux_binprm ?bprm;

struct file *file;

int retval;

int i;

file = open_exec(filename);

retval = PTR_ERR(file);

if (IS_ERR(file))

return retval;

bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);

memset(bprm.page, 0,

MAX_ARG_PAGES*sizeof(bprm.page[0]));

bprm.file = file; ?-->保存打開文件的file結構指針

bprm.filename = filename;

bprm.sh_bang =

0;-->

bprm.loader = 0;

bprm.exec = 0;

if ((bprm.argc = count(argv, bprm.p / sizeof(void *))) < 0)

{

allow_write_access(file);

fput(file);

return bprm.argc;

}

if ((bprm.envc = count(envp, bprm.p / sizeof(void *))) < 0)

{

allow_write_access(file);

fput(file);

return bprm.envc;

}

retval = prepare_binprm(&bprm);

if (retval < 0)

goto out;

retval = copy_strings_kernel(1, &bprm.filename,

&bprm);

if (retval < 0)

goto out;

bprm.exec = bprm.p;

retval = copy_strings(bprm.envc, envp, &bprm);

if (retval < 0)

goto out;

retval = copy_strings(bprm.argc, argv, &bprm);

if (retval < 0)

goto out;

retval = search_binary_handler(&bprm,regs);

if (retval >= 0)

return retval;

out:

allow_write_access(bprm.file);

if (bprm.file)

fput(bprm.file);

for (i = 0 ; i < MAX_ARG_PAGES ; i++) {

struct page * page = bprm.page[i];

if (page)

__free_page(page);

}

return retval;

}

總結

以上是生活随笔為你收集整理的linux内核调度 0号进程,Linux内核源代码情景分析---第四章 进程与进程调度的全部內容,希望文章能夠幫你解決所遇到的問題。

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

亚洲男男gaygay无套同网址 | 五月天婷亚洲天综合网精品偷 | 婷婷精品视频 | 日韩欧美精品一区 | 在线观看理论 | 国产精品久久久久久久av大片 | 日韩欧美精品在线观看 | 日韩在线观看中文 | 高清国产午夜精品久久久久久 | 99精品久久99久久久久 | 最近中文字幕完整高清 | 懂色av懂色av粉嫩av分享吧 | 成年人电影免费看 | 中文字幕乱视频 | 国产一区二区在线免费观看 | 91免费网 | 国产资源在线视频 | 日韩精品在线看 | 视频一区在线播放 | 天天天天干| 日韩欧美视频免费在线观看 | 久久精品99 | 丁香花在线观看免费完整版视频 | 99精品免费网 | 欧美日韩1区2区 | 伊人精品在线 | 4438全国亚洲精品在线观看视频 | 中文字幕第一页在线 | 日日综合网 | 久久国产精品视频免费看 | 亚洲精品网址在线观看 | 欧美一级艳片视频免费观看 | 一区二区三区高清在线 | 综合网伊人 | 永久免费视频国产 | 91福利视频网站 | 亚洲专区一二三 | 日日夜夜天天久久 | 蜜桃av观看 | 亚洲精品国产第一综合99久久 | 亚洲成色777777在线观看影院 | 热久久影视 | 免费看短| 久久视频在线免费观看 | 国内精品视频一区二区三区八戒 | 少妇搡bbbb搡bbb搡忠贞 | 不卡的av在线 | 日本系列中文字幕 | 中文字幕av最新 | 欧美另类老妇 | 久久这里只有精品久久 | 日韩免费精品 | 亚洲a免费 | 91精品啪啪 | 久久久免费高清视频 | 中文字幕精品在线 | 五月天综合网 | 免费观看久久 | 国内免费的中文字幕 | 欧美xxxxx在线视频 | 国产视频 亚洲精品 | 色搞搞 | 日韩影片在线观看 | 探花视频免费观看 | 亚洲综合色激情五月 | 久久精品一区二区三区国产主播 | 欧美福利精品 | 国产人成看黄久久久久久久久 | 激情丁香综合五月 | 成人在线播放网站 | 久久成人综合视频 | 久久久久影视 | 久久精品成人热国产成 | 99久久精品免费视频 | 最新超碰在线 | 天天操,夜夜操 | 一区三区视频 | 成人国产一区 | 日韩一区二区三区在线观看 | 日韩在线免费高清视频 | 国产精品久久视频 | 久久成人免费电影 | 成人av电影在线 | 精品亚洲男同gayvideo网站 | 美女搞黄国产视频网站 | 操老逼免费视频 | 亚洲精品免费在线观看视频 | 国产欧美最新羞羞视频在线观看 | 日韩最新中文字幕 | 亚洲闷骚少妇在线观看网站 | 国产在线观看黄 | 中文字幕电影一区 | 亚洲在线看 | 欧美一级片免费在线观看 | 五月天中文字幕mv在线 | 亚洲成人午夜av | 国产视频不卡一区 | 在线视频第一页 | 欧美91视频 | 欧美亚洲成人xxx | 天天操天天色天天射 | 免费看麻豆 | 久久亚洲婷婷 | 亚洲一区二区三区miaa149 | 在线播放一区二区三区 | 国产精品影音先锋 | 在线观看精品一区 | 天天综合网国产 | 国产无遮挡又黄又爽在线观看 | 中文字幕久久亚洲 | 日韩系列| 久久免费av电影 | 99人成在线观看视频 | 不卡的av片| 国产一卡久久电影永久 | 福利精品在线 | 日韩av成人在线观看 | 18女毛片| 国产在线传媒 | 国产资源精品在线观看 | 黄色软件大全网站 | 日韩欧美高清一区二区 | 精品国产一区二区三区久久久久久 | 亚洲jizzjizz日本少妇 | 天天射综合网站 | 国产69精品久久久久久久久久 | 亚洲人成在线观看 | 国产亚洲日本 | 免费观看黄色12片一级视频 | 色人久久 | 国产中文字幕在线免费观看 | 日韩欧美精品一区二区三区经典 | 亚洲区另类春色综合小说 | 亚洲国产精品电影在线观看 | 四虎影视成人永久免费观看亚洲欧美 | 国产日韩精品在线观看 | 2021国产精品 | 欧美日韩二区在线 | 精产嫩模国品一二三区 | 久久黄视频 | 黄色亚洲 | 国产99久久九九精品 | 久久久精品高清 | 国产在线观看污片 | 九九久久婷婷 | 91久草视频 | 久久精品久久精品久久39 | 久久久久久欧美二区电影网 | 久草a视频 | 少妇视频一区 | 中文字幕在线观 | 日本久久精品 | 天天草天天色 | 精品久久1 | 99精品久久久久 | 99久e精品热线免费 99国产精品久久久久久久久久 | 视频 国产区 | 日本最新一区二区三区 | 日韩久久精品一区二区三区下载 | 国产视频一级 | 三级午夜片 | 亚洲国产一区二区精品专区 | 日韩久久精品一区 | 久久久精品国产免费观看一区二区 | 精品国产电影一区二区 | 精品毛片在线 | 中文字幕三区 | 97国产大学生情侣酒店的特点 | av资源免费在线观看 | 免费看色视频 | 伊人亚洲综合网 | 中文一区在线 | av综合在线观看 | 丁香婷婷深情五月亚洲 | 久久这里只有精品23 | aaa毛片视频 | 欧美日韩视频在线观看一区二区 | 在线观看免费版高清版 | 视频精品一区二区三区 | 天天拍天天色 | 久久久久久久久久伊人 | 午夜黄色大片 | 伊人www22综合色 | 在线免费中文字幕 | 欧美精品午夜 | 国产一区黄色 | 超碰成人免费电影 | 天天操综合 | 久久久国产精品一区二区三区 | 少妇性bbb搡bbb爽爽爽欧美 | 97免费| 热99久久精品 | 亚洲一级在线观看 | 五月综合色婷婷 | 欧洲一区精品 | 亚洲理论影院 | 亚洲成人二区 | 丁香九月激情综合 | 一区二区视频在线看 | 成人av电影免费在线播放 | 久久成人国产精品入口 | 色福利网站 | 亚洲精品一区二区三区在线观看 | 999免费视频 | 亚洲电影一区二区 | 久久99免费 | 天天操天天谢 | 国产破处在线播放 | 激情婷婷在线 | 麻豆免费在线播放 | 天天天天天天天天操 | 在线观看中文字幕视频 | 亚洲资源一区 | 日韩精品在线播放 | 色综合天天综合在线视频 | 91高清免费 | 成人片在线播放 | 日韩精品一区二区三区高清免费 | 精品福利视频在线 | 精品96久久久久久中文字幕无 | 在线观看你懂的网址 | 香蕉日日 | 九色精品在线 | 成人久久国产 | 国产色在线视频 | 午夜少妇一区二区三区 | 伊人色播| 久草在线在线视频 | 国产成人久久精品一区二区三区 | 成人动态视频 | 免费a网 | 91亚洲视频在线观看 | 麻豆传媒电影在线观看 | 久草在线免费看视频 | 日韩在线观看视频免费 | 国产成人精品一区二三区 | 亚洲作爱| 99精彩视频在线观看免费 | av中文在线观看 | 欧美一级大片在线观看 | 日韩大片在线看 | 亚洲午夜久久久久久久久 | 日韩欧美一区二区不卡 | 973理论片235影院9 | 国产伦精品一区二区三区四区视频 | 色综合www | 久久人人爽人人片 | 国产成人精品999 | 在线免费观看视频 | 在线黄色免费 | 欧美一级特黄aaaaaa大片在线观看 | 成年人在线视频观看 | 精品国产aⅴ麻豆 | 日本最新高清不卡中文字幕 | 国产视频一二区 | 在线观看一 | 美女视频黄的免费的 | 99re久久资源最新地址 | 西西www444 | 成年人免费在线 | 丁香午夜 | 激情电影影院 | 国产在线播放不卡 | 91黄色免费网站 | 久久色视频 | 丁香六月网 | 麻豆小视频在线观看 | 一级黄色在线免费观看 | 天天摸天天干天天操天天射 | 天天综合91 | 欧美一区日韩一区 | 亚洲国产精品成人精品 | 天天操天天操天天操天天 | 欧美日本三级 | 欧洲不卡av | 国产精品粉嫩 | 成人免费观看网站 | 婷婷色网视频在线播放 | 欧美美女视频在线观看 | 在线电影av | 国产一区二区不卡视频 | 婷婷九月激情 | 日韩一区二区三区视频在线 | 激情婷婷在线观看 | 五月天电影免费在线观看一区 | www.福利视频 | 国产亚洲精品av | 99热这里有精品 | 免费看黄在线看 | 久草资源在线观看 | 欧美性生交大片免网 | 亚洲国产精品va在线看黑人 | 亚洲aⅴ在线 | 日本乱码在线 | 狠狠久久伊人 | 久久久国产视频 | 高清精品在线 | av免费在线观| 日本三级香港三级人妇99 | 亚州精品一二三区 | 成人在线一区二区 | 在线黄色观看 | 人人爽人人舔 | 伊人亚洲精品 | 国产视频精品网 | 奇米导航| 99视频在线免费 | 国产在线观看你懂得 | 久草久草久草久草 | 日韩av影视在线观看 | 亚洲国产精品日韩 | 91在线最新| 成人免费视频网 | 91九色porny在线 | 国产成人a亚洲精品 | 国产精品理论片在线播放 | 97视频播放 | 91av在线国产 | 久久视频免费观看 | 在线观看国产区 | 国产麻豆传媒 | 九九久久久久久久久激情 | 亚洲欧美综合精品久久成人 | 人人澡超碰碰97碰碰碰软件 | 国产又粗又猛又爽 | 日韩高清无线码2023 | 国产中文在线播放 | 亚洲色图激情文学 | 十八岁以下禁止观看的1000个网站 | 视频在线99 | 日韩四虎 | 亚洲精品视频在线观看免费视频 | 久久99精品久久久久久秒播蜜臀 | 在线观看色视频 | 国产精品 久久 | 中日韩在线视频 | 最新国产福利 | 成人av中文字幕在线观看 | 探花视频免费观看 | 婷婷日| 午夜久久久影院 | 热久久视久久精品18亚洲精品 | 欧美成a人片在线观看久 | 久久韩国免费视频 | 免费高清在线观看电视网站 | 综合久久久久 | 免费在线电影网址大全 | 国产视频日韩 | 久久综合狠狠综合久久激情 | 国产视频精品免费播放 | 黄色美女免费网站 | 日本精品在线视频 | 狠狠色噜噜狠狠狠合久 | 国产精品九色 | 毛片网站在线看 | 国产三级久久久 | 4p变态网欧美系列 | 久久99久| 日韩有码在线观看视频 | 三上悠亚一区二区在线观看 | 成人久久久久久久久 | 国产高清av| 人人澡人摸人人添学生av | 免费看黄网站在线 | 香蕉在线视频观看 | 日韩视频中文字幕在线观看 | 久久精品国产成人 | 欧美精品在线一区二区 | 亚洲精品视频大全 | 欧美日本在线观看视频 | 成+人+色综合 | 91中文字幕网 | 精品久久久久久久久亚洲 | 超碰97成人 | 国产裸体永久免费视频网站 | 成人不用播放器 | 狠狠色2019综合网 | 精品免费观看 | 色综合色综合色综合 | 欧美va天堂在线电影 | 亚洲第一av在线播放 | 91精品久久久久 | 国产在线a视频 | 99视| 91在线日韩| 免费成人在线观看 | 日韩激情综合 | 午夜视频在线观看欧美 | 久久精品一二区 | 免费国产在线视频 | 美女网站免费福利视频 | 伊人射 | 精品天堂av| av电影免费 | 波多野结衣在线观看视频 | 麻豆91在线观看 | 国产又粗又猛又黄视频 | 久久蜜臀av| 久久高清精品 | 国产成人精品一区二区在线观看 | 一区二区伦理电影 | 婷婷午夜激情 | 免费观看全黄做爰大片国产 | 成人av一二三区 | 98超碰在线观看 | 国内精品中文字幕 | 午夜影院在线观看18 | 91.精品高清在线观看 | 亚洲午夜久久久久久久久久久 | 国产麻豆精品久久一二三 | 精品免费国产一区二区三区四区 | 免费在线观看黄网站 | 亚洲人人射 | 亚洲欧美日韩精品久久奇米一区 | 97av色| 国产区在线看 | 四虎亚洲精品 | 国产麻豆电影在线观看 | 五月天久久久 | 男女激情麻豆 | 欧美少妇xxxxxx| 久久再线视频 | 亚洲天堂网在线观看视频 | 亚洲一区视频在线播放 | 欧美成人性战久久 | 麻豆va一区二区三区久久浪 | 奇米网网址 | 日韩精品中文字幕在线不卡尤物 | 91麻豆精品国产91久久久久久久久 | 一区二区三区三区在线 | 天天久久夜夜 | 91精品国产欧美一区二区 | 91免费高清在线观看 | 最新中文字幕在线观看视频 | 久久av在线播放 | 97在线视频免费观看 | 欧美孕妇与黑人孕交 | 午夜视频亚洲 | 国产精品无 | 亚洲久草网 | 久久综合中文字幕 | 国产精品国产三级国产aⅴ入口 | 国产va饥渴难耐女保洁员在线观看 | 亚洲精品一区二区在线观看 | 亚洲国产精品电影 | 二区视频在线观看 | 日韩欧美一区二区在线 | 色综合久久88色综合天天 | 精品国产一二三四区 | 成人免费 在线播放 | 久久69精品 | www.国产毛片 | 国产日韩一区在线 | 中文字幕在线观看亚洲 | 免费福利片 | 在线观看中文字幕网站 | av电影一区 | 成人av免费在线播放 | 91色一区二区三区 | 天堂网一区二区 | 麻豆系列在线观看 | 成人a免费看 | 国产精品精品国产婷婷这里av | 在线电影av | 91在线欧美 | 激情丁香在线 | 日韩xxxbbb| 伊人天天色 | 久久手机在线视频 | 五月天免费网站 | 欧美在线一二区 | 中文字幕在线视频免费播放 | 欧美久久影院 | 日本中文字幕在线免费观看 | 国产成人99久久亚洲综合精品 | 国产精品久久久久影视 | 久久成人国产精品入口 | 国产亚洲精品女人久久久久久 | 久久丝袜视频 | 日韩高清一区 | 五月天最新网址 | 午夜精品导航 | 亚洲首页 | 午夜精品久久久久久久99 | 国产精品午夜在线 | 国产视频1 | 91丨九色丨蝌蚪丰满 | 00av视频| 国产精品久久久久一区二区国产 | 久久精品站 | 激情婷婷av | 91精品久久久久久久91蜜桃 | 国产在线日本 | 91传媒激情理伦片 | 国产伦精品一区二区三区高清 | 成人黄大片视频在线观看 | www黄色大片| 大片网站久久 | 久久在线免费视频 | 国产精品久久久久一区 | 人人dvd| 91九色蝌蚪视频网站 | 久久66热这里只有精品 | 欧美激情视频免费看 | 国产96在线 | 51久久成人国产精品麻豆 | 国产麻豆传媒 | 99久久这里有精品 | 欧美大片aaa| 黄色成人在线网站 | 亚洲天天做 | 日本女人逼| 日本深夜福利视频 | 色综合久久网 | 国产美腿白丝袜足在线av | 操操操日日 | 三级视频日韩 | 日韩在线观看精品 | 国产99久久久国产精品 | 美女视频黄色免费 | 成人一区二区在线观看 | 色婷婷骚婷婷 | 亚洲一区 av | 日韩欧美一区二区三区黑寡妇 | 国产在线看 | 国产片网站 | 色999五月色| www色,com | a√国产免费a| 久久精品国产亚洲aⅴ | 国产精品网址在线观看 | 日韩av电影国产 | 在线免费中文字幕 | 久久综合亚洲鲁鲁五月久久 | 欧美 国产 视频 | 免费成人黄色av | 国内少妇自拍视频一区 | 日韩在线视频播放 | 亚洲一区二区三区精品在线观看 | 91禁在线看 | 国产视| 国产精品剧情在线亚洲 | 久草com| 日日日操操 | 欧美a影视| 六月色婷 | 91禁看片 | 波多野结衣精品在线 | 超碰免费在线公开 | 99爱精品视频 | 成人a毛片 | 爱射综合| 免费黄色av电影 | 黄色软件在线观看免费 | 亚洲在线精品视频 | 成年人电影免费在线观看 | 成人久久亚洲 | 国产精品一区二区三区在线播放 | www日韩在线观看 | 九九九热精品免费视频观看网站 | 午夜一级免费电影 | 精品中文字幕视频 | 黄色软件在线观看视频 | 婷婷在线色| 天天插伊人| 黄色片视频在线观看 | 91亚色视频在线观看 | 视频在线观看国产 | 日本精品中文字幕 | 国产福利一区在线观看 | 色久综合| 国产精品久久久av | 欧美一区免费观看 | 国产伦精品一区二区三区… | 成人免费色 | 91最新中文字幕 | 亚洲国产精品99久久久久久久久 | 午夜久久福利视频 | 综合网伊人 | 日本bbbb摸bbbb | 亚洲精品国产综合99久久夜夜嗨 | 国产一级精品在线观看 | 成+人+色综合 | 日韩欧美一区二区在线观看 | 久久久久一区 | 亚洲成av人片在线观看香蕉 | 91九色成人蝌蚪首页 | 黄色一集片 | 免费视频久久久久 | 亚洲精品乱码久久久一二三 | av黄色一级片 | 五月天堂色 | 日韩精品一区二区三区免费视频观看 | 日韩,中文字幕 | 精品久久久久亚洲 | 国产一级免费观看视频 | 粉嫩av一区二区三区四区在线观看 | 久草在线免费看视频 | 中文字幕在线免费看线人 | 欧美性色黄大片在线观看 | 成人黄色电影在线 | 国产精品av一区二区 | 亚州精品在线视频 | 久久黄网站| 久久综合射 | 久草在线免费新视频 | 五月开心色 | 蜜臀av夜夜澡人人爽人人 | 欧美在线一二 | 天天操天天射天天爱 | 99操视频 | 狠狠撸电影 | 久久艹艹 | 一区二区视| 五月花丁香婷婷 | 91在线你懂的 | 欧美成人视 | 国产视频一区二区在线观看 | 999成人国产 | 69国产精品视频免费观看 | 在线免费观看视频一区 | 九九九热精品 | 亚洲精品久久久久久久不卡四虎 | 国产精彩视频一区 | 欧美黑人性猛交 | 久久综合久久综合九色 | 一区二区三区四区久久 | 亚洲黄色一级电影 | 亚洲激情视频 | 在线亚洲播放 | 狠狠成人 | 亚洲精品字幕在线 | www.成人sex| 国产精品系列在线观看 | 免费观看91视频 | 在线播放一区二区三区 | 91视频一8mav| 91亚色视频在线观看 | 国产亚洲欧美精品久久久久久 | 久草免费在线视频观看 | 婷婷色综合色 | 日韩欧美在线观看 | 国产精品日韩久久久久 | 成人免费一区二区三区在线观看 | 亚洲激情视频 | 国产一区欧美二区 | 天天干天天干天天射 | 九九视频精品在线 | 久久免费公开视频 | 青青草国产精品视频 | 天天操操操操操操 | 美女久久精品 | 亚洲精品五月天 | 欧美午夜理伦三级在线观看 | 中文字幕丝袜制服 | 成人在线观看网址 | 免费视频在线观看网站 | 国产福利精品在线观看 | 日韩国产精品久久 | 欧美激情视频在线免费观看 | 久久免费视频在线观看6 | 亚州欧美精品 | 色婷婷综合久久久中文字幕 | 激情网综合 | 久久成人一区 | av中文字幕在线观看网站 | 久久99精品国产99久久6尤 | 免费99精品国产自在在线 | 免费在线观看av的网站 | 久久国产影视 | 日本在线观看中文字幕 | 日韩欧美成 | 韩日精品在线 | 亚洲黄色成人av | 国产精品欧美久久久久无广告 | 91成人精品国产刺激国语对白 | 国产精品1区2区3区在线观看 | 国产精品久久久久久久电影 | 久久久久久久久免费 | 热久久免费国产视频 | 国产精品久久亚洲 | 操少妇视频 | 久久亚洲婷婷 | 欧美二区视频 | 999热线在线观看 | 婷婷在线色| 精品国产一区二区三区不卡 | 天天草天天插 | 蜜臀一区二区三区精品免费视频 | 亚洲久草在线视频 | 精品视频 | 久久字幕网| 亚州精品天堂中文字幕 | 日日操天天操夜夜操 | 国产精品第一页在线观看 | 午夜视频免费 | 中文在线字幕免费观看 | 免费在线观看视频a | 五月婷婷综合在线视频 | 日韩在线小视频 | 天天视频色 | 九九视频网站 | 国产亚洲精品久久久久久无几年桃 | 日本高清xxxx | 色在线高清 | 日韩啪啪小视频 | av短片在线观看 | 黄色三级免费片 | 国产免费嫩草影院 | 久久久久久久久久久久久久免费看 | 午夜视频在线观看一区 | 成人在线免费观看网站 | 日韩色一区二区三区 | 精品美女在线视频 | 日韩中文字幕免费视频 | 特级西西444www大胆高清无视频 | www国产精品com | 国产午夜精品免费一区二区三区视频 | 天天亚洲 | 波多野结衣视频一区二区三区 | 欧美日韩高清在线一区 | 日日干,天天干 | 黄色a视频免费 | 毛片视频网址 | 亚洲国产色一区 | 久久精品国产一区二区三区 | 久久艹综合 | 天天射成人 | 亚洲特级片 | 国产精品99久久免费黑人 | 日本黄区免费视频观看 | 午夜精品福利在线 | 国产黄色大片 | 91探花在线视频 | 天天综合久久综合 | 91亚洲成人 | 欧美成人在线免费观看 | 日韩美女免费线视频 | 亚洲精品麻豆视频 | 探花视频在线观看+在线播放 | 欧美日韩后 | 久久久免费毛片 | 久久久精品国产一区二区电影四季 | 欧美精品久久久久久久久久丰满 | 草久久久久 | 亚洲黄色av一区 | 欧美影片 | 午夜电影 电影 | 国产欧美综合在线观看 | 国产99中文字幕 | 少妇搡bbbb搡bbb搡69 | 久久精品久久精品久久精品 | 91在线网站| 欧美一区视频 | 欧美色婷婷| 在线看国产 | 午夜精品久久 | 国产一级电影网 | 久久99热国产 | 天天干天天做天天操 | 91精品推荐| 丁香花在线视频观看免费 | 一区二区视频在线看 | 毛片网站在线看 | 少妇激情久久 | 午夜精品视频一区二区三区在线看 | 日日夜操| av在线激情 | 国产精品高潮呻吟久久久久 | 97在线看 | 亚洲高清视频在线观看免费 | 在线观看涩涩 | 在线看国产一区 | 一区二区三区四区免费视频 | 国产精品综合久久久 | 贫乳av女优大全 | av片一区| 日韩69视频 | 91麻豆免费视频 | 天天干夜夜操视频 | 色综合五月天 | 日韩一区二区免费在线观看 | 久久久精品 | 九九爱免费视频 | 99精品久久久久久久 | 在线观看91精品视频 | 女人18精品一区二区三区 | 免费a v在线 | 开心激情综合网 | 91av影视 | 国产精选在线观看 | 在线免费观看麻豆 | 91精品视频播放 | 日韩在线观看高清 | 欧美日韩网址 | 中文字幕在线观看完整版电影 | 国产精品福利在线播放 | 97精品国产97久久久久久免费 | 五月婷婷.com | 十八岁免进欧美 | 国内精品久久久久久久久久清纯 | 四虎国产精品永久在线国在线 | 日韩和的一区二在线 | 久久久久成人精品免费播放动漫 | 成 人 黄 色 视频免费播放 | 成人精品视频 | 在线观看av国产 | 精品国产精品久久 | 亚洲黄色在线播放 | 久久99精品国产99久久 | 色中色综合 | 丁香六月欧美 | 天天天干天天天操 | 人人草在线观看 | 久草在线网址 | 日韩色高清 | 丁香花在线视频观看免费 | 精品美女国产在线 | 欧美激情综合五月色丁香小说 | 精品国内自产拍在线观看视频 | 色婷婷国产精品 | 天天操狠狠操网站 | 中文字幕色婷婷在线视频 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久伊人爱 | 亚洲尺码电影av久久 | 在线免费观看的av | 91免费国产在线观看 | 韩国av一区二区三区在线观看 | 久久在线免费视频 | 亚洲最大av网 | 国产色网站 | 国产精品美女久久久久久久久 | 99精品视频一区二区 | 午夜三级影院 | 日韩二区在线播放 | 天天射一射 | 亚洲精品综合欧美二区变态 | 香蕉日日 | 亚洲狠狠婷婷 | 婷婷激情五月 | 四虎永久精品在线 | 欧美日韩中 | 久久久www成人免费毛片 | 国产福利专区 | 成人黄色电影免费观看 | 国产精品女人网站 | 天天综合网久久综合网 | 日日操日日操 | 精品亚洲一区二区三区 | 中文字幕在线观看视频网站 | avsex| 国产午夜三级 | 夜夜看av| 久久国产精品免费视频 | 日本中文字幕网站 | 国产三级午夜理伦三级 | 国产人免费人成免费视频 | 亚洲欧美视频网站 | 久久视频精品在线 | 天天干天天弄 | 久久综合9988久久爱 | 亚洲情影院 | 毛片激情永久免费 | 91在线亚洲 | 国产精品久久久久久吹潮天美传媒 | 亚洲自拍自偷 | 激情欧美一区二区三区 | 欧美在线视频不卡 | 99久久婷婷国产 | 综合久久综合久久 | 久久久国产一区二区三区 | 最近中文字幕高清字幕在线视频 | www.com黄 | 日韩成人免费在线观看 | 久久久久久久久精 | 国产精品久久久999 国产91九色视频 | 波多野结衣网址 | 黄色一级免费网站 | 亚洲国产手机在线 | 久草在线久 | 精品视频999 | 国产精品美女久久久久久2018 | 手机在线永久免费观看av片 | 国产精品免费观看在线 | 99久久精品国产网站 | 伊人五月婷 | 开心色停停 | 亚洲黄色影院 | 亚洲日本va中文字幕 | 久久草草热国产精品直播 | 91资源在线视频 | 人人澡人人爽 | 亚洲精品美女久久17c | 一区二区三区四区不卡 | 久草在线99 | 国产一区二区三精品久久久无广告 | 亚洲午夜在线视频 | 国产精品初高中精品久久 | 超碰在线1 | 伊人黄色网 | 中文字幕在线不卡国产视频 | 高清精品在线 | 久久的色 | 亚洲国产中文字幕在线视频综合 | 亚洲乱码国产乱码精品天美传媒 | 日批视频 | 天天草天天爽 | 国产xvideos免费视频播放 | 国产精品嫩草影院99网站 | 久久精品这里都是精品 | 国产视频久久久久 | 免费在线播放 | 9ⅰ精品久久久久久久久中文字幕 | 久久人人爽人人片 | 99精品久久精品一区二区 | 久草资源在线观看 | 日韩一区精品 | 中文字幕资源网 国产 | 国产亚洲情侣一区二区无 | 欧美日韩一级久久久久久免费看 | 黄污网 | 91在线免费看片 | 国产视频在线播放 | 伊人久久精品久久亚洲一区 | 国产欧美三级 | 在线观影网站 | 在线a人片免费观看视频 | 丝袜av一区 | 手机成人免费视频 | .精品久久久麻豆国产精品 亚洲va欧美 | 久久久久免费网站 | 国内视频在线 | 射久久久| 九九久久影院 | 国产视频 久久久 | 91黄视频在线观看 | 日韩久久精品一区二区三区下载 | 国产精品爽爽久久久久久蜜臀 | 久久综合五月天婷婷伊人 | 狠狠搞,com | 久久久久成人精品免费播放动漫 | av网站有哪些 | av理论电影 | 在线观看视频你懂得 | 亚洲天堂社区 | 国产91小视频 | 国内精品久久久久久中文字幕 | 在线免费观看成人 | 免费观看午夜视频 | 中文字幕在线看视频国产中文版 | 在线小视频你懂的 | 97视频免费观看 | 人人躁| 午夜国产福利在线观看 | 国产成人精品一区二三区 | 美女久久久久 | 亚洲婷婷在线视频 | 一本一本久久aa综合精品 | 毛片的网址| 去看片 | 又大又硬又黄又爽视频在线观看 | 国产玖玖精品视频 | 国产成人精品av在线 | 亚洲精品乱码久久久久久久久久 | 免费日p视频 | 97视频免费在线看 | 日本精品免费看 | 亚洲精品美女 | 亚洲人天堂 | 久久午夜电影院 | 国产在线 一区二区三区 | 日批视频在线观看免费 | 国产成人精品一区二 | 九九九热 | av高清免费在线 | 美女天天操 | 日韩欧美久久 | 国产麻豆精品传媒av国产下载 | 久草在线视频在线观看 | 亚洲精品小视频在线观看 | 国产精品久久久久久婷婷天堂 | www最近高清中文国语在线观看 | 91麻豆精品国产91久久久久 | 美女国产免费 | av网站免费线看精品 | 中文字幕一区二区三区在线视频 | 亚洲成熟女人毛片在线 | 国产色拍拍拍拍在线精品 | 亚洲一区二区精品视频 | h视频在线看 | 91视频在线观看免费 | 婷婷色在线 | 日本视频不卡 | 又大又硬又黄又爽视频在线观看 | 中文字幕国产亚洲 | 久久精品最新 | 国产18精品乱码免费看 |