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

歡迎訪問 生活随笔!

生活随笔

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

linux

嵌入式linux学习笔记(2)

發布時間:2023/12/10 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式linux学习笔记(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

筆記目錄

  • 學習目標
  • 學習內容
    • 一、VI 編輯器的設置
      • 1、設置 TAB 鍵為 4 字節
      • 2、VIM 編輯器顯示行號
      • 3.VI/VIM 編輯器使用空格代替了 TAB 鍵
    • 二、存儲
      • 1、ROM
      • 2、RAM
      • 3、FLASH
    • 三、Makefile語法
      • 重要提醒
      • 1、Makefile作用
      • 2、Makefile 規則格式
      • 3、gcc命令
      • 4、Makefile 變量
    • 四、U-Boot
      • 1、U-Boot 簡介
      • 2、U-Boot編譯
      • 3、U-Boot 一些命令
      • 4、uboot啟動linux測試
        • 從emmc啟動
        • 從網絡啟動
          • 在ubuntu上搭建tftp服務器
          • 配置網絡
      • 5、U-Boot 頂層makefile部分
      • 6、U-Boot 圖形化配置
      • 7、uboot移植
    • 五、linux內核
      • 1、linux內核編譯
      • 2、重要的文件夾
    • 六、根文件系統
      • 1、根文件系統介紹
      • 2、根文件系統的目錄
      • 3、BusyBox
        • 編譯 busybox
          • busybox編譯
          • 向根文件系統添加 lib 庫
    • 七、Linux 驅動開發
      • 1.字符設備驅動
    • 八、設備樹
  • 學習時間
  • 學習產出

學習目標

學習linux開發


學習內容

一、VI 編輯器的設置

vi 打開文件/etc/vim/vimrc

1、設置 TAB 鍵為 4 字節

VI 編輯器默認 TAB 鍵為 8 空格,為了使代碼更好看我們改成 4 空格。
在此文件最后面輸入如下代碼:set ts=4

2、VIM 編輯器顯示行號

在此文件最后面輸入如下代碼:set nu

3.VI/VIM 編輯器使用空格代替了 TAB 鍵

在此文件最后面輸入如下代碼:set noexpandtab



二、存儲

1、ROM

ROM是只讀內存,其特性是一旦儲存資料就無法再將之改變或刪除,存儲的資料不會因為電源關閉而消失。

2、RAM

RAM是隨機存儲,掉電不會保存數據。
??SRAM(靜態隨機訪問存儲器)不需要刷新電路即能保存它內部存儲的數據
??DRAM (動態隨機訪問存儲器)只能將數據保持很短的時間。為了保持數據,DRAM使用電容存儲,所以 必須隔一段時間刷新(refresh)一次,如果存儲單元沒有被刷新,存儲的信息就會丟失。
??SDRAM(同步動態隨機訪問存儲器)同步是指 Memory工作需要同步時鐘,內部的命令的發送與數據的傳輸都以它為基準。傳統的DRAM在兩個讀周期之間需要等待一段時間,用于充電操作。而SDRAM一個模組有兩個bank,在對一個bank充電時,可以操作另一個bank,實現流水線。SDRAM的發展已經經歷了五代:分別是SDR SDRAM、 DDR SDRAM、 DDR2 SDRAM、 DDR3 SDRAM、 DDR4 SDRAM。

3、FLASH

FLASH 存儲器又稱閃存,它結合了ROM和RAM的長處,不僅具備電子可擦除可編程(EEPROM)的性能,還不會斷電丟失數據同時可以快速讀取數據(NVRAM 的優勢)。

??NOR Flash和NAND Flash區別
????NOR的讀速度比NAND稍快一些。
????NAND的寫入速度比NOR快很多。
????NAND的4ms擦除速度遠比NOR的5s快。
????大多數寫入操作需要先進行擦除操作。
????NAND的擦除單元更小,相應的擦除電路更少。


EMMC=NAND閃存+閃存控制芯片+標準接口封裝(對廠家而言簡化了電路設計,降低了成本。)
DDR屬于SDRAM
NANO FLASH屬于flash

使用emmc的好處是,除了得到大容量的空間(這一點,只用NAND FLASH多堆疊也可以做到),還有就是emmc可以管理NAND (壞塊處理,ECC,FFS)等。



三、Makefile語法

重要提醒

Makefile 里面是由一系列的規則組成的。
Makefile在編寫時不能使用空格只能用TAB鍵,否則會報錯。
Makefile:12: *** 遺漏分隔符 (null)。 停止。

1、Makefile作用

make 的執行過程,make 工具就是在 Makefile 中一層一層的查找依賴關系,并執行
相應的命令。編譯出最終的可執行文件。
Makefile 的好處就是“自動化編譯”,一旦寫好了 Makefile文件,以后只需要一個 make 命令即可完成整個工程的編譯,極大的提高了開發效率。

2、Makefile 規則格式

?目標… : 依賴文件集合…
??命令 1
??命令 2
??…

3、gcc命令

gcc [選項] [文件名字]
?主要選項如下:
??-c:只編譯不鏈接為可執行文件,編譯器將輸入的.c 文件編譯為.o 的目標文件。
??-o:<輸出文件名> 用來指定編譯結束以后的輸出文件名,如果使用這個選項的話 GCC 默
認編譯出來的可執行文件名字為 a.out。
??-g:添加調試信息,如果要使用調試工具(如 GDB)的話就必須加入此選項,此選項指示編
譯的時候生成調試所需的符號信息。
??-O:對程序進行優化編譯,如果使用此選項的話整個源代碼在編譯、鏈接的的時候都會進
行優化,這樣產生的可執行文件執行效率就高。
??-O2:比-O 更幅度更大的優化,生成的可執行效率更高,但是整個編譯過程會很慢。

簡單的例程:

main: main.o input.o calcu.o #需要main.o input.o等文件生成maingcc -o main #編譯的最終目標是生成一個可執行文件main main.o: main.c #需要的main.o文件由main.c文件生成gcc -c main.c #編譯main.c生成main.o input.o: input.cgcc -c input.c calcu.o: calcu.cgcc -c calcu.cclean: #執行make clean清理文件rm *.orm main

??在第一次編譯的時候由于 main 還不存在,因此第一條規則會執行,第一條規則依賴于文件 main.o、 input.o 和 calcu.o這個三個.o 文件,這三個.o 文件目前還都沒有,因此必須先更新這三個文件。make 會查找以這三個.o 文件為目標的規則并執行。以 main.o 為例,發現更新 main.o 的是第二條規則,因此會執行第二條規則,第二條規則里面的命令為“gcc –c main.c”,這行命令很熟悉了吧,就是不鏈接編譯 main.c,生成 main.o,其它兩個.o 文件同理。最后一個規則目標是 clean,它沒有依賴文件,因此會默認為依賴文件都是最新的,所以其對應的命令不會執行,當我們想要執行 clean 的話可以直接使用命令“make clean”,執行以后就會刪除當前目錄下所有的.o 文件以及 main。

4、Makefile 變量

Makefile 中變量的引用方法是"$(變量名)"
注釋"#"

#Makefile 變量的使用 objects = main.o input.o calcu.omain: $(objects) gcc -o main $(objects) 賦值符“?=”
變量追加“+=”


四、U-Boot

1、U-Boot 簡介


Linux 系統要啟動就必須需要一個 bootloader 程序,也就說芯片上電以后先運行一段bootloader 程序。這段 bootloader 程序會先初始化 DDR 等外設,然后將 Linux 內核從 flash(NAND,NOR FLASH,SD,MMC 等)拷貝到 DDR 中,最后啟動 Linux 內核。

2、U-Boot編譯

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格) mx6ull_14x14_ddr512_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

ARCH=arm 設置目標為 arm 架構,CROSS_COMPILE 指定所使用的交叉編譯器。
第一條命令相當于“make distclean”,目的是清除工程,一般在第一次編譯的時候最好清理一下工程。
第二條指令相當于“make mx6ull_14x14_ddr512_emmc_defconfig”,用于配置 uboot,配置文件為mx6ull_14x14_ddr512_emmc_defconfig。(14x14代表芯片的封裝大小)
最后一條指令相當于 “make -j12”也就是使用 12 核來編譯 uboot。

在頂層的makefile輸入

ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-
可以make后面不用加
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

3、U-Boot 一些命令

uboot 命令中的數字都是十六進制的!不是十進制的!
進入 uboot 的命令行模式

命令含義備注
help/?幫助help/?命令名
bdinfo查看板子信息DRAM 的起始地址和大小、啟動參數保存起始地址、波特率、sp(堆棧指針)起始地址等信息
printenv輸出環境變量信息
version查看 uboot 的版本號
setenv設置環境變量字符串中有空格需要使用單引號‘’將其括起來
saveenv保存修改的環境變量刪除一個環境變量只要給這個環境變量賦空值
md顯示內存值md[.b, .w, .l] address [# of objects]命令中的[.b .w .l]對應 byte、word 和 long,也就是分別以 1 個字節、2 個字節、4 個字節來顯示內存值。address 就是要查看的內存起始地址,[# of objects]表示要查看的數據長度,這個數據長度單位不是字節,而是跟你所選擇的顯示格式有關。(md.b 80000000 14)
nm修改指定地址的內存值nm [.b, .w, .l] address(nm.l 80000000)
mm修改指定地址內存值的使用 mm 修改內存值的時候地址會自增,而使用命令 nm 的話地址不會自增
mw用于使用一個指定的數據填充一段內存mw [.b, .w, .l] address value [count]mw 命令同樣可以以.b、.w 和.l 來指定操作格式, address 表示要填充的內存起始地址, value為要填充的數據, count 是填充的長度。
cp數據拷貝命令cp [.b, .w, .l] source target count cp 命令同樣可以以.b、.w 和.l 來指定操作格式,source 為源地址,target 為目的地址,count為拷貝的長度。
cmp比較兩段內存的數據是否相等cmp [.b, .w, .l] addr1 addr2 count 其中cmp 命令同樣可以以.b、.w 和.l 來指定操作格式,addr1 為第一段內存首地址,addr2 為第二段內存首地址, count 為要比較的長度。
ipaddr開發板 ip 地址使用 dhcp 命令來從路由器獲取 IP 地址
ethaddr開發板的 MAC 地址一定要設置
gatewayip網關地址
netmask子網掩碼
serverip服務器 IP 地址,也就是 Ubuntu 主機 IP 地址用于調試代碼
ping測試開發板的網絡能否使用
dhcp用于從路由器獲取 IP 地址
nfs計算機之間通過網絡來分享資源nfs [loadAddress] [[hostIPaddr:]bootfilename]其中loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下載的文件地址。分析

4、uboot啟動linux測試

從emmc啟動

emmc三個分區,第一個分區存放uboot,第二個分區格式化成FAT文件系統在里面存放.dtb和zimage文件,第三個分區放根文件系統。

首先查看emmc里面是否有系統,linux鏡像zimage和.dtb文件。先將當前設備切換到emmc

mmc dev 1 //切換到EMMC fatls mmc 1:1 //查看EMMC分區1里面的文件 fatload mmc 1:1 80800000 zImage //將zimage下載到DDR的0x80800000 fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb //將dtb下載到DDR的0x83000000 bootz 80800000 - 83000000 //啟動內核

如果內核啟動成功,說明uboot支持emmc啟動,驗證成功。

從網絡啟動

tftp服務器
需要確定ubuntu的~/linux/tftpboot文件夾下有.dtb和zimage文件

在ubuntu上搭建tftp服務器

tftp 命令的作用和 nfs 命令一樣,都是用于通過網絡下載東西到 DRAM 中,只是 tftp 命令使用的 TFTP 協議,Ubuntu 主機作為 TFTP 服務器。因此需要在 Ubuntu 上搭建 TFTP 服務器,需要安裝 tftp-hpa 和 tftpd-hpa,命令如下:

sudo apt-get install tftp-hpa tftpd-hpa sudo apt-get install xinetd

和 NFS 一樣,TFTP 也需要一個文件夾來存放文件,在用戶目錄下新建一個目錄,命令如下:

mkdir /home/wyd/linux/tftpboot chmod 777 /home/wyd/linux/tftpboot

最后配置 tftp,安裝完成以后新建文件/etc/xinetd.d/tftp,如果沒有/etc/xinetd.d 目錄的話自行創建sudo vi /etc/xinetd.d/tftp,然后在里面輸入如下內容:

service tftp {socket_type=dgramprotocol=udpwait=yesuser=rootserver=/usr/sbin/in.tftpdserver_args=-s /home/wyd/linux/tftpboot/disable=noper_source=11cps=100 2flags=IPv4}

sudo vi /etc/default/tftpd-hpa,然后在里面輸入如下內容:

# /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/home/wyd/linux/tftpboot" TFTP_ADDRESS=":69" TFTP_OPTIONS="-1 -c -s"

最后輸入如下命令, 重啟 tftp 服務器:
sudo service tftpd-hpa restart
將 zImage 鏡像等文件拷貝到 tftpboot 文件夾中,并且給予 zImage 相應的權限

cp zImage /home/wyd/linux/tftpboot/ cd /home/wyd/linux/tftpboot/ chmod 777 zImage chmod 777 tftpboot chmod 777 。。。。。

進入 uboot 的命令行模式

tftp 80800000 zImage //將 tftpboot 文件夾里面的 zImage 文件下載到開發板 DRAM 的 0X80800000 地址處 tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb //將 tftpboot 文件夾里面的 dtb 文件下載到開發板 DRAM 的 83000000 地址處 bootz 80800000 - 83000000 //啟動內核

設置 bootargs 和 bootcmd 這兩個環境變量,設置如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000' saveenv

一開始是通過 tftp 下載 zImage 和 imx6ull-alientek-emmc.dtb 這兩個文件

配置網絡
setenv ipaddr 192.168.1.10 //開發板 IP 地址 setenv ethaddr 00:04:9f:04:d2:35 //開發板網卡 MAC 地址 setenv gatewayip 192.168.1.1 //開發板默認網關 setenv netmask 255.255.255.0//開發板子網掩碼 setenv serverip 192.168.1.6 //服務器地址,也就是 Ubuntu 地址(如果不是靜態地址可能需要長期更改) saveenv //保存環境變量

ping測試

=> ping 192.168.1.6Using FEC1 devicehost 192.168.1.6 is alive

5、U-Boot 頂層makefile部分

#版本號 VERSION = 2016 #主版本號 PATCHLEVEL = 03 #修補版本號 SUBLEVEL = #次版本號 EXTRAVERSION = #附加信息 NAME = #名字#隱含規則 #隱含規則則是內建在make 中,為make 提供了重建某一類目標文件(.o 等)的通用方法,同時這些隱含規則所用到的變量也就是所謂的隱含變量。 #隱含規則的好處是在Makefile 中不需要明確給出重建某一個目標的命令,甚至可以不需要規則。make會為你自動搜尋匹配的隱含規則鏈。 #隱含規則的代價之一就是低效,系統必須搜索可能的隱含規則鏈。同時隱含規則也有可能應用了不是你想要的規則而引入很難debug的錯誤。 #變量SHELLMAKEFLAGS一樣,默認情況(沒有用“unexport”聲明)下在整個make的執行過程中被自動的傳遞給所有的子make。 #“+=”來給變量 MAKEFLAGS 追加了一些值,-rR”表示禁止使用內置的隱含規則和變量定義,--include-dir”指明搜索路徑,”$(CURDIR)”表示當前目錄 MAKEFLAGS += -rR --include-dir=$(CURDIR) #CURDIR是make的內嵌變量,自動設置為當前目錄#export將變量傳遞到子make過程,unexport禁止將變量傳遞到子make過程。 #在locale環境中,有一組變量,代表國際化環境中的不同設置,"C"是系統默認的locale: #LC_ALL是一個宏,如果該值設置了,則該值會覆蓋所有LC_*的設置值。注意,LANG的值不受該宏影響。 #LC_COLLATE定義該環境的排序和比較規則 #LC_NUMERIC非貨幣的數字顯示格式 unexport LC_ALL LC_COLLATE=C LC_NUMERIC=C export LC_COLLATE LC_NUMERIC# Avoid interference with shell env settings #根據注釋可以看到為了避免當前shell環境變量對編譯的影響,去除grep的配置選項GREP_OPTIONS; unexport GREP_OPTIONS#輸入make -j12 V=1 打印詳細信息 #判斷V的代碼是不是來自于命令行 #origin 用于告訴你變量是哪來的 ifeq ("$(origin V)", "command line")KBUILD_VERBOSE = $(V) #如果是,KBUILD_VERBOSE=1 endif ifndef KBUILD_VERBOSEKBUILD_VERBOSE = 0 endififeq ($(KBUILD_VERBOSE),1) #如果 KBUILD_VERBOSE1quiet = #quiet和 Q 都為空Q = elsequiet=quiet_Q = @ #加 @ 命令不顯示在終端 endif# If the user is running make -s (silent mode), suppress echoing of # commands#make -s 靜默輸出#判斷當前正在使用的編譯器版本號是否為 4.x#filter 是個過濾函數,函數格式如下: #$(filter <pattern...>,<text>) #filter 函數表示以 pattern 模式過濾 text 字符串中的單詞,僅保留符合模式 pattern 的單詞, #可以有多個模式。函數返回值就是符合 pattern 的字符串。因此$(filter 4.%,$(MAKE_VERSION)) #的 含 義 就 是 在 字 符 串 “ MAKE_VERSION ” 中 找 出 符 合 “ 4.% ” 的 字 (% 為 通 配 符 ) , #MAKE_VERSION 是 make 工具的版本號, #ubuntu16.04 里面默認自帶的 make 工具版本號為 4.1, ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4 #firstword 是獲取首單詞,函數格式如下: #$(firstword <text>) #firstword 函數用于取出 text 字符串中的第一個單詞,函數的返回值就是獲取到的單詞。 ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)quiet=silent_ endif else # make-3.8x ifneq ($(filter s% -s%,$(MAKEFLAGS)),)quiet=silent_ endif endif #導出 quiet Q KBUILD_VERBOSE export quiet Q KBUILD_VERBOSEifeq ($(KBUILD_SRC),)# OK, Make called in directory where kernel src resides # Do we want to locate output files in a separate directory? #make -O 指定輸出結果到某一個文件夾 ifeq ("$(origin O)", "command line")KBUILD_OUTPUT := $(O) endif# That's our default target when none is given on the command line PHONY := _all _all:# Cancel implicit rules on top Makefile $(CURDIR)/Makefile Makefile: ;ifneq ($(KBUILD_OUTPUT),) # Invoke a second make in the output directory, passing relevant variables # check that the output directory actually exists saved-output := $(KBUILD_OUTPUT) KBUILD_OUTPUT := $(shell mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) \&& /bin/pwd) $(if $(KBUILD_OUTPUT),, \$(error failed to create output directory "$(saved-output)"))PHONY += $(MAKECMDGOALS) sub-make$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make@:sub-make: FORCE$(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \-f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS))# Leave processing to above invocation of make skip-makefile := 1 endif # ifneq ($(KBUILD_OUTPUT),) endif # ifeq ($(KBUILD_SRC),)# We process the rest of the Makefile if this is the final invocation of make ifeq ($(skip-makefile),)# Do not print "Entering directory ...", # but we want to display it when entering to the output directory # so that IDEs/editors are able to understand relative filenames. MAKEFLAGS += --no-print-directory# Call a source code checker (by default, "sparse") as part of the # C compilation. # # Use 'make C=1' to enable checking of only re-compiled files. # Use 'make C=2' to enable checking of *all* source files, regardless # of whether they are re-compiled or not. # # See the file "Documentation/sparse.txt" for more details, including # where to get the "sparse" utility. #“make C=1”使能代碼檢查,檢查那些需要重新編譯的文件。 #“make C=2”用于檢查所有的源碼文件 ifeq ("$(origin C)", "command line")KBUILD_CHECKSRC = $(C) endif ifndef KBUILD_CHECKSRCKBUILD_CHECKSRC = 0 endif# Use make M=dir to specify directory of external module to build # Old syntax make ... SUBDIRS=$PWD is still supported # Setting the environment variable KBUILD_EXTMOD take precedence #編譯模塊 ifdef SUBDIRSKBUILD_EXTMOD ?= $(SUBDIRS) endififeq ("$(origin M)", "command line")KBUILD_EXTMOD := $(M) endif# If building an external module we do not care about the all: rule # but instead _all depend on modules PHONY += all ifeq ($(KBUILD_EXTMOD),) _all: all else _all: modules endififeq ($(KBUILD_SRC),)# building in the source treesrctree := . elseifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))# building in a subdirectory of the source treesrctree := ..elsesrctree := $(KBUILD_SRC)endif endif objtree := . src := $(srctree) obj := $(objtree)VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))#srctree 源碼路徑 export srctree objtree VPATH#打印變量便于調試 mytest:echo srctree=$(srctree)echo objtree=$(objtree) # Make sure CDPATH settings don't interfere unexport CDPATH######################################################################### #獲取主機架構和系統 HOSTARCH := $(shell uname -m | \sed -e s/i.86/x86/ \-e s/sun4u/sparc64/ \-e s/arm.*/arm/ \-e s/sa110/arm/ \-e s/ppc64/powerpc/ \-e s/ppc/powerpc/ \-e s/macppc/powerpc/\-e s/sh.*/sh/)HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \sed -e 's/\(cygwin\).*/cygwin/')export HOSTARCH HOSTOS########################################################################## set default to nothing for native builds #設置目標架構、交叉編譯器 ifeq ($(HOSTARCH),$(ARCH)) CROSS_COMPILE ?= endif################ ARCH ?= arm CROSS_COMPILE ?= arm-linux-gnueabihf- #################設置配置文件 KCONFIG_CONFIG ?= .config export KCONFIG_CONFIG# SHELL used by kbuild CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \else if [ -x /bin/bash ]; then echo /bin/bash; \else echo sh; fi ; fi)HOSTCC = cc HOSTCXX = c++ HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer HOSTCXXFLAGS = -O2ifeq ($(HOSTOS),cygwin) HOSTCFLAGS += -ansi endififeq ($(HOSTOS),darwin) # get major and minor product version (e.g. '10' and '6' for Snow Leopard) DARWIN_MAJOR_VERSION = $(shell sw_vers -productVersion | cut -f 1 -d '.') DARWIN_MINOR_VERSION = $(shell sw_vers -productVersion | cut -f 2 -d '.')os_x_before = $(shell if [ $(DARWIN_MAJOR_VERSION) -le $(1) -a \$(DARWIN_MINOR_VERSION) -le $(2) ] ; then echo "$(3)"; else echo "$(4)"; fi ;)# Snow Leopards build environment has no longer restrictions as described above HOSTCC = $(call os_x_before, 10, 5, "cc", "gcc") HOSTCFLAGS += $(call os_x_before, 10, 4, "-traditional-cpp") HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress")# since Lion (10.7) ASLR is on by default, but we use linker generated lists # in some host tools which is a problem then ... so disable ASLR for these # tools HOSTLDFLAGS += $(call os_x_before, 10, 7, "", "-Xlinker -no_pie") endif# Decide whether to build built-in, modular, or both. # Normally, just do built-in.KBUILD_MODULES := KBUILD_BUILTIN := 1# If we have only "make modules", don't compile built-in objects. # When we're building modules with modversions, we need to consider # the built-in objects during the descend as well, in order to # make sure the checksums are up to date before we record them.ifeq ($(MAKECMDGOALS),modules)KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1) endif# If we have "make <whatever> modules", compile modules # in addition to whatever we do anyway. # Just "make" or "make all" shall build modules as well# U-Boot does not need modules #ifneq ($(filter all _all modules,$(MAKECMDGOALS)),) # KBUILD_MODULES := 1 #endif#ifeq ($(MAKECMDGOALS),) # KBUILD_MODULES := 1 #endifexport KBUILD_MODULES KBUILD_BUILTIN export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD# We need some generic definitions (do not try to remake the file). scripts/Kbuild.include: ; #用文件 scripts/Kbuild.include 這個文件 include scripts/Kbuild.include# Make variables (CC, etc...) #交叉編譯工具變量設置 AS = $(CROSS_COMPILE)as # Always use GNU ld ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),) LD = $(CROSS_COMPILE)ld.bfd else LD = $(CROSS_COMPILE)ld endif CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm LDR = $(CROSS_COMPILE)ldr STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump AWK = awk PERL = perl PYTHON = python DTC = dtc CHECK = sparseCHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \-Wbitwise -Wno-return-void -D__CHECK_ENDIAN__ $(CF)KBUILD_CPPFLAGS := -D__KERNEL__ -D__UBOOT__KBUILD_CFLAGS := -Wall -Wstrict-prototypes \-Wno-format-security \-fno-builtin -ffreestanding KBUILD_AFLAGS := -D__ASSEMBLY__# Read UBOOTRELEASE from include/config/uboot.release (if it exists) UBOOTRELEASE = $(shell cat include/config/uboot.release 2> /dev/null) UBOOTVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION #架構(arm)cpu(arm7)板卡(mx6ullevk)供應商(freescale)soc(mx6) cpu文件所處的目錄 板子配置信息所處目錄 #config.mk定義變量 export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR export CONFIG_SHELL HOSTCC HOSTCFLAGS HOSTLDFLAGS CROSS_COMPILE AS LD CC export CPP AR NM LDR STRIP OBJCOPY OBJDUMP export MAKE AWK PERL PYTHON export HOSTCXX HOSTCXXFLAGS DTC CHECK CHECKFLAGSexport KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS LDFLAGS export KBUILD_CFLAGS KBUILD_AFLAGS# When compiling out-of-tree modules, put MODVERDIR in the module # tree rather than in the kernel tree. The kernel tree might # even be read-only. export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions# Files to ignore in find ... statementsexport RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o \-name CVS -o -name .pc -o -name .hg -o -name .git \) \-prune -o export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \--exclude CVS --exclude .pc --exclude .hg --exclude .git

6、U-Boot 圖形化配置

menuconfig是一套圖形化的配置工具,需要 ncurses 庫支持。ncurses 庫提供了一系列的 API 函數供調用者
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev

在uboot源碼的根目錄下輸入命令打開圖形化窗口
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
如果要將某個功能編譯為模塊,那就按下“M”,此時“[ ]”就會變為“< M >。

設置完成后需要重新編譯
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

7、uboot移植

uboot的燒寫有兩種方法,一種是燒寫到SD卡,一種是燒寫到EMMC中(也需要用到SD卡)。

下載NXP的uboot(NXP有一個例程板卡,仿照那個板卡改自己的板子)
編譯NXP的uboot

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

需要將SD卡格式化成FAT32的格式。
(正點原子專門編寫了一個軟件來將編譯出來的.bin 文件燒寫到 SD 卡中,這個軟件叫做“imxdownload”,軟件放到了開發板光盤中,路徑為:開發板光盤->5、開發工具->2、Ubuntu 下裸機燒寫軟件->imxdownload,imxdownlaod 只能在 Ubuntu 下使用。)
將imxdownlaod拷貝到工程根目錄下。
確定要燒寫的 SD 卡(ls /dev/sd*(我的是/dev/sdb))
使用 imxdownload 軟件將 u-boot.bin燒寫到 SD 卡中。

chmod 777 imxdownload //給予 imxdownload 可執行權限 ./imxdownload u-boot.bin /dev/sdb //燒寫 u-boot.bin 到 SD 卡中

五、linux內核

1、linux內核編譯

需要下載lzop庫,用于打包和加載zimage
sudo apt-get install lzop

編譯內核

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

編譯完成以后就會在 arch/arm/boot 這個目錄下生成一個叫做 zImage 的文件,zImage 就是我們要用的 Linux 鏡像文件。另外也會在 arch/arm/boot/dts 下生成很多.dtb 文件(imx6ull-alientek-emmc.dtb),這些.dtb 就是設備樹文件。

2、重要的文件夾

名字描述
arch架構相關目錄名
block塊設備相關目錄
crypto加密相關目錄
Documentation文檔相關目錄
drivers驅動相關目錄
firmeare固件相關目錄
fs文件系統相關目錄
include頭文件相關目錄
init初始化相關目錄
ipc進程間通信相關目錄
kernel內核相關目錄
lib庫相關目錄
mm內存管理相關目錄
net網絡相關目錄
samples例程相關目錄
scripts腳本相關目錄
security安全相關目錄
sound音頻處理相關目錄
tools工具相關目錄
usr與 initramfs 相關的目錄,用于生成initramfs
virt提供虛擬機技術(KVM)

linux頂層的makefile和uboot非常相似



六、根文件系統

1、根文件系統介紹

根文件系統首先是內核啟動時所 mount(掛載)的第一個文件系統,內核代碼映像文件保存在根文件系統中,而系統引導啟動程序會在根文件系統掛載之后從中把一些基本的初始化腳本和服務等加載到內存中去運行。

2、根文件系統的目錄

名字描述
/bin系統需要的可執行文件(ls rm…)
/dev設備文 件(串口…)
/etc存放配置文件目錄
/mnt臨時掛載目錄,可以將 SD 卡或者 U 盤掛載到/mnt/sd 或者/mnt/usb 目錄中
/proc臨時掛載目錄,存儲系統運行信息文件
/usr軟件資源目錄
/var此目錄存放一些可以改變的數據
/sbin用戶存放一些可執行文件
/sys系統啟動以后此目錄作為 sysfs 文件系統的掛載點,sysfs 是一個類似于 proc 文件系統的特殊文件系統,sysfs 也是基于 ram 的文件系統,也就是說它也沒有實際的存儲設備。此目錄是系統設備管理的重要目錄,此目錄通過一定的組織結構向用戶提供詳細的內核數據結構信息。
/opt可選的文件、軟件存放區(由用戶決定)

3、BusyBox

BusyBox 是一個集成了大量的 Linux 命令和工具的軟件,像 ls、mv、ifconfig 等命令 BusyBox 都會提供。BusyBox 就是一個大的工具箱,這個工具箱里面集成了 Linux 的許多工具和命令。

編譯 busybox

busybox編譯

make //將編譯的結果放入/home/wyd/linux/mnt/rootfs文件夾下
make install CONFIG_PREFIX=/home/wyd/linux/mnt/rootfs

編譯完成以后會在 busybox 的所有工具和文件就會被安裝到 rootfs 目錄中, rootfs 目錄內容有:bin linuxrc sbin usr。

Linux 內核 init 進程最后會查找用戶空間的 init 程序,找到以后就會運行這個用戶空間的 init 程序,從而切換到用戶態。如果 bootargs 設置 init=/linuxrc,那么 linuxrc 就是可以作為用戶空間的 init 程序,所以用戶態空間的 init 程序是 busybox 來生成的。busybox 的工作就完成了,但是此時的根文件系統還不能使用,還需要一些其他的文件。

向根文件系統添加 lib 庫

在 rootfs 中創建一個名為“lib”的文件夾 mkdir lib
將交叉編譯器的庫文件放到根文件系統中。

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib //*so*(*是通配符)和.a 文件,這些就是庫文件 “-d”表示拷貝符號鏈接 cp *so* *.a /home/wyd/linux/mnt/rootfs/lib/ -d

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib

mkdir dev proc mnt sys tmp root

setenv bootargs ‘console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250(服務器ip地址ubuntu):
/home/wyd/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251(開發板):192.168.1.250(服務器ip地址ubuntu):192.168.1.1:
255.255.255.0::eth0:off’ //設置 bootargs


七、Linux 驅動開發

1.字符設備驅動

字符設備是 Linux 驅動中最基本的一類設備驅動,字符設備就是一個一個字節,按照字節
流進行讀寫操作的設備,讀寫數據是分先后順序的。比如我們最常見的點燈、按鍵、IIC、SPI,
LCD 等等都是字符設備,這些設備的驅動就叫做字符設備驅動。

Linux 驅動有兩種運行方式,第一種就是將驅動編譯進 Linux 內核中,這樣當 Linux 內核啟
動的時候就會自動運行驅動程序。第二種就是將驅動編譯成模塊(Linux 下模塊擴展名為.ko),在
Linux 內核啟動以后使用“insmod”命令加載驅動模塊。

模塊有加載和卸載兩種操作,我們在編寫驅動的時候需要注冊這兩種操作函數,模塊的加載和
卸載注冊函數如下:

module_init(xxx_init); //注冊模塊加載函數 module_exit(xxx_exit); //注冊模塊卸載函數

printk在內核源碼中用來記錄日志信息的函數,只能在內核源碼范圍內使用。用法和printf非常相似

.ko文件是kernel object文件(內核模塊),該文件的意義就是把內核的一些功能移動到內核外邊, 需要的時候插入內核,不需要時卸載。
insmod xxx.ko 裝載驅動
modprobe xxx.ko 裝載驅動
cat /proc/device
lsmod 內核中已經加載的設備程序
rmmod 驅動設備名稱 卸載驅動

八、設備樹

設備樹(Device Tree),將這個詞分開就是“設備”和“樹”,描述設備樹的文件叫做 DTS(Device
Tree Source),這個 DTS 文件采用樹形結構描述板級設備,也就是開發板上的設備信息,比如
CPU 數量、 內存基地址、IIC 接口上接了哪些設備、SPI 接口上接了哪些設備等等。

DTS 是設備樹源碼文件,DTB 是將DTS 編譯以后得到的二進制文件。
將.dts 編譯為.dtb需要用到 DTC 工具

編譯 DTS 文件的話只需要進入到 Linux 源碼根目錄下,然后執行如下命令:
make all或者:make dtbs
“make all”命令是編譯 Linux 源碼中的所有東西,包括 zImage,.ko 驅動模塊以及設備樹,如果只是編譯設備樹的話建議使用“make dtbs”命令。

DTS 語法
.dtsi 頭文件:設備樹的頭文件擴展名為.dtsi,一般.dtsi 文件用于描述 SOC 的內部外設信息,比如 CPU 架構、主頻、外設寄存器地址范圍,比如 UART、IIC 等等。

設備節點:設備樹是采用樹形結構來描述板子上的設備信息的文件,每個設備都是一個節點,叫做設備節點,每個節點都通過一些屬性信息來描述節點信息,屬性就是鍵—值對。

節點標簽(label) :節點名字(節點名字@首地址)
節點標簽可以用來給節點追加信息。
例如:

/ {aliases {can0 = &flexcan1;};cpus {#address-cells = <1>;#size-cells = <0>;cpu0: cpu@0 {compatible = "arm,cortex-a7";device_type = "cpu";reg = <0>;};};intc: interrupt-controller@00a01000 {compatible = "arm,cortex-a7-gic";#interrupt-cells = <3>;interrupt-controller;reg = <0x00a01000 0x1000>,<0x00a02000 0x100>;}; }

每個節點都有不同屬性,不同的屬性又有不同的內容,屬性都是鍵值對,值可為空或任意的字節流。設備樹源碼中常用的幾種數據形式如下所示:
1、字符串
compatible = “arm,cortex-a7”;
2、32 位無符號整數
reg = <0>;
也可以設置為一組值,比如:
reg = <0 0x123456 100>;
3、字符串列表
屬性值也可以為字符串列表,字符串和字符串之間采用“,”隔開,如下所示:
compatible = “fsl,imx6ull-gpmi-nand”, “fsl, imx6ul-gpmi-nand”;

compatible 屬性
compatible 屬性也叫做“兼容性”屬性,compatible 屬性的值是一個字符串列表,compatible 屬性用于將設備和驅動綁定起來。一般驅動程序文件都會有一個 OF 匹配表,此 OF 匹配表保存著一些 compatible 值,如果設備節點的compatible 屬性值和 OF 匹配表中的任何一個值相等,那么就表示設備可以用這個驅動。

model 屬性
model 屬性值也是一個字符串,一般 model 屬性描述設備模塊信息,比如名字之類的。

status 屬性
status 屬性看名字就知道是和設備狀態有關的,status 屬性值是字符串,字符串是設備的狀態信息。常用的是“okay”和“disabled”
“okay”表明設備是可操作的。
“disabled” 表明設備當前是不可操作的,但是在未來可以變為可操作的,比如熱插拔設備插入以后。至于 disabled 的具體含義還要看設備的綁定文檔。

#address-cells 和#size-cells 屬性
這兩個屬性的值都是無符號 32 位整形,#address-cells 和#size-cells 這兩個屬性可以用在任何擁有子節點的設備中,用于描述子節點的地址信息。 #address-cells 屬性值決定了子節點 reg 屬性中地址信息所占用的字長(32位)
#size-cells 屬性值決定了子節點 reg 屬性中長度信息所占的字長(32位)。
#address-cells 和#size-cells 表明了子節點應該如何編寫 reg 屬性值,一般 reg 屬性都是和地址有關的內容,和地址相關的信息有兩種:起始地址和地址長度。

reg 屬性
reg 屬性的值一般是(address,length),reg 屬性一般用于描述設備地址空間資源信息,一般都是某個外設的寄存器地址范圍信息。
reg 屬性的格式一為:reg = <address1 length1 address2 length2 address3 length3......>
每個“address length”組合表示一個地址范圍,其中 address 是起始地址,length 是地址長度,#address-cells 表明 address 這個數據所占用的字長,#size-cells 表明 length 這個數據所占用的字長。

開發板查看設備樹:/proc/device-tree
cd /lib/modules/4.1.15-gb78e551/

root@ATK-IMX6U:~# cp /mnt/gpioled.ko /lib/modules/4.1.15-gb78e551/
root@ATK-IMX6U:~# cp /mnt/ledApp /lib/modules/4.1.15-gb78e551/
cd /lib/modules/4.1.15-gb78e551/

depmod: ERROR: could not open directory /lib/modules/4.1.15-g871ccc8: No such file or directory
depmod: FATAL: could not search modules: No such file or directory

學習時間

2021.4-2021.10


學習產出

1、 csdn筆記 1篇

總結

以上是生活随笔為你收集整理的嵌入式linux学习笔记(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

九九天堂 | 国产美女视频免费观看的网站 | 亚洲精品在线二区 | 91久久国产综合精品女同国语 | 91精品网站在线观看 | 中文字幕你懂的 | 天天干,天天射,天天操,天天摸 | 国产精品区二区三区日本 | 色综合网在线 | 国产精品一区二区三区观看 | 在线免费av网 | 久操97 | 国产一区二区三区 在线 | 天天天天色射综合 | 久久精品这里热有精品 | 97激情影院| 又黄又爽又色无遮挡免费 | 狠狠操在线 | av免费网站 | 国产在线观看免 | av官网| 亚洲免费婷婷 | 中文字幕在线国产精品 | 99色在线观看视频 | 五月天婷亚洲天综合网鲁鲁鲁 | 91日本在线播放 | 成 人 黄 色 免费播放 | 国产高清成人av | 精品久久久久久综合 | 97在线播放| a√国产免费a | 在线 视频 一区二区 | 精品国产一区二区三区久久影院 | 成人久久久久久久久 | 精品免费国产一区二区三区四区 | 久久伊人色综合 | .国产精品成人自产拍在线观看6 | 99精品视频免费全部在线 | 免费国产一区二区视频 | 首页av在线 | 91看片淫黄大片91 | 国产九色视频在线观看 | 狠狠躁日日躁夜夜躁av | 午夜精品一区二区三区在线播放 | 成年人在线电影 | 国产 中文 日韩 欧美 | 国产精品一区二区在线看 | av在线免费观看黄 | 久久激情小视频 | 成人蜜桃视频 | 狠狠88综合久久久久综合网 | 免费人成网ww44kk44 | 久久精品国产成人 | 欧美日本在线观看视频 | 男女男视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 中文字幕黄色网 | 国产欧美精品一区二区三区 | 日韩免费电影网 | 国产精品二区三区 | 亚州欧美视频 | 欧美成人基地 | 91九色蝌蚪视频网站 | 欧美精品在线观看一区 | 日日干日日 | 国产中文字幕91 | 麻豆久久精品 | 国产精品入口66mio女同 | 国产精品自在欧美一区 | 国产精品99久久久久久小说 | 精品黄色视| 欧美精品二区 | 亚洲成人av电影在线 | 久久久精品国产免费观看同学 | 欧美高清视频不卡网 | 日韩视频www | 一区二区精品视频 | 91av原创| 国产精品毛片一区视频播不卡 | 五月婷丁香网 | 99精品国产兔费观看久久99 | 丁香婷婷色综合亚洲电影 | 日韩,精品电影 | 国产精品爽爽久久久久久蜜臀 | 国产亚洲va综合人人澡精品 | 成人在线视频免费看 | 成人亚洲精品久久久久 | 免费观看性生活大片 | 99热 精品在线 | 中文字幕xxxx | av观看久久久 | 日韩影片在线观看 | 国产在线a免费观看 | av在线精品 | 丝袜美女在线观看 | 日本三级在线观看中文字 | 亚洲精品色婷婷 | 免费的黄色的网站 | 日本三级在线观看中文字 | 91亚洲成人| 午夜在线日韩 | 日韩在线视频精品 | 91伊人久久大香线蕉蜜芽人口 | 久久字幕精品一区 | 日韩二区三区在线观看 | 精品亚洲午夜久久久久91 | 综合网色 | 久久免费影院 | 国产精品在线看 | 亚洲精品一区二区三区四区高清 | 久久成年人视频 | 在线亚洲天堂网 | 国产又粗又硬又爽视频 | 久久久久亚洲精品男人的天堂 | 中文字幕婷婷 | 欧美日韩有码 | 在线免费观看视频一区 | 国产片免费在线观看视频 | 在线小视频你懂得 | 丁香影院在线 | 狠狠色噜噜狠狠狠合久 | 久久精品国产免费看久久精品 | 久草在线视频在线 | 91精品区 | 99精品视频免费全部在线 | 天天色天天综合 | 丁香六月伊人 | 美女视频国产 | 中文字幕你懂的 | 亚洲精品视频在线观看免费视频 | 日韩特黄一级欧美毛片特黄 | 久久久久国产免费免费 | 麻豆成人在线观看 | 亚洲人片在线观看 | 亚洲丁香日韩 | 国产在线精品国自产拍影院 | 久久久综合色 | 精品久久国产精品 | av观看久久久 | 久久久久久久久久影院 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 免费日韩 精品中文字幕视频在线 | 午夜精品一区二区三区在线视频 | 欧美精品久久99 | 日韩欧美一区二区不卡 | 一区二区欧美日韩 | 国产99久久99热这里精品5 | 日日夜夜综合 | 亚洲男人天堂2018 | 91久久精品一区 | 日韩欧美观看 | 精品国产成人 | 日韩av不卡在线观看 | 日韩综合一区二区 | 黄色aaa级片 | 久久人人射 | 欧美一二三视频 | 91精品视频一区二区三区 | 美女激情影院 | 国产97色在线 | 久久夜色网 | 国产精久久久久久久 | 久久久精品电影 | 综合久久婷婷 | 很黄很黄的网站免费的 | 久久久久久久国产精品视频 | 在线视频一区二区 | 久草网在线观看 | 亚洲午夜av| 国产中文字幕视频在线观看 | 男女靠逼app| 日韩免费b | 96av在线视频 | 天天爽综合网 | 亚洲精品美女久久久久网站 | 在线观看理论 | 免费国产黄线在线观看视频 | 中文av免费 | 欧美一级欧美一级 | 久久久久久国产精品免费 | 亚洲视频综合在线 | 国产精品爽爽爽 | 日韩亚洲欧美中文字幕 | 免费日p视频| 亚洲爱爱视频 | 韩国av在线播放 | 亚洲精品字幕在线观看 | 国产黄网站在线观看 | 国产精品一区二区三区在线看 | 国产日韩欧美在线观看视频 | 极品久久久 | 四虎影视8848aamm | 黄色三级免费 | 999久久国精品免费观看网站 | 国产青草视频在线观看 | 免费午夜在线视频 | 伊人成人久久 | 人人澡人人添人人爽一区二区 | 成人综合婷婷国产精品久久免费 | 丁五月婷婷 | 亚洲 欧美 综合 在线 精品 | 日韩av二区 | 中文字幕 在线看 | 天天干天天草天天爽 | 亚洲精品乱码久久久久v最新版 | 免费亚洲视频在线观看 | 日本久久91 | 久久免费视频网站 | 黄色av高清| 亚洲精品久久久蜜桃直播 | 久久久片| 国产第页 | 草莓视频在线观看免费观看 | 亚洲国产久 | 亚洲精品乱码白浆高清久久久久久 | 91精品久久久久久粉嫩 | 久久欧美精品 | 激情欧美一区二区三区免费看 | 超碰在线资源 | 久久精品一区二区国产 | 久久成人一区二区 | 亚洲精品tv久久久久久久久久 | 高清av在线 | 一级做a视频 | 99久久精品免费看国产麻豆 | av超碰在线 | 久久亚洲影院 | 国产成人一区二区三区影院在线 | 色在线免费观看 | 91一区二区三区在线观看 | 白丝av免费观看 | 丁香国产视频 | 五月天色中色 | 久久伊人精品一区二区三区 | 国产精品久久久久久久7电影 | 亚洲国产免费看 | 蜜臀久久99精品久久久无需会员 | 日韩精品视频在线观看网址 | 97小视频| 久久久国产精品一区二区三区 | av成人免费在线观看 | 免费无遮挡动漫网站 | 正在播放国产一区二区 | 色网免费观看 | 韩国一区视频 | 亚洲最新av在线网站 | 亚洲三区在线 | 国内精品久久久久 | 亚洲日本va午夜在线影院 | 69精品在线观看 | 日本在线精品视频 | 日韩精品久久一区二区 | 欧美日韩一区二区在线观看 | 国产高清中文字幕 | 久久人人97超碰com | 九月婷婷人人澡人人添人人爽 | 久久电影色 | 国产色视频网站2 | 日韩av高潮 | 日韩欧美在线高清 | 四虎国产精品成人免费影视 | 免费视频一二三区 | 亚洲黄色三级 | 天天干,天天草 | 91麻豆看国产在线紧急地址 | 91在线色 | 免费在线观看日韩视频 | www四虎影院 | 奇米网444 | 在线看片一区 | 国产精品一区二区在线播放 | 国产玖玖视频 | 亚洲最大av在线播放 | 成人高清在线观看 | 国产亚洲va综合人人澡精品 | www欧美日韩 | 国内视频一区二区 | 亚洲国产精品第一区二区 | 男女拍拍免费视频 | 一级黄色大片在线观看 | 99色| 精品亚洲视频在线观看 | 欧美日韩高清一区 | 久久精品香蕉 | 黄色成年| 国产精品区在线观看 | 天天射天天操天天 | 综合久久久久久久久 | 日韩电影在线观看中文字幕 | 伊人五月综合 | 久久久久久久久艹 | 欧美黑人性爽 | 伊人伊成久久人综合网站 | 涩涩成人在线 | 日本韩国欧美在线观看 | 久久色在线播放 | 国产在线观 | 91精品国 | 激情综合网色播五月 | 99精品在线视频观看 | 日本少妇久久久 | 欧美少妇18p | 国产午夜精品一区二区三区在线观看 | 偷拍福利视频一区二区三区 | 在线免费观看黄网站 | 亚洲最新av | 黄色av影视 | 色综合天天狠天天透天天伊人 | 日韩久久久久久久久久久久 | 99久久久国产精品美女 | 久久综合久久综合这里只有精品 | www.色com| av在线亚洲天堂 | 日本中文字幕电影在线免费观看 | 久久午夜免费观看 | 久久精品79国产精品 | 三级动态视频在线观看 | 狠狠色伊人亚洲综合网站色 | 中文字幕人成不卡一区 | 精品国产一区二区三区久久久蜜臀 | 日韩av成人在线观看 | 五月婷丁香网 | 国产成人精品一区二 | 国产 欧美 日产久久 | 五月婷婷另类国产 | 91精选在线 | 国产成人一区二 | 日本免费一二三区 | 国产精品视频全国免费观看 | 91av免费观看 | 中文字幕 第二区 | 欧美性爽爽 | 奇米影视8888在线观看大全免费 | 99 视频 高清 | 天天爽天天碰狠狠添 | 国产精品久久久久久久妇 | 久久国产色 | 韩国三级在线一区 | 天天综合成人网 | 成人在线观看日韩 | 黄色软件大全网站 | 999久久久免费精品国产 | 日日色综合 | 六月色播 | 人人人爽| 免费看污在线观看 | 欧美一区二区三区在线视频观看 | 又紧又大又爽精品一区二区 | 欧美动漫一区二区三区 | 成年人视频免费在线播放 | 国产成人免费在线观看 | 在线欧美中文字幕 | 精品中文字幕在线播放 | 97在线精品 | 97超碰中文 | 91黄色免费网站 | 国产在线中文字幕 | 欧美色伊人 | av中文字幕在线播放 | 日韩有码欧美 | 免费在线观看一区二区三区 | 欧美日韩裸体免费视频 | av片子在线观看 | 久久国产二区 | 久久免费国产精品 | 在线亚洲成人 | 日韩性色 | 黄色小网站在线 | 国产 成人 久久 | 91香蕉嫩草| 摸阴视频 | 欧美极品少妇xxxx | 国产成人精品综合 | 久久久91精品国产一区二区三区 | 高清久久久久久 | 国产日韩欧美精品在线观看 | 亚洲人成网站精品片在线观看 | 九九免费在线观看 | 免费看av片网站 | 国产精品一区欧美 | 久久国产福利 | 日韩在线视频播放 | 国产资源免费在线观看 | 97视频在线免费 | 成年人在线观看免费视频 | 日本中文字幕在线电影 | 精品视频在线观看 | 天天精品视频 | 国产黄色片免费观看 | 黄色aa久久 | 亚洲无在线 | 中文字幕影片免费在线观看 | 成人av资源| 日韩免费一二三区 | 波多野结衣网址 | 久久久久久在线观看 | 亚洲网站在线 | 在线免费观看国产视频 | 欧美色综合 | 亚洲h在线播放在线观看h | 久草电影免费在线观看 | 丁香婷婷色月天 | 在线日韩中文 | 久久69精品久久久久久久电影好 | 中文字幕视频三区 | 在线天堂中文在线资源网 | 欧美性生交大片免网 | 中文字幕一区二区三区在线视频 | av电影在线免费 | 91久久人澡人人添人人爽欧美 | 久久99久国产精品黄毛片入口 | 亚洲年轻女教师毛茸茸 | 亚洲精品免费在线观看 | 96精品在线 | 精品久久一区 | 午夜精品久久久久久99热明星 | 一区二区丝袜 | 中文字幕国内精品 | 中文字幕大全 | 四虎www| av在线一二三区 | 午夜精品视频福利 | 91视频91蝌蚪| 国产在线播放观看 | 一级免费av| 91在线麻豆 | 狠狠伊人 | 天天干天天干天天干天天干天天干天天干 | 丝袜制服天堂 | 国产裸体永久免费视频网站 | 日韩动态视频 | 日韩一级片观看 | 日韩精品亚洲专区在线观看 | 青青河边草免费直播 | 婷婷丁香激情五月 | 国内外成人免费在线视频 | 天天干天天色2020 | 国产精品 中文在线 | 一区二区在线电影 | 成年人电影免费看 | 911精品美国片911久久久 | 亚洲精品国久久99热 | 欧美亚洲一区二区在线 | 国产婷婷精品av在线 | 综合久久网 | 2021国产在线 | 日本中文字幕免费观看 | 91丨九色丨91啦蝌蚪老版 | 国产手机视频在线 | 天天综合狠狠精品 | 色狠狠一区二区 | 国产一级片免费视频 | 在线免费视 | 美女啪啪图片 | 92中文资源在线 | 国产尤物一区二区三区 | 五月婷婷在线播放 | 91av免费看| 91资源在线播放 | 69久久久久久久 | 成人a大片 | 亚洲aⅴ在线观看 | 亚洲欧洲精品久久 | 国产精品理论片 | 国内精品视频在线 | 国产精品久久久久一区二区三区 | 免费视频久久久久 | 色婷婷视频 | 99热在线观看 | 在线观看国产www | 久草在线这里只有精品 | 嫩小bbbb摸bbb摸bbb | 国产一二区在线观看 | 久草在线欧美 | 免费观看91视频大全 | 日韩欧美综合精品 | 五月激情婷婷丁香 | 国产96在线 | 天天人人综合 | 在线一二区 | 在线看片视频 | 亚洲人在线7777777精品 | 日韩av电影中文字幕 | 日韩中文字幕视频在线 | 婷婷丁香导航 | 亚洲 欧美 变态 国产 另类 | 精品福利在线 | 91在线网站| 色射色 | av高清影院 | 日韩精品一区在线播放 | 亚洲精品一区二区精华 | 欧美在线观看视频一区二区 | 国产高清福利在线 | 中文字幕在线观看91 | 日本久草电影 | 国产精品久久久久久久婷婷 | 国产高清在线观看 | 国产在线看一区 | 国产精品久免费的黄网站 | 亚洲一区欧美激情 | 国产69精品久久久久9999apgf | 天堂va在线高清一区 | 狠狠婷婷| 精品国产观看 | 国产一二区在线观看 | 国产一区二区久久久 | 亚洲精品一区二区三区在线观看 | 国产精品久久久久久999 | 欧美另类v | 日本精品午夜 | 国产成人久久精品 | 在线播放一区二区三区 | 久久久精品久久日韩一区综合 | 色六月婷婷 | 亚洲一区视频免费观看 | 欧美一区二区三区在线看 | 精品视频免费看 | 国产精品1区2区 | 久久久久久久久久国产精品 | 国产理论一区二区三区 | 探花视频在线观看免费 | 亚洲精品美女久久久久网站 | 亚洲精品乱码久久久久久写真 | 91精品久久久久久粉嫩 | 精品国产成人av在线免 | 97色资源| 国产麻豆精品久久 | 久久黄视频 | 麻豆一二三精选视频 | 精品美女国产在线 | 就要干b | 一二三四精品 | 91av中文字幕| 园产精品久久久久久久7电影 | 欧美另类美少妇69xxxx | 久操综合| 国产一级精品在线观看 | 色婷婷综合视频在线观看 | 久久久久免费电影 | 久久综合加勒比 | a级国产乱理论片在线观看 特级毛片在线观看 | 四虎影视成人永久免费观看视频 | 亚洲午夜激情网 | 亚洲综合激情网 | 超碰午夜| 久久国内免费视频 | 五月婷婷激情 | av一区二区三区在线 | 激情五月婷婷综合网 | 香蕉视频国产在线 | 国产视频网站在线观看 | 天无日天天操天天干 | 精品成人久久 | 国产精品久久久久久999 | 91在线日韩| 国产69精品久久99不卡的观看体验 | 亚洲电影一区二区 | 色天天综合久久久久综合片 | 天天射天天色天天干 | 九九九在线观看视频 | 96亚洲精品久久久蜜桃 | 天天干夜夜干 | 国产美女视频 | 日韩理论电影在线观看 | 亚洲专区欧美专区 | 日韩 精品 一区 国产 麻豆 | 99久久精品一区二区成人 | 五月婷婷丁香 | 91亚洲激情 | 黄污网 | 国产精品一区在线观看 | 亚洲成av人片在线观看www | 午夜国产影院 | 国际精品网 | 国产亚洲精品电影 | 狠狠躁18三区二区一区ai明星 | 极品久久久久久久 | 国内揄拍国内精品 | 亚洲国产精品va在线看黑人动漫 | 在线视频日韩欧美 | 国产伦理久久精品久久久久_ | 四虎永久视频 | 久久精品人人做人人综合老师 | 亚洲亚洲精品在线观看 | 国产精品毛片网 | 992tv又爽又黄的免费视频 | 国产精品久久久亚洲 | 国产又粗又猛又黄又爽视频 | 日韩一区二区三区高清免费看看 | 99视频在线免费看 | 午夜精品一区二区三区可下载 | 午夜精品成人一区二区三区 | 久草精品在线 | 天天色成人网 | 成人免费观看完整版电影 | 国产精品在线看 | 4438全国亚洲精品在线观看视频 | 蜜桃麻豆www久久囤产精品 | 欧美久久久久久久 | 日韩r级电影在线观看 | 天天操,夜夜操 | 天天曰天天射 | av大全免费在线观看 | 久久久久久福利 | 五月天婷婷视频 | 日韩视频欧美视频 | 狠狠色噜噜狠狠狠合久 | 久久久久久亚洲精品 | 成人国产精品av | 国产成人高清 | 午夜视频一区二区 | 99久久这里有精品 | 成人教育av | 一本之道乱码区 | 国产精品久久久久久久久久ktv | 欧美日本国产在线观看 | 在线 你懂 | 激情综合五月婷婷 | 国产一区二区手机在线观看 | 免费看污在线观看 | 韩国一区二区av | 欧美日韩在线观看视频 | 国内精品在线一区 | 性日韩欧美在线视频 | 97在线视频免费看 | 黄色一级影院 | 婷婷av色综合 | 成人免费在线观看av | 国产成人精品在线 | www.久久色| 日韩色av色资源 | 欧美日韩国产亚洲乱码字幕 | 在线视频专区 | 在线有码中文 | 88av网站| 色网av | 在线 国产 亚洲 欧美 | 99国产精品免费网站 | av在线短片| 在线观看免费日韩 | 日本在线观看视频一区 | 国产在线观看一 | 国产精品12| 久久av黄色 | 欧美日韩精品电影 | 91精品国产91久久久久久三级 | 亚洲精品色婷婷 | 天天搞天天干 | 亚洲情影院 | 欧美男男激情videos | 日韩videos| 在线播放 亚洲 | 美女视频永久黄网站免费观看国产 | 亚洲第一久久久 | 国产一区免费 | 在线观看涩涩 | 欧美一级黄大片 | 久久人人爽人人片av | 国产九九九视频 | 久久婷婷综合激情 | 国产一区免费视频 | 成人毛片久久 | 国产精品第二页 | 国产婷婷精品av在线 | 五月婷婷开心中文字幕 | 国产999精品视频 | 国内丰满少妇猛烈精品播放 | 午夜电影中文字幕 | 久草免费在线 | 成人va在线观看 | 久久久久久久久久久成人 | 婷婷av在线 | 免费三级网 | 久久超级碰视频 | 婷婷六月天在线 | 99r精品视频在线观看 | 国产精品色婷婷 | 精品国产乱码久久久久久1区二区 | 国产精品av电影 | 国产精品白虎 | 日韩二区在线播放 | 久久久精品二区 | 色综合久久五月天 | 国产精品一区二区免费在线观看 | 国产麻豆精品一区二区 | 三级av黄色 | 91免费观看| 国产人成看黄久久久久久久久 | 在线免费黄色av | 在线日韩中文 | 国产精品久久久久久999 | 国产中文字幕在线观看 | 色婷婷视频在线 | 在线观看久久久久久 | 欧美激情h | 亚州欧美精品 | 91福利小视频 | 国产精品久久久久久久久久免费 | 欧美二区三区91 | 国产成人免费观看 | 国产麻豆精品久久一二三 | 国产91精品一区二区麻豆网站 | 国产精品第一页在线观看 | 国产免费一区二区三区最新6 | 五月天激情婷婷 | 久久99热久久99精品 | 国产粉嫩在线观看 | 色橹橹欧美在线观看视频高清 | 在线国产一区二区三区 | 怡红院久久 | 国产精品久久亚洲 | 国产在线自 | 日韩二区三区在线观看 | 日韩激情三级 | 亚洲精品久久久久中文字幕m男 | 国际精品网| 欧美高清视频不卡网 | 国产精品福利午夜在线观看 | 国产精品18久久久久vr手机版特色 | 久久影视一区 | 国产免费久久 | 国产视频一二区 | 日韩啪啪小视频 | 美女久久视频 | 麻豆免费在线视频 | 国产精品久久麻豆 | 亚洲免费精品一区二区 | 欧美日韩亚洲在线 | 色婷婷av在线 | 午夜在线日韩 | 国产成人精品999在线观看 | 日韩久久网站 | 成人在线一区二区 | 人人爽人人爽人人爽学生一级 | 国产亚洲综合性久久久影院 | 天天射天天操天天色 | 天天曰夜夜操 | 国产在线无 | 亚洲人成在| 国产一级免费在线观看 | 久久这里有精品 | 久久精品久久久久 | 亚洲精品午夜aaa久久久 | 六月丁香婷婷在线 | 国产成人精品免高潮在线观看 | 久久99久国产精品黄毛片入口 | 久久一级片 | 黄色av大片| www.成人久久| 欧美一级性视频 | 成人中心免费视频 | 欧美精品一区二区三区一线天视频 | 久久精品视频在线观看免费 | 久久久精品 一区二区三区 国产99视频在线观看 | 久久视频在线免费观看 | 精品视频在线播放 | 中文字幕永久在线 | 天天av在线播放 | 久久国产精品99精国产 | 久久综合日 | 欧美日韩国产页 | 亚洲妇女av | 国产精品久久久久久久久久了 | 精品久久久久久久久久 | 亚洲天天干 | 国产视频精品免费 | 久久视频国产精品免费视频在线 | 免费的黄色av | a极黄色片| 最近中文字幕高清字幕在线视频 | 伊人视频 | 91少妇精拍在线播放 | 亚洲成人午夜av | 超碰在线免费福利 | 欧美午夜精品久久久久 | 麻豆国产在线视频 | 免费在线91 | 成年人网站免费在线观看 | 久久国产精品电影 | av看片网| av网站有哪些 | 国产三级视频在线 | 91最新地址永久入口 | 91中文在线观看 | 久久99久久99精品免费看小说 | 成人影片在线免费观看 | 欧美精品做受xxx性少妇 | 欧美日韩伦理在线 | 国产流白浆高潮在线观看 | 欧美少妇18p| 亚洲欧洲av | 黄色精品在线看 | 久草| 国产99久久99热这里精品5 | 色婷婷午夜 | 黄网站色欧美视频 | 国产一区免费在线 | 久久免费视频在线观看6 | 91麻豆免费看 | 欧美九九九 | 色99久久 | 欧美伦理一区二区三区 | 久久亚洲二区 | 亚洲六月丁香色婷婷综合久久 | 日韩欧美综合视频 | 中文字幕色婷婷在线视频 | 国际精品久久久 | 成人久久毛片 | 在线免费av电影 | 午夜精品麻豆 | 91亚洲成人 | 高清不卡毛片 | 天天色中文 | 黄av在线 | 精品欧美乱码久久久久久 | 97视频在线播放 | 欧美色图亚洲图片 | 永久中文字幕 | 欧美怡红院视频 | 亚洲三区在线 | 国产午夜精品一区二区三区四区 | 日韩二区三区在线 | 亚洲自拍自偷 | 五月婷婷激情五月 | 成人黄大片视频在线观看 | 91精品夜夜 | 中文字幕高清在线播放 | 在线电影播放 | 欧美色图p | 黄色小说视频在线 | 亚洲视频精品 | 在线视频久 | 久久人人爽人人爽人人片av软件 | 免费在线一区二区三区 | 婷婷国产精品 | 精品视频一区在线观看 | 国产亚洲人成网站在线观看 | 精品美女国产在线 | 久久中文字幕导航 | 国产电影黄色av | 久久www免费视频 | 成人在线视频免费 | 69精品人人人人 | 99精品视频中文字幕 | 国产美女视频免费观看的网站 | jizz18欧美18 | 99精品偷拍视频一区二区三区 | 久久免费电影 | 99久视频 | 日韩乱码中文字幕 | 日本精品久久久久 | 91av视频播放 | 成人在线视频你懂的 | 免费黄色av电影 | 91久久偷偷做嫩草影院 | 久久午夜精品影院一区 | 久久影视一区二区 | 天天色天天上天天操 | 狠狠色香婷婷久久亚洲精品 | 久久这里只有精品1 | 少妇视频一区 | 97超碰在线资源 | 成年人免费在线观看网站 | 成人精品99 | 天天添夜夜操 | 成人亚洲网 | 亚洲最大激情中文字幕 | 国产美女搞久久 | 手机av电影在线观看 | 综合在线观看色 | 2000xxx影视 | 国产日本三级 | 天堂av在线免费 | 日韩久久片 | 国产理论在线 | 日韩www在线| 国产精品久久久久9999吃药 | 99国产在线观看 | 香蕉视频免费看 | 91大片成人网 | 天天艹天天操 | 91av原创 | 欧美在线18 | 激情久久五月 | 91chinese在线 | 日p视频在线观看 | 国产一区在线视频 | 日日爱夜夜爱 | 国产精品国产精品 | 午夜av在线播放 | 成人动漫精品一区二区 | 国产白浆在线观看 | 97超碰在线资源 | 91精品老司机久久一区啪 | 视频在线观看日韩 | 国产精品日韩久久久久 | 日韩sese| 国产亚洲精品综合一区91 | 97热久久免费频精品99 | 日本中文不卡 | 人人舔人人爱 | 久草网站在线观看 | 国产日本高清 | 国产欧美三级 | 伊人婷婷 | 成人福利av | 日韩欧美一区二区三区在线观看 | 99久久精品费精品 | 精品国产一区在线观看 | 午夜精品视频在线 | 国产在线污 | 91精品啪在线观看国产 | 久久99精品视频 | 国产精品一区二区免费在线观看 | 草久热 | 欧美日韩在线精品一区二区 | 五月天电影免费在线观看一区 | 日韩欧美在线免费 | 亚洲理论在线观看 | 日日爽| 九九九九九精品 | 欧美一级免费在线 | 日韩精品中文字幕一区二区 | 黄网站app在线观看免费视频 | 日韩精品一区二区久久 | 国产精品 9999 | 精品国产自在精品国产精野外直播 | 国产精品a成v人在线播放 | 欧美精品久久久久a | 国产精品久久久久久婷婷天堂 | 狠狠色狠狠色 | 就操操久久 | 1000部国产精品成人观看 | 亚洲黄色精品 | 日韩在线观看视频中文字幕 | 欧美在线视频第一页 | www.com久久| 国产欧美精品一区二区三区 | 黄色的视频 | 日韩在线视频观看免费 | 国产又粗又猛又色 | 91污视频在线 | 特黄特黄的视频 | 国产精品3 | 一区二区中文字幕在线播放 | 免费成人黄色 | 欧美二区视频 | 亚洲少妇天堂 | 999免费视频 | 在线观看日韩视频 | 午夜精品一区二区三区在线观看 | 中文字幕视频三区 | 国产爽视频 | 国产视频欧美视频 | 伊人资源站 | 国产电影黄色av | 国产精品久久久久久久久岛 | 9ⅰ精品久久久久久久久中文字幕 | 亚洲电影一区二区 | 黄网站www | 激情在线五月天 | 色综合欧洲| 在线视频国产区 | 色综合久久中文综合久久牛 | 久草网首页 | 色窝资源| 在线观看视频国产 | 国产成人精品一区二区在线观看 | 亚洲电影自拍 | 天天操夜夜操夜夜操 | 在线高清| 中文字幕黄色av | 欧美一进一出抽搐大尺度视频 | 欧美亚洲国产日韩 | 美女视频黄色免费 | 成人黄色电影免费观看 | 超碰在线94 | 99久久99视频只有精品 | 噜噜色官网 | 粉嫩av一区二区三区免费 | 天天做天天爱夜夜爽 | 久久久久久久综合色一本 | 美女视频黄色免费 | 亚洲va欧洲va国产va不卡 | 久久精品99国产精品日本 | 亚洲四虎在线 | 亚洲黄色片 | 最近高清中文在线字幕在线观看 | 成人99免费视频 | 婷婷精品 | 免费在线一区二区三区 | 久久99热精品这里久久精品 | 国产欧美在线一区二区三区 | 天天干天天干天天干 | 美女久久久久久久久久 | 国产高清免费在线播放 | 永久免费毛片 |