Giới thiệu về ngắt (Interrupt)

Ngắt là gì?

Hằng ngày bạn lập trình, bạn sử dụng các hàm như write, writeln, read, scanf, printf… Có lúc nào bạn tự hỏi các hàm này do đâu mà có, được cài đặt như thế nào? Xin trả lời: đó là các hàm thư viện kèm theo mỗi trình biên dịch và chúng được cài đặt như thế nào ư? Đừng quan tâm nó được cài đặt như thế nào bởi đó là mục địch của các ngôn ngữ lập trình làm cho việc lập trình được đơn giản và thống nhất (đối với các ngôn ngữ lập trình đa hệ điều hành như Pascal, C vừa dùng để lập trình cho DOS, cho Windows, cho Linux v.v..).

Như các bạn đã biết mọi chương trình lập trình để chạy được cần biên dịch ra mã máy, các trình biên dịch đã che dấu cách cài đặt bên trong của các hàm thư viện này bởi vì cùng một lệnh write nếu chạy trong DOS sẽ được dịch ra mã máy khác với lệnh write nếu chạy trong Linux. Đó là ở mức độ lập trình ứng dụng.

mức độ hệ thống, chúng ta cũng phải biết rằng các thiết bị phần cứng cũng hoạt động theo cùng một nguyên tắc như trên. Các nhà sản xuất phần cứng không muốn (cũng như không thể) bắt các nhà lập trình phải hiểu được cách thức các thiết bị phần cứng hoạt động thực sự như thế nào. Vì sao? Giả sử điều đó xảy ra, khi đó một nhà lập trình viên muốn hiển thị một kí tự lên màn hình, anh ta phải lập trình cho máy tăng điện áp ở một cổng nào đó, hạ điện áp ở một cổng khác v.v.. tùy theo thiết kế của hãng sản xuất card màn hình. Nhưng không phải là tất cả, trên thị trường đâu phải chỉ có một loại card màn hình, thế là lập trình viên phải viết lệnh cho tất cả mọi card màn hình có trên thị trường. Vậy đó, một công việc hết sức đơn giản chúng ta thường làm hằng ngày bằng một lệnh write của Pascal là sự che đậy của một quá trình rất phức tạp. Hướng giải quyết của các thiết bị phần úứng cũng có những “hàm thư viện của chúng”, đây là các hàm thư viện sử dụng cho mọi chương trình chạy trên các thiết bị phần cứng đó kể cả hệ điều hành. Các hàm thư viện này không có tên mà được kí hiệu bằng các con số như ngắt 01, 08, 1C v.v.. Các hàm thư viện này (bây giờ gọi là “ngắt”) không phụ thuộc hệ điều hành, không phụ thuộc ngôn ngữ lập trình hay bất cứ trình biên dịch nào, cứ có các thiết bị phần cứng đó là bạn có thể gọi và sử dụng được các ngắt này.

Vấn đề không phải chỉ dừng lại ở đó, một số hệ điều hành (trong đó có MS-DOS) cũng muốn tạo ra các thư viện dùng chung cho các chương trình chạy trong nó (các thư viện không phụ thuộc ngôn ngữ lập trình hay trình biên dịch, miễn sao có DOS là có các hàm thư viện này) cũng tạo ra các ngắt riêng cho nó.

Các ngắt này được cài đặt như thế nào? Trong RAM vùng nhớ đầu tiên không được sử dụng cho các trình ứng dụng mà là để lưu các thông tin cần thiết cho quá trình vận hành của máy, trong đó có một vùng nhớ với kích thước 256*4 byte tạo thành một mảng để lưu 256 con trỏ cất giữ địa chỉ của 256 ngắt (đánh số từ 0 đến 255). Các ngắt, chúng thực sự là các chương trình con mà bạn thường viết trong Pascal, C… được biên dịch riêng lẻ rồi đặt trong một vùng nhớ nào đó (không nhất thiết là RAM, có thể là bộ nhớ riêng của phần cứng và được ánh xạ vào RAM) rồi đặt vào địa chỉ của chương trình con đó vào vị trí tương ứng trong bảng nói trên. Bây giờ bất cứ chương trình nào muốn gọi ngắt chỉ cần truy cập vào bảng nói trên, tìm địa chỉ rồi gọi ngắt đó (như gọi một chương trình con vậy). Bây giờ sản xuất một card màn hình, nhà sản xuất đã viết sẵn các chương trình và đặt nó vào một số ngắt tương ứng (theo quy ước), lập trình viên lúc này muốn hiện một kí tự ra màn hình không cần biết máy sử dụng loại card nào, cũng không cần biết card đó được cấu tạo ra sao, chỉ cần gọi ngắt tương ứng với màn hình (với các tham số cần thiết) là có thể hiển thị các kí tự lên màn hình.

Ngoài ra ngắt còn có một vai trò khác cũng quan trọng không kém: đó là cách các thiết bị phần cứng báo các sự kiện vật lý cho chương trình máy tính biết. Ví dụ khi bạn kích chuột, nhấn một phím trên bàn phím v.v.. những thiết bị phần cứng (chuột, bàn phím) sẽ thông báo cho hệ điều hành bắt cách gọi một ngắt tương ứng, hệ điều hành hoặc một chương trình nào đó nếu chặt trước ngắt này thì sẽ nhận biết được sự kiện người dùng nhấn phím hay chuột.

Theo cách hoạt động trên của các ngắt hệ thống, có thể bạn sẽ nảy sinh một số câu hỏi, đây là những câu hỏi mà tôi đã từng đặt ra và đã tìm được lời giải đáp:

  • Số lượng chức năng có thể cung cấp cho các thiết bị phần cứng rất nhiều những chỉ có 256 ngắt làm sao mà đủ? Xin trả lời đúng là số ngắt rất ít nên một ngắt không chỉ có một chức năng mà thường là gộp của nhiều chức năng, các chức năng cần gọi được xác định thông qua các tham số truyền cho ngắt. Ví dụ ngắt 10h là ngắt tập hợp các chức năng chuẩn của card màn hình, khi cần chức năng gì của màn hình, lập trình viên gọi ngắt 10h và truyền các tham số (theo quy ước) để chương trình con ở ngắt 10h thực hiện đúng chức năng mà lập trình viên yêu cầu. Cùng là ngắt 10h nếu lập trình viên truyền các tham số khác thì ngắt 10h lại thực hiện một chức năng khác… (cái này cũng đủ rồi, không biết kiến trúc của máy tính hiện đại có tăng số ngắt lên không nữa)
  • Vậy làm sao các ngắt nhận được các tham số? Các ngắt nhận tham số qua các thanh ghi của CPU (các thanh này không nằm trong RAM mà nằm ngay trong CPU), nếu tham số lớn có thể truyền qua dạng con trỏ. Thực ra các chương trình chúng ta thường viết cũng nhận tham số bằng cách này nhưng như đã nói các ngôn ngữ lập trình và trình biên dịch đã lo liệu hết rồi, bạn chỉ việc khai báo hàm cho đúng ngữ pháp, thế là xong.
  • Theo như cách nói ở trên thì cách điều khiển phần cứng là thống nhất, có thể bạn sẽ đặt ra câu hỏi tại sao cần driver ở từng thiết bị làm gì? Đúng là theo như trên thì cách điều khiển phần cứng có thể coi là thống nhất, và bạn có bao giờ đòi driver của bàn phím chuẩn, chuột chuẩn, ổ cứng chuẩn không? Và khi cài Windows XP, dù không có driver chương trình cài đặt đâu cần đến driver vẫn hiển thị được trên màn hình, đó chính là nhờ thông qua các ngắt chuẩn. Còn việc đòi driver của Windows là do số lượng thiết bị là quá nhiều, mỗi thiết bị ngoài những chức năng chuẩn còn có thêm các chức năng khác. Windows nếu chỉ dùng ngắt thì chỉ có thể điều khiển được các ngắt tương ứng với các chức năng chuẩn mà thôi (vì đã có quy ước), còn các ngắt tương ứng với các chức năng mở rộng thì chịu. Với lại còn có rất nhiều phần cứng ra đời sau khi Windows ra đời, chẳng lẽ Windows phải thay đổi mã nguồn để chạy được các thiết bị đó.

Nguồn từ thành viên topwin (diendantinhoc.com)

One thought on “Giới thiệu về ngắt (Interrupt)

  1. Pingback: Giới thiệu về ngắt (Interrupt) | Phạm Anh Hữu

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s