BÁO CÁO đồ án THỰC HÀNH MÔN HỆ ĐIỀU HÀNH – IT007 l23 CNCL đề tài a7 – hoàn thiện JackOS

39 21 0
BÁO CÁO đồ án THỰC HÀNH MÔN HỆ ĐIỀU HÀNH – IT007 l23 CNCL đề tài a7 – hoàn thiện JackOS

Đ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

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN - - BÁO CÁO ĐỒ ÁN THỰC HÀNH MÔN HỆ ĐIỀU HÀNH – IT007.L23.CNCL Đề tài: A7 – Hoàn thiện JackOS Giáo viên hướng dẫn: Trần Đại Dương Nhóm sinh viên thực hiện: Đinh Thị Diễm Sương MSSV: 19522145 Nguyễn Lê Thanh MSSV: 19522238 Ngơ Hồ Bích Trâm MSSV: 19522375 Phạm Hoàng Thư MSSV: 19522310 Lê Thị Phương Thanh MSSV: 19522231 TP Hồ Chí Minh, 2021 IT007 – Hệ điều hành 2|Page IT007 – Hệ điều hành MỤC LỤC CHƯƠNG GIỚI THIỆU JACKOS 1.1 Giới thiệu JackOS 1.2 Mục tiêu 1.3 Yêu cầu cài đặt .6 CHƯƠNG CÀI ĐẶT, BUILD, CHẠY VÀ DEBUG JACKOS .7 2.1 Cài đặt phần mềm Nand to Tetris 2.1.1 Thư mục projects 2.1.2 Thư mục tools .8 2.2 Xây dựng The API JackOS 12 2.2.1 Array 12 2.2.2 Keyboard 13 2.2.3 Math 15 2.2.4 Memory 19 2.2.5 Output 21 2.2.6 String 24 2.2.7 Sys 27 2.2.8 Screen 28 2.3 Biên Dịch, chạy kiểm tra .35 CHƯƠNG TRIỂN KHAI HỆ ĐIỀU HÀNH 38 CHƯƠNG TỔNG KẾT 39 3|Page IT007 – Hệ điều hành DANH MỤC CÁC BẢN Bảng 2.1: Xây dựng code công dụng Array 11 Bảng 2.2: Xây dựng code công dụng Keyboard .12 Bảng 2.3: Xây dựng code công dụng Math 14 Bảng 2.4: Xây dựng code công dụng Memory .18 Bảng 2.5: Xây dụng code công dụng Output 20 Bảng 2.6: Xây dựng code công dụng String 23 Bảng 2.7: Xây dụng code công dụng Sys .26 Bảng 2.8: Xây dựng code công dụng Screen 28 Bảng 2.9: So sánh trình biên dịch thư mục 35 Bảng 4.1: Bảng phân công công việc 38 4|Page IT007 – Hệ điều hành DANH MỤC HÌNH ẢNH Hình 2.1: Bộ phần mềm Nand to Tetris Hình 2.2: Thư mục Projects Hình 2.3: Projects 12 Hình 2.4: Một số tệp lớn thư mục khác Projects 12 Hình 2.5: Các tệp thư mục tools Hình 2.6: Thư mục Bin .7 Hình 2.7: Các tệp có thư mục builtInChips builtInVMCode Hình 2.8: Các phiên thư mục OS Hình 2.9: Cơng cụ Hardware Simulator Hình 2.10: Màn hình công cụ Hardware Simulator Hình 2.11: Cơng cụ Emulator .9 Hình 2.12: Màn hình cơng cụ Emulator Hình 2.13: Cơng cụ VM Emulator 10 Hình 2.14: Màn hình cơng cụ VM Emulator 10 Hình 2.15: Cơng cụ Assembler 10 Hình 2.16: Cơng cụ Compiler 11 Hình 2.17: Cơng cụ Text Comparer 11 Hình 2.18: Trình biên dịch Virtual Machine Emulator .35 Hình 3.1: Gift mơ trò chơi Pong .37 5|Page IT007 – Hệ điều hành CHƯƠNG GIỚI THIỆU JACKOS 1.1 Giới thiệu JackOS JackOS hệ điều hành viết ngôn ngữ Jack cung cấp dịch vụ toán học, quản lý nhớ, đồ họa, in ký tự hình, xây dựng, xử lý thao tác chuỗi, đọc đầu vào bàn phím, v.v Hệ điều hành Jack thực tập hợp gồm có lớp Mỗi lớp triển khai kiểm tra cách riêng biệt theo thứ tự mong muốn 1.2 Mục tiêu Triển khai hệ điều hành Jack cho phép dịch thực thi ngôn ngữ cấp cao, dựa đối tượng, tảng phần cứng máy tính đơn giản kiểm tra cách sử dụng chương trình thử nghiệm mơ tả bên Hiểu thực hành nhiều chủ đề khoa học máy tính ứng dụng, chẳng hạn xử lý ngăn xếp, phân tích cú pháp, tạo mã thuật toán cổ điển cấu trúc liệu để quản lý nhớ, đồ họa vector, xử lý đầu vào - đầu nhiều chủ đề khác nằm cốt lõi hệ thống máy tính đại 1.3 Yêu cầu cài đặt JackOS thiết kế hoạt động Command-line Environment (như terminal, shell) Để cài đặt sử dụng JackOS cho nội dung thực đồ án, cần cài đặt công cụ:  GCC, GNU, QEMU  Các công cụ phần mềm nand2tetris cung cấp tệp Batch (cho Windows), tập lệnh (cho Unix Mac OS), Compiler Jack VM Emulator  Cài đặt Java Run-time Environment Để có hiệu suất tốt nhất, tải xuống phiên có  The API JackOS triển khai hoàn thiện dự án 6|Page IT007 – Hệ điều hành CHƯƠNG CÀI ĐẶT, BUILD, CHẠY VÀ DEBUG JACKOS 2.1 Cài đặt phần mềm Nand to Tetris Bộ phần mềm Nand to Tetris chứa tất cơng cụ tệp cần thiết để hồn thành dự án Phần mềm sử dụng tự theo điều khoản GNU GPL (Giấy phép Công cộng Chung) Phần mềm mã nguồn mở Bộ phần mềm Nand2tetris bao gồm hai thư mục: project tools Hình 2.1: Bộ phần mềm Nand to Tetris 2.1.1 Thư mục projects Thư mục projects chia thành 14 thư mục dự án có tên 00, 01, , 13 Trong thư mục dự án 12 hệ điều hành JackOS Trong thư mục dự án 12 chứa tệp cần phải sửa đổi hoàn thành dự án Hình 2.2: Thư mục Projects Có tám thư mục: Array, Keyboard, Math, Memory, Output, Screen, String, Sys Mỗi thư mục Xxx, có cung cấp tệp lớp Xxx.jack xương với tất chữ ký mà chương trình yêu cầu, lớp thử nghiệm tương ứng có tên Main.jack tập lệnh thử nghiệm liên quan 7|Page IT007 – Hệ điều hành Hình 2.3: Projects 12 Hình 2.4: Một số tệp lớn thư mục khác Projects 12 2.1.2 Thư mục tools Thư mục tools chứa công cụ phần mềm, tệp thư mục:  Các tệp bat sh tệp tập lệnh, sử dụng để gọi cơng cụ phần mềm nand2tetris Hình 2.5: Các tệp thư mục tools  Thư mục bin chứa mã công cụ phần mềm nand2tetris bao gồm số thư mục chứa tệp lớp Java tệp hỗ trợ Hình 2.6: Thư mục Bin 8|Page IT007 – Hệ điều hành  Thư mục builtInChips thư mục builtInVMCode chứa tệp sử dụng Trình mơ phần cứng Trình mơ VM cung cấp tương ứng Hình 2.7: Các tệp có thư mục builtInChips builtInVMCode  Thư mục OS chứa phiên biên dịch hệ điều hành Jack Hình 2.8: Các phiên thư mục OS  Công cụ Hardware Simulator mô kiểm tra cổng chip logic thực HDL (Ngơn ngữ mơ tả phần cứng) Hình 2.9: Công cụ Hardware Simulator 9|Page IT007 – Hệ điều hành Hình 2.10: Màn hình cơng cụ Hardware Simulator  Công cụ CPU Emulator mô hoạt động hệ thống máy tính Hack Được sử dụng để kiểm tra chạy chương trình viết ngơn ngữ máy Hack, phiên nhị phân hợp ngữ Hình 2.11: Cơng cụ Emulator Hình 2.12: Màn hình cơng cụ Emulator  Cơng cụ VM Emulator mô hoạt động máy ảo (tương tự JVM Java), sử dụng để chạy kiểm tra chương trình viết ngôn ngữ VM (tương tự Bytecode Java) 10 | P a g e IT007 – Hệ điều hành Sys.error(17); } let chars[length] = c; (char c) let length = length + 1; chuỗi return this; } method void eraseLastChar () { if (length = 0) { method void Sys.error(18); Xóa ký tự cuối eraseLastChar } khỏi chuỗi () let length = length - 1; return; } method int intValue () method int intValue () { Trả giá trị var int ret, i, sign; nguyên while(i < length){ chuỗi, if(i = 0){ if(chars[i] = 45){ let sign = -1; phát ký tự chữ số } else { let sign = 1; if((chars[i] > 47) & (chars[i] < 58)){ let ret = (10 * ret) + chars[i] - 48; } else { return ret; } } } else { if((chars[i] > 47) & (chars[i] < 58)){ let ret = (10 * ret) + chars[i] - 48; } else { return ret; 25 | P a g e IT007 – Hệ điều hành } } let i = i + 1; } return ret * sign; } method void setInt (int value) { var int divisor; let length = 0; Đặt chuỗi để if(value < 0){ method void appendChar(45); // minus setInt (int let value = -value; value) } chứa biểu diễn giá trị cho addDigits(value); return; } function char backSpace () function char function char backSpace () { return 129; lùi } function char doubleQuote () { doubleQuote () return 34; newLine () Trả ký tự ngoặc kép (“) } function char Trả ký tự xóa function char newLine () { return 128; Trả ký tự dòng } 2.2.7 Sys Một thư viện dịch vụ hệ thống static int CYCLES_PER_MS; Bảng 2.7: Xây dụng code công dụng Sys Tên hàm Code Công dụng 26 | P a g e IT007 – Hệ điều hành function void init () { let CYCLES_PER_MS = 20000 + 15000; Memory.init(); Math.init(); Keyboard.init(); function void Screen.init(); init () Output.init(); Main.main(); Thực tất lần khởi tạo theo yêu cầu hệ điều hành Sys.halt(); return; } function void halt () { function void halt () while(true) Tạm dừng thực {} chương return; trình } function void wait (int duration) { var int i; function void while (i < (CYCLES_PER_MS * duration)) { wait (int let i = i + 1; duration) } Chờ khoảng mili giây trả return; } Hiển thị mã lỗi function void error (int errorCode) { function void error (int errorCode) cho Output.printString("ERR"); dạng Output.printInt(errorCode); "ERR", tạm return; dừng việc thực } chương trình 2.2.8 Screen Là thư viện chức để hiển thị đồ họa hình 27 | P a g e IT007 – Hệ điều hành * Màn hình vật lý Hack bao gồm 256 hàng (được lập mục 255, từ xuống dưới) * Trong số 512 pixel – điểm ảnh, pixel (được lập mục 511, từ trái sang phải) Pixel bên trái bật * Màn hình lập mục (0,0).) static Array stat0; static int screen; static bool stat2; Bảng 2.8: Xây dựng code công dụng Screen Tên hàm Code Công dụng function void init() { var int l0; let screen = 16384; let stat2 = true; let stat0 = Array.new (17); Khai báo lớp function void let stat0 [0] = 1; Screen init () while (l0 < 16) { Khởi tạo let l0 = l0 + 1; hình let stat0[l0] = (stat0[l0 - 1] + stat0[l0 - 1]); } return; } function void clearScreen () { var int l0; while (l0 < 8192) { function void let screen[l0] = 0; Xóa tồn clearScreen () let l0 = l0 + 1; hình } return; function void updateLocatio n (int arg0, int } function void updateLocation (int arg0, int arg1){ Cập nhật vị trí if (stat2) { let arg0 [screen] = arg0[screen] | arg1; 28 | P a g e IT007 – Hệ điều hành } else { let arg0[screen] = arg0[screen] & (~arg1); arg1) } return; function void } function void setColor (boolean b) { let stat2 = b; setColor (boolean b) return; Cài đặt màu } function void drawPixel (int arg0, int arg1) { var int l0, l1, l2; if ((arg0 < 0) | (arg0 > 511) | (arg1 < 0) | (arg1 > 255)) { Sys.error (7); function void } else { Vẽ điểm ảnh Pixel tọa độ drawPixel (int let l0 = arg0 / 16; (arg0, arg1), sử arg0, int arg1) let l1 = arg0 - (l0 * 16); dụng màu let l2 = (arg1 * 32) + l0; Screen.updateLocation (l2, stat0[l1]); } return; } function void drawConditional (int a, int b, int c) { function void drawConditio nal (int a, int b, int c) if (c) { Screen.drawPixel(b, a); } else { Vẽ có điều kiện Screen.drawPixel(a, b); } return; function void } function void drawLine (int x1, int y1, int x2, int Vẽ đường drawLine (int y2) { từ điểm ảnh tọa x1, int y1, int var int lcl0, lcl1, dy, dx, temp, lcl5, vert, lcl7, độ (x1, y1) đến 29 | P a g e IT007 – Hệ điều hành x2, int y2) lcl8, lcl9, lcl10; điểm ảnh tọa độ if ((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)) { (x2, y2), sử Sys.error(8); } dụng màu let dx = Math.abs(x2 - x1); let dy = Math.abs(y2 - y1); let vert = dx < dy; if ((vert & (y2 < y1)) | ((~vert) & (x2 < x1))) { let temp = x1; let x1 = x2; let x2 = temp; let temp = y1; let y1 = y2; let y2 = temp; } if (vert) { let temp = dx; let dx = dy; let dy = temp; let lcl1 = y1; let lcl0 = x1; let lcl8 = y2; let lcl7 = x1 > x2; } else { let lcl1 = x1; let lcl0 = y1; let lcl8 = x2; let lcl7 = y1 > y2; } let lcl5 = (2 * dy) - dx; let lcl9 = (2 * dy); let lcl10 = * (dy - dx); 30 | P a g e IT007 – Hệ điều hành Screen.drawConditional (lcl1, lcl0, vert); while (lcl1 < lcl8) { if (lcl5 < 0) { let lcl5 = lcl9 + lcl5; } else { let lcl5 = lcl5 + lcl10; if (lcl7) {let lcl0 = lcl0 - 1;} else {let lcl0 = lcl0 + 1;} } let lcl1 = lcl1 + 1; Screen.drawConditional (lcl1, lcl0, vert); } return; function void } function void drawRectangle (int x1, int y1, int Vẽ hình chữ drawRectangl x2, int y2) { nhật có tơ màu e (int x1, int var int l0, l1, l2, l3, l4, l5, l6, l7, l8; bên có góc y1, int x2, int if ((x1 > x2) | (y1 > y2) | (x1 < 0) | (x2 > 511) | bên y2) (y1 < 0) | (y2 > 255)) { Sys.error(9); } else { trái (x1, y1) góc bên phải let l3 = x1 / 16; (x2, y2), sử let l7 = x1 - (16 * l3); dụng màu let l4 = x2 / 16; let l8 = x2 - (16 * l4); let l6 = ~(stat0[l7]-1); let l5 = stat0[l8 + 1] - 1; let l0 = ((y1 * 32) + l3); let l2 = l4 - l3; while (~(y1 > y2)) { let l1 = l0 + l2; if (l2 = 0) { Screen.updateLocation (l0, (l5 & 31 | P a g e IT007 – Hệ điều hành l6)); } else { Screen.updateLocation(l0, l6); let l0 = l0 + 1; while (l0 < l1) { Screen.updateLocation(l0, -1); let l0 = l0 + 1; } Screen.updateLocation(l1, l5); } let y1 = y1 + 1; let l0 = (l1 + 32) - l2; } } return; } function void drawHorizont function void drawHorizontal (int arg0, int arg1, int arg2) { al (int arg0, var int l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10; int arg1, int let l7 = Math.min (arg1, arg2); arg2) let l8 = Math.max (arg1, arg2); Vẽ đường nằm ngang if ((arg0 > -1) & (arg0 < 256) & (l7 < 512) & (l8 > -1)) { let l7 = Math.max (l7, 0); let l8 = Math.min (l8, 511); let l1 = l7 / 16; let l9 = l7 - (l1 * 16); let l2 = l8 / 16; let l10 = l8 - (l2 * 16); let l5 = ~(stat0[l9] - 1); let l4 = stat0[l10 + 1] - 1; let l0 = (32 * arg0) + l1; let l6 = l2 - l1; 32 | P a g e IT007 – Hệ điều hành let l3 = l0 + l6; if (l6 = 0) { Screen.updateLocation (l0, (l4 & l5)); } else { Screen.updateLocation (l0, l5); let l0 = l0 + 1; while (l0 < l3) { Screen.updateLocation (l0, -1); let l0 = l0 + 1; } Screen.updateLocation (l3, l4); } } return; } function void drawSymetric (int arg0, int arg1, int arg2, int arg3) { Screen.drawHorizontal ((arg1 - arg3), function void drawSymetric (int arg0, int arg1, int arg2, int arg3) (arg0 + arg2), (arg0 - arg2)); Screen.drawHorizontal ((arg1 + arg3), (arg0 + arg2), (arg0 - arg2)); Screen.drawHorizontal ((arg1 - arg2), Vẽ đối xứng (arg0 - arg3), (arg0 + arg3)); Screen.drawHorizontal ((arg1 + arg2), (arg0 - arg3), (arg0 + arg3)); return; function void } function void drawCircle (int arg0, int arg1, int Vẽ vịng trịn drawCircle arg2) { bán kính arg2 (int arg0, int var int l0, l1, l2; arg1, int arg2) if ((arg0 < 0) | (arg0 > 511) | (arg1 < 0) | (arg1 > xung quanh tọa 255)) { Sys.error(12); tô màu độ (arg0, arg1), sử dụng màu 33 | P a g e IT007 – Hệ điều hành } if (((arg0 - arg2) < 0) | ((arg0 + arg2) > 511) | ((arg1 - arg2) < 0) | ((arg1 + arg2) > 255)) { Sys.error(13); } let l1 = arg2; let l2 = - arg2; Screen.drawSymetric (arg0, arg1, l0, l1); while (l1 > l0) { if (l2 < 0) { let l2 = l2 + (2 * l0) + 3; } else { let l2 = l2 + (2 * (l0 - l1)) + 5; let l1 = l1 - 1; } let l0 = l0 + 1; Screen.drawSymetric (arg0, arg1, l0, l1); } return; } 2.3 Biên Dịch, chạy kiểm tra Sau cài đặt xong công cụ trên, ta phát triển, biên dịch kiểm tra lớp OSClass.jack cách riêng biệt, làm theo quy trình sau:  Bước 1: Đặt OSClass.jack hoàn thiện dự án thư mục bao gồm chương trình thử nghiệm cung cấp thiết kế để kiểm tra  Bước 2: Biên dịch thư mục trình biên dịch Jack cung cấp Điều dẫn đến việc biên dịch OSClass.jack tệp lớp thử nghiệm cung cấp Trong trình này, tệp OSClass.vm tạo  Bước 3: Tải thư mục vào VM Emulator cung cấp 34 | P a g e IT007 – Hệ điều hành Hình 2.18: Trình biên dịch Virtual Machine Emulator  Bước 4: Biên dịch thư mục, thực thi tập lệnh kiểm tra VM Emulator cung cấp đảm bảo trình so sánh với tệp so sánh kết thúc thành công Bảng 2.9: So sánh trình biên dịch thư mục OSClass.jack Chương trình thử nghiệm Kết kiểm tra mong muốn Main.jack Array.jack ArrayTest.tst ArrayTest.cmp Keyboard.jack Main.jack Main.jack Math.jack MathTest.tst MathTest.cmp 35 | P a g e IT007 – Hệ điều hành Main.jack Memory.jack MemoryTest.tst MemoryTest.cmp Output.jack Main.jack Screen.jack Main.jack String.jack Main.jack Sys.jack Main.jack 36 | P a g e IT007 – Hệ điều hành CHƯƠNG TRIỂN KHAI HỆ ĐIỀU HÀNH Sau kiểm tra thành công lớp hệ điều hành riêng biệt, kiểm tra tồn việc triển khai hệ điều hành trị chơi Pong, có mã nguồn có sẵn thư mục dự án / 11 / Pong cách đặt tất tệp jack bạn vào thư mục này, biên dịch thực thi trị chơi VM Emulator cung cấp Hình 3.19: Gift mơ trị chơi Pong 37 | P a g e IT007 – Hệ điều hành CHƯƠNG TỔNG KẾT Từ học, triển khai máy ảo trình biên dịch cho ngơn ngữ lập trình đơn giản, phát triển hoàn thiện hệ điều hành giúp thu hẹp khoảng cách ngôn ngữ cấp cao tảng phần cứng Áp dụng kiến thức học, hồn thành dự án thực tế có ý nghĩa phần trải nghiệm học tập giúp phát triển kỹ lập trình, khoa học máy tính ứng dụng, chẳng hạn xử lý ngăn xếp, phân tích cú pháp, tạo mã thuật toán cổ điển cấu trúc liệu để quản lý nhớ, đồ họa vector, xử lý đầu vàođầu nhiều chủ đề khác nằm cốt lõi hệ thống máy tính đại Bảng 4.10: Bảng phân công công việc Họ tên Đinh Thị Diễm Sương Ngơ Hồ Bích Trâm Nguyễn Lê Thanh MSSV 19522145 19522375 Thư  Lên ý tưởng hướng dãn Hoàn thành dựng Array, Output Hoàn thành  Tổng hợp Word  Tìm hiểu cơng dụng xây 19522238 dựng Math, String  Thuyết trình Hồn thành  Làm PowerPoint  Tìm hiểu cơng dụng xây 19522310 dựng Memory, Sys Hồn thành  Thuyết trình  Tìm hiểu cơng dụng xây Thanh Phạm Hoàng JackOS Đánh giá thực  Tìm hiểu cơng dụng xây Lê Thị Phương Nhiệm vụ  Tìm hiểu giới thiệu 19522231 dựng Keyboard, Screen Hồn thành  Thuyết trình   38 | P a g e IT007 – Hệ điều hành TÀI LIỆU THAM KHẢO [1] Dự án 12 Hệ điều hành [Truy cập lần cuối: 24/6/2021] [2] Phần mềm Nand2tetris [Truy cập lần cuối: 24/6/2021] Hết 39 | P a g e .. .IT007 – Hệ điều hành 2|Page IT007 – Hệ điều hành MỤC LỤC CHƯƠNG GIỚI THIỆU JACKOS 1.1 Giới thiệu JackOS 1.2 Mục tiêu ... Emulator .35 Hình 3.1: Gift mơ trị chơi Pong .37 5|Page IT007 – Hệ điều hành CHƯƠNG GIỚI THIỆU JACKOS 1.1 Giới thiệu JackOS JackOS hệ điều hành viết ngôn ngữ Jack cung cấp dịch vụ toán học,... hiệu suất tốt nhất, tải xuống phiên có  The API JackOS triển khai hoàn thiện dự án 6|Page IT007 – Hệ điều hành CHƯƠNG CÀI ĐẶT, BUILD, CHẠY VÀ DEBUG JACKOS 2.1 Cài đặt phần mềm Nand to Tetris Bộ

Ngày đăng: 03/10/2021, 22:12

Từ khóa liên quan

Mục lục

  • CHƯƠNG 1. GIỚI THIỆU JACKOS

    • 1.1 Giới thiệu JackOS

    • 1.2 Mục tiêu

    • 1.3 Yêu cầu cài đặt

    • CHƯƠNG 2. CÀI ĐẶT, BUILD, CHẠY VÀ DEBUG JACKOS

      • 2.1 Cài đặt phần mềm Nand to Tetris

        • 2.1.1 Thư mục projects

        • 2.1.2 Thư mục tools

        • 2.2 Xây dựng The API JackOS

          • 2.2.1 Array

          • 2.2.2 Keyboard

          • 2.2.3 Math

          • 2.2.4 Memory

          • 2.2.5 Output

          • 2.2.6 String

          • 2.2.7 Sys

          • 2.2.8 Screen

          • 2.3 Biên Dịch, chạy và kiểm tra

          • CHƯƠNG 3. TRIỂN KHAI HỆ ĐIỀU HÀNH

          • CHƯƠNG 4. TỔNG KẾT

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

  • Đang cập nhật ...

Tài liệu liên quan