1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài tập lớn lập trình driver trên ubuntu 32 bit chương 2 viết driver cho ubuntu 32bi

36 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

Tiêu đề Viết driver cho Ubuntu 32bit
Tác giả Phạm Bá Hiếu, Nguyễn Tuấn Anh
Người hướng dẫn TS. Phạm Văn Hưởng
Trường học Học viện Kỹ thuật Mật Mã
Chuyên ngành Lập trình driver
Thể loại Bài tập lớn
Năm xuất bản 2020
Thành phố Hà Nội
Định dạng
Số trang 36
Dung lượng 4,5 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Hơn thế nữa, cùng với cộng đồng sử dụng Linux rộng lớn trên các phần mềm mã nguồn mở đa dạng làm cho việc phát triển hệ thống một chiến lược được các công ty lựa chọn hàng đầu.. Có thể l

Trang 1

BAN CƠ YẾU CHÍNH PHỦ

Nhóm inh viên thực hiện s :

Trang 2

MỞ ĐẦU 3

Chương 1 KIẾN THỨC NỀN TẢNG 4

1.1 Hệ điều hành Ubuntu 4

1.1.1 Khái niệm 4

1.2 Ubuntu 32 bit và Ubuntu 64 bit 4

1.2.1 Kiến trúc HĐH Ubuntu 5

1.2.2 Cài đặt hệ điều hành Ubuntu 6

1.3 Driver 10

1.3.1 Khái niệm 10

1.3.2 Môi trường, công cụ và quy trình biên dịch Driver 13

Chương 2 Viết driver cho ubuntu 32bit 14

2.1 Kiến thức về ngôn ngữ C/C++ 14

2.1.1 Khái niệm 14

2.1.2 Cú pháp của C 14

2.1.3 Lưu dữ liệu 15

2.2 Lập trình driver trên ubuntu 16

2.3 Phát triển driver cho bàn phím usb 17

2.3.1 Mô tả chương trình mã nguồn 17

2.3.2 Truyền dữ liệu giữa USB và thiết bị 18

2.3.3 Phân tích mã Drive 20

2.3.4 Xử lý urb trong trình device driver 22

2.3.5 Mã nguồn usb driver 24

KẾT LUẬN 33

TÀI LIỆU THAM KHẢO 34

Trang 3

MỞ ĐẦU

Hiện nay, với sự phát triển ngày càng nhanh của hệ thống nhúng trên thị trường,

dễ dàng có thể thấy hệ điều hành Linux xuất hiện ở hầu hết tạp cũng như khả năng đáp ứng cao Việc tích hợp hệ điều hành lên hệ giản hóa quá trình thiết kế sản phẩm, rút ngắn thời gian cũng như chi phí vì ứng dụng này được kế thừa sự ưu việt của một hệ điều hành nói riêng Đó là sự nhỏ gọn, ổn định, thực thi nhanh, đơn giản hóa và khả n phần cứng Hơn thế nữa, cùng với cộng đồng sử dụng Linux rộng lớn trên các phần mềm mã nguồn mở đa dạng làm cho việc phát triển hệ thống một chiến lược được các công ty lựa chọn hàng đầu

Mặt khác, chuẩn giao tiếp USB (Universal Series Bus) đã và đang những chuẩn giao tiếp phổ biến nhất Hiện tại, USB đã trở thành chuẩn phương thức truyền dữ liệu thân thuộc với người dùng công nghệ nhờ bền và giá thành hợp lý của nó

Do đó chúng em quyết định chọn đề tài “Viết driver bàn phím USB làm bài tập lớn cho môn học Vì đây là một đề tài tương gian thực hiện có hạn, nên nhóm chúng

em chỉ dừng lại ở mức độ đi sâu của hệ điều hành nhằm tìm hiểu cơ chế quản lý giao tiếp USB của Linux dụng nằm trong file /drivers/hid của Linux kernel

.

Trang 4

1 KIẾN THỨC NỀN TẢNG

a) Hệ điều hành Ubuntu

1.a.1 Khái niệm

Ubuntu là một hệ điều hành máy tính dựa trên Debian GNU/Linux, một bản phân

phối Linux thông dụng Ubuntu có rất nhiều tính năng hữu ích cho các máy tính xách tay, desktop và cả máy chủ Đồng thời, hệ điều hành Ubuntu cũng được cung cấp miễn phí.

b) Ubuntu 32 bit và Ubuntu 64 bit

- Ubuntu 32 bit: sử dụng cho máy tính có CPU mà độ rộng của các thanh ghi bên trong là 32 bit.

- Hệ thống 32 bit có thể truy cập địa chỉ bộ nhớ, tức là 4GB RAM hoăc bộ nhớ vật lý Trong quá trình sử dụng máy tính, nếu ta sử dụng vượt quá dung lượng RAM hiện tại thì hệ thống sẽ tự động chuyển sang sử dụng bộ nhớ ảo hay dung lượng ổ cứng còn dư để lưu trữ tạm thời.

- Vi xử lý 32 bit chỉ tương thích với hệ điều hành 32 bit.

- Không phù hợp với stress testing và multi-tasking.

- Ubuntu 64 bit: sử dụng cho máy tính có CPU mà độ rộng của các thanh ghi bên trong là 64 bit.

- Hệ thống 64 bit có thể truy cập địa chỉ bộ nhớ, tức là 17 tỉ GB RAM Hệ thống

có thể phù hợp với thế bị có nhiều hơn 4GB RAM.

- Vi xử lý 64 bit có thể chạy cả hệ điều hành 32 bit và 64 bit.

- Hoạt động tốt cho stress testing và multi-tasking.

- Các bản phân phối Ubuntu:

 Kubuntu là bản phân phối Ubuntu để sử dụng môi trường làm việc KDE.

 Lubuntu là phiên bản gọn nhẹ nhất sử dụng LXDE, được khuyên dùng cho các máy tính cũ, cấu hình thấp.

 Xubuntu là bản phân phối với giao diện mặc định Xfce.

 Myth ubuntu là bản phân phối dành cho hệ thống kênh truyền hình MythTV, thích hợp cho giải trí tại gia đình.

Trang 5

 Ubuntu Studio là nền tảng chuyên phục vụ chỉnh sửa video và âm thanh chuyên nghiệp, chất lượng cao.

- Yêu cầu thiết bị (phiên bản 20.04 TLS):

 Vi xử lý tốc độ trên 2GHz, 2 nhân.

 Ram 4Gb.

 25GB dung lượng đĩa trống

1.b.1 Kiến trúc HĐH Ubuntu

Trang 6

1.b.2 Cài đặt hệ điều hành Ubuntu

Tải hệ điều hành

Trang 7

Sử dụng chương trình Vmware

Trang 8

Đặt tên máy ảo, vị trí lưu trữ:

Trang 9

Cấu hình dung lượng ổ đĩa cho máy ảo:

Trang 10

Cấu hình RAM cho máy ảo:

Trang 11

c) Driver

1.c.1 Khái niệm

Driver là một trình điều khiển có vai trò điều khiển, quản lý, giám sát một thực

thể nào đó dưới quyền của nó Bus driver làm việc với một đường bus, device driver làm việc với một thiết bị (chuột, bàn phím, màn hình, đĩa cứng, camera, …) Có thể lấy ví dụ tương tự như vai trò của một phi công hoặc một hệ thống bay tự động được giám sát bởi phi công, một thành phần phần cứng có thể được điều khiển bởi một driver hoặc được điều khiển bởi một phần cứng khác mà được quản lý bởi một driver Trường hợp này, phần cứng có vai trò điều khiển được gọi là một device controller Bản thân các controller cũng cần driver Ví dụ: hard disk controller, display controller, audio controller, … quản lý các thiết bị kết nối với chúng, mà nói một cách kỹ thuật hơn đó là các IDE controller, PCI controller, USB controller, SPI controller, I2C controller, … Các device controller thông thường được kết nối với CPU thông qua đường bus (PCI, IDE, USB, SPI, …)

Trang 12

Trong vi điều khiển, CPU và các device controller thường được thiết kế trên một chip Điều này cho phép giảm kích thước và giá thành, phù hợp với phát triển hệ thống nhúng Mà về mặt nguyên tắc, sẽ không có gì khác biệt đối lớn đối với các driver trên các hệ thống máy tính cá nhân.

Các bus driver cung cấp giao diện đặc tả cho các giao thức phần cứng tương ứng Nó nằm ở tầng dưới cùng trong mô hình phân lớp phần mềm của hệ điều hành Nằm trên nó là các device driver thực sự để vận hành các thiết bị, mang đặc trưng của từng thiết bị xác định Ngoài ra, mục đích quan trọng của các driver thiết bị là cung

Trang 13

cấp một giao diện trừu tượng hóa cho người sử dụng, tức là cung cấp một giao diện lên tầng trên của hệ điều hành Một cách tổng quan, một driver sẽ bao gồm 2 phần quan trọng: a) giao tiếp với thiết bị (Device-specific) b) giao tiếp với hệ điều hành (OS-specific) Thành phần giao tiếp với thiết bị (device-specific) của một driver là giống nhau đối với tất cả các hệ điều hành Nó có thể hiểu và giải mã các thông tin về thiết bị (chi tiết kỹ thuật, kiểu thao tác, hiệu năng, cách lập trình giao tiếp với thiết bị,

…)

Thành phần giao tiếp với hệ điều hành (OS-specific) gắn kết chặt chẽ với các cơ chế của hệ điều hành, và do vậy sẽ là khác nhau giữa một driver trên Linux và một driver trên Windows, hoặc MacOS, …

Tùy thuộc vào đặc trưng của của driver với hệ điều hành, driver trên Linux được phân chia thành 3 loại (phân cấp theo chiều dọc):

- Packet-oriented or the network vertical (driver hướng gói dữ liệu)

- Block-oriented or the storage vertical (driver hướng khối dữ liệu)

- Byte-oriented or the character vertical (driver hướng byte/ký tự)

Packet-oriented hay network driver gồm 2 phần: a) network protocol stack và b) network interface card (NIC) device drivers, hoặc đơn giản là network device driver (có thể là Ethernet, Wi-Fi, hoặc bất kỳ các giao tiếp mạng nào khác,…) Block-oriented hay storage driver gồm 2 phần: a) File-system drivers để giải mã các định dạng khác

Trang 14

nhau trên các phân vùng lưu trữ khác nhau (FAT, ext, …) và b) Block device drivers cho các giao thức phần cứng ứng với các thiết bị lưu trữ khác nhau (IDE, SCSI, MTD,

…) Các Byte-oriented hay character driver lại tiếp tục được phân chia thành các lớp con (sub-classified) như tty driver, input driver, console driver, frame-buffer drivers, sound driver, … (tương ứng với các giao tiếp như RS232, PS/2, VGA, I2C, SPI, …)

1.c.2 Môi trường, công cụ và quy trình biên dịch Driver

a) Công cụ biên dịch

Bộ trình dịch GNU ( tiếng Anh : GNU Compiler Collection - thường được viết tắt thành GCC ) là một tập hợp các trình biên dịch được thiết kế cho nhiều ngôn ngữ lập trình khác nhau GCC là một thành phần quan trọng của GNU toolchain , và được hầu hết các hệ điều hành giống Unix , như Linux và Mac OS X chọn làm trình dịch tiêu chuẩn Các dòng hệ điều hành BSD đa phần đều sử dụng GCC, dù một số dòng như FreeBSD và OpenBSD lại sử dụng Clang làm trình biên dịch chuẩn Các phiên bản sau đo của GCC cũng hỗ trợ trên cả Microsoft Windows và một số hệ điều hành khác GCC cũng có thể biên dịch chương trình cho cả Android và iOS

Make là một công cụ xây dựng tự động hóa tự động build các chương trình thực

thi và các thư viện từ mã nguồn bằng cách đọc các tệp được gọi là Makefiles chỉ định cách dẫn xuất chương trình đích Mặc dù các tính năng của môi trường phát triển tích hợp và ngôn ngữ -specific compiler cũng có thể được sử dụng để quản lý quá trình xây dựng.

b) Môi trường biên dịch

- Hệ điều hành Ubuntu phiên bản 18.04 32bit

- Phiên bản nhân Linux : 5.8.0

c) Quy trình biên dịch

- Cài đặt các công cụ biên dịch và hỗ trợ

- Viết chương trình driver

Trang 15

- Cài đặt driver vào nhân hệ điều hành

Trang 16

2 VIẾT DRIVER CHO UBUNTU 32BIT a) Kiến thức về ngôn ngữ C/C++

2.a.1 Khái niệm

- Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập

niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX

- Từ đó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất

- C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy trong khoa học máy tính mặc dù ngôn ngữ này không được thiết kế dành cho người nhập môn.

2.a.2 Cú pháp của C.

- C có nhiều điểm yếu trong cú pháp Đáng chú ý là:

- Nguyên mẫu của hàm nào không chỉ ra tham số nào thì được hiểu ngầm là cho phép một tập bất kì các tham số Một vấn đề về cú pháp đã được đề ra cho khả năng tương thích ngược của K&R C, về việc thiếu các nguyên mẫu.

- Một số sự chọn lựa đáng ngờ vực về thứ tự ưu tiên của các toán tử, chẳng hạn như == "nối kết" một cách chặt chẽ hơn và trong các biểu thức như là & | x & 1

== 0.

- Việc dùng toán tử "=" một cách dễ nhầm lẫn Nếu dùng trong đẳng thức toán học để chỉ các phép gán, dẫn tới các phép gán không chủ định trong việc so sánh và dẫn tới một ấn tượng sai lầm rằng phép gán có tính bắc cầu Ví dụ: việc dùng câu lệnh if (x=0) { } sẽ dễ gây ra các lỗi bất ngờ.

- Thiếu các toán tử infix cho các đối tượng phức tạp, đặc biệt là cho các phép toán trên dãy các ký tự làm cho chương trình phụ thuộc nặng nề lên các phép toán rất khó đọc.

- Dựa vào quá nhiều trên hệ thống ký hiệu làm cơ sở cho cú pháp ngay cả ở nơi không tường minh như là "&&" và "||" thay vì dùng "and" và "or".

- Cú pháp khai báo không được dễ hiểu, đặc biệt cho hàm của các con trỏ Trong tình huống hoàn toàn tương tự của C++, nhà nghiên cứu Damian Conway nói về

cú pháp của khai báo như sau:

- Khó để mà đặc tả một kiểu trong C++ bởi vì thực tế là một số phần tử của việc khai báo (như là con trỏ) thì là các toán tử tiền tố trong khi một số khác (như là mảng) lại là toán tử hậu tố (nghĩa là phải đặt đứng trước tên con trỏ và dặt * [] sau tên mảng—người dịch) Nhừng toán tử khai báo này lại có các thứ tự ưu

Trang 17

tiên khác nhau, cần phải được đặt trong các dấu ngoặc cẩn thận để đạt được sự khai báo mong muốn.

2.a.3 Lưu dữ liệu

- Một trong những chức năng quan trọng nhất của một ngôn ngữ lập trình là việc cung cấp cơ sở cho việc quản lý bộ nhớ và các đối tượng được chứa trong bộ nhớ

C cung ứng 3 phương cách để cấp phát bộ nhớ cho các đối tượng:

- Sự cấp phát vùng nhớ tĩnh : khoảng trống dành cho đối tượng thì được cung cấp trong phần mã nhị phân ở thời gian dịch; những đối tượng này có một thời gian sống lâu dài theo sự tồn tại của phần mã nhị phân chứa chúng (các đối tượng).

- Sự cấp phát vùng nhớ tự động : Các đối tượng tạm thời có thể được chứa trong một chồng ( stack ), và khoảng trống này thì được trả về một cách tự động và có thể được dùng lại sau khi khối mã mà chúng (tức các đối tượng tạm thời) được khai báo đã thực thi xong.

- Sự cấp phát vùng nhớ động : Các khối của bộ nhớ với bất kì cỡ lớn mong muốn nào đều có thể được yêu cầu (hay xin) trong thời gian thi hành bằng cách dùng các hàm thư viện như là malloc() realloc() , và free() từ một khu vực của bộ nhớ có tên là heap ; các khối này có thể được tái dụng sau khi gọi hàm free() để hoàn trả chúng lại cho bộ nhớ.

- Ba phương án này thích hợp cho các tình huống khác nhau và có những hậu quả khác nhau Ví dụ, kiểu cấp phát tĩnh sẽ không cần thời gian (để tính toán) cho

sự cấp phát, kiểu cấp phát tự động sẽ cần một khoảng thời gian nào đó cho dự tính, và kiểu cấp phát động có thể đòi hỏi một lượng lớn thời gian dùng dễ tính toán cho việc cấp phát và hoàn trả (các vùng nhớ đã được yêu cầu trước đó) Mặt khác, khoảng trống của chồng thường giới hạn cho vùng nhớ tĩnh hay cho khoảng trống của heap, và chỉ kiểu cấp phát vùng nhớ động là cho phép sự cấp phát cho các đối tượng mà kích thước của nó chỉ có thể biết được trong lúc thi hành Hầu hết các chương trình C đều dùng nhiều cả ba phương cách này.

- Khi có thể thì sự cấp phát tự động hay sự cấp phát tĩnh thường được dề nghị dùng vì kho nhớ được quản lý bởi trình dịch, giải phóng cho người lập trình những lồi lầm phiền hà khi phải xin cấp phát và hoàn trả các vùng nhớ bằng tay Rất tiếc nhiều cấu trúc dữ liệu có thể trương nở trong thời gian thực thi và vì kiểu cấp phát tĩnh và kiểu tự động phải có một độ lớn cố định ở thời gian dịch nên trong nhiều tình huống mà buộc phải dùng kiểu cấp phát động Các dãy thay đổi về độ lớn là một ví dụ điển hình của trường hợp này (Xem ví dụ từ bài malloc về các dãy được cấp phát vùng nhớ động.).

Trang 18

b) Lập trình driver trên ubuntu

- Như đã biết, Linux là 1 hệ điều hành có tính module rất cao, cho phép người dùng có thể chỉnh sửa các module, driver cần thiết tương ứng với thiết bị đang

- Biên dịch trực tiếp nghĩa là các driver có dùng hay không cũng đều được load ngày từ khi hđh khởi động, tất nhiên nó sẽ chiếm 1 phần memory Lợi điểm là

"tính trung thực" của nhân và driver Các hệ thống bảo mật cao thường biên dịch trực tiếp để tránh các module "lạ" bị cài vào nhân trong quá trình hoạt động của máy.

- Biên dịch module nghĩa là biên dịch các driver như những module, chỉ khi cần

sử dụng mới được tải vào nhân Lợi điểm của phương pháp này là hiệu quả sử dụng tài nguyên Bạn có thể tạo ra 1 nhân rất nhỏ gọn và thuận tiện trong việc biên dịch lại 1 số module nào đó (thay vì phải biên dịch lại toàn bộ nhân).

- Chương trình hello world:

static char *whom = "world";

module_param(whom, charp, S_IRUGO);

MODULE_PARM_DESC(whom, "Say hello to whom");

static int array[4];

static int array_length;

module_param_array(array, int, &array_length, S_IRUGO);

MODULE_PARM_DESC(array, "array of 4 integers");

static int hello_init(void)

Trang 19

printk(KERN_ALERT "Goodbye, %s\n", whom);

- Xem xét module này chúng ta thấy được một module căn bản nhất cần include

2 file <linux/init.h> và <linux/module.h>, và cần hiện thực ít nhất 2 hàm module_init và module_exit Hàm module_init sẽ được gọi khi lệnh insmod thực thi và hàm module_exit sẽ được gọi khi chúng ta rmmod module Linux kernel cung cấp nhiều macro cho module, sau đây là một số macro thường gặp:

@host:# insmod my_module my_variable=value

@host:# insmod /hello_world.ko whom="foo" array=1,2,3,4

c) Phát triển driver cho bàn phím usb

- Thư viện sử dụng: <linux/usb/input.h> lấy dữ liệu đầu vào từ các thiết bị usb.

- Sử dụng cấu trúc usb_device để tiến hành thực thi lại usb device driver

2.c.1 Mô tả chương trình mã nguồn

- Sử dụng usb_device_id Cấu trúc đại diện cho các thiết bị được hỗ trợ bởi trình điều khiển và thành viên id_table của usb_driver trỏ đến một mảng khởi tạo của cấu trúc này Như là:

Ngày đăng: 26/05/2023, 09:38

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w