Mô phỏng Linus Torvalds: tạo hệ điều hành của riêng bạn từ đầu (VIII)

Chúng ta quay lại với loạt bài hướng dẫn cách tạo hệ điều hành của riêng mình. Tôi cho rằng bạn sẽ thích chương này rất nhiều vì cuối cùng chúng ta cũng có thể tương tác với hệ điều hành của mình. Hôm nay chúng ta sẽ đọc bộ gõ bàn phím. Đối với điều này, sơ đồ tương tự như bộ đếm thời gian. Dù sao chúng ta cũng phải sử dụng IRQ nên chúng ta sẽ bắt đầu giống như với bộ hẹn giờ.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Tuy nhiên, trình xử lý bàn phím của chúng tôi có phần phức tạp hơn khi chúng tôi đọc các phím và đặt chúng vào bộ đệm.

extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = mã quét; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

Chúng tôi có thể kiểm tra cách chúng tôi gọi một hàm có tên là ND :: Bàn phím :: GetChar. Ở đó chúng tôi có được ký tự và sau đó nếu nó không phải là ký tự trống (ở đây tôi đã sử dụng 255, chúng tôi sẽ phải sử dụng một hệ thống tốt hơn) chúng tôi đặt ký tự trên màn hình và lưu trữ nó trong một bộ đệm ký tự đơn giản (đây cũng là tùy thuộc vào cải tiến, hệ thống hiện tại có thể tràn).

nsigned char ND :: Bàn phím :: GetChar () {unsigned char scancode; scancode = (unsigned char) ND :: Ports :: InputB (0x60); if (mã quét & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {return en_US [scancode]; }} char * ND :: Bàn phím :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; trả về stringBuffer; }

http://gist.github.com/2d4f13e0b1a281c66884

Ở đây chúng ta có thể thấy cách lấy phím đã được nhấn. Ở 0x60 sẽ luôn có phím cuối cùng được nhấn. Trên thực tế, nó có thể được đọc trực tiếp mà không cần phải sử dụng IRQ, nhưng sau đó chúng ta sẽ không biết cách xác định khi nào có sự thay đổi. Ở đó, chúng tôi kiểm tra bằng thao tác AND xem mã chúng tôi thu được có tương ứng với một phím đã được dừng nhấn hay không.

Trong trường hợp đó, chúng tôi trả về 255 (vì chúng tôi sẽ bỏ qua nó sau này) và nếu không thì phím đã được nhấn. Trong trường hợp đó, chúng tôi trả về vị trí của một mảng được gọi là en_US. Mảng này chứa thông tin gì? Mảng này chúng ta gọi là sơ đồ bàn phím hoặc bản đồ ký tự. Như bạn đã biết, các ngôn ngữ khác nhau có bàn phím khác nhau và không được hỗ trợ khi chúng ghi đè lên các phím. Vì vậy, en_US sẽ cung cấp cho chúng ta phím tương ứng với mỗi mã và nó sẽ hoạt động trên bàn phím kiểu Mỹ.

unsigned char en_US [128] = {0,27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0 ',' - ',' = ',' \ b ',' \ t ',' q ',' w ',' e ',' r ',' t ',' y ',' u ',' i ',' o ',' p ',' [','] ',' \ n ', 0, / * Ctrl * /' a ',' s ',' d ',' f ',' g ', 'h', 'j', 'k', 'l', ';', '\' ',' '', 0, / * Shift trái * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Dịch phải * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * Phím F1-F10 * / 0, / * Num lock * / 0, / * Khóa cuộn * / 0, / * Phím Home * / 0, / * Mũi tên lên * / 0, / * Trang lên * / '-', 0, / * Mũi tên trái * / 0, 0, / * Mũi tên phải * / '+', 0, / * Phím kết thúc * / 0, / * Mũi tên xuống * / 0, / * Xuống trang * / 0, / * Chèn phím * / 0, / * Phím xóa * / 0,0,0, Phím 0, 0, 11, / * F12-F0 * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Cũng có một chức năng được xác định có một cụm từ. Mục đích đơn giản là để dễ dàng truy cập các chuỗi từ các ứng dụng cần nó, tại thời điểm này chỉ có một. Tôi đang nói về NextShellLite, một phiên bản rút gọn của shell có thể có trong tương lai mà NextDivel sẽ có. Mục đích của NextShellLite chỉ là cung cấp một trình bao rút gọn để dần dần thử nghiệm các chức năng mới. Tôi sẽ không đặt mã shell ở đây nhưng tôi đã đưa nó vào trong mã NextDivel.

Hiện tại, nó không hoạt động như một chương trình riêng biệt mà là một hàm được gọi bởi hạt nhân, chủ yếu là do chúng ta chưa thêm tùy chọn để chạy các tệp thực thi. Và tất nhiên, một số hình ảnh về cách vỏ hoạt động với các chức năng nhập liệu của bàn phím mới.

Tiếp theoShellLite


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   dario dijo

    gia sư xuất sắc! cảm ơn 🙂

  2.   PopArch dijo

    Sự thật là tôi chưa bao giờ làm theo hướng dẫn vì ở phần đầu nó đã báo lỗi cho tôi khi cố biên dịch nhưng tôi không nhớ đó là lỗi gì

  3.   Con mèo của Lopez dijo

    Xin lỗi vì sự thiếu hiểu biết của tôi ... những mã này được viết từ đâu? Từ nhà ga ??

    1.    AdrianArroyoStreet dijo

      Các mã là một phần của mã nguồn. Tôi không đặt nó hoàn chỉnh bởi vì nếu không bài đăng là tất cả mã và không có gì giải thích. Tôi khuyên bạn nên đọc các hướng dẫn ngay từ đầu nếu bạn muốn làm theo nó. Bạn cũng có thể kiểm tra mã nguồn đầy đủ tại đây (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady dijo

    Cải tiến như thế nào để không xảy ra tràn?

    1.    Plock dijo

      Kady, bạn đã kiểm tra mã kho lưu trữ chưa? Ở đó kích thước tối đa được thiết lập, cũng như các chức năng để kiểm soát nó, ở đó bạn có thể thực hiện thay đổi kích thước hoặc thực hiện một cách hợp lý để giải phóng bộ đệm khi nó trở nên bão hòa
      Tôi để lại liên kết để bạn kiểm tra nó https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico dijo

    Xin chào rất thú vị, bạn có định tiếp tục với "loạt" Mô phỏng Linus Torvals này không?
    Bạn có thể giới thiệu cuốn sách, thông tin nào để có thể làm một nhân như thế này không?

    Chúc mừng!

  6.   AnswersVeganas.Org dijo

    Chào. Cảm ơn vì hướng dẫn. Làm ơn, bạn có thể giới thiệu một cuốn sách mà bạn đã thực hiện không phải là "Hệ điều hành" của Tanenbaum không? Cảm ơn bạn rất nhiều trước.
    Chúc mừng.