Et lækkert hack jeg fandt.
Har bibeholdt den oprindelige hackers navn i teksten, for at give ham den credit jeg mener han fortjener.
-------------------
VRAM Storage Device - How to use the memory on GFX board in a different way...
2002-09-03 01:09 by Michał Schulz
Have you ever thought why does your graphics card have so much memory? Do You think you have not enough RAM or awfully slow swap file? Do you need fast ram-disk or diskless machine? Go for it! Take one of these cheap 32MB graphics cards and enjoy the speed.
1. Requirements
In order to use VRAM as a storage device you need:
* XFree86,
* MTD compiled as the modules (especially slram),
* Gfx card with tons of memory which we would never use otherwise.
2. Preparation
In order to use the memory you have to find, where Gfx video ram is placed within PCI address space. It can be done in many different ways. What I did first was the general check of GFX card resources:
1.
execute lspci (or even better lspci -vvv) and look for the entry called similar to "VGA compatible controller". There should be at last one such entry which describes GFX card and its resources. In my case it looked as follows:
01:00.0 VGA compatible controller: nVidia Corporation Vanta [NV6] (rev
15) (prog-if 00 [VGA])
Flags: bus master, 66Mhz, medium devsel, latency 248, IRQ 10
Memory at d6000000 (32-bit, non-prefetchable) [size=16M]
Memory at d4000000 (32-bit, prefetchable) [size=32M]
Expansion ROM at <unassigned> [disabled] [size=64K]
Capabilities: [60] Power Management version 1
Capabilities: [44] AGP version 2.0
There are two addresses possible. Please note, that this is true for NVidia cards only. Others may have more or less address spaces. One of "Memory at" entries here says about MMIO address space. The other is gfx ram. This information is not enough, so it's high time to ask XFree86 about some details.
2.
XFree86 puts some log information on the screen. They are also recorder in /var/log/ in XFree86.log (or sometimes XFree86.0.log and so on). One can find all needed information about GFX ram (which is also called here linerar framebuffer):
meehow:~# cat /var/log/XFree86.0.log |grep framebuffer
(**) NV(0): Depth 24, (--) framebuffer bpp 32
(--) NV(0): Linear framebuffer at 0xD4000000
As You may see, in my case GFX ram starts at physical address 0xd4000000. Now when one knows how much memory hes card has and where it starts, the experiment may be performed!
3. Configuring MTD
MTD is the acronym for Memory Technology Devices (please look at http://www.linux-mtd.infradead.org/ for more details), allowing us to use Flash memories, DoC devices and others. Now I'm going to use it in a bit unusual way (though very simple).
One of mtd drivers handles RAM devices directly accessed through PCI bus. As we may read:
Many PC chipsets are incapable of correctly caching system memory above 64M or 512M. A driver exists which allows you to use this memory with the linux-mtd system.
It's the different issue but fits perfectly now. We do have an additional memory. We cannot add it for the kernel use (that would require some more sophisticated tricks and would be not too efficient). But of course we may use is as a block or a char device. Driver which handles that is called slram. (CONFIG_MTD_SLRAM kernel option). Besides this we will need mtdcore, mtdblock (if the block access is needed) and/or mtdchar (if the char access required).
4. Few calculations
XFree86 uses PCI information to know where it should create a displayable image. That means if we will decrease the video memory size and tell XFree86 that the video card has less memory than it can detect, the rest will remain unused and untouched by the X11. It will be possible then to use it ourself.
The quantity of the video memory needed for X11 depends on the video resolutions used. The easiest is to multiply width by height by bytes_per_pixel of the highest mode used by XFree86 on the machine. Than some quantity may be added which will be used by for example XAA extension. Please note, that most common GFX cards use FOUR bytes per pixel in 24bpp modes. If you use the framebuffer console, you must take account at it's resolution as well.
Let's assume, that we decided to give 4MB of memory for XFree86 (4MB is 0x00400000 in hex). If the video framebuffer starts at 0xd4000000, then the memory available for MTD will begin at (0xd4000000 + 0x00400000) 0xd4400000. What we know now is the location and the size of memory for our device.
5. Fixing the XF86Config
In order to tell XFree86 how much memory it should use, you have to fix XFree86 a bit. Otherwise, X11 will detect memory size and use it all. We don't want that. In a Device section you need to add the line:
VideoRam 4096
It will limit the video area to 4MB. If XFree86 has to be restarted after this fix.
CAUTUION! It WILL NOT work with nVidias binary drivers. They just ignore VideoRam option! On the other hand it works perfectly with XFree86's nv driver.
6. Birth of MTD device
Everything is prepared now. We may begin then:
meehow:~# modprobe slram map=VRAM,0xd4400000,+0x00c00000
My graphics card has 16MB memory onboard. I've left 4MB for X11 driver. The rest (12MB = 0x00c00000) is for MTD device. Let's have a look whether we succeed:
meehow:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00b00000 00010000 "VRAM"
Hooray! The mtd0 device is installed and redy for use. How to work with it? Quite easy. First of all you must check whether /dev/mtd0 and /dev/mtdblock0 devices are present in the system (it will be of course different on systems with devfs). If they are not there, they must be created. If the char device is needed, one has to type:
meehow:~# mknod /dev/mtd0 c 90 0
And be sure that mtdchar module is loaded (or make sure that kernel will load it when needed). For block device:
meehow:~# mknod /dev/mtdblock0 b 31 0
And the module needed to access it is mtdblock now.
The device is set up. That's all. Anyone survived?
7. What the hell can I do with that?
Well, many things. When I was thinking about it, I have found two ways to use it. One of them is making any filesystem on that:
meehow:~# mkfs.ext2 /dev/mtdblock0
and mounting it somewhere, the other is more sophisticated:
meehow:~# mkswap /dev/mtdblock0
Setting up swapspace version 1, size = 12582912 bytes
meehow:~# swapon /dev/mtdblock0
Later on, more possibilities occur. You can use this methon in X11 terminals, to limit network bandwitch for example. During bootup such terminal would load kernel and compressed filesystem. The FS may be placed then on such mtdblock device and kernel may boot from it. Using console-only server with some kind of modern 32MB gfx card may use the vram as huge swap (which is way faster than swap on disk). New ideas are welcome :) Contact me at: michal.schulz(at)tu-clausthal.de
-
Seneste indlæg
Arkiver
- december 2025
- januar 2024
- december 2023
- november 2023
- oktober 2023
- september 2023
- marts 2023
- oktober 2022
- september 2022
- august 2022
- juli 2022
- juni 2022
- maj 2022
- marts 2022
- februar 2022
- december 2021
- oktober 2021
- september 2021
- august 2021
- marts 2021
- maj 2019
- april 2019
- januar 2019
- december 2018
- november 2018
- oktober 2018
- september 2018
- august 2018
- juli 2018
- maj 2018
- april 2018
- marts 2018
- januar 2018
- december 2017
- september 2017
- juli 2017
- juni 2017
- april 2017
- december 2016
- november 2016
- februar 2016
- januar 2016
- december 2015
- september 2015
- august 2015
- april 2015
- februar 2015
- december 2014
- september 2014
- august 2014
- juni 2014
- april 2014
- marts 2014
- februar 2014
- januar 2014
- november 2013
- oktober 2013
- september 2013
- juni 2013
- maj 2013
- april 2013
- januar 2013
- december 2012
- oktober 2012
- september 2012
- august 2012
- juli 2012
- juni 2012
- maj 2012
- maj 2011
- marts 2011
- februar 2011
- juni 2009
- maj 2009
- marts 2009
- december 2008
- november 2008
- oktober 2008
- august 2008
- juli 2008
- juni 2008
- april 2008
- marts 2008
- februar 2008
- januar 2008
- december 2007
- november 2007
- oktober 2007
- september 2007
- august 2007
- juli 2007
- juni 2007
- maj 2007
- april 2007
- marts 2007
- februar 2007
- januar 2007
- november 2006
- oktober 2006
- august 2006
- juli 2006
- juni 2006
- maj 2006
- april 2006
- marts 2006
- februar 2006
- januar 2006
- december 2005
- november 2005
- oktober 2005
- september 2005
- juni 2005
- maj 2005
- april 2005
- marts 2005
- februar 2005
- januar 2005
- december 2004
- november 2004
- oktober 2004
- september 2004
- august 2004
- juli 2004
- juni 2004
- maj 2004
- april 2004
- marts 2004
- februar 2004
- januar 2004
- december 2003
- november 2003
- oktober 2003
- september 2003
- august 2003
- juli 2003
- juni 2003
- maj 2003
- april 2003
- marts 2003
- februar 2003
- januar 2003
- juli 2002
- juni 2002
Kategorier
- Android (1)
- Ansible (1)
- Apache (53)
- Backdoors (3)
- Backuppc (1)
- Blog (2)
- Cisco (2)
- Development (1)
- Domain Name System (3)
- Exploits (4)
- FreeBSD (64)
- Hardware hacking (2)
- HP (1)
- HTML (2)
- Humor (10)
- I3WM (2)
- Intrusion detection (1)
- IRC (5)
- Irssi (1)
- Javascript (1)
- Knowledge Base (623)
- Kryptering (6)
- KVM (4)
- Lamp (5)
- Letsencrypt (1)
- LifeHack (2)
- Links (30)
- Linux (251)
- MobilPhone (1)
- Monitoring (3)
- Mysql (6)
- Nagios (9)
- Networking (152)
- Old Base (529)
- OpenBSD (4)
- OpenVPN (3)
- Opskrifter (1)
- OsX (1)
- PHP (12)
- Postfix (1)
- Programmering (50)
- Python (5)
- Retro hardware (2)
- Security (13)
- Shellscript (7)
- Sparc (1)
- SQL (24)
- SSH (9)
- Uncategorized (40)
- Vagrant (2)
- Videostreaming (1)
- Vim (7)
- VNC (1)
- Windows (24)
- Wordpress (3)
- Workstation (28)
- xcp-ng (1)
- Zfs (1)
Meta