1. Trang chủ
  2. » Tất cả

Overview Embedded Linux - Copy

25 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 25
Dung lượng 2,12 MB

Nội dung

I Tổng quan hệ điều hành Linux, Linux Embedded Linux OS Linux hệ điều hành máy tính mã nguồn mở tự tương tự Unix, xây dựng nhân Linux (Linux Kernel) Thực chất, phân phối Linux việc kết hợp GNU/Linux để phục vụ nhu cầu người dùng Một số phân phối phổ biến là: Ubuntu, RedHat, CentOS, Linux có ưu điểm:      Open source Miễn phí Tính bảo mật cao Tính linh hoạt Hoạt động mượt máy tính cấu hình yếu Với ưu điểm trên, phân phối Linux thích hợp cộng với máy tính nhúng Linux Embedded Linux Embedded hiểu hệ thống embedded mà sử dụng hệ điều hành Linux Nó có ưu điểm mà hệ thống nhúng sử dụng vi điều khiển khơng có Tính Linux Embedded đa dạng, thời gian phát triển ứng dụng nhanh, hỗ trợ nhiều thư viên, API có sẵn Bên cạnh khả xử lý muilti thread mạnh,… Linux Embedded có nhiều ứng dụng thiết bị ô tô, thiết bị mạng - viễn thơng, thiết bị di động (Android) Về cơng việc chia Linux Embedded làm phần tầng kernel tầng application Về tổng quan, để làm việc với cần yêu cầu bản:     Có kinh nghiệm ngơn ngữ C Nắm kiến thức vi điều khiển Có kiến thức hệ điều hành như: file system, scheduler, virtual memory,… Cách thức kernel hoạt động Hiện nay, thiết bị nhúng(máy tính nhúng) phát triển mạnh Từ mạch giá rẻ cho sinh viên RaspBerry Pi, BeagleBone Black, có mạch cấu hình cao dành cho công việc chuyên sâu ZC706, ZCU,… Hình BeagleBone Black Hình ZC706 II Build Linux OS BeagleBone Black Về bản, Linux Embedded có thành phần quan trọng là: Toolchains, Bootloader, Kernel, Root FileSystem Việc build lại thành phần giúp có nhìn tổng quan cách thức hoạt động Linux OS thiết bị nhúng Bên cạnh đó, cịn giúp cấu hình thành phần quan trong/ cần thiết cho người dùng từ đầu Toolchains 1.1 Tổng quan Toolchains Toolchains tập hợp công cụ giúp biên dịch source code thành mã thực thi chạy thiết bị yêu cầu Toolchain bao gồm thành phần :     Binutils (Binary utilities): GNU Assembler, Linker,… GCC : GNU C Compiler C library: Chứa file header, file bianry cho phép giao tiếp với hệ điều hành GDB (GNU Debugger) Toolchains phân làm loại Native Cross:   Native compiler: Chỉ biên dịch cho máy chạy Cross compiler: Biên dịch cho thiết bị thiết bị khác Linux Embedded sử dụng cross compiler để biên dịch code từ máy tính (sử dụng Ubuntu, Kali, ) để biên dịch cho thiết bị nhúng (RaspBerry Pi, Beagbone Black,…) Nguyên nhân sử dụng Cross Compiler cấu hình thiết bị nhúng yếu nhiều so với PC Do vậy, biên dịch trực tiếp thiết bị nhúng lâu, nhiều gặp lỗi Hình Biên dịch file.ko sử dụng cross compile 1.2 Cách build toolchain sử dụng crosstool-NG 1.2.1 Install crosstool-NG Trước bắt đầu, máy tính cần cài số phần mềm yêu cầu $ sudo apt-get install automake bison chrpath flex g++ git gperf gawk libexpat1-dev libncurses5-dev libsdl1.2-dev libtool python2.7-dev texinfo Cài đặt crosstool-NG $ git clone https://github.com/crosstool-ng/crosstool-ng.git $ cd crosstool-ng $ git checkout crosstool-ng-1.22.0 $ /bootstrap $ /configure enable-local $ make $ make install Hình Kết build toochain cho BeagleBone Black Bootloader 2.1 Tổng quan Bootloader Trong hệ thống Linux Embedded, bootloader có cơng việc khởi tạo hệ thống từ mức load kernel Thực chất công việc thứ phần phụ công việc thứ Về tổng quan, bật nguồn reset thiết bị, dòng bootloader code thực thi Khi đó, DRAM controller chưa thiết lập dẫn đến việc khơng thể truy cập vào nhớ Tương tự, giao diện, nhớ flash NAND, MMC khơng thể sử dụng Do cần sử dụng bootloader để boot đừng thành phần hệ điều hành lên nhớ Việc cuối bootloader boot kernel vào RAM tạo môi trường cho Hoạt động bootloader chia làm bước (boot sequence) sau:  Phase - ROM Code Để đảm bảo tính tin cậy, nhà sản xuất có tích hợp vùng nhớ chứa code (ngay từ sản xuất khơng thể xóa) để sử dụng vừa thiết lập lại vừa reset thiết bị Code vùng nhớ gọi ROM code ROM code có khả load số đoạn code nhỏ từ vị trí định vào SRAM Hầu hết thiết bị thiết kế vùng nhỏ SRAM on-chip (4Kb đến vài trăm Kb) ROM code load SPL (Secondary program loader) vào vùng nhớ  Phase - Secondary program loader SPL thiết lập memory controller thành phần thiết yếu để hệ thống chuẩn bị load TPL (Teriary Program Loader) Nếu SPL có tích hợp file system driver load thêm u-boot.img từ phân vùng khác  Phase - Teriary Program Loader Đến bước cuối này, hệ thống boot bootloader đầy đủ (ví dụ: U-boot, BareBox,…) Hệ thống có giao diện command line để người dùng load kernel image, can thiệp vào enviroment variable để thiết lập vị trí boot kernel, chọn boot kernel cách khác boot từ flash (QSPI, MMC), từ PC thông qua TFTP,… 2.2 Build U-boot U-boot open source nên tải build theo bước sau: $ git clone git://git.denx.de/u-boot.git $ cd u-boot $ git checkout v2017.01 Hình Kết build U-boot Sau build xong, hệ thống tạo file u-boot.img MLO Trước copy vào SD card cần phải format chia lại SD card thành phân vùng (1 phân vùng BOOT với định đạng FAT32, phân vùng ROOTFS với định dạng ext4) Copy file u-boot.img MLO vào phân vùng BOOT với lệnh $ cp u-boot.img MLO /media/BOOT 2.3 Install U-boot U-boot cung cấp cho người dùng khái niệm gọi enviroment variable Việc giúp u-boot cấu hình lại số thành phần command line build xong Enviroment variable viết dạng name=value Trong số trường hợp muốn chọn cách boot kernel (boot từ QSPI, SD card,…) cấu hình truyền nhận TFTP việc viết lại enviroment variable cần thiết Hình Kết install u-boot cho beaglebone black Kernel Image 3.1 Tổng quan Kernel Kernel thành phần quan trọng Linux Kernel thực việc chính: quản lý tài nguyên, cung cấp giao diện với phần cứng cung cấp API cho user space Hình Kernel hệ thống Các ứng dụng chạy user space với mức độ ưu tiên CPU thấp Giao diện kernel space user space C library (sử dụng để thực yêu cầu từ user space tới kernel space thông qua system call) System call cho phép user chuyển từ chế độ user ưu tiên thấp sang chế độ user ưu tiên cao, cho phép truy cập tất địa ô nhớ ghi CPU 3.2 Build Kernel Tải kernel máy: $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git $ git checkout linux-4.9.y $ cd linux-stable $ make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- mrproper $ make ARCH=arm multi_v7_defconfig $ make -j4 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- zImage $ make -j4 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- modules $ make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- dtbs Trong file source code kernel, file chứa folder sau:            arch: Chứa file định cho loại kiến trúc (architecture-specific files) Documentation : Chứa tài liệu kernel Nếu muốn tìm hiểu thơng tin kernel vào tìm phần drivers: Chứa nhiều device driver fs: Chứa filesystem code include: Chứa kernel header file init: Chứa kernel start-up code kernel: Chứa hàm chức năng, bao gồm scheduler, locking, timers, quản lý lượng, debug/trace code mm: Chứa quản lý nhớ net: Chứa giao thức mạng script: Chứa nhiều script tiện dụng, bao gồm device tree compiler, DTC tools: Chứa nhiều công cụ hỗ trợ tiện dụng cho Linux Ngoài việc build kernel mặc định, source kernel hỗ trợ file Kconfig để người dùng tự cấu hình bật/tắt, thêm chức cho phù hợp với nhu cầu cơng việc Hình Cấu hình cho kernel Hình Kết install kernel BeagleBone Black Root Filesystem 4.1 Tổng quan Rootfs Root Filesystem thành phần cuối cần boot lên board Nó có chứa thư mục gốc hệ điều hành Linux Các thành phần để tạo rootfs tối thiểu:         init: Đây chương trình để bắt đầu thứ, thường chạy dạng script Shell: Cung cấp môi trường để viết command line, chạy script init Daemon: Là background program sử dụng để cung cấp dịch vụ cho thành phần khác Ví dụ system log daemon (syslogd) secure shell daemon (sshd) Shared Libraries: Cung cấp liên kết cho hầu hết chương trình Configuration files: Cấu hình cho init daemon, thường nằm đường dẫn /etc Device Nodes: Là file đặc biệt cho phép truy cập vào driver /proc /sys: Biểu diễn cấu trúc liệu Linux dạng hệ thống phân cấp thư mục (Filesystem Hierarchy Standard) Kernel modules: Nếu có cấu hình/ build kernel module build hệ thống chúng lưu trữ /lib/modules/[kernel version] 4.2 Build Rootfs Tải rootfs máy: $ git clone git://git.buildroot.net/buildroot Cấu hình roofs cho BeagleBone Black: $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- beaglebone_defconfig $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihfSau build rootfs.ext4, việc cần quan tâm boot rootfs lên board Linux hỗ trợ phương thức boot:    initramfs: Còn gọi ramdisk, filesystem img load vào RAM Cần lưu ý RAM nhớ bị hết liệu ngắt nguồn khỏi board Do dùng initramfs liệu sau boot lên bị ngắt nguồn Disk image: Đây định dạng rootfs load lên thiết bị lưu trữ board Disk image định dạng ext4 muốn copy vào SD card, định dạng jffs2 muốn copy vào nhớ flash Network Filesystem: Rootfs boot từ máy tính tới board thơng qua TFTP, NFS Cách thường sử dụng giai đoạn phát triển Hình Install Root File System cho BeagbleBone Black III Linux driver Tổng quan Linux kernel Về khái niệm, hệ điều hành hiểu theo nghĩa :  Với nghĩa hẹp, hệ điều hành phần mềm quản lý tài nguyên phần cứng Phần mềm gọi Kernel Với Linux cịn gọi Linux kernel  Với nghĩa rộng, hệ điều hành gói bao gồm phần mềm quản lý tài nguyên phần cứng, giao diện dòng lệnh (Command line Interface - CLI), giao diện đồ họa cho người dùng (Graphic User Interface - GUI),… Hình Sơ đồ khối chức hệ điều hành Dựa UNIX kernel, Linus Tovarlds tạo Linux kernel Dựa vào chức năng, Linux kernel chia làm phần chính: Process manager - có nhiệm vụ quản lý tiến trình, bao gồm :     Tạo / hủy tiến trình Lập lịch cho tiến trình Hỗ trợ tiến trình giao tiếp với Đồng hoạt động tiến trình tránh tình trạng tranh chấp tài nguyên Memory Manager - có nhiệm vụ quản lý nhớ, bao gồm :    Cấp phát nhớ trước chạy chương trình, thu hồi nhớ kết thúc chương trình Đảm bảo chương trình đưa vào nhớ Bảo vệ vùng nhớ tiến trình Device Management - có nhiệm vụ quản lý thiết bị, bao gồm:     Điều khiển hoạt động thiết bị Giám sát trạng thái thiết bị Trao đổi liệu với thiết bị Lập lịch sử dụng thiết bị File System Management - có nhiệm vụ quản lý liệu thiết bị lưu trữ (ổ cứng, thẻ nhớ,…) bao gồm cơng việc: thêm, tìm kiếm, sửa, xóa liệu Networking Management - có nhiệm vụ quản lý gói tin theo mơ hình TCP/IP System Call Interface - có nhiệm vụ cung cấp dịch vụ sử dụng phần cứng cho tiến trình Hình Kiến trúc Linux kernel Bộ nhớ RAM chứa lệnh nhị phân Linux kernel tiến trình RAM chia làm phần:   Kernel space: Vùng không gian chứa lệnh liệu kernel User space: Vùng không gian chứa lệnh liệu tiến trình Hình Kiến trúc Linux kernel (góc độ CPU) Linux driver Driver phần mềm, gồm lệnh, hướng dẫn CPU tương tác với thiết bị (màn hình, chuột, ổ cứng,…) Các thiết bị không nối trực tiếp tới CPU :   Số lượng chân CPU nhỏ số lượng thiết bị Tốc độ làm việc CPU lớn nhiều so với thiết bị Do đó, thiết bị kết nối với CPU thơng qua device controller Linux driver chia làm loại bus driver device driver CPU làm việc với device controller thông qua bus driver Device driver hướng dẫn CPU làm việc với thiết bị Ví dụ để đọc giá trị từ RTC DS1307 cần driver Bus driver I2C driver hướng dẫn cho CPU xử lý frame truyền theo chuẩn I2C Device driver DS1307 driver hướng dẫn cho CPU làm để đọc/ghi ghi ngày, giờ, tháng, năm,… Hình Quan hệ driver, controller device Về chi tiết, bus driver device driver chia làm thành phần cụ thể để dễ làm việc Bus driver   Protocol abstraction: Cung cấp dịch vụ cho device driver sử dụng Ví dụ: đọc ghi ghi thiết bị Protocol specific: Cung cấp lệnh hướng dẫn CPU làm việc với controller, giúp đọc/ghi liệu bus Device driver   OS Specific: Cung cấp dịch vụ giúp CPU đọc/ghi liệu thiết bị Ví dụ:cung cấp hàm entry point read, write, ioctl,… Device Specific: Hướng dẫn CPU điều khiển thiết bị, giám sát thiết bị, trao đổi liệu với thiết bị Phần xây dựng dựa datasheet Hình Các thành phần driver Dựa vào lượng liệu mà thiết bị trao đổi với CPU, chia thiết bị làm loại:    Character device: Lượng liệu trao đổi CPU thiết bị byte Ví dụ: chuột, loa,… Block device: Lượng liệu trao đổi CPU thiết bị khối Ví dụ: thiết bị lưu trữ Network device: Lượng liệu trao đổi CPU thiết bị gói tin (nhiều byte) Ví dụ: thiết bị mạng (NIC card, Wifi card,…) 2.1 Character driver Character driver sử dụng để hướng dẫn CPU làm việc với character device Các tiến trình user space không giao tiếp trực tiếp với character driver mà thông qua device file (device node) Bằng cách này, Linux kernel đánh lừa tiến trình character device file, việc đọc/ghi tương tự với file thơng thường Hình Kết nối tiến trình character device Cấu trúc character driver bao gồm : OS Specific   Hàm khởi tạo: o Yêu cầu kernel cấp phát device number o Yêu cầu kernel tạo device file o Yêu cầu kernel cấp phát nhớ cho cấu trúc liệu driver khởi tạo chúng o Yêu cầu khởi tạo thiết bị vật lý o Đăng ký hàm entry point với kernel o Đăng ký hàm xử lý ngắt Hàm kết thúc : Ngược lại hàm khởi tạo Device Specific    Hàm khởi tạo/giải phóng thiết bị Đọc/ghi ghi thiết bị Hàm xử lý ngắt 2.2 Platform driver Platform device hiểu thiết bị cắm vào không chạy (khác với USB, chuột, bàn phím,…) Các thiết bị cần khai báo với kernel để sử dụng Ví dụ thiết bị sử dụng I2C, SPI,…là platform device khơng thể thấy khơng khai báo Pseudo platform bus (platform bus) loại bus ảo kernel, sử dụng cho device mà không nằm bus vật lý kernel Ví dụ led không nằm bus I2C, SPI,… Platform driver sử dụng để điều khiển platform device Nhưng platform driver điều khiển thiết bị nằm platform bus Ví dụ khơng thể điều khiển I2C device platform device, nằm bus vật lý I2C có sẵn Để match platform driver platform device ta sử dụng device tree Platform driver kiểm tra trường compatible (trong struct platform_device_id) xem có trùng với trường compatible (trong device tree) Nếu trùng match paltform driver với device tree Hình Các thiết bị đăng ký bus Ứng dụng - UART Software Controller (UART Bit Banging) 3.1.Giới thiệu Kiểu truyền liệu nối tiếp phần mềm thay cho phần cứng chuyên dụng Phần mềm trực tiếp thiết lập, lấy mẫu trạng thái chân vi điều khiển, chịu trách nhiệm xử lý tham số tín hiệu như: thời gian, lấy mẫu, đồng hóa tín hiệu,….Việc thực cịn gọi Bit Banging Có thể sử dụng cho số trường hợp cụ thể Ví dụ cổng UART bị hỏng, muốn tăng số lượng cổng UART lại không muốn/không thể sử dụng thêm phần cứng hỗ trợ truyền nhận UART, vi điều khiển khơng hỗ trợ UART sử dụng software UART (UART Bit Banging) Ưu điểm phương pháp chi phí thấp(hầu khơng có), không cần thay đổi phần cứng,… Nhược điểm vi điều khiển tốn thêm tài nguyên để thực tác vụ Bit Banging Do làm tác vụ khác bị chậm Bên cạnh đó, truyền dẫn liệu yêu cầu tốc độ q nhanh chân GPIO đáp ứng kịp 3.2 UART Bit Banging 3.2.1 UART Protocol Hình UART Protocol Hình Kết nối phần cứng 3.2.2 Truyền liệu Việc truyền nhận liệu thiết bị sử dụng baudrate (tốc độ bit/s) Giả sử, sử dụng baudrate = 9600 tương đương với việc thời gian gửi bit (s) Nếu sử dụng software UART sử dụng timer để định thời gian truyền/ nhận bit 3.2.3 Nhận liệu Việc nhận liệu cần xác nhận cách sử dụng ngắt sườn xuống để kiểm tra có bit start Sau xác nhận xuất bit start việc nhận liệu tương tự việc truyền liệu 3.3 Truyền nhận liệu sử dụng Character Driver Có thể tạo device file sử dụng system call để thực việc truyền nhận UART dễ dàng Khi liệu gửi/nhận để đẩy vào buffer, soft UART lấy liệu buffer để xử lý Lưu liệu vào user buffer : Dữ liệu lưu vào buffer theo bước việc nhận liệu Thông qua việc copy liệu vào kernel buffer, liệu lưu lên user buffer Truyền liệu từ user buffer vào uart_tx_buffer: Dữ liệu từ user buffer copy vào kernel buffer Thông qua kernel buffer, liệu gửi xuống uart_tx_buffer Việc truyền liệu theo bước truyền liệu nêu 3.4 Kết sử dụng Soft UART Sau thử nghiệm với tốc độ khác 4800, 9600, 14400, 19200 nhận thấy:   RX nhận ổn định tốc độ 4800 Khi tăng lên tốc độ 9600 bit Nếu bỏ qua bit sử dụng nhận với tốc độ 9600 TX nhận ổn định tốc độ 9600 Khi giảm tăng giá trị baudrate khác có tượng bị bit truyền với sai số tầm 5% Hình Nhận chuỗi với baudrate 4800 Hình Truyền chuỗi với baudrate 9600 IV Device tree Device tree file mô tả phần cứng, kiểu định dạng giống JSON Cấu trúc mô tả dạng với node đại diện cho device Mỗi node có thuộc tính, thuộc tính gán giá trị để trống Device Tree chuẩn sử dụng với mục đích định nghĩa giao tiếp(I2C, SPI,…) cho hệ firmware máy tính Các phần Device Tree gồm:    Quy ước đặt tên, alias, gán nhãn Mô tả liệu API Quản lý địa truy cập tài ngun device Hình 1.Mơ tả node 1.Quy ước đặt tên Node đặt theo dạng name[@address] với name tối đa 31 ký tự, [@address] địa để truy cập vào node [@address] có khơng có 2.Alias, label phandle Phân tích thành phần hình trên:    Lable: định danh node tên (1 lable dùng cho nhiều node) Lable DTC chuyển thành giá trị 32 bit nhất.Ví dụ: gpio1, node_lable lable Phandle(pointer handle): giá trị 32 bit sử dụng để tham chiếu node với node khác.&gpio phandle trỏ tới node gpio1 Alias: Giúp kernel rà sốt hết để tìm node Alias khơng DT dùng mà kernel dùng 3.Device Tree Compiler (DTC) Device Tree Compiler công cụ biên dịch file dts sang file dtb Device tree sử dụng dạng chính:    Dạng source code (Device Tree Source – DTS) có định dạng dts Dạng source code mức SoC có định dạng dtsi, dtsi include vào dts Dạng biên dịch (Device Tree Blod –DTB) có định dạng dtb Phụ lục Yocto Project Giới thiệu Yocto Project dự án mã nguồn mở cung cấp công cụ giúp xây dựng thành phần Embedded Linux Yocto Project bao gồm nhiều thành phần nhiều dự án mã nguồn mở Poky, BitBake OpenEmbedded-Core Yocto Project sử dụng Poky làm reference distribution Poky bao gồm OpenEmbedded Build System (BitBake + OpenEmbedded-Core) metadata mặc định có sẵn (các recipes, file cấu hình,…) Ngồi việc build bootloader, kernel, rootfs Yocto project build SDK (Software Development Kit) Hình Poky build system Việc sử dụng Buildroot để build thành phần riêng lẻ gây số lỗi kết hợp phần với (bootloader, kernel, rootfs) Bởi vậy, sử dụng Yocto Project để build tất thành phần giải pháp hiệu Hình Các thành phần Yocto Project Một số lưu ý:     Yocto phân phối Linux Yocto build system Yocto framework Yocto tool So sánh Yocto Project Buildroot Tư tưởng - Output - Layer - Mức độ phức tạp - Yocto Project Hỗ trợ nhiều kiến trúc Chỉ cung cấp Core recipes, sử dụng layer để mở rộng thêm gói hỗ trợ Việc custom xảy layer khác Tạo phân phối, ouput loạt package Có thể tạo roofs img Có thể tạo disk image Có thể tạo SDK kèm theo image Cơ chế layer cho phép sửa/ thêm package Bên thứ cung cấp layer với BSP Cần tìm hiểu kỹ Core BitBake dự án tách riêng Có tài liệu hướng dẫn chi tiết - Buildroot Tập trung vào đơn giản Dễ sử dụng, dễ hiểu, dễ mở rộng Sử dụng cơng nghệ tại: makefile, kconfig Kích thước nhỏ tốt Output roofs img Khơng có gói binary, khơng có hệ thống quản lý gói Cần phải update tồn hệ thống Khơng có khái niệm Tất package lấy từ repository Thiết kế đơn giản, dễ hiểu Core logic viết hoàn toàn make Tài liệu chi tiết, resource dễ dàng tìm kiếm sử dụng ... make -j4 ARCH=arm CROSS_COMPILE=arm-cortex_a8 -linux- gnueabihf- zImage $ make -j4 ARCH=arm CROSS_COMPILE=arm-cortex_a8 -linux- gnueabihf- modules $ make ARCH=arm CROSS_COMPILE=arm-cortex_a8 -linux- gnueabihf-... git://git.kernel.org/pub/scm /linux/ kernel/git/stable /linux- stable.git $ git checkout linux- 4.9.y $ cd linux- stable $ make ARCH=arm CROSS_COMPILE=arm-cortex_a8 -linux- gnueabihf- mrproper $ make ARCH=arm... ARCH=arm CROSS_COMPILE=arm -linux- gnueabihf- distclean $ make ARCH=arm CROSS_COMPILE=arm -linux- gnueabihf- beaglebone_defconfig $ make ARCH=arm CROSS_COMPILE=arm -linux- gnueabihfSau build rootfs.ext4,

Ngày đăng: 28/10/2021, 14:49

TỪ KHÓA LIÊN QUAN

w