Chào mừng quý vị đến với .

Quý vị chưa đăng nhập hoặc chưa đăng ký làm thành viên, vì vậy chưa thể tải được các tư liệu của Thư viện về máy tính của mình.
Nếu đã đăng ký rồi, quý vị có thể đăng nhập ở ngay ô bên phải.

Bài giảng về HĐH

Wait
  • Begin_button
  • Prev_button
  • Play_button
  • Stop_button
  • Next_button
  • End_button
  • 0 / 0
  • Loading_status
Nhấn vào đây để tải về
Báo tài liệu có sai sót
Nhắn tin cho tác giả
(Tài liệu chưa được thẩm định)
Nguồn:
Người gửi: Trần Thị Kim Dung (trang riêng)
Ngày gửi: 01h:44' 18-11-2009
Dung lượng: 1.2 MB
Số lượt tải: 25
Số lượt thích: 0 người
Bài 1 : Interrupts
Ngắt là gì ?
Phân loại :
Ngắt cứng : là các ngắt tự phát sinh khi các thiết bị ngoại vi cần được phục vụ

Ngắt mềm : dùng để quản lí thiết bị ngoạii vi như đĩa, màn hình, bàn phím …

Mô hình của ngắt
Danh sách các ngắt thông dụng
Cách gọi ngắt trong C
Dùng hàm geninterrupt()
Cú pháp : void geninterrupt (int intr_num)
trong đó intr_num là số hiệu ngắt.
Ví dụ : xuất một kí tự A ra màn hình
{
_AL = ‘A’;
_AH = 0x0E;
geninterrupt (0x10);
}
Cách gọi ngắt trong C (tt)
Dùng cấu trúc union và các hàm gọi ngắt
struct BYTEREGS , WORDREGS
struct SREGS
union REGS
struct REGPACK
Các hàm gọi ngắt
int intdos(REGS *inregs, REGS *outregs);
int int86(int intno, REGS *inregs, REGS *outregs);
Cách gọi ngắt trong C (tt)
Chèn trực tiếp đoạn chương trình Assembler
Ta dùng từ khóa asm trước dòng lệnh
Cú pháp : asm
Nếu lệnh gồm nhiều dòng ta làm như sau :
asm {


………….

}
Cách gọi ngắt trong C (tt)
Ví dụ : Xuất kí tự A ra màn hình
void main ()
{
asm {
mov al , ‘A’
mov ah, 0Eh
int 10h
}
}
Bài tập thực hành về ngắt
1. Viết chương trình nhập một kí tự từ bàn phím rồi xuất kí tự ra màn hình.
2. Viết chương trình xuất ra màn hình chuỗii kí tự “Hello World”.
3. Viết chương trình hiện ngày, giờ hệ thống ra màn hình.
Phụ lục về ngắt
Giới thiệu về công cụ Tech Help v 4.0
Hướng dẫn sử dụng
Bài 2 : Đĩa mềm và các thao tác I/O
Cấu trúc vật lí :

Đĩa mềm gồm 2 mặt (side), mỗi mặt có 1 đầu điều khiển dùng để truy xuất đọc/ghi dữ liệu chứa trên đĩa.

Mỗi mặt gồm nhiều rãnh tròn đồng tâm gọI là track, mỗi track lạI được chia thành các cung gọi là sector

Cấu trúc vật lí của đĩa mềm
Cấu trúc vật lí của đĩa mềm (tt)
Đĩa mềm 1.44 MB có :
2 side (đánh số 0 -> 1)
Mỗi side có 80 track (đánh số 0 -> 79)
MỗI track có 18 sector (đánh số 1 -> 18)
MỗI sector có kích thước 512 bytes
Kích thước đĩa mềm = 2 * 80 * 18 * 512 byte
= 1 474 560 byte = 1.44 MB
Cấu trúc vật lí của đĩa mềm (tt)
Định vị sector vật lí :
chỉ rõ bộ ba giá trị : side, track, sector
Ví dụ : ta cần đọc sector 1, track 0, side 0 ta phảii chỉ ra 3 thông số : side = 0, track = 0, sector = 1
Sector logic : đánh số từ 0 -> 2879
Ánh xạ từ sector vật lí
Sector vật lí Sector logic
side track sector tương ứng
0 0 1 -------- 0
…………………………………
0 1 1 18
Cấu trúc logic của đĩa mềm
Boot sector (sector đầu tiên / sector logic 0)
Bảng FAT 1 (9 sector từ sector logic 1 -> 9)
Bảng FAT 2 (9 sector từ sector logic 10 -> 18)
Vùng thư mục gốc – Root Directory (14 sector từ sector 19 -> 32)
Vùng dữ liệu - từ sector 33 trở đi
Các thao tác truy xuất đĩa
Ngắt 13h : Nhập xuất đĩa
AH = 00h Reset bộ điều khiển đĩa
Input : DL = ổ đĩa (0: đĩa mềm 1,.. 80h: đĩa cứng)
AH = 02h Đọc các sector
Input :
DL = số hiệu ổ đĩa DH = số hiệu đầu đọc ghi
CH = số hiệu track (0..n) CL = số hiệu sector (1..n)
AL = số sector cần đọc ES:BX = địa chỉ buffer
Output : CF = 1 nếu lỗi, mã lỗi trong AH
CF = 0 đọc thành công
AH = 03h Ghi các sector
Input : tương tự như đọc sector
ES:BX = địa chỉ buffer dữ liệu cần ghi
Bài tập thực hành
1. Viết chương trình đọc / ghi boot sector của đĩa mềm 1.44MB
2. Viết chương trình đọc / ghi 1 sector bất kì trên đĩa mềm 1.44MB và hiển thị ra màn hình
3. Viết chương trình format đĩa mềm 1.44MB
Hướng dẫn thực hành
Tạo cấu trúc mô tả boot sector
typedef struct tagBOOT_SECTOR
{
unsigned char CmdJmp[3] ;
unsigned char Ver[8] ;
unsigned int SectorSize ;
unsigned char SectorPerCluster ;
unsigned int ReservedSector ;
unsigned char FatCount ;
unsigned int RootSize ;
unsigned int TotalSector ;
unsigned char Media ;
unsigned int SectorPerFat ;
unsigned int SectorPerTrack ;
unsigned int HeadCount ;
unsigned int HidenSector ;
unsigned char Code[482] ;
}BOOT_SECTOR
Chương trình đọc sector
int ReadSectors(int sector, int numsec, void *buff)
{ union REGS regin, regout;
struct SREGS sreg;
regin.h.al = 0 ; // chọn ổ đĩa A
regin.x.cx = numsec ;
regin.x.dx = sector ;
sreg.ds = FP_SEG(buff) ;
regin.x.bx = FP_OFF(buff) ;
int86x (0x25, ®in, ®out, &sreg) ;
if ( regout.x.cflag) return 0 ; // đọc bị lỗI
return numsec;
}
Chương trình ghi sector
int WriteSector(int sector, int numsec, void *buff)
{ union REGS regin, regout;
struct SREGS sreg;
regin.h.al = 0 ; // chọn ổ đĩa A
regin.x.cx = numsec ;
regin.x.dx = sector ;
sreg.ds = FP_SEG(buff) ;
regin.x.bx = FP_OFF(buff) ;
int86x (0x26, ®in, ®out, &sreg) ;
if (regout.x.cflag) return 0 ; // đọc bị lỗI
return numsec;
}
Sử dụng hàm đọc / ghi sector
BOOT_SECTOR bootsector ;
if (ReadSector(0,1,(void *)&bootsector) == 0)
return ; // bị lỗi
else printf(“Read OK”) ;
printf(“Sector size %d “,bootsector.SectorSize);
printf(“Số sector / cluster %d”, bootsectorSectorPerCluster );
printf(“Number of FAT %d “, bootsector.FatCount );
printf(“Number of entry %d ”, bootsector.RootSize );
………….
Bài 3 : FAT và Root Directory
FAT = (File Allocation Table)
bảng FAT gồm nhiều phần tử, mỗi phần tử có kích thước 12 bit (FAT12), 16 bit (FAT16)…
mỗii phần tử đạii diện cho một cluster
Giá trị
0 : cluster trống
002 - FEF : chứa dữ liệu, giá trị của nó là số
cluster kế tiếp trong chuỗi.
FF0 – FF6 : dành riêng
FF7 : cluster hỏng
FF8 – FFF : là cluster cuốI cùng của chuỗi
Root Directory
Root directory gồm 14 sector chứa 224 entry
mỗI entry 32 byte có cấu trúc như sau :
Giả lập các lệnh : DIR, COPY, TYPE
Khai báo một cấu trúc ENTRY 32 byte
typedef struct tagENTRY {
unsigned char FileName [8] ;
unsigned char FileExt [3] ;
unsigned char Attrib ;
unsigned char Reserved [10] ;
unsigned int Time ;
unsigned int Date ;
unsigned int FirstCluster ;
unsigned long FileSize ;
} ENTRY ;
Giả lập các lệnh : DIR, COPY…(tt)
Khai báo một mảng RootDir gồm 224 Entry
sau đó đọc nội dung Root Directory trên đĩa.
Ví dụ :
ENTRY RootDir[224] ;
ReadSector (19,14,(char *)&RootDir);
i = 0;
while (RootDir[i].FileName[0] != 0)
{ kiểm tra thuộc tính của entry
sau đó hiển thị nội dung của nó
i ++ ;
}
Bài tập thực hành
1. Giả lập lệnh DIR
2. Giả lập lệnh TYPE
3. Giả lập lệnh COPY CON
Phụ lục về FAT :
GetFatItem (int num)
unsigned char Fat[9*512] ;
ReadSector (1, 9 , (void *)Fat) ;
a = Fat [num * 3 / 2] ;
b = Fat [num * 3 / 2 + 1];
if (num % 2 == 0)
{ b = b & 0x0F ;
Result = b << 8 ;
Result = result | a ;
}else
Result = b << 4 ;
a = a >> 4 ;
Result = result | a ;
 
Gửi ý kiến

↓ CHÚ Ý: Bài giảng này được nén lại dưới dạng ZIP và có thể chứa nhiều file. Hệ thống chỉ hiển thị 1 file trong số đó, đề nghị các thầy cô KIỂM TRA KỸ TRƯỚC KHI NHẬN XÉT  ↓