Build, chạy nhân Linux trong QEMU ARM

Chạy một bản Linux tối giản trên Qemu ARM

Bài này sẽ làm một ví dụ để chỉ ra sự liên quan giữa
các thành phần của một hệ thống Linux thông qua
việc build, chạy Kernel trên board vexpress-a9 mô phỏng bằng Qemu.

Đó là Kernel, Root file system, Busybox, Init.


1. “Chém” chút về quá trình khởi động của Linux

  • Về cơ bản, quá trình khởi động Linux có 2 giai đoạn.
    Giai đoạn đầu là load kernel lên RAM và chạy
    Giai đoạn thứ hai là kernle sẽ tự động mount hệ thống file
    rồi các ứng dụng trên hệ thống file được mount.
    Bất cứ bản Linux nào, dù lớn, dù bé đều thì tối thiểu phải có 2 giai đoạn ở trên.
    Tiếp tục đọc

So sánh giữa Buildroot và Yocto Project

Bài này sẽ dịch lại Slide thảo luận giữa 2 diễn giả là Alexandre Belloni, Thomas Petazzoni
từ Free Electrons tại Embedded Linux Conference 2016.

So sánh giữa Buildroot và OpenEmbedded/Yocto Project

1. Điểm chung

  • Đều là build-system cho Embedded Linux.
    Mục tiêu là có thể customize, build hoàn chỉnh một Embedded Linux System.
    Bao gồm: filesystem, toolchain, kernel, bootloaders
  • Đều được build từ source
  • Sử dụng cross-compilation
  • Rất actively trong cả dự án đang maintained và phát triển.
  • Được sử dụng rộng dãi trong công nghiệp.
  • Tài liệu tốt, nhiều khóa đào tạo.
  • Sử dụng Free Software (phần mềm tự do)
    Tiếp tục đọc

Thực hiện 4 Stage khi Compile bằng tay (Manual)

Ta đã có bài giới thiệu về 4 Stage khi Compiling rồi. Đầu ra của Stage trước sẽ là đầu vào của Stage sau.

Trong compile thông thường dạng

$gcc -o HelloWorld HelloWorld.c

Với câu lệnh trên,ta sẽ không thấy kết quả của 3 Stage đầu tiên.

Để hiểu rõ hơn, chúng ta hãy thử thực hiện các Stage bằng tay xem liệu ta có thể tạo ra file chạy như câu lệnh compile trên hay không.

Tiếp tục đọc

4 Stage khi biên dịch HelloWorld.c

Gần đây, phải giải quyết giúp một vài vấn đề liên quan đến Cross-Compile. Có tìm hiểu kĩ một chú về Compiler, Linker, và Loader.
Bài này xin nói về cơ bản về quá trình biên dịch một file source code (.c) sang dạng chạy được.
Ví dụ: từ HelloWorld.c thành HelloWorld và chạy được như ví dụ dưới đây.

HelloWorld.c

#include
int main()
{
print("Hello World \n");
return 0;
}

Kết quả chạy:

$./HelloWorld
HelloWorld

Tiếp tục đọc

Một chút hiểu thêm về “Hello World” trong C.

Gần đây, gặp một số vấn đề về Loader-Linker giữa môi trường build và môi trường chạy trong Cross-Compiling.

Có thể bất kì chương nào trong Linux cũng vậy. Nhưng chỉ xét một chường trình được build bằng C thì
một chương trình sẽ được chạy 2 cách dưới đây

Tiếp tục đọc

Lỗi về Case-sensive khi biên dịch C (gcc)

Khi phát triển các ứng dụng trên Linux, nhúng Linux, mình hầu như cài đặt và sử dụng một máy ảo (tạo bằng VMWare hoặc VirtualBox). Cài trình biên dịch GCC lên đó.
Hầu như mình có thể làm mọi việc trên môi trường máy ảo đó trừ quản lý source.
Vì cty mình vẫn sử dụng SVN với Client là Tortoise. Linux cũng có rất nhiều công cụ tuơng tự Tortoise nhưng để tránh những vấn đề không cần thiết, có thể làm phiền người khác liên quan đến tương thích SVN, mình vẫn chọn quản lý bằng Tortoise trên Windows.
Tiếp tục đọc

Phân biệt Build vs Host vs Target

Khái niệm Cross-compiling là rất phổ biến khi phát triển các hệ thống nhúng.
Với người mới, hiểu rõ khái niệm là rất quan trọng.

Bài này sẽ cố gắng phân biệt 3 khái niệm về môi trường. Đó là Host Enviroment, Build Enviroment, và Target Enviroment. Có thể dịch nôm na là Môi trường chủ, Môi trường biên dịch, và Môi trường chạy đích.
Vì có thể dẫn đến hiểu nhầm hoặc không rõ nghĩa nên chúng ta nên sử dụng trực tiếp thì hơn.

Trước khi bắt đầu với các ví dụ, ta nên xem qua một số nguồn diễn giải 3 khái niệm này.

Tiếp tục đọc

2 cách sử dụng thư viện trong Linux

Mình đang gặp 1 vấn đề là 1 hàm F1() trong thư viện động mình viết (lib1.so) không hoạt động đúng như mong muốn. Trong hàm F1()có gọi một loại hàm F21(), F22(), F23()…F2n() từ 1 thư viện tĩnh (lib2.a) khác.

Khi build không gặp lỗi,

Khi biên dịch thư viện động này với 1 file sample.c để chưa main() để chạy thử và gọi hàm F1() từ thư viện động lib1.so. Kết quả vẫn mong muốn.

Tuy nhiên, khi ném thư viện đó vào ứng dụng khác (mà mình không biết họ có sử dụng cùng cách làm với ví dụ của mình không) thì các hàm F2x() có vẻ vẫn chạy nhưng kết quả không như mong muốn, và luôn đưa ra những kết quả giống nhau.

Tìm hiểu 1 chút về Dynamic Libraries, thì thấy có vẻ chưa hiểu kĩ lắm nên sẽ tìm 1 vài bài để dịch, đọc. Có thể chưa phải là đúng tutor cho đúng problem. Nhưng cứ dịch đã, hiểu được sẽ giải thích được và tìm ra được nguyên nhân ở trên. Tiếp tục đọc

CMake – Một ví dụ đơn giản

Trong bài tôi đã giới thiệu qua về CMake. Như ta đã biết nó cung cấp tính tăng giúp việc sinh ra Makefile một cách hiệu quả. Nhất là đối với các dự án phức tạp. Nó cũng cung cấp thêm các bộ sinh khác để sinh cấu trúc quản lý source cho các IDE khác nhau như Visual Studio, KDE.
Trong giới hạn, tôi sẽ nói về việc sử dụng CMake để build một simple project trên cả Windows và Linux.

Ta vẫn xoay quanh ví dụ kinh điển là tạo chương trình Hello World, nhưng yêu cầu hiển thị câu đó trên ít nhất 3 ngôn ngữ. ja,en,vi. Chương trình sẽ viết bằng ngôn ngữ C.

(Link tham khảo)
Ví dụ được thực hiện trong thư mục /home/oedev/Code/CMake

Nội dung chính gồm các phần sau,
1. Chương trình Hello World cho En.
2. Thêm ngôn ngữ Ja, Vi vào chương trình trên.
3. Thêm ngôn ngữ Ja, Vi trong một tình huống khác.

Tiếp tục đọc