Giới thiệu về lập trình Assembly trên Linux (AT&T Style không phải Intel Style)

Tham khảo
– Sách : AT&T Assembly Language, Richard Blum

1. Ngôn ngữ Assembly là gì?

  • Ở mức thấp nhất, Process chỉ hiểu instruction code
  • Instruction Code là các mã nhị phân chứa các thành phần: Instruction prefix, Opcode, ModR/M, SIB, Displacement, Data Element.
  • Người ta hoàn toàn có thể viết chương trình bằng instruction code, nhưng nó sẽ cực kì khó nhọc, bởi ta chỉ thấy không gì khác ngoài các byte nối tiếp nhau.
  • Việc sử dụng các ngôn ngữ bậc cao giúp việc viết chương trình dễ dàng hơn rất nhiều, vì trình biên dịch hoặc thông dịch đảm nhiệm việc chuyển mã ngôn ngữ bậc cao trực tiếp hoặc gián tiếp sang instruction code để chạy.
  • Tuy nhiên, việc sinh instruction code của trình biên dịch/thông dịch không phải luôn luôn hiệu quả. 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

PER trong ASN.1 Encoding

PER là phương thức biểu diễn dữ liệu ngắn gọn và xúc tích nhất có thể của ASN.1. Thay vì sử dụng TLV như BER, PER sử dụng Preamble (diễn cho nhiều hoặc trạng thái bị lược bỏ của một dữ liệu bên trong), giá trị kích thước(cũng có thể bị lược bỏ), giá trị (cũng có thể bị lược bỏ), hay gọi là PLV.

Đơn vị biểu diễn của PER không phải Octet mà là Bit. Mỗi phần tử sẽ thuộc 1 trong 3 loại sau:
1. Trường dư bit, tức là dãy bit không thể biểu diễn bằng một số nguyên các Octet.
2. Trường nguyên bit, có thể biểu diễn bằng một số nguyên các Octet.
3. Danh sách trường, chứa cả các thành phần là nguyên bit và dư bit.

Tiếp tục đọc

CER/DER trong ASN.1 Encoding

Khi sử dụng BER để hiện thực dữ liêu, ta thấy rằng có khá nhiều chỗ tùy ý. Tức là cùng một thông tin có nhiều cách biểu diễn khác nhau. Khi sử dụng với trường hợp chữ kí Số, phát sinh ra nhiều vấn đề.

Để giải quyết những vấn đề đó, người ta thêm ràng buộc vào BER, và tạo ra CERDER.

Sự khác nhau chủ yếu giữa CERDER là về biểu diễn trường độ dài. Length(L). Trong khi DER sử dụng một định dạng với độ dài cố định, thì CER sử dụng định dạng với độ dài không có định,
Tiếp tục đọc

ASN.1 – BER (Basic Encoding Rules)

Tiếp tục về ASN.1.

Như bài đầu tiên, ASN.1 tách biệt phần định nghĩa dữ liệu (các file định nghĩa) với phần hiện thực dữ liệu (mỗi trường được biểu diễn bằng mấy byte, mấy bit, etc)

Ta sẽ tiếp tục nói về hiện thực dữ liệu.
Các phương thức để hiện thực dữ liệu gồm có: BER, CER/DER, và PER.

Trong đó:
BER : Basic Encoding Rules
CER/DER : Canonical Encoding Rules/Distinguished Encoding Rules
PER : Packet Encoding Rules

Tiếp tục đọc