ನಮ್ಮ ಸ್ವಂತ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಅನ್ನು ಹೇಗೆ ರಚಿಸುವುದು ಎಂಬುದರ ಕುರಿತು ನಾವು ಟ್ಯುಟೋರಿಯಲ್ ಸರಣಿಗೆ ಹಿಂತಿರುಗುತ್ತೇವೆ. ಈ ಅಧ್ಯಾಯವನ್ನು ನೀವು ತುಂಬಾ ಇಷ್ಟಪಡುತ್ತೀರಿ ಎಂದು ನಾನು ಭಾವಿಸುತ್ತೇನೆ ಏಕೆಂದರೆ ನಾವು ಅಂತಿಮವಾಗಿ ನಮ್ಮ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂನೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಬಹುದು. ಇಂದು ನಾವು ಕೀಬೋರ್ಡ್ ಇನ್ಪುಟ್ ಅನ್ನು ಓದುತ್ತೇವೆ. ಇದಕ್ಕಾಗಿ, ಸ್ಕೀಮ್ ಟೈಮರ್ಗೆ ಹೋಲುತ್ತದೆ. ನಾವು ಹೇಗಾದರೂ ಐಆರ್ಕ್ಯುಗಳನ್ನು ಬಳಸಬೇಕಾಗಿದೆ ಆದ್ದರಿಂದ ನಾವು ಟೈಮರ್ನಂತೆಯೇ ಪ್ರಾರಂಭಿಸುತ್ತೇವೆ.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
ನಮ್ಮ ಕೀಬೋರ್ಡ್ ಹ್ಯಾಂಡ್ಲರ್, ಆದಾಗ್ಯೂ, ನಾವು ಕೀಲಿಗಳನ್ನು ಓದುತ್ತೇವೆ ಮತ್ತು ಅವುಗಳನ್ನು ಬಫರ್ನಲ್ಲಿ ಠೇವಣಿ ಇಡುತ್ತೇವೆ.
ಬಾಹ್ಯ "ಸಿ" ಅನೂರ್ಜಿತ ND_Keyboard_Handler (struct regs * r) {ಸಹಿ ಮಾಡದ ಚಾರ್ ಸ್ಕ್ಯಾನ್ಕೋಡ್ = ND :: ಕೀಬೋರ್ಡ್ :: ಗೆಟ್ಚಾರ್ (); if (ಸ್ಕ್ಯಾನ್ಕೋಡ್! = 255) {ND :: ಸ್ಕ್ರೀನ್ :: ಪುಟ್ಚಾರ್ (ಸ್ಕ್ಯಾನ್ಕೋಡ್); ಸ್ಟ್ರಿಂಗ್ಬಫರ್ [ಸ್ಟ್ರಿಂಗ್ಪೋಸ್] = ಸ್ಕ್ಯಾನ್ಕೋಡ್; ಸ್ಟ್ರಿಂಗ್ಪೋಸ್ ++; }}
http://gist.github.com/634afddcb3e977ea202d
ನಾವು ಎನ್ಡಿ :: ಕೀಬೋರ್ಡ್ :: ಗೆಟ್ಚಾರ್ ಎಂಬ ಕಾರ್ಯವನ್ನು ಹೇಗೆ ಕರೆಯುತ್ತೇವೆ ಎಂಬುದನ್ನು ನಾವು ಪರಿಶೀಲಿಸಬಹುದು. ಅಲ್ಲಿ ನಾವು ಪಾತ್ರವನ್ನು ಪಡೆದುಕೊಳ್ಳುತ್ತೇವೆ ಮತ್ತು ಅದು ಖಾಲಿ ಅಕ್ಷರವಲ್ಲದಿದ್ದರೆ (ಇಲ್ಲಿ ನಾನು 255 ಅನ್ನು ಬಳಸಿದ್ದೇನೆ, ನಾವು ಉತ್ತಮ ವ್ಯವಸ್ಥೆಯನ್ನು ಬಳಸಬೇಕಾಗಿತ್ತು) ನಾವು ಪಾತ್ರವನ್ನು ಪರದೆಯ ಮೇಲೆ ಇರಿಸಿ ಅದನ್ನು ಅಕ್ಷರಗಳ ಸರಳ ಬಫರ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸುತ್ತೇವೆ (ಇದು ಕೂಡ ಸುಧಾರಣೆಗೆ ಒಳಪಟ್ಟಿರುತ್ತದೆ, ಪ್ರಸ್ತುತ ವ್ಯವಸ್ಥೆಯು ಉಕ್ಕಿ ಹರಿಯಬಹುದು).
nsigned char ND :: ಕೀಬೋರ್ಡ್ :: ಗೆಟ್ಚಾರ್ () {ಸಹಿ ಮಾಡದ ಚಾರ್ ಸ್ಕ್ಯಾನ್ಕೋಡ್; scancode = (ಸಹಿ ಮಾಡದ ಚಾರ್) ND :: ಬಂದರುಗಳು :: InputB (0x60); (ಸ್ಕ್ಯಾನ್ಕೋಡ್ & ND_KEYBOARD_KEY_RELEASE) {ರಿಟರ್ನ್ 255; } else {ಹಿಂತಿರುಗಿ en_US [ಸ್ಕ್ಯಾನ್ಕೋಡ್]; }} ಚಾರ್ * ಎನ್ಡಿ :: ಕೀಬೋರ್ಡ್ :: ಗೆಟ್ಸ್ಟ್ರಿಂಗ್ () {ಹಾಗೆಯೇ (ಸ್ಟ್ರಿಂಗ್ಬಫರ್ [ಸ್ಟ್ರಿಂಗ್ಪೋಸ್ -1]! = '\ n') {} ಸ್ಟ್ರಿಂಗ್ಪೋಸ್ = 0; ರಿಟರ್ನ್ ಸ್ಟ್ರಿಂಗ್ಬಫರ್; }
http://gist.github.com/2d4f13e0b1a281c66884
ಒತ್ತಿದ ಕೀಲಿಯನ್ನು ಹೇಗೆ ಪಡೆಯಲಾಗಿದೆ ಎಂಬುದನ್ನು ಇಲ್ಲಿ ನಾವು ನೋಡಬಹುದು. 0x60 ನಲ್ಲಿ ಯಾವಾಗಲೂ ಕೊನೆಯ ಕೀಲಿಯನ್ನು ಒತ್ತಲಾಗುತ್ತದೆ. ವಾಸ್ತವವಾಗಿ ಇದನ್ನು ಐಆರ್ಕ್ಯು ಬಳಸದೆ ನೇರವಾಗಿ ಓದಬಹುದು, ಆದರೆ ಬದಲಾವಣೆ ಸಂಭವಿಸಿದಾಗ ಹೇಗೆ ಗುರುತಿಸುವುದು ಎಂದು ನಮಗೆ ತಿಳಿದಿರುವುದಿಲ್ಲ. ಅಲ್ಲಿ ನಾವು ಪಡೆದ ಕೋಡ್ ಒತ್ತುವುದನ್ನು ನಿಲ್ಲಿಸಿದ ಕೀಲಿಯೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗಿದೆ ಎಂದು ನಾವು ಪರಿಶೀಲಿಸುತ್ತೇವೆ.
ಅಂತಹ ಸಂದರ್ಭದಲ್ಲಿ ನಾವು 255 ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತೇವೆ (ಏಕೆಂದರೆ ನಾವು ಅದನ್ನು ನಂತರ ನಿರ್ಲಕ್ಷಿಸುತ್ತೇವೆ) ಮತ್ತು ಇಲ್ಲದಿದ್ದರೆ ಕೀಲಿಯನ್ನು ಒತ್ತಲಾಗುತ್ತದೆ. ಅಂತಹ ಸಂದರ್ಭದಲ್ಲಿ ನಾವು en_US ಎಂಬ ರಚನೆಯ ಸ್ಥಾನವನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತೇವೆ. ಈ ರಚನೆಯು ಯಾವ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿದೆ? ಈ ಶ್ರೇಣಿಯನ್ನು ನಾವು ಕೀಮ್ಯಾಪ್ ಅಥವಾ ಅಕ್ಷರ ನಕ್ಷೆ ಎಂದು ಕರೆಯುತ್ತೇವೆ. ನಿಮಗೆ ತಿಳಿದಿರುವಂತೆ, ವಿಭಿನ್ನ ಭಾಷೆಗಳು ವಿಭಿನ್ನ ಕೀಬೋರ್ಡ್ಗಳನ್ನು ಹೊಂದಿವೆ ಮತ್ತು ಅವು ಕೀಗಳನ್ನು ತಿದ್ದಿ ಬರೆಯುವುದರಿಂದ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಆದ್ದರಿಂದ en_US ಪ್ರತಿ ಕೋಡ್ಗೆ ಅನುಗುಣವಾದ ಕೀಲಿಯನ್ನು ನಮಗೆ ನೀಡುತ್ತದೆ ಮತ್ತು ಅದು ಅಮೇರಿಕನ್ ಕೀಬೋರ್ಡ್ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.
ಸಹಿ ಮಾಡದ ಚಾರ್ 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, / * ಎಡ ಶಿಫ್ಟ್ * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * ಬಲ ಶಿಫ್ಟ್ * / '*', 0, / * Alt * / '', 0, / * ಕ್ಯಾಪ್ಸ್ ಲಾಕ್ * / 0,0,0,0,0,0,0,0,0,0, / * ಎಫ್ 1-ಎಫ್ 10 ಕೀಗಳು * / 0, / * ಸಂಖ್ಯೆ ಲಾಕ್ * / 0, / * ಸ್ಕ್ರಾಲ್ ಲಾಕ್ * / 0, / * ಹೋಮ್ ಕೀ * / 0, / * ಮೇಲಿನ ಬಾಣ * / 0, / * ಪುಟ ಅಪ್ * / '-', 0, / * ಎಡ ಬಾಣ * / 0, 0, / * ಬಲ ಬಾಣ * / '+', 0, / * ಎಂಡ್ ಕೀ * / 0, / * ಡೌನ್ ಬಾಣ * / 0, / * ಪುಟ ಡೌನ್ * / 0, / * ಕೀಲಿಯನ್ನು ಸೇರಿಸಿ * / 0, / * ಕೀಲಿಯನ್ನು ಅಳಿಸಿ * / 0,0,0, 0, 0, 11, / * ಎಫ್ 12-ಎಫ್ 0 ಕೀಗಳು * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
ಒಂದು ಪದಗುಚ್ got ವನ್ನು ಪಡೆದ ಒಂದು ವ್ಯಾಖ್ಯಾನಿತ ಕಾರ್ಯವೂ ಇತ್ತು. ಅಗತ್ಯವಿರುವ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಂದ ತಂತಿಗಳನ್ನು ಸುಲಭವಾಗಿ ಪ್ರವೇಶಿಸುವುದು ಇದರ ಉದ್ದೇಶ, ಈ ಸಮಯದಲ್ಲಿ ಕೇವಲ ಒಂದು. ನಾನು ನೆಕ್ಸ್ಟ್ಶೆಲ್ಲೈಟ್ ಬಗ್ಗೆ ಮಾತನಾಡುತ್ತಿದ್ದೇನೆ, ನೆಕ್ಸ್ಟ್ಡಿವೆಲ್ ಹೊಂದಿರಬಹುದಾದ ಭವಿಷ್ಯದ ಶೆಲ್ನ ಕಡಿಮೆ ಆವೃತ್ತಿಯಾಗಿದೆ. ಹೊಸ ಕಾರ್ಯಗಳನ್ನು ಕ್ರಮೇಣ ಪರೀಕ್ಷಿಸಲು ಕಡಿಮೆ ಶೆಲ್ ಅನ್ನು ಒದಗಿಸುವುದು ನೆಕ್ಸ್ಟ್ಶೆಲ್ಲೈಟ್ನ ಉದ್ದೇಶವಾಗಿದೆ. ನಾನು ಶೆಲ್ ಕೋಡ್ ಅನ್ನು ಇಲ್ಲಿ ಹಾಕಲು ಹೋಗುತ್ತಿಲ್ಲ ಆದರೆ ನಾನು ಅದನ್ನು ನೆಕ್ಸ್ಟ್ಡಿವೆಲ್ ಕೋಡ್ನಲ್ಲಿ ಸೇರಿಸಿದ್ದೇನೆ.
ಈ ಸಮಯದಲ್ಲಿ ಇದು ಪ್ರತ್ಯೇಕ ಪ್ರೋಗ್ರಾಂ ಆಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ ಆದರೆ ಕರ್ನಲ್ ಕರೆಯುವ ಕಾರ್ಯವಾಗಿ, ಮುಖ್ಯವಾಗಿ ನಾವು ಎಕ್ಸಿಕ್ಯೂಟಬಲ್ ಗಳನ್ನು ಚಲಾಯಿಸುವ ಆಯ್ಕೆಯನ್ನು ಇನ್ನೂ ಸೇರಿಸಿಲ್ಲ. ಮತ್ತು ಹೊಸ ಕೀಬೋರ್ಡ್ ಇನ್ಪುಟ್ ಕಾರ್ಯಗಳೊಂದಿಗೆ ಶೆಲ್ ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದರ ಕೆಲವು ಚಿತ್ರಗಳು.
ಅತ್ಯುತ್ತಮ ಬೋಧಕ! ಧನ್ಯವಾದಗಳು
ಸತ್ಯವೆಂದರೆ, ನಾನು ಟ್ಯುಟೋರಿಯಲ್ ಅನ್ನು ಎಂದಿಗೂ ಅನುಸರಿಸಲಿಲ್ಲ ಏಕೆಂದರೆ ಮೊದಲ ಭಾಗದಲ್ಲಿ ಕಂಪೈಲ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸುವಾಗ ಅದು ನನಗೆ ದೋಷವನ್ನು ನೀಡಿತು ಆದರೆ ಅದು ಯಾವ ದೋಷ ಎಂದು ನನಗೆ ನೆನಪಿಲ್ಲ
ನನ್ನ ಕ್ರಾಸ್ ಅಜ್ಞಾನಕ್ಕಾಗಿ ಕ್ಷಮಿಸಿ ... ಈ ಸಂಕೇತಗಳನ್ನು ಎಲ್ಲಿಂದ ಬರೆಯಲಾಗಿದೆ? ಟರ್ಮಿನಲ್ ನಿಂದ ??
ಸಂಕೇತಗಳು ಮೂಲ ಕೋಡ್ನ ಭಾಗವಾಗಿದೆ. ನಾನು ಅದನ್ನು ಪೂರ್ಣವಾಗಿ ಇಡುವುದಿಲ್ಲ ಏಕೆಂದರೆ ಇಲ್ಲದಿದ್ದರೆ ಪೋಸ್ಟ್ ಎಲ್ಲಾ ಕೋಡ್ ಮತ್ತು ಏನೂ ವಿವರಣೆಯಿಲ್ಲ. ನೀವು ಅದನ್ನು ಅನುಸರಿಸಲು ಬಯಸಿದರೆ ನೀವು ಮೊದಲಿನಿಂದಲೂ ಟ್ಯುಟೋರಿಯಲ್ ಓದಬೇಕೆಂದು ನಾನು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ. ನೀವು ಪೂರ್ಣ ಮೂಲ ಕೋಡ್ ಅನ್ನು ಸಹ ಇಲ್ಲಿ ಪರಿಶೀಲಿಸಬಹುದು (http://github.com/AdrianArroyoCalle/next-divel)
ಉಕ್ಕಿ ಹರಿಯದಂತೆ ಸುಧಾರಣೆ ಹೇಗೆ?
ಕ್ಯಾಡಿ, ನೀವು ಇನ್ನೂ ರೆಪೊಸಿಟರಿ ಕೋಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿದ್ದೀರಾ? ಅಲ್ಲಿ ಗರಿಷ್ಠ ಗಾತ್ರವನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ, ಹಾಗೆಯೇ ಅದನ್ನು ನಿಯಂತ್ರಿಸುವ ಕಾರ್ಯಗಳು, ಅಲ್ಲಿ ನೀವು ಗಾತ್ರದಲ್ಲಿ ಬದಲಾವಣೆಯನ್ನು ಮಾಡಬಹುದು ಅಥವಾ ಬಫರ್ ಸ್ಯಾಚುರೇಟೆಡ್ ಆದಾಗ ಅದನ್ನು ಮುಕ್ತಗೊಳಿಸಲು ಸಮಂಜಸವಾದ ಮಾರ್ಗವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದು
ನೀವು ಅದನ್ನು ಪರಿಶೀಲಿಸಲು ನಾನು ಲಿಂಕ್ ಅನ್ನು ಬಿಡುತ್ತೇನೆ https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
ಹಲೋ ತುಂಬಾ ಆಸಕ್ತಿದಾಯಕವಾಗಿದೆ, ನೀವು ಎಮ್ಯುಲೇಟಿಂಗ್ ಲಿನಸ್ ಟಾರ್ವಾಲ್ಗಳ ಈ «ಸರಣಿಯೊಂದಿಗೆ ಮುಂದುವರಿಯಲಿದ್ದೀರಾ?
ಈ ರೀತಿಯ ಕರ್ನಲ್ ಮಾಡಲು ನೀವು ಯಾವುದೇ ಪುಸ್ತಕ, ಮಾಹಿತಿಯನ್ನು ಶಿಫಾರಸು ಮಾಡಬಹುದೇ?
ಶುಭಾಶಯಗಳು!
ನಮಸ್ತೆ. ಟ್ಯುಟೋರಿಯಲ್ ಗೆ ಧನ್ಯವಾದಗಳು. ದಯವಿಟ್ಟು, ಟ್ಯಾನೆನ್ಬಾಮ್ ಅವರ "ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ಸ್" ಅಲ್ಲದ ಪುಸ್ತಕವನ್ನು ನೀವು ಶಿಫಾರಸು ಮಾಡಬಹುದೇ? ಮುಂಚಿತವಾಗಿ ತುಂಬಾ ಧನ್ಯವಾದಗಳು.
ಗ್ರೀಟಿಂಗ್ಸ್.