|
|
用户名:matsuri 笔名:matsuri 地区: 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
思想上从来都是一个人过日子,晚上有星星就看星星,没星星就看月亮.于青山绿水中,劈柴架炉笑看风云.
linux内核笔记之三种地址的概念
逻辑地址,线性地址和物理地址.(参见linux内核完全注释p16)
进程的虚拟地址需要首先通过其局部段描述符变换为cpu整个线性地址空间中的地址,然后再使用页目录表pdt(一级页表)和页表pt(二级页表)映射到实际物理地址页上.
为了使用实际物理内存,每个进程的线性地址通过二级页表动态映射到主内存区域的不同内存页上.因此每个进程最大可用的虚拟内存空间是64MB.每个进程的逻辑地址通过加上任务号*64MB,即可转换为线性地址。在linux内核注释中,为了方便,直接将进程中的地址简称为线性地址(实际上是逻辑地址)。
在进程进入内核心态时,也是使用了页表,但是为了管理内存需要(例如需要将某个具体的物理地址上的值清零操作),在内核区的开始的部分内存区域,需要将其初始化为线性地址和物理地址相同的映射(线性地址0x00000001=物理地址0x00000001),通过将页表项按照从0到16M的范围依此递增,将地址值填入表中,可以达到目的。这样一来,对内核区某个线性地址的操作,就是对某个物理地址的操作,可以达到一一对应的关系。
linux内核笔记之cr3位
在tss->cr3位上存放的是这个任务的当前使用的页目录项,任务切换时,需要将不同的tss->cr3的值装入tr(任务寄存器)中,然后实现任务的转换.在linux 0.11版本中,由于总共内存的线性空间使用的是4G,平均每个进程使用64M,所以,所有任务只使用一个页目录项.即cr3的值在0.11版本中不变化.
最近在看linux内核
希望将来有精力和时间写自己的64操作系统,最好是在中国的龙芯cpu上测试,哈哈,还有操作系统的整个架构不基于minix操作系统设计的思想,能有自己的算法.集成的汇编编译程序需要和别人合作开发.
有希望总是好的,哈哈哈哈哈哈哈
绘制半透明位图以及如何画透明位图
有的时侯,我们希望显示一幅半透明的位图。也就是说我们将一幅位图B显示到A位图上,又希望透过B位图看到A位图的一部分图像但不是全部。比如A位图是一幅曲线图,B是一幅提示位图,我们想在显示提示的同时看到已显示的曲线,但不需要曲线的背景,就需有用到半透明位图。曲线看上去就象从B位图中渗透过来,其实半透明技术就是一种渗透技术,渗透公式我们可选用多种,在这里我们选用(A AND 0x7F)OR B。注意,白色不能产生渗透。
//参数说明:
//hDIB -位图句柄
//pPal -位图调色板
//xDest -显示位图的左上角x坐标
//yDest -显示位图的左上角y坐标
void DrawSemiTransparentBitmap(CDC *pDC, int nXDest, int nYDest, HGLOBAL hDIB,CPalette *pPal)
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :1 << bmInfo.bmiHeader.biBitCount;
int nWidth = bmInfo.bmiHeader.biWidth;
int nHeight = bmInfo.bmiHeader.biHeight;
LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
CDC memDC;
memDC.CreateCompatibleDC( pDC );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
memDC.RealizePalette();
::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0, nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
CDC maskDC;
CBitmap mbm;
maskDC.CreateCompatibleDC(pDC);
mbm.CreateCompatibleBitmap(pDC, nWidth, nHeight);
maskDC.SelectObject(&mbm);
maskDC.FillSolidRect(CRect(0, 0, nWidth, nHeight), RGB(0x7F, 0x7F, 0x7F));
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC, 0, 0, SRCPAINT);
memDC.SelectObject(pOldBitmap);
}
如何画透明位图
画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,
而不透明的是白色的,白色的部分就是透明的部分。假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。
用VC++ MFC实现的代码如下:
void CDemoDlg::OnPaint()
CPaintDC dc(this);
Cbitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;
BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
BmpB.LoadBitmap(IDB_BITMAPB); //载入图B
CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
dcBack.CreateCompatibleDC(&dc);
dcA.CreateCompatibleDC(&dc);
dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC
pOldBack=dcBack.SelectObject(&BmpBack);
pOldA=dcA.SelectObject(&BmpA);
pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC
dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A
dcBack.SelectObject(pOldBack);
dcBack.SelectObject(pOldA);
dcBack.SelectObject(pOldB); //从内存DC中删除位图
你会看到红色的字母A透明地画在背景上了。
用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好
遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。用VC++ MFC实现的代码如下:
/*
这是一个用来画透明位图的函数
CDC *pDC 需要画位图的CDC指针
UINT IDImage 位图资源ID
Crect &rect 指定位图在pDC中的位置
COLORREF rgbMask 位图的透明色
*/
void DrawTransparentBitmap(CDC *pDC, UINT IDImage,Crect &rect, COLORREF rgbMask)
CDC ImageDC,MaskDC;
Cbitmap Image,*pOldImage;
Cbitmap maskBitmap,*pOldMaskDCBitmap ;
Image.LoadBitmap(IDImage);
ImageDC.CreateCompatibleDC(pDC);
pOldImage=ImageDC.SelectObject(&Image);
MaskDC.CreateCompatibleDC(pDC);
maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );
ImageDC.SetBkColor(rgbMask);
MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );
ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);
MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
void CDemoDlg::OnPaint()
CPaintDC dc(this);
Cbitmap BmpBack,*pOldBack,;
BmpBack.LoadBitmap(IDB_BACKGROUND);
CDC dcBack;
dcBack.CreateCompatibleDC(&dc);
pOldBack=dcBack.SelectObject(&BmpBack);
dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
DrawTransparentBitmap(&dc,IDB_BITMAPA,Crect(0,0,48,48),RGB(192,192,0));
dcBack.SelectObject(pOldBack);
Vxworks配置(p4+rtl8139网卡)
安装tornado2.2
使用安装文件:WINDRIVER.TORNADO.V2.2.FOR.PENTIUM
CD1= Tornado 2.2/VxWorks 5.5 for PENTIUM
(DISK_ID: TDK-14611-ZC-01)
CD2= BSPs/Drivers for VxWorks 5.5: PENTIUM
(DISK_ID: TDK-14621-ZC-01)
以上两个文件分别是开发工具软件和bsp文件
软件大小:328M
安装方法:1)首先安装虚拟光驱软件DAEMON3.2
2)分别MOUNT 文件夹CD1和CD2下后缀名为BIN的文件
3)自动安装后,输入序列号如下:
CD1: cAQ8i-qP2I&-g$vT6-3&gjw-bEk9g
CD2: A7KbB-Rd37p-hNFBE-kzgaT-b9gpC
4)拷贝CRACK目录下的license.dat 到c:\flexlm 目录,
如果没有这个目录,自己建一个。在我的电脑里设置如下环境变量:
LM_LICENSE_FILE = c:\flexlm\license.dat