精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

嵌入式筆試面試題目系列(匯總)

系統 Linux
本系列按類別對題目進行分類整理,這樣有利于大家對嵌入式的筆試面試考察框架有一個完整的理解。

[[377628]]

 本系列按類別對題目進行分類整理,這樣有利于大家對嵌入式的筆試面試考察框架有一個完整的理解。

一、進程與線程

1、什么是進程、線程,有什么區別?

進程是資源(CPU、內存等)分配的基本單位,線程是CPU調度和分配的基本單位(程序執行的最小單位)。同一時間,如果CPU是單核,只有一個進程在執行,所謂的并發執行,也是順序執行,只不過由于切換速度太快,你以為這些進程在同步執行而已。多核CPU可以同一時間點有多個進程在執行。

2、多進程、多線程的優缺點

說明:一個進程由進程控制塊、數據段、代碼段組成,進程本身不可以運行程序,而是像一個容器一樣,先創建出一個主線程,分配給主線程一定的系統資源,這時候就可以在主線程開始實現各種功能。當我們需要實現更復雜的功能時,可以在主線程里創建多個子線程,多個線程在同一個進程里,利用這個進程所擁有的系統資源合作完成某些功能。

優缺點:1)一個進程死了不影響其他進程,一個線程崩潰很可能影響到它本身所處的整個進程。2) 創建多進程的系統花銷大于創建多線程。3)多進程通訊因為需要跨越進程邊界,不適合大量數據的傳送,適合小數據或者密集數據的傳送。多線程無需跨越進程邊界,適合各線程間大量數據的傳送。并且多線程可以共享同一進程里的共享內存和變量。

3、什么時候用進程,什么時候用線程

1)創建和銷毀較頻繁使用線程,因為創建進程花銷大。2)需要大量數據傳送使用線程,因為多線程切換速度快,不需要跨越進程邊界。3)安全穩定選進程;快速頻繁選線程;

4、多進程、多線程同步(通訊)的方法

進程間通訊:

(1)有名管道/無名管道(2)信號(3)共享內存(4)消息隊列(5)信號量(6)socket

線程通訊(鎖):

(1)信號量(2)讀寫鎖(3)條件變量(4)互斥鎖(5)自旋鎖

5、進程線程的狀態轉換圖

(1)就緒狀態:進程已獲得除CPU外的所有必要資源,只等待CPU時的狀態。一個系統會將多個處于就緒狀態的進程排成一個就緒隊列。

(2)執行狀態:進程已獲CPU,正在執行。單處理機系統中,處于執行狀態的進程只一個;多處理機系統中,有多個處于執行狀態的進程。

(3)阻塞狀態:正在執行的進程由于某種原因而暫時無法繼續執行,便放棄處理機而處于暫停狀態,即進程執行受阻。(這種狀態又稱等待狀態或封鎖狀態)

通常導致進程阻塞的典型事件有:請求I/O,申請緩沖空間等。

一般,將處于阻塞狀態的進程排成一個隊列,有的系統還根據阻塞原因不同把這些阻塞集成排成多個隊列。


(1) 就緒→執行

處于就緒狀態的進程,當進程調度程序為之分配了處理機后,該進程便由就緒狀態轉變成執行狀態。

(2) 執行→就緒

處于執行狀態的進程在其執行過程中,因分配給它的一個時間片已用完而不得不讓出處理機,于是進程從執行狀態轉變成就緒狀態。

(3) 執行→阻塞

正在執行的進程因等待某種事件發生而無法繼續執行時,便從執行狀態變成阻塞狀態。

(4) 阻塞→就緒

處于阻塞狀態的進程,若其等待的事件已經發生,于是進程由阻塞狀態轉變為就緒狀態。

6、父進程、子進程

父進程調用fork()以后,克隆出一個子進程,子進程和父進程擁有相同內容的代碼段、數據段和用戶堆棧。父進程和子進程誰先執行不一定,看CPU。所以我們一般我們會設置父進程等待子進程執行完畢。

7、說明什么是上下文切換?

你可以有很多角度,有進程上下文,有中斷上下文。

進程上下文:一個進程在執行的時候,CPU的所有寄存器中的值、進程的狀態以及堆棧中的內容,當內核需要切換到另一個進程時,它需要保存當前進程的所有狀態,即保存當前進程的進程上下文,以便再次執行該進程時,能夠恢復切換時的狀態,繼續執行。

中斷上下文:由于觸發信號,導致CPU中斷當前進程,轉而去執行另外的程序。那么當前進程的所有資源要保存,比如堆棧和指針。保存過后轉而去執行中斷處理程序,快讀執行完畢返回,返回后恢復上一個進程的資源,繼續執行。這就是中斷的上下文。

二、C/C++題目

1、new和malloc

做嵌入式,對于內存是十分在意的,因為可用內存有限,所以嵌入式筆試面試題目,內存的題目高頻。

1)malloc和free是c++/c語言的庫函數,需要頭文件支持stdlib.h;new和delete是C++的關鍵字,不需要頭文件,需要編譯器支持;

2)使用new操作符申請內存分配時,無需指定內存塊的大小,編譯器會根據類型信息自行計算。而malloc則需要顯式地支持所需內存的大小。

3)new操作符內存分配成功時,返回的是對象類型的指針,類型嚴格與對象匹配,無需進行類型轉換,故new是符合類型安全性的操作符。而malloc內存分配成功則是返回void*,需要通過強制類型轉換將void*指針轉換成我們需要的類型。

4)new內存分配失敗時,會拋出bad_alloc異常。malloc分配內存失敗時返回NULL。

2、在1G內存的計算機中能否malloc(1.2G)?為什么?(2021浙江大華二面問題)

答:是有可能申請1.2G的內存的。

解析:回答這個問題前需要知道malloc的作用和原理,應用程序通過malloc函數可以向程序的虛擬空間申請一塊虛擬地址空間,與物理內存沒有直接關系,得到的是在虛擬地址空間中的地址,之后程序運行所提供的物理內存是由操作系統完成的。

3 、extern”C” 的作用

我們可以在C++中使用C的已編譯好的函數模塊,這時候就需要用到extern”C”。也就是extern“C” 都是在c++文件里添加的。

extern在鏈接階段起作用(四大階段:預處理--編譯--匯編--鏈接)。

4、strcat、strncat、strcmp、strcpy哪些函數會導致內存溢出?如何改進?(2021浙江大華二面問題)

strcpy函數會導致內存溢出。

strcpy拷貝函數不安全,他不做任何的檢查措施,也不判斷拷貝大小,不判斷目的地址內存是否夠用。

  1. char *strcpy(char *strDest,const char *strSrc) 

strncpy拷貝函數,雖然計算了復制的大小,但是也不安全,沒有檢查目標的邊界。

  1. strncpy(dest, src, sizeof(dest));  

strncpy_s是安全的

strcmp(str1,str2),是比較函數,若str1=str2,則返回零;若str1

strncat()主要功能是在字符串的結尾追加n個字符。

  1. char * strncat(char *dest, const char *src, size_t n); 

strcat()函數主要用來將兩個char類型連接。例如:

  1. char d[20]="Golden"
  2. char s[20]="View"
  3. strcat(d,s); 
  4. //打印d 
  5. printf("%s",d); 

輸出 d 為 GoldenView (中間無空格)

延伸:

memcpy拷貝函數,它與strcpy的區別就是memcpy可以拷貝任意類型的數據,strcpy只能拷貝字符串類型。

memcpy 函數用于把資源內存(src所指向的內存區域)拷貝到目標內存(dest所指向的內存區域);有一個size變量控制拷貝的字節數;

函數原型:

  1. void *memcpy(void *dest, void *src, unsigned int count); 

5 、static的用法(定義和用途)(必考)

1)用static修飾局部變量:使其變為靜態存儲方式(靜態數據區),那么這個局部變量在函數執行完成之后不會被釋放,而是繼續保留在內存中。

2)用static修飾全局變量:使其只在本文件內部有效,而其他文件不可連接或引用該變量。

3)用static修飾函數:對函數的連接方式產生影響,使得函數只在本文件內部有效,對其他文件是不可見的(這一點在大工程中很重要很重要,避免很多麻煩,很常見)。這樣的函數又叫作靜態函數。使用靜態函數的好處是,不用擔心與其他文件的同名函數產生干擾,另外也是對函數本身的一種保護機制。

6、const的用法(定義和用途)(必考)

const主要用來修飾變量、函數形參和類成員函數:

1)用const修飾常量:定義時就初始化,以后不能更改。

2)用const修飾形參:func(const int a){};該形參在函數里不能改變

3)用const修飾類成員函數:該函數對成員變量只能進行只讀操作,就是const類成員函數是不能修改成員變量的數值的。

被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。

參考一個大佬的回答:

我只要一聽到被面試者說:"const意味著常數",我就知道我正在和一個業余者打交道。去年Dan Saks已經在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著"只讀"就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什么意思?

  1. const int a; 
  2. int const a; 
  3. const int *a; 
  4. int * const a; 
  5. int const * a const; 

前兩個的作用是一樣,a是一個常整型數。

第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。

第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。

最后一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。

7、volatile作用和用法

一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量在內存中的值,而不是使用保存在寄存器里的備份(雖然讀寫寄存器比讀寫內存快)。

回答不出這個問題的人是不會被雇傭的。這是區分C程序員和嵌入式系統程序員的最基本的問題。搞嵌入式的家伙們經常同硬件、中斷、RTOS等等打交道,所有這些都要求用到volatile變量。不懂得volatile的內容將會帶來災難。

以下幾種情況都會用到volatile:

1、并行設備的硬件寄存器(如:狀態寄存器)2、一個中斷服務子程序中會訪問到的非自動變量3、多線程應用中被幾個任務共享的變量

8、const常量和#define的區別(編譯階段、安全性、內存占用等)

用#define max 100 ; 定義的常量是沒有類型的(不進行類型安全檢查,可能會產生意想不到的錯誤),所給出的是一個立即數,編譯器只是把所定義的常量值與所定義的常量的名字聯系起來,define所定義的宏變量在預處理階段的時候進行替換,在程序中使用到該常量的地方都要進行拷貝替換;

用const int max = 255 ; 定義的常量有類型(編譯時會進行類型檢查)名字,存放在內存的靜態區域中,在編譯時確定其值。在程序運行過程中const變量只有一個拷貝,而#define所定義的宏變量卻有多個拷貝,所以宏定義在程序運行過程中所消耗的內存要比const變量的大得多

9、變量的作用域(全局變量和局部變量)

全局變量:在所有函數體的外部定義的,程序的所在部分(甚至其它文件中的代碼)都可以使用。全局變量不受作用域的影響(也就是說,全局變量的生命期一直到程序的結束)。

局部變量:出現在一個作用域內,它們是局限于一個函數的。局部變量經常被稱為自動變量,因為它們在進入作用域時自動生成,離開作用域時自動消失。關鍵字auto可以顯式地說明這個問題,但是局部變量默認為auto,所以沒有必要聲明為auto。

局部變量可以和全局變量重名,在局部變量作用域范圍內,全局變量失效,采用的是局部變量的值。

10、sizeof 與strlen (字符串,數組)

1.如果是數組

  1. #include<stdio.h> 
  2. int main() 
  3.     int a[5]={1,2,3,4,5}; 
  4.     printf(“sizeof  數組名=%d\n”,sizeof(a)); 
  5.     printf(“sizeof *數組名=%d\n”,sizeof(*a)); 

運行結果

  1. sizeof  數組名=20 
  2. sizeof *數組名=4 

2.如果是指針,sizeof只會檢測到是指針的類型,指針都是占用4個字節的空間(32位機)。

sizeof是什么?是一個操作符,也是關鍵字,就不是一個函數,這和strlen()不同,strlen()是一個函數。

那么sizeof的作用是什么?返回一個對象或者類型所占的內存字節數。我們會對sizeof()中的數據或者指針做運算嗎?基本不會。例如sizeof(1+2.0),直接檢測到其中類型是double,即是sizeof(double) = 8。如果是指針,sizeof只會檢測到是指針的類型,指針都是占用4個字節的空間(32位機)。

  1. char *p = "sadasdasd"
  2. sizeof(p):4 
  3. sizeof(*p):1//指向一個char類型的 

除非使用strlen(),僅對字符串有效,直到'\0'為止了,計數結果不包括\0。

要是非要使用sizeof來得到指向內容的大小,就得使用數組名才行, 如

  1. char a[10]; 
  2. sizeof(a):10  //檢測到a是一個數組的類型。 

 

關于strlen(),它是一個函數,考察的比較簡單:

  1. strlen “\n\t\tag\AAtang” 

答案:11

11、經典的sizeof(struct)和sizeof(union)內存對齊

內存對齊作用:

1.平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。

2.性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。

結構體struct內存對齊的3大規則:

1.對于結構體的各個成員,第一個成員的偏移量是0,排列在后面的成員其當前偏移量必須是當前成員類型的整數倍;

2.結構體內所有數據成員各自內存對齊后,結構體本身還要進行一次內存對齊,保證整個結構體占用內存大小是結構體內最大數據成員的最小整數倍;

3.如程序中有#pragma pack(n)預編譯指令,則所有成員對齊以n字節為準(即偏移量是n的整數倍),不再考慮當前類型以及最大結構體內類型。

  1. #pragma pack(1) 
  2.   
  3. struct fun{ 
  4.   int i; 
  5.   double d; 
  6.   char c; 
  7. }; 

sizeof(fun) = 13

  1. struct CAT_s 
  2.     int ld; 
  3.     char Color; 
  4.     unsigned short Age; 
  5.     char *Name
  6.     void(*Jump)(void); 
  7. }Garfield; 

1.使用32位編譯,int占4, char 占1, unsigned short 占2,char* 占4,函數指針占4個,由于是32位編譯是4字節對齊,所以該結構體占16個字節。(說明:按幾字節對齊,是根據結構體的最長類型決定的,這里是int是最長的字節,所以按4字節對齊);

2.使用64位編譯 ,int占4, char 占1, unsigned short 占2,char* 占8,函數指針占8個,由于是64位編譯是8字節對齊(說明:按幾字節對齊,是根據結構體的最長類型決定的,這里是函數指針是最長的字節,所以按8字節對齊)所以該結構體占24個字節。

  1. //64位 
  2. struct C  
  3. {  
  4.  double t;   //8   1111 1111 
  5.  char b;  //1      1 
  6.  int a;   //4      0001111   
  7.  short c;  //2     11000000 
  8. };   
  9.  sizeof(C) = 24;  //注意:1 4 2 不能拼在一起 

char是1,然后在int之前,地址偏移量得是4的倍數,所以char后面補三個字節,也就是char占了4個字節,然后int四個字節,最后是short,只占兩個字節,但是總的偏移量得是double的倍數,也就是8的倍數,所以short后面補六個字節

聯合體union內存對齊的2大規則:

1.找到占用字節最多的成員;

2.union的字節數必須是占用字節最多的成員的字節的倍數,而且需要能夠容納其他的成員

  1. //x64 
  2. typedef union { 
  3.     long i; 
  4.     int k[5]; 
  5.     char c; 
  6. }D 

要計算union的大小,首先要找到占用字節最多的成員,本例中是long,占用8個字節,int k[5]中都是int類型,仍然是占用4個字節的,然后union的字節數必須是占用字節最多的成員的字節的倍數,而且需要能夠容納其他的成員,為了要容納k(20個字節),就必須要保證是8的倍數的同時還要大于20個字節,所以是24個字節。

引申:位域(大疆筆試題)

C語言允許在一個結構體中以位為單位來指定其成員所占內存長度,這種以位為單位的成員稱為“位段”或稱“位域”( bit field) 。利用位段能夠用較少的位數存儲數據。一個位段必須存儲在同一存儲單元中,不能跨兩個單元。如果第一個單元空間不能容納下一個位段,則該空間不用,而從下一個單元起存放該位段。

1.位段聲明和結構體類似

2.位段的成員必須是int、unsigned int、signed int

3.位段的成員名后邊有一個冒號和一個數字

  1. typedef struct_data{ 
  2.    char m:3; 
  3.    char n:5; 
  4.    short s; 
  5.      
  6.    union
  7.    int a; 
  8.    char b; 
  9.    }; 
  10.      
  11.    int h; 
  12. }_attribute_((packed)) data_t; 

答案12

m和n一起,剛好占用一個字節內存,因為后面是short類型變量,所以在short s之前,應該補一個字節。所以m和n其實是占了兩個字節的,然后是short兩個個字節,加起來就4個字節,然后聯合體占了四個字節,總共8個字節了,最后int h占了四個字節,就是12個字節了

attribute((packed)) 取消對齊

GNU C的一大特色就是__attribute__機制。__attribute__可以設置函數屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。

__attribute__書寫特征是:__attribute__前后都有兩個下劃線,并且后面會緊跟一對括弧,括弧里面是相應的__attribute__參數。

跨平臺通信時用到。不同平臺內存對齊方式不同。如果使用結構體進行平臺間的通信,會有問題。例如,發送消息的平臺上,結構體為24字節,接受消息的平臺上,此結構體為32字節(只是隨便舉個例子),那么每個變量對應的值就不對了。

不同框架的處理器對齊方式會有不同,這個時候不指定對齊的話,會產生錯誤結果

12、inline函數

在C語言中,如果一些函數被頻繁調用,不斷地有函數入棧,即函數棧,會造成棧空間或棧內存的大量消耗。為了解決這個問題,特別的引入了inline修飾符,表示為內聯函數。

大多數的機器上,調用函數都要做很多工作:調用前要先保存寄存器,并在返回時恢復,復制實參,程序還必須轉向一個新位置執行C++中支持內聯函數,其目的是為了提高函數的執行效率,用關鍵字 inline 放在函數定義(注意是定義而非聲明)的前面即可將函數指定為內聯函數,內聯函數通常就是將它在程序中的每個調用點上“內聯地”展開。

內聯是以代碼膨脹(復制)為代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。

13、內存四區,什么變量分別存儲在什么區域,堆上還是棧上。

 


 

文字常量區,叫.rodata,不可以改變,改變會導致段錯誤

  1. int a0=1; 
  2. static int a1; 
  3. const static a2=0; 
  4. extern int a3; 
  5.  
  6. void fun(void) 
  7.  int a4; 
  8.  volatile int a5; 
  9.  return

a0 :全局初始化變量;生命周期為整個程序運行期間;作用域為所有文件;存儲位置為data段。

a1 :全局靜態未初始化變量;生命周期為整個程序運行期間;作用域為當前文件;儲存位置為BSS段。

a2 :全局靜態變量

a3 :全局初始化變量;其他同a0。

a4 :局部變量;生命周期為fun函數運行期間;作用域為fun函數內部;儲存位置為棧。

a5 :局部易變變量;

14、使用32位編譯情況下,給出判斷所使用機器大小端的方法。


聯合體方法判斷方法:利用union結構體的從低地址開始存,且同一時間內只有一個成員占有內存的特性。大端儲存符合閱讀習慣。聯合體占用內存是最大的那個,和結構體不一樣。

a和c公用同一片內存區域,所以更改c,必然會影響a的數據

  1. #include<stdio.h> 
  2.  
  3. int main(){ 
  4.   union w 
  5.   { 
  6.       int a; 
  7.       char b; 
  8.   }c; 
  9.   c.a = 1; 
  10.   if(c.b == 1) 
  11.    printf("小端存儲\n"); 
  12.   else 
  13.    printf("大端存儲\n"); 
  14.  return 0; 

指針方法

通過將int強制類型轉換成char單字節,p指向a的起始字節(低字節)

  1. #include <stdio.h> 
  2. int main () 
  3.     int a = 1; 
  4.     char *p = (char *)&a; 
  5.     if(*p == 1) 
  6.     { 
  7.         printf("小端存儲\n"); 
  8.     } 
  9.     else 
  10.     { 
  11.         printf("大端存儲\n"); 
  12.     } 
  13.     return 0; 

15、用變量a給出下面的定義

  1. a) 一個整型數; 
  2. b)一個指向整型數的指針; 
  3. c)一個指向指針的指針,它指向的指針是指向一個整型數; 
  4. d)一個有10個整型的數組; 
  5. e)一個有10個指針的數組,該指針是指向一個整型數; 
  6. f)一個指向有10個整型數數組的指針; 
  7. g)一個指向函數的指針,該函數有一個整型參數并返回一個整型數; 
  8. h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并返回一個整型數 
  9. 答案: 
  10. a)int a 
  11. b)int *a; 
  12. c)int **a; 
  13. d)int a[10]; 
  14. e)int *a [10]; 
  15. f) int a[10], *p=a; 
  16. g)int (*a)(int
  17. h) int( *a[10])(int

16、與或非,異或。運算符優先級

sum=a&b<

其中a=3,b=5,c=4(先加再移位再&再異或)答案4


第三章網絡編程

1 、TCP、UDP的區別

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數據。

UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是并不能保證它們能到達目的地。

1)TCP是面向連接的,UDP是面向無連接的

2)UDP程序結構較簡單

3)TCP是面向字節流的,UDP是基于數據報的

4)TCP保證數據正確性,UDP可能丟包

5)TCP保證數據順序到達,UDP不保證

2 、TCP、UDP的優缺點

TCP優點:可靠穩定

TCP的可靠體現在TCP在傳輸數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完之后,還會斷開來連接用來節約系統資源。

TCP缺點:慢,效率低,占用系統資源高,易被攻擊

在傳遞數據之前要先建立連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞機制等都會消耗大量時間,而且要在每臺設備上維護所有的傳輸連接。然而,每個連接都會占用系統的CPU,內存等硬件資源。因為TCP有確認機制、三次握手機制,這些也導致TCP容易被利用,實現DOS、DDOS、CC等攻擊。

UDP優點:快,比TCP稍安全

UDP沒有TCP擁有的各種機制,是一種無狀態的傳輸協議,所以傳輸數據非常快,沒有TCP的這些機制,被攻擊利用的機會就少一些,但是也無法避免被攻擊。

UDP缺點:不可靠,不穩定

因為沒有TCP的這些機制,UDP在傳輸數據時,如果網絡質量不好,就會很容易丟包,造成數據的缺失。

3 、TCP UDP適用場景

TCP:傳輸一些對信號完整性,信號質量有要求的信息。

UDP:對網絡通訊質量要求不高時,要求網絡通訊速度要快的場景。

4、 TCP為什么是可靠連接?

因為tcp傳輸的數據滿足3大條件,不丟失,不重復,按順序到達。

5、OSI典型網絡模型,簡單說說有哪些


6、三次握手、四次揮手

三次握手


1、TCP服務器進程先創建傳輸控制塊TCB,時刻準備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態;

2、TCP客戶進程也是先創建傳輸控制塊TCB,然后向服務器發出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。

3、TCP服務器收到請求報文后,如果同意連接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,但是同樣要消耗一個序號。

4、TCP客戶進程收到確認后,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。

5、當服務器收到客戶端的確認后也進入ESTABLISHED狀態,此后雙方就可以開始通信了。

四次揮手


1、客戶端進程發出連接釋放報文,并且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等于前面已經傳送過來的數據的最后一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。

2、服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,并且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。

3、客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)。

4、服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由于在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。

5、客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2∗ *∗MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態。

6、服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

第四章常見算法

十種常見排序算法可以分為兩大類:

非線性時間比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。

線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此稱為線性時間非比較類排序。


算法優劣評價術語

穩定性:

穩定:如果 a 原本在 b 前面,而 a = b,排序之后 a 仍然在 b 的前面;

不穩定:如果 a 原本在 b 的前面,而 a = b,排序之后 a 可能會出現在 b 的后面;

排序方式:

內排序:所有排序操作都在內存中完成,占用常數內存,不占用額外內存。

外排序:由于數據太大,因此把數據放在磁盤中,而排序通過磁盤和內存的數據傳輸才能進行,占用額外內存。

復雜度:

時間復雜度: 一個算法執行所耗費的時間。

空間復雜度: 運行完一個程序所需內存的大小。



至于各種算法的原理以及代碼實現,由于太多并且比較復雜,不在本文列出。但推薦兩本入門的書:《啊哈!算法》、《大話數據結構》。電子版我會發在交流群里。

排序算法很多,嵌入式要求的不會太多,你會冒泡排序、快速排序、插入排序就可以解決很多問題。難的比如動態規劃問題,圖的路徑問題,嵌入式考的比較少,純軟才會考這些。(大公司和獨角獸公司考的會相對難一些)

第五章Linux操作系統題目

1、 Linux內核的組成部分

Linux內核主要由五個子系統組成:進程調度,內存管理,虛擬文件系統,網絡接口,進程間通信。


2、Linux系統的組成部分

Linux系統一般有4個主要部分:

內核、shell、文件系統和應用程序。


3、用戶空間與內核通信方式有哪些?

1)系統調用。用戶空間進程通過系統調用進入內核空間,訪問指定的內核空間數據;

2)驅動程序。用戶空間進程可以使用封裝后的系統調用接口訪問驅動設備節點,以和運行在內核空間的驅動程序通信;

3)共享內存mmap。在代碼中調用接口,實現內核空間與用戶空間的地址映射,在實時性要求很高的項目中為首選,省去拷貝數據的時間等資源,但缺點是不好控制;

4)copy_to_user()、copy_from_user(),是在驅動程序中調用接口,實現用戶空間與內核空間的數據拷貝操作,應用于實時性要求不高的項目中。

以及:

  1. procfs(/proc) 
  2. sysctl (/proc/sys) 
  3. sysfs(/sys) 
  4. netlink 套接口 

4、系統調用與普通函數調用的區別

系統調用:

1.使用INT和IRET指令,內核和應用程序使用的是不同的堆棧,因此存在堆棧的切換,從用戶態切換到內核態,從而可以使用特權指令操控設備

2.依賴于內核,不保證移植性

3.在用戶空間和內核上下文環境間切換,開銷較大

4.是操作系統的一個入口點

普通函數調用:

1.使用CALL和RET指令,調用時沒有堆棧切換

2.平臺移植性好

3.屬于過程調用,調用開銷較小

4.一個普通功能函數的調用

5、內核態,用戶態的區別

內核態,操作系統在內核態運行——運行操作系統程序

用戶態,應用程序只能在用戶態運行——運行用戶程序

當一個進程在執行用戶自己的代碼時處于用戶運行態(用戶態),此時特權級最低,為3級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態。Ring3狀態不能訪問Ring0的地址空間,包括代碼和數據;當一個進程因為系統調用陷入內核代碼中執行時處于內核運行態(內核態),此時特權級最高,為0級。執行的內核代碼會使用當前進程的內核棧,每個進程都有自己的內核棧。

6、 bootloader、內核 、根文件的關系

啟動順序:bootloader->linux kernel->rootfile->app

Bootloader全名為啟動引導程序,是第一段代碼,它主要用來初始化處理器及外設,然后調用Linux內核。Linux內核在完成系統的初始化之后需要掛載某個文件系統作為根文件系統(RootFilesystem),然后加載必要的內核模塊,啟動應用程序。(一個嵌入式Linux系統從軟件角度看可以分為四個部分:引導加載程序(Bootloader),Linux內核,文件系統,應用程序。)

7 、Bootloader啟動的兩個階段:

Stage1:匯編語言

1)基本的硬件初始化(關閉看門狗和中斷,MMU(帶操作系統),CACHE。配置系統工作時鐘)

2)為加載stage2準備RAM空間

3)拷貝內核映像和文件系統映像到RAM中

4)設置堆棧指針sp

5)跳到stage2的入口點

Stage2:c語言

1)初始化本階段要使用到的硬件設備(led uart等)

2)檢測系統的內存映射

3)加載內核映像和文件系統映像

4)設置內核的啟動參數

嵌入式系統中廣泛采用的非易失性存儲器通常是Flash,而Bootloader就位于該存儲器的最前端,所以系統上電或復位后執行的第一段程序便是Bootloader。

8、 linux下檢查內存狀態的命令

  1. 1)查看進程:top 
  2. 2)查看內存:free 
  3. 3)cat /proc/meminfo 
  4. 4)vmstat 

假如一個公司服務器有很多用戶,你使用top命令,可以看到哪個同事在使用什么命令,做什么事情,占用了多少CPU。

9 、一個程序從開始運行到結束的完整過程(四個過程)

預處理(Pre-Processing)、編譯(Compiling)、匯編(Assembling)、鏈接(Linking)

10、什么是堆,棧,內存泄漏和內存溢出?

棧由系統操作,程序員不可以操作。

所以內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完后必須顯式釋放的內存。應用程序一般使用malloc,new等函數從堆中分配到一塊內存,使用完后,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用。

內存溢出:你要求分配的內存超出了系統能給你的,系統不能滿足需求,于是產生溢出。

內存越界:向系統申請了一塊內存,而在使用內存時,超出了申請的范圍(常見的有使用特定大小數組時發生內存越界)

內存溢出問題是 C 語言或者 C++ 語言所固有的缺陷,它們既不檢查數組邊界,又不檢查類型可靠性(type-safety)。眾所周知,用 C/C++ 語言開發的程序由于目標代碼非常接近機器內核,因而能夠直接訪問內存和寄存器,這種特性大大提升了 C/C++ 語言代碼的性能。只要合理編碼,C/C++ 應用程序在執行效率上必然優于其它高級語言。然而,C/C++ 語言導致內存溢出問題的可能性也要大許多。

11、死鎖的原因、條件

產生死鎖的原因主要是:

(1) 因為系統資源不足。

(2) 進程運行推進的順序不合適。

(3) 資源分配不當等。

如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

(1) 互斥條件:一個資源每次只能被一個進程使用。

(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。

(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。

12、硬鏈接與軟鏈接

鏈接操作實際上是給系統中已有的某個文件指定另外一個可用于訪問它的名稱。對于這個新的文件名,我們可以為之指定不同的訪問權限,以控制對信息的共享和安全性的問題。如果鏈接指向目錄,用戶就可以利用該鏈接直接進入被鏈接的目錄而不用打一大堆的路徑名。而且,即使我們刪除這個鏈接,也不會破壞原來的目錄。

1>硬鏈接

硬鏈接只能引用同一文件系統中的文件。它引用的是文件在文件系統中的物理索引(也稱為inode)。當您移動或刪除原始文件時,硬鏈接不會被破壞,因為它所引用的是文件的物理數據而不是文件在文件結構中的位置。硬鏈接的文件不需要用戶有訪問原始文件的權限,也不會顯示原始文件的位置,這樣有助于文件的安全。如果您刪除的文件有相應的硬鏈接,那么這個文件依然會保留,直到所有對它的引用都被刪除。

2>軟鏈接(符號鏈接)

軟連接,其實就是新建立一個文件,這個文件就是專門用來指向別的文件的(那就和windows 下的快捷方式的那個文件有很接近的意味)。軟連接產生的是一個新的文件,但這個文件的作用就是專門指向某個文件的,刪了這個軟連接文件,那就等于不需要這個連接,和原來的存在的實體原文件沒有任何關系,但刪除原來的文件,則相應的軟連接不可用。

13、計算機中,32bit與64bit有什么區別

64bit計算主要有兩大優點:可以進行更大范圍的整數運算;可以支持更大的內存。

64位操作系統下的虛擬內存空間大小:地址空間大小不是2^32,也不是2^64,而一般是2^48。因為并不需要2^64那么大的尋址空間,過大的空間只會造成資源的浪費。所以64位Linux一般使用48位表示虛擬空間地址,40位標識物理地址。

14、中斷和異常的區別

內中斷:同步中斷(異常)是由cpu內部的電信號產生的中斷,其特點為當前執行的指令結束后才轉而產生中斷,由于有cpu主動產生,其執行點必然是可控的。

外中斷:異步中斷是由cpu的外設產生的電信號引起的中斷,其發生的時間點不可預期。

15、中斷怎么發生,中斷處理流程

請求中斷→響應中斷→關閉中斷→保留斷點→中斷源識別→保護現場→中斷服務子程序→恢復現場→中斷返回。


16、 Linux 操作系統掛起、休眠、關機相關命令

關機命令有halt, init 0, poweroff ,shutdown -h 時間,其中shutdown是最安全的

重啟命令有reboot,init 6,,shutdow -r時間

在linux命令中reboot是重新啟動,shutdown -r now是立即停止然后重新啟動

具體可用參數可以百度。

17、說一個linux下編譯優化選項:

加:-o

18、在有數據cache情況下,DMA數據鏈路為:

外設-DMA-DDR-cache-CPU

19、linux命令

1、改變文件屬性的命令:chmod (chmod 777 /etc/squid 運行命令后,squid文件夾(目錄)的權限就被修改為777(可讀可寫可執行))

2、查找文件中匹配字符串的命令:grep

3、查找當前目錄:pwd

4、刪除目錄:rm -rf 目錄名

5、刪除文件:rm 文件名

6、創建目錄(文件夾):mkdir

7、創建文件:touch

8、vi和vim 文件名也可以創建

9、解壓:tar -xzvf 壓縮包

打包:tar -cvzf 目錄(文件夾)

10、查看進程對應的端口號

  1. 1、先查看進程pid 
  2. ps -ef | grep 進程名 
  3.  
  4. 2、通過pid查看占用端口 
  5. netstat -nap | grep 進程pid 

20、硬實時系統和軟實時系統

軟實時系統:

Windows、Linux系統通常為軟實時,當然有補丁可以將內核做成硬實時的系統,不過商用沒有這么做的。

硬實時系統:

對時間要求很高,限定時間內不管做沒做完必須返回。

VxWorks,uCOS,FreeRTOS,WinCE,RT-thread等實時系統;

21、MMU基礎

現代操作系統普遍采用虛擬內存管理(Virtual Memory Management) 機制,這需要MMU( Memory Management Unit,內存管理單元) 的支持。有些嵌入式處理器沒有MMU,則不能運行依賴于虛擬內存管理的操作系統。

也就是說:操作系統可以分成兩類,用MMU的、不用MMU的。

用MMU的是:Windows、MacOS、Linux、Android;不用MMU的是:FreeRTOS、VxWorks、UCOS……

與此相對應的:CPU也可以分成兩類,帶MMU的、不帶MMU的。

帶MMU的是:Cortex-A系列、ARM9、ARM11系列;

不帶MMU的是:Cortex-M系列……(STM32是M系列,沒有MMU,不能運行Linux,只能運行一些UCOS、FreeRTOS等等)。

MMU就是負責虛擬地址(virtual address)轉化成物理地址(physical address),轉換過程比較復雜,可以自行百度。

第六章 單片機常見面試題

1、ROM與RAM

這一點我另一篇文章講解過,這里放鏈接:

ROM與RAM的區別

2、 IO口工作方式(學過STM32的人應該很熟悉)

上拉輸入、下拉輸入、推挽輸出、開漏輸出。

3、請說明總線接口USRT、I2C、USB的異同點

(串/并、速度、全/半雙工、總線拓撲等)


4、IIC協議時序圖

必須會畫出來,我面試被問到過,讓我畫,我畫了個大概。

IIC協議有兩根線,一根SCL時鐘線,一根SDA數據線,如圖可以看到開始信號和結束信號的電平狀態。開始后,因為IIC總線可以掛在很多設備(不超過8個),所以先發送一個設備地址,選中這個設備,設備地址最后一位代表了是寫還是讀。選中設備后,再發送寄存器地址,代表選中某個寄存器,再開始傳輸數據。

八位設備地址=7位從機地址+讀/寫地址,

再給地址添加一個方向位位用來表示接下來數據傳輸的方向,

0表示主設備向從設備(write)寫數據,

1表示主設備向從設備(read)讀數據


開始信號:SCL 為高電平時,SDA 由高電平向低電平跳變,開始傳送數據。

結束信號:SCL 為高電平時,SDA 由低電平向高電平跳變,結束傳送數據。

應答信號:接收數據的 IC 在接收到 8bit 數據后,向發送數據的 IC 發出特定的低電平脈沖,表示已收到數據。CPU 向受控單元發出一個信號后,等待受控單元發出一個應答信號,CPU 接收到應答信號后,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現故障。

IIC信號在數據傳輸過程中,當SCL=1高電平時,數據線SDA必須保持穩定狀態,不允許有電平跳變,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。SCL=1時 數據線SDA的任何電平變換會看做是總線的起始信號或者停止信號。

IIC我也有一篇文章有講解,請看鏈接:

IIC總線最多可以掛多少個設備

5、單片機的SP指針始終指向

棧頂

6、IIC總線在傳送數據過程中共有三種類型信號:

它們分別是:開始信號、結束信號和應答信號。

7、FIQ中斷向量入口地址:

FIQ和IRQ是兩種不同類型的中斷,ARM為了支持這兩種不同的中斷,提供了對應的叫做FIQ和IRQ處理器模式(ARM有7種處理模式)。

FIQ的中斷向量地址在0x0000001C,而IRQ的在0x00000018。

8、SPI四種模式,簡述其中一種模式,畫出時序圖

在芯片資料上極性和相位一般表示為CPOL(Clock POLarity)和CPHA(Clock PHAse), 極性和相位組合成4種工作模式。


spi四種模式SPI的相位(CPHA)和極性(CPOL)分別可以為0或1,對應的4種組合構成了SPI的4種模式(mode)

Mode 0 CPOL=0, CPHA=0

Mode 1 CPOL=0, CPHA=1

Mode 2 CPOL=1, CPHA=0

Mode 3 CPOL=1, CPHA=1

時鐘極性CPOL: 即SPI空閑時,時鐘信號SCLK的電平(1:空閑時高電平; 0:空閑時低電平) 時鐘相位CPHA: 即SPI在SCLK第幾個邊沿開始采樣(0:第一個邊沿開始; 1:第二個邊沿開始)

sd卡的spi常用的是mode 0 和mode 3,這兩種模式的相同的地方是都在時鐘上升沿采樣傳輸數據,區別這兩種方式的簡單方法就是看空閑時,時鐘的電平狀態,低電平為mode 0 ,高電平為mode 3。

具體的通信過程請自行百度,2021年秋招大疆筆試題考了這道題。

第七章 雜項面試題

1、講一講馮諾依曼和哈佛體系的區別

哈佛結構是一種將程序指令存儲和數據存儲分開的存儲器結構。目前使用哈佛結構的中央處理器和微控制器有很多,ARM9、ARM10和ARM11,51單片機屬于哈佛結構。

馮·諾伊曼結構也稱普林斯頓結構,是一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。

2、面向對象編程的三大特性

以及重載的意思。重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。

3、http默認端口號

80

4、linux中mysql數據庫默認的端口是

3306

5、編程習慣小知識點

C語言編程中,單片機平臺,一般有.c和.h文件,如果一個人在.h文件中定義了一個變量,會有什么后果。(討論編程習慣的問題,我一般是只在.h文件中聲明函數,不會做變量定義;另外,編程中每一個模塊都會有對應的.c和.h文件,最終的總程序自己定義一個comm.c和comm.h去調用各個模塊,這樣的習慣我覺得還行)

if語句中如果是或運算( | ),第一個條件滿足時,第二個條件還會判斷嗎。或運算的話,當然不會,因為 0|1=1,中斷了

 

 

責任編輯:姜華 來源: 嵌入式Linux系統開發
相關推薦

2021-01-15 07:49:01

嵌入式筆試面試

2021-01-20 07:28:34

嵌入式筆試面試

2021-01-19 07:16:25

嵌入式筆試面試

2021-01-21 08:00:50

嵌入式筆試面試

2021-01-14 10:24:33

嵌入式筆試面試

2025-08-07 09:42:15

2021-02-25 16:26:35

嵌入式筆試面試

2009-06-16 14:03:16

Hibernate面試Hibernate面試

2009-06-02 15:11:11

Hibernate面試題查詢

2018-03-08 18:40:47

Java百度面試題

2011-05-19 16:30:38

軟件測試

2017-08-29 14:12:16

Java面試題

2021-10-27 11:00:30

C++語言面試

2009-05-14 09:28:16

嵌入式面試求職

2009-06-18 15:45:55

J2ee筆試

2021-03-31 10:36:33

Python面試題開發

2009-08-01 23:17:19

ASP.NET面試題目ASP.NET

2011-01-14 13:13:23

嵌入式Linux開發

2015-07-31 09:34:44

Java面試題

2009-08-18 10:30:32

點贊
收藏

51CTO技術棧公眾號

精品国产91久久久久久浪潮蜜月| 综合欧美亚洲日本| free欧美| 欧产日产国产v| 1stkiss在线漫画| 国产成人免费在线视频| 国内精品久久久久| 成人黄色免费网址| 国产欧美日韩电影| 日韩欧美在线国产| 热这里只有精品| 天天操天天射天天舔| 麻豆精品精品国产自在97香蕉 | 天天视频天天爽| 麻豆av在线播放| 国产精品网曝门| 好吊妞www.84com只有这里才有精品| 四虎影院在线免费播放| 欧美区国产区| 一区二区三区黄色| 国产香蕉精品视频| 欧美黄页免费| 一本久道中文字幕精品亚洲嫩 | 91久久综合| 日韩日本欧美亚洲| 欧美黄色一级生活片| 丁香综合av| 欧美日韩精品一区二区三区蜜桃 | 欧美xxxhd| 亚洲你懂的在线视频| 日韩理论片在线观看| 视频二区在线观看| 高清av一区二区| 成人性生交大片免费看视频直播| 台湾佬中文在线| 国内精品嫩模av私拍在线观看| 日韩有码视频在线| 国产精品成人在线视频| 亚洲婷婷伊人| 日韩av一卡二卡| www日本在线观看| 国产区二区三区| 欧美激情精品久久久久久免费| 另类春色校园亚洲| 欧美成人精品3d动漫h| 超碰成人在线播放| 91国内外精品自在线播放| 欧美性猛交xxxx乱大交3| 国产va亚洲va在线va| 2024最新电影免费在线观看| **欧美大码日韩| 亚洲五月六月| 欧美性天天影视| 国产精品私人影院| 亚洲高清视频在线观看| 不卡在线视频| 国产精品久久久久久一区二区三区| 欧美在线播放一区| 77777影视视频在线观看| 国产精品毛片久久久久久| 亚洲伊人婷婷| 国产激情视频在线| 亚洲伊人色欲综合网| 精品少妇人欧美激情在线观看| 日本无删减在线| 午夜激情一区二区三区| 欧美性久久久久| 在线观看精品| 欧美日本韩国一区| 日韩av影视大全| 激情亚洲另类图片区小说区| 日韩av在线天堂网| 免费一级做a爰片久久毛片潮| 精品久久久亚洲| 久久精品国产成人精品| 强行糟蹋人妻hd中文| 亚洲全部视频| 国产成人精品电影| 国产剧情久久久| 成人av在线网| 日本不卡二区高清三区| 免费日本一区二区三区视频| 亚洲狠狠丁香婷婷综合久久久| 亚洲精品无码国产| 亚洲资源一区| 精品国产91久久久久久| 黄色av免费在线播放| 日韩欧国产精品一区综合无码| 日韩一区二区免费高清| 欧美做受喷浆在线观看| 日韩一级毛片| 久久久综合av| 中文字幕在线一| 成人免费观看视频| 亚洲高清视频在线观看| 好吊日av在线| 欧美日韩精品高清| 中文字幕a在线观看| 欧美色爱综合| 久久久久久有精品国产| 中文字幕免费视频观看| 国产成人一级电影| 青青草国产精品| 影院在线观看全集免费观看| 色激情天天射综合网| 一个人看的视频www| 国产精品嫩草影院在线看| 俺也去精品视频在线观看| 日干夜干天天干| 国精品**一区二区三区在线蜜桃| 狠狠色狠色综合曰曰| 欧美精品自拍视频| 日本免费成人| 亚洲欧美日韩精品久久| 欧美黄色免费观看| 久久99精品国产| 欧美日韩天天操| 色网在线观看| 538prom精品视频线放| 高潮毛片无遮挡| 一区二区自拍| 亚洲a中文字幕| 在线国产91| 91成人网在线| 精品人妻少妇嫩草av无码| 精品二区视频| 国产精品我不卡| 尤物yw193can在线观看| 91精品国产全国免费观看| 日韩黄色中文字幕| 日韩精品乱码免费| 欧美成人一区二区在线| 1234区中文字幕在线观看| 日韩亚洲欧美成人一区| 我要看黄色一级片| 黑人巨大精品欧美一区| 亚洲一区bb| 久久69成人| 色多多国产成人永久免费网站 | 色婷婷综合久久久中文字幕| 成人在线电影网站| 激情六月综合| 国产亚洲欧美一区二区三区| 第一av在线| 欧美成人艳星乳罩| 精品国产乱码久久久久久老虎| 国产精品一区二区三区毛片淫片| 午夜精品久久久久久久91蜜桃| 亚洲图片你懂的| 亚洲xxx在线观看| 欧美肥老太太性生活| 国产精品一区二区在线| 日本黄色片在线观看| 欧美日韩一区中文字幕| 国产熟女高潮一区二区三区 | 91精品国产高清久久久久久91| 日韩中文字幕在线精品| 中文字幕无线精品亚洲乱码一区 | 久久久久久久久久久网 | 欧美1区2区视频| 91视频九色网站| 国产视频在线播放| 欧美一区二区三区免费观看视频| 日韩va亚洲va欧美va清高| 国产精品一级黄| 欧美这里只有精品| 欧美网色网址| 国产精品h在线观看| 网友自拍视频在线| 日韩欧美一二三| 香蕉视频一区二区| 久久女同性恋中文字幕| 亚洲精品视频导航| 欧美/亚洲一区| 好吊色欧美一区二区三区| 中文字幕系列一区| 久久久精品日本| 少妇av一区二区| 91黄视频在线| www欧美com| 99视频在线精品| 一区二区三区 日韩| 综合久久婷婷| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 99久久99久久精品国产片果冻| 国产精品无码专区av在线播放| 日韩在线观看电影完整版高清免费悬疑悬疑 | 日韩大片免费在线观看| 国产欧美日韩在线| 99国产精品免费视频| 久久精品一区二区国产| 影音先锋成人资源网站| 亚洲美女15p| 亚洲va久久久噜噜噜久久天堂| 都市激情国产精品| 日韩在线视频网| 污视频在线免费观看| 精品婷婷伊人一区三区三| 亚洲精品在线观看av| 国产欧美综合色| 小毛片在线观看| 狠狠色狠狠色综合| 国产免费一区二区三区视频| 亚洲v在线看| 日本一区视频在线播放| 丁香综合av| 亚洲iv一区二区三区| 亚洲成人激情社区| 欧美国产日韩视频| 日本在线免费播放| 亚洲欧美国产高清va在线播 | 日韩精品视频在线观看免费| 国产视频一区二区三| 在线观看日韩毛片| 欧美一区二区三区四| 尤物视频一区二区| 男人晚上看的视频| 久久女同精品一区二区| 国产午夜在线一区二区三区| 国产自产高清不卡| 欧美成人三级在线播放| 久久一区二区三区四区五区| 久久国产午夜精品理论片最新版本| 日韩一区电影| 亚洲春色在线视频| 精品久久久久久久久久久下田 | 亚洲精品久久一区二区三区777| 美国一区二区三区在线播放| 国产精品免费观看久久| 亚洲欧洲一级| 99在线精品免费视频| 欧美视频一区| 久久人妻无码一区二区| 国产精品精品| 一区二区日本伦理| 日韩欧美视频| 亚州欧美一区三区三区在线| 欧美人与拘性视交免费看| 久久久久久99| 欧美电影免费网站| 国产日韩一区二区| 美女扒开腿让男人桶爽久久动漫| 岛国视频一区免费观看| 亚洲午夜精品| 国产精品免费观看高清| 1204国产成人精品视频| 超碰97人人在线| 综合久久成人| 久草热久草热线频97精品| 美国十次av导航亚洲入口| 久久精品美女| 亚洲调教一区| 日韩在线导航| 水蜜桃久久夜色精品一区| 亚洲 欧洲 日韩| 一区二区三区在线| 福利视频免费在线观看| 亚洲精品人人| 免费无码av片在线观看| 日韩精品1区2区3区| 免费看污污网站| 精品一区二区三区欧美| 成人免费黄色av| 成人国产精品免费观看| 国产伦精品一区二区三区妓女| 久久看人人爽人人| 青青草华人在线视频| 专区另类欧美日韩| 国产精品第108页| 欧美视频不卡中文| 亚洲一级av毛片| 欧美一二三区在线| 色婷婷av一区二区三| 亚洲人成在线免费观看| 麻豆视频在线免费观看| 欧美激情第6页| 神马电影网我不卡| 成人夜晚看av| 欧美三级电影在线| 伊人久久av导航| 伊人久久大香线蕉综合热线| 国产精品免费观看久久| 狠狠久久亚洲欧美| 色呦呦一区二区| 国产精品久久久久天堂| 国产乡下妇女做爰视频| 欧美综合在线视频| 亚洲精品国产suv一区| 亚洲人成自拍网站| 日韩av激情| 国产成人啪精品视频免费网| 精品中文在线| 奇米精品在线| 国产精品xvideos88| 男女午夜激情视频| 国产美女娇喘av呻吟久久| 素人fc2av清纯18岁| 亚洲人成亚洲人成在线观看图片| 日本三级免费看| 6080亚洲精品一区二区| 三级av在线| 欧美成人剧情片在线观看| 国产 日韩 欧美一区| 99在线影院| 99久久久久| 久章草在线视频| 成人做爰69片免费看网站| 中国特黄一级片| 婷婷开心激情综合| 超碰在线观看99| 在线日韩中文字幕| 欧美伦理91| 国产精品 日韩| 亚洲激情中文| 五月婷婷丁香色| 91啪亚洲精品| 国产性70yerg老太| 91麻豆精品国产91久久久 | 97精品人妻一区二区三区在线 | 亚洲一区二区自偷自拍| 亚洲一区二区视频在线观看| 国产一区二区女内射| 一区二区三区无码高清视频| 麻豆成全视频免费观看在线看| 99re在线视频观看| 亚洲天堂一区二区三区四区| 91香蕉视频导航| 久久精品一二三| 久久久精品福利| 亚洲级视频在线观看免费1级| av官网在线播放| 成人在线视频网站| 日韩精品永久网址| 天堂社区在线视频| 久久精品免费在线观看| 久久久久久久久黄色| 日韩电影中文字幕在线| а√在线中文在线新版| 国产精品视频免费一区| 亚洲视频一区| 国产精品果冻传媒| 亚洲电影在线播放| 刘亦菲毛片一区二区三区| 欧美日产国产成人免费图片| 久久伊人久久| 99er在线视频| 丰满少妇久久久久久久| 免费一级肉体全黄毛片| 欧美成人精品二区三区99精品| 国产嫩草在线视频| 国产精品伊人日日| 99国产精品私拍| 极品粉嫩小仙女高潮喷水久久| 婷婷中文字幕综合| 欧美在线观看在线观看| 日本欧美精品在线| 青青草97国产精品麻豆| 免费精品99久久国产综合精品应用| 中文字幕av免费专区久久| 在线中文字幕网站| 久久香蕉频线观| 欧美影院精品| 少妇高潮毛片色欲ava片| 久久综合999| 精品乱码一区内射人妻无码| 日韩在线免费高清视频| 中文在线综合| 无码人妻丰满熟妇区96| 国产清纯美女被跳蛋高潮一区二区久久w| 中文在线a天堂| 久久久成人精品| 麻豆精品少妇| 污视频网站观看| 一级日本不卡的影视| 日本一级在线观看| 国产精品偷伦一区二区| 亚洲综合色站| 三级黄色片网站| 欧美精品v国产精品v日韩精品| 人妖欧美1区| 欧美高清性xxxxhd| 精品一二三四区| 日本在线视频免费| 日日骚久久av| 日本久久成人网| 91精产国品一二三产区别沈先生| 亚洲资源在线观看| 国产黄色免费在线观看| 91视频免费在线| 国产日韩精品视频一区二区三区| 欧美福利第一页| 亚洲电影免费观看高清完整版在线| 欧美18—19sex性hd| 99中文字幕在线观看| 久久久综合精品| 国产人妖在线播放| 国产va免费精品高清在线观看| 亚洲女同中文字幕| 欧美成人国产精品一区二区| 精品999在线播放|