在利用framebuffe來虛擬出個顯示器設備fb0,這個問題想了很久,終於在網上找到答案並且試驗成功記錄下來,以防以後再忘了。
雖然framebuffer有很多局限性,比如在內核啟動之後就無法修改分辨率,但是通過framebuffer這個內核抽象出來的設備文件可以很方便的控制顯卡,顯示圖像。
由於framebuffer是顯卡的抽象,因此向 /dev/fb0(假設是fb0),就相當於向顯存寫數據,因此無論你是在什麼環境下屏幕都會被覆蓋掉,但是同時還有其他進程和你爭搶顯卡的顯示權,因此需要一種方式獨占顯卡的使用權限,這個也是我找了很久才發現的。
對framebuffer的操作很容易從網上找到例子,我這裡簡單說一下
1.在未開啟framebuffer的linux系統下開啟framebuffer(以Ubuntu 9.04alpha6為例)
開啟framebuffer需要修改以下幾個文件,你可以在在命令行裡用vi編輯,也可以個用gedit,我個人還是推薦後者。
注意在進行下一步操作之前必須先改一下文件的權限,默認是只讀。
sudo gedit /etc/initramfs-tools/modules
在最後面新起兩行加入
fbcon
vesafb
在這個文件中裡面好多#,記住上面要加的兩行前面不能有#,否則給注釋掉了。
sudo gedit /etc/modprobe.d/blacklist-framebuffer.conf
執行上面指令之前必須先得修改權限。默認是只讀的。
注釋掉(前面添加一個#)
blacklist vesafb
這個很容易發現,直接注釋掉就可以。
同時還要注釋掉你的顯卡驅動,我的是nVidia
補充:找不見可以用該指令查看:sudo lshw
這裡再補充說一下,你可以在windows下查看自己的顯卡型號(N或T)在裡面找到注釋掉就可以了。
sudo gedit /boot/grub/menu.lst
這一行指令,在ubuntu10.10版本中沒有meun.lst了現在改成了grub.cfg,所以在這必須這樣來:sudo gedit /boot/grub/grub.cfg
在kernel啟動參數的行末尾添上 vga=0x317 (1024x768,16位,你也可以使用別的分辨率模式)
注:vga=0×314 即為800*600 16位
終端的分辨率可以用fbset設置。
|640x480 800x600 1024x768 1280x1024
----+-------------------------------------
256 | 0x301 0x303 0x305 0x307
32k | 0x310 0x313 0x316 0x319
64k | 0x311 0x314 0x317 0x31A
16M |0x312 0X315 0x318 0X31B
上面這些我沒有測試過,我用的是0X31B,你們自己根據自己顯卡設置。
在ubuntu10.10中的grub.cfg中沒有了kernel了,在裡面找到這條語句:
linux /boot/vmlinuz-2.6.35-25-generic root=UUID=cabcaf02-31fd-487d-b90c-08c8faaaa2d8 ro quiet splash (vga=0x31B)括號裡面是自己加上的,估計這個文件也得改權限。特別提示在裡面找可以用“splash”作為關鍵詞查找或定位。
然後
sudo update-initramfs -u
重新啟動就可以了!
到這基本就搞定了。