Các cổng và các thanh ghi (ports and registers )

8 331 0
Các cổng và các thanh ghi (ports and registers )

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

Thông tin tài liệu

Các cổng ghi (Ports and Registers ) Các cổng ghi (Ports and Registers ) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Windows XP sử dụng mô hình máy tính trừu tượng mô tả hình 7.4 để cung cấp giao diện driver hợp kiến trúc CPU Trong chế độ này, CPU có nhớ riêng biệt không gian địa Để truy cập vào nhớ thiết bị, CPU giao công việc cho dạng nhớ khác nhớ load hay lưu truy cập trực tiếp đến địa ảo CPU dịch địa ảo thành địa vật lý cách thiết lập bảng trang Để truy cập vào thiết bị vào sơ đồ hoá, cách khác, CPU cầu cứu tới hệ thống đặc biệt x86 với lời dẫn vào Hình 7.4 Truy cập vào cổng ghi 1/8 Các cổng ghi (Ports and Registers ) Các thiết bị phải có đường Bus cách thức cụ thể để giải mã bọ nhớ địa vào/ra Trong trường hợp bus PCI, cầu nối (host) để vẽ đường (nối) địa nhớ vật lý CPU điạ vào/ra tới không gian địa mà truy cập trực tiếp tới thiết bị Bít cờ không gian cấu hình thiết bị định cầu nối có vẽ đường (nối từ) từ ghi thiết bị tới nhớ địa vào/ra CPU thong qua hai không gian địa Rộng bạn di chuyển có điều kiện loạt code biên dịch trình điều khiển bạn cho tất thể có thể, nhà thiết kế Windows Nt sáng tạo lớp phần cứng trừu tượng (Hal), mà ám vài lần sách Hal cung cấp hàm mà bạn sử dụng để truy xuất tới tài nguyên nhớ cổng Hãy nhìn bảng 7.3 Với bảng tóm lược này, bạn đọc/ghi UCHAR/ USHORT/ULONG mảng kiểu đến hay từ (đến đi) Cổng//Thanh ghi điều tạo nên 24 hàm hal tất mà bạn sử dụng để truy cập thiết bị Từ trình điều khiển WDM không trực tiếp dựa vào Hal cho tất thứ, bạn nghĩ 24 hàm tốt việc công khai toàn bộ, nguyên vẹn …… hal Bảng 7.3 Các hàm Hal cho việc truy cập cổng ghi nhớ Table 7-3 HAL Functions for Accessing Ports and Memory Registers Access Width Functions for Port Access Functions for Memory Access bits READ_PORT_UCHAR WRITE_PORT_UCHAR READ_REGISTER_UCHAR WRITE_REGISTER_UCHAR 16 bits READ_PORT_USHORT WRITE_PORT_USHORT READ_REGISTER_USHORT WRITE_REGISTER_USHORT 32 bits READ_PORT_ULONG WRITE_PORT_ULONG READ_REGISTER_ULONG WRITE_REGISTER_ULONG String of 8-bit bytes READ_PORT_BUFFER_UCHAR WRITE_PORT_BUFFER_UCHAR READ_REGISTER_BUFFER_UCHAR WRITE_REGISTER_BUFFER_UCHAR 2/8 Các cổng ghi (Ports and Registers ) String of READ_PORT_BUFFER_USHORT READ_REGISTER_BUFFER_USHORT 16-bit words WRITE_PORT_BUFFER_USHORT WRITE_REGISTER_BUFFER_USHORT String of READ_PORT_BUFFER_ULONG 32-bit WRITE_PORT_BUFFER_ULONG doublewords READ_REGISTER_BUFFER_ULONG WRITE_REGISTER_BUFFER_ULONG Những diễn bên hàm truy cập phục thuộc vào hệ nền(Platform) Ví dụ, phiên Intel x86 READ_PORT_CHAR thực cấu trúc IN để đọc byte từ cổng vào /ra định Bản bổ sung Microsoft Windows 98/ME tiến xa … lưu trữ tràn lời gọi trình điều khiển với lời gọi IN số trường hợp The Alpha version of this routine performs a memory fetch Phiên intel x86 Read_Register_uchar thực lộ trình nhớ … Theo cách khác, phiên định vùng đệm hàm (Read-registẻunchar) thực thêm số công việc môi trường x86 để chắn rằngtất nhớ cache xoá (làm sạch) cách hợp lý mà hoạt động kết thúc Tài nguyên cổng (Port) Các thiết bị vào mô hình hoá (IO-Mapped) phơi bày ghi phần cứng mà số kiến trúc CPU (bao gồm Intel x86) định địa thong qua phần mềm sử dụng không gian địa vào đặc biệt Trên số kiến trúc CPU khác, không tồn không gian địa riêng biệt, ghi định địa thong qua việc sử dụng nhớ thức khác May mắn thay, bạn không cần phải hiểu rõ phức tạp địa Nếu bạn yêu cầu thiết bị cổng tài nguyên, vòng lặp bạn lặp qua kí hiệu tài nguyên dịch tìm kiếm kí hiệu CmResourceTypePort, bạn lưu thông tin nơi typedef struct _DEVICE_EXTENSION { PUCHAR portbase; ULONG nports; BOOLEAN mappedport; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; 3/8 Các cổng ghi (Ports and Registers ) PHYSICAL_ADDRESS portbase; // base address of range for (ULONG i = 0; i < nres; ++i, ++resource) { switch (resource->Type) { case CmResourceTypePort: portbase = resource->u.Port.Start; pdx->nports = resource->u.Port.Length; pdx->mappedport = (resource->Flags & CM_RESOURCE_PORT_IO) == 0; break; } if (pdx->mappedport) { pdx->portbase = (PUCHAR) MmMapIoSpace(portbase, 4/8 Các cổng ghi (Ports and Registers ) pdx->nports, MmNonCached); if (!pdx->portbase) return STATUS_NO_MEMORY; } else pdx->portbase = (PUCHAR) portbase.QuadPart; Kí hiệu nguồn chứa đựng tập hợp đặt tên u mà có cấu trúc hạ tầng cho kiểu số kiểu nguồn chuẩn u.Port có thong tin tài nguyên cổng u.Port.Start địa bắt đầu vùng liên tiếp cổng vào ra, u.Port.Length số lượng cổng vùng (phạm vi) Địa bắt đầu giá trị địa vật lý 64 bit Thành phần Flags kí hiệu nguồn cho cổng tài nguyên có cờ CMRESOURCE-PORT-TO thiết lập kiến trúc CPU có không gian địa vào riêng để chứa địa cổng thuộc Nếu cờ CM_resource_Port_IO bị xoá, mà hệ Alpha hang khác RISC, bạn cần phải gọi MnMapIoSpace để đạt nhân chế độ địa ảo cổng truy cập Việc truy cập giao cho nhớ khác, bạn gọi cổng … công việc thường nhật Hal (read_Port_unchar thế) từ trình điều khiển Nếu cờ CM_RESOURCE_PORT_IO thiết lập, hệ x86, bạn không cần vẽ sơ đồ (định sơ đồ) địa cổng Bạn gọi PORT flavor of HAL routines từ trình điều khiển bạn bạn muốn truy xuất vào cổng số cổng bạn Các công việc thường nhật HAL (Hal routimes) đòi hỏi đối số địa cổng Puchar, đólà lý loại đại sở với kiểu Theo cách phần khác QuadPart dẫn đến (tạo ra) trỏ 32 bit 64 bít, thích hợp với hệ cho mà bạn biên dịch - Nhờ StoptDevice bạn giải phóng tài nguyên thực bạn phải tiến hành sơ đồ hoá tài nguyên cổng bạn VOID StopDevice( ) { 5/8 Các cổng ghi (Ports and Registers ) if (pdx->portbase && pdx->mappedport) MmUnmapIoSpace(pdx->portbase, pdx->nports); pdx->portbase = NULL; } Tài nguyên nhớ (Memory Resources): Các thiết bị mà nhớ mô hình hoá ghi, mà phần mềm truy cập sử dụng câu lệnh nạp lưu trữ Giá trị tài nguyên dịch bạn lấy từ trình quản lý PnP địa vật lý, bạn cần phải dự phòng địa ảo để chứa (bao bọc) nhớ vật lý Sau đó, bạn phải gọi thủ tục Hal, mà lien kết với ghi nhớ Read_Register_Unchar , write_register_unchar, Phần code cấu thích bạn tương tự trình bày typedef struct _DEVICE_EXTENSION { PUCHAR membase; ULONG nbytes; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; PHYSICAL_ADDRESS membase; // base address of range for (ULONG i = 0; i < nres; ++i, ++resource) { 6/8 Các cổng ghi (Ports and Registers ) switch (resource->Type) { case CmResourceTypeMemory: membase = resource->u.Memory.Start; pdx->nbytes = resource->u.Memory.Length; break; } pdx->membase = (PUCHAR) MmMapIoSpace(membase, pdx->nbytes, MmNonCached); if (!pdx->membase) return STATUS_NO_MEMORY; Trong suốt phần nguồn (code), u.memory có thong tin vềtài nguyên nhớ U.memory.Start địa bắt đầu khoảng (phạm vi) liên tiếp vùng nhớ, u.memory.length số byte phạm vi Địa bắt đầu giá trị địa vật lý 64 bits Không phải ngẫu nhiên mà u.port u.memory gống nhau- việc làm có mục đích bạ kiểm tra lại để thấy điều bạn muốn Bạn phải gogị hàm MnMapÍopace để đạt nhân chế độ địa ảo thong qua phạm vi nhớ truy xuất Hàm StopDevice bạn vạch vô điều kiện tài nguyên nhớ bạn VOID StopDevice( ) 7/8 Các cổng ghi (Ports and Registers ) { if (pdx->membase) MmUnmapIoSpace(pdx->membase, pdx->nbytes); pdx->membase = NULL; } 8/8 .. .Các cổng ghi (Ports and Registers ) Các thiết bị phải có đường Bus cách thức cụ thể để giải mã bọ nhớ địa vào/ra Trong trường hợp bus PCI, cầu nối (host) để vẽ đường (nối) địa nhớ vật... CM_RESOURCE_PORT_IO) == 0; break; } if (pdx->mappedport) { pdx->portbase = (PUCHAR) MmMapIoSpace(portbase, 4/8 Các cổng ghi (Ports and Registers ) pdx->nports, MmNonCached); if (!pdx->portbase) return... sơ đồ hoá tài nguyên cổng bạn VOID StopDevice( ) { 5/8 Các cổng ghi (Ports and Registers ) if (pdx->portbase && pdx->mappedport) MmUnmapIoSpace(pdx->portbase, pdx->nports); pdx->portbase = NULL;

Ngày đăng: 31/12/2015, 22:05

Từ khóa liên quan

Mục lục

  • Các cổng và các thanh ghi (Ports and Registers )

Tài liệu cùng người dùng

Tài liệu liên quan