没有这样的数学公式。事实上,键盘布局之间的映射略有不同。这是一个相当困难的问题。通常,您会为用户提供一种选择键盘布局并基于此加载地图的方法。所以回答你的问题:我建议你制作一个数组,将每个扫描码映射到正确的字符。我假设您在 qemu 或其他模拟器中运行它,并且其中的键映射对于所有意图和目的都是相当恒定的。然后,一旦您的内核在开发中进一步发展,您就可以提供多个可以由用户换出的键盘映射数组。虽然我将它放在需要在您的操作系统中实现的任务列表中。
这种数组的一个例子(对于像你在 qemu 中得到的标准美式键盘布局):
char kbd_US [128] =
{
0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b',
'\t', /* <-- Tab */
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',
0, /* <-- control key */
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 0, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0,
'*',
0, /* Alt */
' ', /* Space bar */
0, /* Caps lock */
0, /* 59 - F1 key ... > */
0, 0, 0, 0, 0, 0, 0, 0,
0, /* < ... F10 */
0, /* 69 - Num lock*/
0, /* Scroll Lock */
0, /* Home key */
0, /* Up Arrow */
0, /* Page Up */
'-',
0, /* Left Arrow */
0,
0, /* Right Arrow */
'+',
0, /* 79 - End key*/
0, /* Down Arrow */
0, /* Page Down */
0, /* Insert Key */
0, /* Delete Key */
0, 0, 0,
0, /* F11 Key */
0, /* F12 Key */
0, /* All other keys are undefined */
};
请注意,此映射并不完整,不适用于所有键盘,您可能需要重新定义修饰键(如控制、alt 和 shift)的映射。您需要为此进行一些测试。