在系统内核中绘制鼠标指针

获取更多操作系统开发相关信息,请参看视频:
Linux kernel Hacker, 从零构建自己的内核

有了桌面背景,能够显示字符串,现在在图形界面上还少了点东西,那就是鼠标指针,如果有个鼠标能在桌面里动来动去,那系统就有点意思了。

就像前几节说的那样,任何图像都是二维平面上点的集合,把不同位置的点设置成不同颜色,那么我们想要的图像就显示出来了,我们先来看看一个用来表示二维图标的数组:

static char cursor[16][16] = {
  "**************..",
  "*OOOOOOOOOOO*...",
  "*OOOOOOOOOO*....",
  "*OOOOOOOOO*.....",
  "*OOOOOOOO*......",
  "*OOOOOOO*.......",
  "*OOOOOOO*.......",
  "*OOOOOOOO*......",
  "*OOOO**OOO*.....",
  "*OOO*..*OOO*....",
  "*OO*....*OOO*...",
  "*O*......*OOO*..",
  "**........*OOO*.",
  "*..........*OOO*",
  "............*OO*",
  ".............***"
 };

大家看上面的数组是不是有个鼠标的模样了,只要把*对应的像素点画成黑色,0代表的像素点画成白色,. 代表的像素点设置成背景色,那么一个鼠标的图像就出来了:


这里写图片描述

我们接下来就通过代码设置相关像素点的颜色

void init_mouse_cursor(char* mouse, char bc) {
    static char cursor[16][16] = {
  "**************..",
  "*OOOOOOOOOOO*...",
  "*OOOOOOOOOO*....",
  "*OOOOOOOOO*.....",
  "*OOOOOOOO*......",
  "*OOOOOOO*.......",
  "*OOOOOOO*.......",
  "*OOOOOOOO*......",
  "*OOOO**OOO*.....",
  "*OOO*..*OOO*....",
  "*OO*....*OOO*...",
  "*O*......*OOO*..",
  "**........*OOO*.",
  "*..........*OOO*",
  "............*OO*",
  ".............***"
 };

      int x, y;
      for (y = 0; y < 16; y++) {
          for (x = 0; x < 16; x++) {
             if (cursor[y][x] == '*') {
                 mouse[y*16 + x] = COL8_000000;
             }
             if (cursor[y][x] == 'O') {
                mouse[y*16 + x] = COL8_FFFFFF;
             }
             if (cursor[y][x] == '.') {
                 mouse[y*16 + x] = bc;
             }
          }
      }
}

代码中把设置成黑色,O设置成白色,. 设置成背景色。有了上面的颜色二维数组后,我们需要把该数组的数值写入显存,但显存是一维数组,所以需要将上面的1616二维数组转换为一个256字节的数组然后写入显存,代码如下:

void putblock(char* vram, int vxsize, int pxsize,
int pysize, int px0, int py0, char* buf, int bxsize) {
    int x, y;
    for (y = 0; y < pysize; y++)
      for (x = 0; x < pxsize; x++) {
          vram[(py0+y) * vxsize + (px0+x)] = buf[y * bxsize + x];
      }
}

上面代码中,vxsize是整个屏幕的宽度,也就是320,pxsize,pysize, bxsize 等于16,也就是二维数值的行和列值, px0,py0是鼠标所在的左上角坐标,有了上面代码后,在主函数中通过以下调用就能画出鼠标:

void CMain() {
....
init_mouse_cursor(mcursor, COL8_008484);
putblock(vram, xsize, 16, 16, 80, 80, mcursor, 16);
for(;;){
io_hlt();
}

上面代码把鼠标画到左上角坐标为80,80的屏幕处,运行上面代码,反编译后加入内核汇编代码,最后编译内核,用虚拟机加载后结果如下:


这里写图片描述

虽然鼠标画出来,但动不了,那是因为我们还没有在内核中建立相关机制,要想让鼠标动起来,我们需要设置中断处理,当我们触摸鼠标硬件,硬件会向CPU发送信号,CPU接收信号后引发中断,放下手中正在处理的任务,去执行中断代码,如果这段中断代码是我们写的话,那么我们可以乘此机会重新绘制鼠标,改变鼠标位置,这样鼠标就动起来了。设置中断由于涉及到硬件,所以将会是一个难度比较大的技术点,我们又需要操作类似GDT这种数据结构,在后面的时间里,我们会就这些问题深入研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 37,049评论 8 114
  • 1, 从八岁到十八岁,玉露除了妈妈一无所有。 可她妈妈一点也不喜欢她,长久以来的冷暴力,让玉露曾一度陷入抑郁。 她...
    Lori啊阅读 365评论 0 0
  • 我已束手就擒 背过身去 向终将汇入大海的江水投去 没过了我的虚荣繁华 我的遗世独立 没过了 我已束手就擒
    萧陌阅读 533评论 0 2
  • 花儿开过,草儿绿过,狂风吹过,暴雨来过。就算是隔了几千里,也可以感受阴霾,也可以看到阳光,灿烂的,不仅仅是笑脸,还...
    大麦大麦阅读 336评论 0 1