1. 请问,在ACDSee GIF 图像中931*400是什么意思
像素啦~~
不能知道真实的尺寸,
英文名称:Pixel
[编辑本段]像素定义
“像素”(Pixel) 是由 Picture(图像) 和 Element(元素)这两个单词的字母所组成的,是用来计算数码影像的一种单位,如同摄影的相片一样,数码影像也具有连续性的浓淡阶调,我们若把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”(Pixel)。这种最小的图形的单元能在屏幕上显示通常是单个的染色点。越高位的像素,其拥有的色板也就越丰富,越能表达颜色的真实感。 一个像素通常被视为图像的最小的完整采样。这个定义和上下文很相关。例如,我们可以说在一幅可见的图像中的像素(例如打印出来的一页)或者用电子信号表示的像素,或者用数码表示的像素,或者显示器上的像素,或者数码相机(感光元素)中的像素。这个列表还可以添加很多其它的例子,根据上下文,会有一些更为精确的同义词,例如画素,采样点,字节,比特,点,斑,超集,三合点,条纹集,窗口,等等。我们也可以抽象地讨论像素,特别是使用像素作为解析度地衡量时,例如2400像素每英寸(ppi)或者640像素每线。点有时用来表示像素,特别是计算机市场营销人员,因此ppi有时所写为DPI(dots per inch)。 用来表示一幅图像的像素越多,结果更接近原始的图像。一幅图像中的像素个数有时被称为图像解析度,虽然解析度有一个更为特定的定义。像素可以用一个数表示,譬如一个"3兆像素" 数码相机,它有额定三百万像素,或者用一对数字表示,例如“640乘480显示器”,它有横向640像素和纵向480像素(就像VGA显示器那样),因此其总数为640 × 480 = 307,200像素。 数字化图像的彩色采样点(例如网页中常用的JPG文件)也称为像素。取决于计算机显示器,这些可能不是和屏幕像素有一一对应的。在这种区别很明显的区域,图像文件中的点更接近纹理元素。 在计算机编程中,像素组成的图像叫位图或者光栅图像。光栅一词源于模拟电视技术。位图化图像可用于编码数字影像和某些类型的计算机生成艺术。
[编辑本段]原始和逻辑像素
因为多数计算机显示器的解析度可以通过计算机的操作系统来调节,显示器的像素解析度可能不是一个绝对的衡量标准。 现代液晶显示器按设计有一个原始解析度,它代表像素和三元素组之间的完美匹配。(阴极射线管也是用红-绿-蓝荧光三元素组,但是它们和图像像素并不重合,因此和像素无法比较)。 对于该显示器,原始解析度能够产生最精细的图像。但是因为用户可以调整解析度,显示器必须能够显示其它解析度。非原始解析度必须通过在液晶屏幕上拟合重新采样来实现,要使用插值算法。这经常会使屏幕看起来破碎或模糊。例如,原始解析度为1280×1024的显示器在解析度为1280×1024时看起来最好,也可以通过用几个物理三元素组来表示一个像素以显示800×600,但可能无法完全显示1600×1200的解析度,因为物理三元素组不够。 像素可以是长方形的或者方形的。有一个数称为长宽比,用于表述像素有多方。例如1.25:1的长宽比表示每个像素的宽是其高度的1.25倍。计算机显示器上的像素通常是方的,但是用于数字影像的像素有矩形的长宽比,例如那些用于CCIR 601数字图像标准的变种PAL和NTSC制式的,以及所对应的宽屏格式。 单色图像的每个像素有自己的辉度。0通常表示黑,而最大值通常表示白色。例如,在一个8位图像中,最大的无符号数是255,所以这是白色的值。 在彩色图像中,每个像素可以用它的色调,饱和度,和亮度来表示,但是通常用红绿蓝强度来表示(参看红绿蓝)。
[编辑本段]比特每像素
一个像素所能表达的不同颜色数取决于比特每像素(BPP)。这个最大数可以通过取二的色彩深度次幂来得到。例如,常见的取值有 : 8 bpp [28=256;(256色)]; 16 bpp [216=65536; (65,536色,称为高彩色)]; 24 bpp [224=16777216; (16,777,216色,称为真彩色)]; 48 bpp [248=281474976710656;(281,474,976,710,656色,用于很多专业的扫描仪) 。 256色或者更少的色彩的图形经常以块或平面格式存储于显存中,其中显存中的每个像素是到一个称为调色板的颜色数组的索引值。这些模式因而有时被称为索引模式。虽然每次只有256色,但是这256种颜色选自一个选择大的多的调色板,通常是16兆色。改变调色板中的色彩值可以得到一种动画效果。视窗95和视窗98的标志可能是这类动画最著名的例子了。 对于超过8位的深度,这些数位就是三个分量(红绿蓝)的各自的数位的总和。一个16位的深度通常分为5位红色和5位蓝色,6位绿色(眼睛对于绿色更为敏感)。24位的深度一般是每个分量8位。在有些系统中,32位深度也是可选的:这意味着24位的像素有8位额外的数位来描述透明度。在老一些的系统中,4bpp(16色)也是很常见的。 当一个图像文件显示在屏幕上,每个像素的数位对于光栅文本和对于显示器可以是不同的。有些光栅图像文件格式相对其他格式有更大的色彩深度。例如GIF格式,其最大深度为8位,而TIFF文件可以处理48位像素。没有任何显示器可以显示48位色彩,所以这个深度通常用于特殊专业应用,例如胶片扫描仪和打印机。这种文件在屏幕上采用24位深度绘制。
[编辑本段]子像素
很多显示器和图像获取系统出于不同原因无法显示或感知同一点的不同色彩通道。这个问题通常通过多个子像素的办法解决,每个子像素处理一个色彩通道。例如,LCD显示器通常将每个像素水平分解位3个子像素。多数LED显示器将每个像素分解为4个子像素;一个红,一个绿,和两个蓝。多数数码相机传感器也采用子像素,通过有色滤波器实现。(CRT显示器也采用红绿蓝荧光点,但是它们和图像像素并不对齐,因此不能称为子像素)。 对于有子像素的系统,有两种不同的处理方式:子像素可以被忽略,将像素作为最小可以存取的图像元素,或者子像素被包含到绘制计算中,这需要更多的分析和处理时间,但是可以在某些情况下提供更出色的图像。 后一种方式被用于提高彩色显示器的外观解析度。这种技术,被称为子像素绘制,利用了像素几何来分别操纵子像素,对于设为原始解析度的平面显示器来讲最为有效(因为这种显示器的像素几何通常是固定的而且是已知的)。这是反走样的一种形式,主要用于改进文本的显示。微软的ClearType,在Windows XP上可用,是这种技术的一个例子。
[编辑本段]兆像素
一个兆像素(megapixel)是一百万个像素,通常用于表达数码相机的解析度。例如,一个相机可以使用2048×1536像素的解析度,通常被称为有“3.1百万像素” (2048 × 1536 = 3,145,728)。 数码相继使用感光电子器件,或者是耦合电荷设备(CCDs)或者CMOS传感器,它们记录每个像素的辉度级别。在多数数码相机中,CCD采用某种排列的有色滤波器,在Bayer滤波器拼合中带有红,绿,蓝区域,使得感光像素可以记录单个基色的辉度。相机对相邻像素的色彩信息进行插值,这个过程称为解拼(de-mosaic),然后建立最后的图像。这样,一个数码相机中的x兆像素的图像最后的彩色解析度最后可能只有同样图像在扫描仪中的解析度的四分之一。这样,一幅蓝色或者红色的物体的图像倾向于比灰色的物体要模糊。绿色物体似乎不那么模糊,因为绿色被分配了更多的像素(因为眼睛对于绿色的敏感性)。参看[1]的详细讨论。 作为一个新的发展,Foveon X3 CCD采用三层图像传感器在每个像素点探测红绿蓝强度。这个结构消除了解拼的需要因而消除了相关的图像走样,例如高对比度的边的色彩模糊这种走样。
[编辑本段]类似概念
从像素的思想衍生出几个其它类型的概念,例如体元素(voxel),纹理元素(texel)和曲面元素(surfel),它们被用于其它计算机图形学和图像处理应用。
[编辑本段]数码相机的像素
像素是衡量数码相机的最重要指标。像素指的是数码相机的分辨率。它是由相机里的光电传感器上的光敏元件数目所决定的,一个光敏元件就对应一个像素。因此像素越大,意味着光敏元件越多,相应的成本就越大。 数码相机的图像质量是由像素决定的,像素越大,照片的分辨率也越大,打印 尺寸在不降低打印质量的同时也越大。早期的数码相机都是低于100万像素的。从1999年下半年开始,200万像素的产品渐渐成为市场的主流。(笑话,现在的手机都普遍200万像素了,家庭用的相机一般都要500~600万像素左右比较合适.要不还不如手机拍照.) 当前的数码相机的发展趋势,像素宛如PC机的CPU主频,有越来越大的势头。 其实从市场分类角度看,面向普及型的产品,考虑性价比的因素,像素并不是 越大越好。毕竟200万像素的产品,已经能够满足目前普通消费者的大多数应用。因 此大多数厂商在高端数码相机追求高像素的同时,当前其产量最大的,仍是面向普 及型的百万像素产品。专业级的数码相机,已有超过1亿像素级的产品。而300万像 素级的产品,将随着CCD(成像芯片)制造技术的进步和成本的进一步下降,也将很 快成为消费市场的主流。 另外值得消费者注意的是,当前的数码相机产品,在像素标称上分为CCD像素和经软件优化后的像素,后者大大高于前者。如某品牌目前流行的数码相机,其CCD像素为230万,而软件优化后的像素可达到330万。
[编辑本段]像素画
像素其实是由很多个点组成。 我们这里说的“像素画”并不是和矢量图对应的点阵式图像,而是指的一种图标风格的图像,此风格图像强调清晰的轮廓、明快的色彩,同时像素图的造型往往比较卡通,因此得到很多朋友的喜爱。 像素图的制作方法几乎不用混叠方法来绘制光滑的线条,所以常常采用.gif格式,而且图片也经常以动态形式出现.但由于其特殊的制作过程,如果随意改变图片的大小,风格就难以保证了。 像素画的应用范围相当广泛,从小时候玩的FC家用红白机的画面直到今天的GBA手掌机;从黑白的手机图片直到今天全彩的掌上电脑;即使我们日以面对的电脑中也无处不充斥着各类软件的像素图标。如今像素画更是成为了一门艺术,深深的震撼着你我。
[编辑本段]效象素值
首先我们要明确一点,一张数码照片的实际象素值跟感应器的象素值是有所不同的。以一般的感应器为例,每个象素带有一个光电二极管,代表着照片中的一个象素。例如一部拥有500万象素的数码相机,它的感应器能输出分辨率为 2,560 x 1,920的图像—其实精确来讲,这个数值只相等于490万有效象素。有效象素周围的其他象素负责另外的工作,如决定“黑色是什么”。很多时候,并不是所有感应器上的象素都能被运用。索尼F505V就是其中的经典案例。索尼F505V的感应器拥有334万象素,但它最多智能输出1,856 x 1,392即260万象素的图像。归其原因,是索尼当时把比旧款更大的新型感应器塞进旧款数码相机里面,导致感应器尺寸过大,原来的镜头不能完全覆盖感应器中的每个象素。 因此,数码相机正是运用”感应器象素值比有效象素值大“这一原理输出数码图片。在当今市场不断追求高象素的环境下,数码相机生产商常常在广告中以数值更高的感应器象素为对象,而不是反映实际成像清晰度的有效象素。
[编辑本段]感应器象素插值
在通常情况下,感应器中不同位置的每个象素构成图片中的每个象素。例如一张500万象素的照片由感应器中的500万个象素对进入快门的光线进行测量、处理而获得(有效象素外的其他象素只负责计算)。但是我们有时候能看到这样的数码相机:只拥有300万象素,却能输出600万象素的照片!其实这里并没有什么虚假的地方,只是照相机在感应器300万象素测量的基础上,进行计算和插值,增加照片象素。 当摄影者拍摄JPEG格式的照片时,这种“照相机内扩大”的成像质量会比我们在电脑上扩大优秀,因为“照相机内扩大”是在图片未被压缩成JPEG格式前完成的。有数码相片处理经验的摄友都清楚,在电脑里面扩大JPEG图片会使画面细腻和平滑度迅速下降。虽然数码相机插值所得的图片会比感应器象素正常输出的图片画质好,但是插值所得的图片文件大小比正常输出的图片大得多(如300万感应器象素插值为600万象素,最终输入记忆卡的图片为600万象素)。因此,插值所得的高象素看来并没有太多的可取之处,其实运用插值就好像使用数码变焦-并不能创造原象素无法记录的细节地方。
[编辑本段]CCD总象素
CCD总象素也是一个相当重要指标,由于各生产厂家采用不同技术,所以其厂家标称CCD像素并不直接对应相机实际像素,所以购买数码相机时更要看相机实际所具有总像素数。一般来讲总像素水平达到300万左右就可以满足一般应用了,一般200万象素、100万象素产品也可以满足低端使用,当然更高象素数码相机可以得到更高质量照片,现在有些公司已经开始推出600万象素级别普通数码相机了。
关于相机的发展变化
数码相机的发展变化,在某种意义上说,比人们预料的要快得多。截至2007年底,高像素的相机已经进入一般消费者手中。比如八百万像素的相机,价格已经不是很高。像素可为3,264X2,448=7,990,272。
2. 0x7c931ec3 指令引用的 0x03c6302a 内存。 该内存不能为 written 是怎么回事啊
内存不能为read/written 问题的简单解决办法:(原创答案,欢迎分享→请活学活用→仅供参考):
一、硬件的可能性是比较小的,如果是硬件,那就应该是内存条跟主机不兼容的问题导致的 如果能排除硬件上的原因(内存条不兼容,更换内存)往下看:
二、系统或其它软件引起的,可用下述方法处理: 系统本身有问题,及时安装官方发行的补丁,必要时重装系统。 病毒问题:杀毒 。杀毒软件与其它软件冲突:卸载有问题的软件。显卡、声卡驱动是否正确安装或者是否被恶意覆盖否?重新安装显卡声卡驱动。
1、使用系统自带的sfc命令,修复受到损坏的系统文件恢复到正常状态。
开始→运行→输入cmd,打开“命令提示符”窗口→输入字符串命令sfc/scannow→回车→耐心等待命令程序对每个系统文件搜索扫描→一旦发现系统文件的版本不正确或者系统文件已经损坏→它就能自动弹出提示界面→要求插入Windows系统的安装光盘→从中提取正常的系统文件来替代不正常的系统文件→达到修复系统文件的目的→最后重新启动计算机。
2、安装过的Domino这程序导致有问题,你可以在开始→运行→msconfig→启动项目→关闭Domino启动项→如果关闭不了→可以用卡卡助手之类的系统设置软件把它强行关掉→如果还是不行的→证明你系统中毒→那就重新安装系统彻底解决。
三、浏览器出现内存不能读、写的提示:
1、运行→regedit→进入注册表, 在→
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks
这个位置有一个正常的键值{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 将其他的删除。
2、打开CMD窗口输入如下命令:
for %i in (%windir%\system32\*.dll) do regsvr32.exe /s %i 回车
for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %i 回车
两条分别运行完成后重启机器。
四、如果以上方法无法解决只能使用最后一招:
完全注册dll:打开“运行”输入→cmd→回车
然后把下面这行字符复制到黑色cmd框里面去回车等待dll文件全部注册完成就关闭可以了,为防止输入错误可以复制这条指令,然后在命令提示符后击鼠标右键→粘贴→回车,耐心等待,直到屏幕滚动停止。
(下面是要运行的代码):
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
完成后重新启动机器。
五、如果你电脑里面存在NET.Framework这个微软的组件服务而你又不使用它→那么卸载这个服务可能会解决问题:开始→设置→控制面板→添加删除程序→NET.Framework→删除。
六、关闭这个报告(治标不治本):
1、右击桌面上“我的电脑”→属性→高级→错误报告→错误汇报→勾选“禁用错误汇报”→“但在发生严重错误时通知我”复选框→确定。这样处理对于一些小错误,Windows XP就不会弹出错误提示了。
2、如果不行彻底关闭错误报告服务。开始→运行中输入→services.msc→打开“服务”窗口→找到“Error Reporting Service”→打开“Error Reporting Service的属性”对话框→将“启动类型”改为“已禁用”→确定后重新启动系统。
简单有效的处理方法是看错误提示,哪一个软件引起的冲突就卸载那个软件,重新启动机器以后首先关闭杀毒软件,重新运行安装。
3. 拜托各位告我怎么备份,
分类: 电脑/网络 >> 操作系统/系统故障
问题描述:
麻烦详细一点谢谢
解析:
使用GHOST啊 而且做这样的备份最好是系统在刚做好的时候 这样的系统最干净。至于GHOST的使用这里我就不详细的说了。因为这是个老问题了你搜索一下就知道有很多的说明了。
这是我以前回答别人问GHOST的用法,你可以参考一下:
我现在一直用GHOST6 先把这个只有931KB的大小的文件拷下来其中只有两个文件ghost.exe和ghostxp.exe (比如把他拷D:\ghost6)现在开始使用,我用的是DOS版不知道有没有WINDOWS版的,不管哪个版本操作上应该都是差不多的:
1.用光盘启动进入DOS。
2.具体操作是这样的D:\CD GHOST6---)D:\GHOST6\GHOST 然后进入GHOST的操作界面
3.如果你要进行备份整个系统盘比如C盘 选择“partition” 再选择“to image”意思就是将C盘备份成一镜像文件 然后硬盘选择如果是单硬盘直接点确定。然后再进行盘符选择. 肯定选择C盘点.确定进入选择将镜像放的路径.可以不进行选择直接点确定.这样就将该镜像放在D;\ghost6下(还有这一步还得给该镜像取名 这可以随便起 比如back~1)。然后进入选择将C盘做成镜像的压缩的程度。我一般选择“fast'就是中间一项 然后确定就开始进行备份一般大概10来分钟。
4.如果要将该镜像恢复到C盘前面操作都是一样。进入操作界面后选择”partition" 再选择“from image" 确定 再确定 选择C盘 然后选择镜像所在的路径 基本上一路确定就开始恢复。不过这里一定要慎重的就是选择恢复到盘的选择上 千万不能选择错误 否则恢复到其他盘的话 其他盘的数据就全部丢失了。
以上只是我自己操作的一些经验,是根据记忆写下来的,可能很多地方还有需要补充。要熟悉还得自己亲自动手多操作几次就可以了,
4. CIE 931色度图怎么看
CIE 1931 色度图 (2维标准观测)
目的
这个工程的目的就是证明如何显示一个1931 CIE(Commission International de l'Eclairage 国际照明协会)的色度图,同样还包括1960和1976介绍中对其的改革。额外地,这个图可以使用1931的2维标准观测来显示,也可以用1964年的10维标准观测来显示,我们还试着解释它们之间的不同。
背景
标准观测(Standard Observer)。CIE标准观测是基于协会和建造者的表格的二维区域。CIE 1964标准观测是10维的。 引导到1931标准观测的实验只使用了视网膜中的一个小凹槽,覆盖了视野的2维。1964年附加的标准观测是基于视网膜10维区域的色彩比配实验。观测忽略了中央的2维点。当视觉感受被期望为4维时,1964的标准观测就被推荐出来了。
CIE标准观测通常都基于许多实验,这些实验是用少数拥有普通视力的人做出的。没有真正的观测是也CIE标准观测一样的。请参考[Judd75, pp. 153-157] or [Billmeyer81, pp.42-45]。关于新闻组的投递,Danny提出“1964观测有50个观测者左右,而1931只有一打。1964的工作包括一些外国的已经获得博士学位的同事,但是早期的工作只有包括伦敦附近的一些英国人”。
根据[Foley96, p. 580], 1964的表格并不是普遍为计算机使用的,因为它强调很大的一个颜色区域,这个区域里的大多数颜色并不是图象中能够找到的。
下面的图能够被“标准”表格色度程序显示,当程序被校准了以后尺寸也就正确了。
CIE 1931 2-Degree Field of View
CIE 1964 10-Degree Field of View
要得到附加的CIE1931和1964观测信息,请看[Judd75, p. 155] or [Billmeyer81, p. 42]。
颜色匹配函数。一系列关于1931和1964标准观测的颜色匹配函数被定义了。这两个标准观测的1纳米的定义可以在文件中找到,cxyz31_1.txt 和 cxyz64_1.txt, at [CIE 标准, http://cvision.ucsd.e/cie.htm], 或者表格在 [Wyszecki82]。
CIE颜色匹配函数的一纳米表格给出了7个标准的图。但是根据[Wyszecki82, p. 131]“那些大量的用来定义颜色匹配函数的数字图形是不必像实验得到颜色匹配数据那样具有验证,基于这个数字图形的表格上的值有一个相比较的精密度的。视觉色彩匹配和这里的精密度是有很大距离的。”但是有了这个精密度和计算机,还有色度表上的坐标,我们可以直接用色度匹配函数来计算出颜色,而不必像以前一样用表格来计算了。
1931颜色匹配函数的图形就在下面:
CIE1964颜色匹配函数的曲线弯度就和上面的或者[Billmeyer81, p. 44]有一点点区别。
色度图
CIE 1931 xy Chromaticity Diagram
马蹄铁线是光谱轨迹。
连接马蹄铁底部结束的线叫作无光谱的“紫色线”
In terms of the tristimulus values X, Y and Z:
x = X / (X + Y + Z)
y = Y / (X + Y + Z)
z = Z / (X + Y + Z)
x + y + z = 1
See [Fortner97, pp. 95-100, 102-116]
这个CIE图标的表示给予绿色区域一个并不平衡的面积。对于原来1931CIE色度图的各种改变被提议修正这个失真,还要归整出一个唯一近似的色度空间。
理论上来说,最小可分辨区域应该是原形的,但是由于不唯一的色度图,对于这个区域却是椭圆形,而且这种区域在色度图中由位置的不同而有不同的尺寸大小。碎小的这种椭圆区域在CIE色度图中常被指出。[Chamberlin80, p. 67-68]
根据[Fortner97, p. 104],控制波长和纯度的因素经常在色度图中用来描述颜色,也表达了色调和饱和度的概念。
注意:没有一个输出设备能够输出精确的CIE图象,因为输出设备都是有固定的墨和颜色的,固定的几种颜色是不能够表达所有可以看见的颜色的。
1960 CIE uv Chromaticity Diagram
Conversion of 1931 xy coordinates to 1960 uv coordinates:
u = 4x / (-2x + 12y + 3)
v = 6y / (-2x + 12y + 3)
In terms of the tristimulus values X, Y and Z:
u = 4X / (X + 15Y +3Z)
v = 6Y / (X + 15Y + 3Z)
Conversion of 1960 uv coordinates to 1931 xy coordinates:
x = 3u / (2u - 8v + 4)
y = 2v / (2u - 8v + 4)
See [Agoston87, p. 240], [Judd75, p. 296], [Billmeyer81, p. 57].
这个1960的公式“碾碎”了所有黄色,褐色,橙色和红色,把它们放入了一个相关的很小的色度图区域,这个图是在色差点和光谱轨迹之间的。这个区域应该足够地大,因为这些颜色出现在食物,油,绘画和其它工业领域。[Chamerlin80, p. 60],1976的色度图有了更好的改进:
1976 CIE u'v' Chromaticity Diagram
Conversion of 1976 u'v' coordinates to 1931 xy coordinates:
x = 9u' / (6u' - 16v' + 12)
y = 4v' / (6u' - 16v' + 12)
z = (-3u' - 20v' + 12) / (6u' - 16v' + 12)
For conversion from 1960 to 1976 coordinates:
u' = u
u' = 4x / (-2x + 12y + 3)
u' = 4X / (X + 15Y +3Z)
v' = 3v/2
v' = 9Y / (X + 15Y + 3Z)
v' = 9y / (-2x + 12y + 3)
w' = (-6x + 3y + 3) / (-2x + 12y + 3)
[Chamberlin80, p. 60], [Billmeyer81, p. 58], [Hunt87, Appendix 6, p. 197].
1976年图表的优点是每点之间的距离已经近似于均衡的距离了,1931中的一些定义并不确切。但是历史的惯性获得了胜利的优势:1976图表并没有像1931图表那样广泛使用。
Chromaticity Coordinates of Phosphors.
(中间一些表格显示不正常,请去酷太阳实验室查看详细资料)
也可以参看Phosphors for Cathode Ray Tubes 或者 Phosphor Handbook。
Maxwell三角形和色阶
在麦氏维尔三角形中,从三个附加根源出现的颜色可以混合成任何一个可能的颜色。在麦氏维尔三角形实验室报告中有更详细的解释。
RGB的色度坐标定义了一个可以被所有CRT显示器可能显示颜色色麦氏维尔三角形(或者色阶)。在单个显示器上,在各种颜色空间上正确显示色阶是不可能的,因为色阶有轻微的不同,有些颜色不能够精确地显示出来。色阶可以被近似出来,但是,例如下面显示的SMPTE色阶存在于各种色度图中:
SMPTE Gamut in 1931 CIE xy Chromaticity Diagram
SMPTE Gamut in 1960 CIE uv Chromaticity Diagram
SMPTE Gamut in 1976 CIE u'v' Chromaticity Diagram
1931和1964色度图并不严格正确,但在对于论证目的的色度图程序来说是允许的。
顺便说一下,YUV的Y是被颜色中白色部分所纠正的GAMMA,CIE XYZ 中的Y是并不确切的白色。它们存在联系,但不相同。请看颜色制度。
5. 嵌入式系统linux内核开发实战指南的目录
第1部分 嵌入式系统硬件开发
第1章 嵌入式系统概述 2
这一章对嵌入式系统的概念及其特点和应用作了概括介绍,笔者根据自己多年的经验阐述了对嵌入式系统的理解,并对一些常见的嵌入式处理器的硬件数据进行了比较。
1.1 嵌入式系统概念 2
1.2 嵌入式处理器 3
1.3 嵌入式系统应用 4
1.4 嵌入式系统发展 4
1.5 一些嵌入式处理器的硬件特性比较 5
第2章 ARM处理器概述 16
为了使本书内容完整,从第2章到第7章中的内容大部分是笔者阅读《ARM体系结构与编程》(详情参见附录中的参考文献)的笔记和心得,把与嵌入式系统开发和Linux内核密切相关的硬件知识进行了概括和整理,本章主要介绍了ARM处理器的特点、ARM处理器的体系架构版本和ARM处理器系列。
2.1 ARM发展历程 16
2.2 ARM处理器特点 17
2.3 ARM处理器应用 17
2.4 ARM体系架构 18
2.4.1 ARM体系架构版本 18
2.4.2 ARM体系架构变种(Variant) 20
2.4.3 ARM体系架构版本命名格式 22
2.5 ARM处理器 22
2.5.1 ARM7系列处理器 23
2.5.2 ARM9系列处理器 24
2.5.3 ARM9E系列处理器 24
2.5.4 ARM10E系列处理器 25
2.5.5 SecurCore系列处理器 25
2.5.6 StrongARM处理器 26
2.5.7 Xscale处理器 26
第3章 ARM指令及其寻址方式 27
本章主要介绍了ARM处理器的指令和寻址方式以及ARM汇编伪指令,这是做ARM处理器应用系统底层软件开发必备的知识。
3.1 ARM处理器的程序状态寄存器(PSR) 27
3.2 ARM指令的条件码 28
3.3 ARM指令介绍 29
3.3.1 跳转指令 29
3.3.2 数据处理指令 30
3.3.3 乘法指令 31
3.3.4 杂类算术指令 32
3.3.5 状态寄存器访问指令 32
3.3.6 Load/Store内存访问指令 33
3.3.7 批量Load/Store内存访问指令 34
3.3.8 LDREX和STREX指令 35
3.3.9 信号量操作指令 37
3.3.10 异常中断产生指令 37
3.3.11 ARM协处理器指令 37
3.4 ARM指令寻址方式 39
3.4.1 数据处理指令的操作数的寻址方式 39
3.4.2 字及无符号字节的Load/Store指令的寻址方式 43
3.4.3 杂类Load/Store指令的寻址方式 47
3.4.4 批量Load/Store指令的寻址方式 49
3.4.5 协处理器Load/Store指令的寻址方式 51
3.4.6 ARM指令的寻址方式总结 52
3.5 ARM汇编伪操作(Directive) 53
3.5.1 符号定义伪操作 54
3.5.2 数据定义伪操作 54
3.5.3 汇编控制伪操作 56
3.5.4 栈中数据帧描述伪操作 57
3.5.5 信息报告伪操作 57
3.5.6 其他伪操作 58
3.6 ARM汇编伪指令 59
3.7 Thumb指令介绍 60
第4章 ARM处理器内存管理单元(MMU) 61
本章主要介绍了ARM处理器内存管理单元(MMU)的工作原理,Linux内存管理功能是通过处理器硬件MMU实现的,在没有MMU的处理器系统中,Linux只能工作在物理地址模式,没有虚拟(线性)地址空间的概念。
4.1 ARM处理器中CP15协处理器的寄存器 61
4.1.1 访问CP15寄存器的指令 61
4.1.2 CP15寄存器介绍 62
4.2 MMU简介 70
4.3 系统访问存储空间的过程 71
4.3.1 使能MMU时的情况 71
4.3.2 禁止MMU时的情况 71
4.3.3 使能/禁止MMU时应注意的问题 72
4.4 ARM处理器地址变换过程 72
4.4.1 MMU的一级映射描述符 73
4.4.2 MMU的二级映射描述符 74
4.4.3 基于段的地址变换过程 75
4.4.4 粗粒度大页地址变换过程 75
4.4.5 粗粒度小页地址变换过程 76
4.4.6 细粒度大页地址变换过程 76
4.4.7 细粒度小页地址变换过程 77
4.4.8 细粒度极小页地址变换过程 77
4.5 ARM存储空间访问权限控制 78
4.6 TLB操作 79
4.6.1 使TLB内容无效 79
4.6.2 锁定TLB内容 79
4.6.3 解除TLB中被锁定的地址变换条目 80
4.7 存储访问失效 80
4.7.1 MMU失效(MMU Fault) 80
4.7.2 外部存储访问失效(External Abort) 81
第5章 ARM处理器的Cache和Write Buffer 82
本章主要介绍了ARM处理器高速缓存(Cache)和写缓存(Write Buffer)的工作原理,使读者了解如何提高处理器的性能。
5.1 Cache和Write Buffer一般性介绍 82
5.1.1 Cache工作原理 82
5.1.2 地址映像方式 83
5.1.3 Cache写入方式原理简介 84
5.1.4 关于Write-through和Write-back 85
5.1.5 Cache替换策略 86
5.1.6 使用Cache的必要性 87
5.1.7 使用Cache的可行性 87
5.2 ARM处理器中的Cache和Write Buffer 88
5.2.1 基本概念 88
5.2.2 Cache工作原理 88
5.2.3 Cache地址映射和变换方法 89
5.2.4 Cache分类 90
5.2.5 Cache替换算法 91
5.2.6 Cache内容锁定 91
5.2.7 MMU映射描述符中B位和C位的含义 92
5.2.8 Cache和Writer Buffer编程接口 93
5.3 ARM处理器的快速上下文切换技术 94
5.3.1 FCSE概述 94
5.3.2 FCSE原理 94
5.3.3 FCSE编程接口 95
第6章 ARM处理器存储访问一致性问题 97
本章介绍了在支持MMU、Cache和DMA的系统中可能出现的存储访问一致性问题,以及Linux中解决类似问题的方法。
6.1 存储访问一致性问题介绍 97
6.1.1 地址映射关系变化造成的数据不一致性 97
6.1.2 指令cache的数据不一致性问题 98
6.1.3 DMA造成的数据不一致问题 99
6.1.4 指令预取和自修改代码 99
6.2 Linux中解决存储访问一致性问题的方法 99
第7章 ARM处理器工作模式与异常中断处理 101
本章主要介绍了ARM处理器的工作模式和异常中断处理过程,这是ARM处理器系统启动程序编写者或Bootloader开发人员的必备知识。
7.1 ARM处理器工作模式 101
7.2 ARM处理器异常中断向量表和优先级 103
7.3 ARM处理器异常中断处理 104
7.3.1 进入异常中断处理 104
7.3.2 退出异常中断处理 105
7.4 ARM处理器的中断(IRQ或FIQ) 109
第8章 ARM处理器启动过程 110
本章根据笔者的开发经验介绍了ARM处理器系统的启动过程以及编写ARM处理器系统启动程序需要注意的事项。
8.1 ARM处理器上电/复位操作 110
8.2 ARM处理器系统初始化过程 111
8.3 ARM处理器系统初始化编程注意事项 111
第9章 嵌入式系统设计与调试 113
本章根据笔者10多年的开发经验介绍了嵌入式系统的设计流程和调试方法,列举了大量笔者工作中碰到的实际案例。本章内容对于嵌入式系统硬件开发和调试有较高的参考、指导价值。
9.1 嵌入式系统设计流程 113
9.2 嵌入式系统硬件原理设计与审核 114
9.3 硬件设计工具软件 117
9.4 嵌入式系统调试仿真工具 117
9.5 嵌入式系统调试诊断方法 118
第10章 自制简易JTAG下载烧写工具 123
本章根据笔者自己制作简易JTAG线缆的经验,介绍了简易JTAG线缆的硬件原理和软件流程,这是初学者必备的最廉价的工具,必须掌握。
10.1 JTAG简介 123
10.1.1 一些基本概念 124
10.1.2 JTAG接口信号 124
10.1.3 TAP控制器的状态机 125
10.1.4 JTAG接口指令集 129
10.2 简易JTAG线缆原理 130
10.2.1 PC并口定义 130
10.2.2 PC并口的寄存器 131
10.2.3 简易JTAG线缆原理图 133
10.2.4 简易JTAG线缆烧写连接图(见图10-5) 134
10.3 简易JTAG烧写代码分析 135
10.3.1 简易JTAG烧写程序(flashp)使用说明 135
10.3.2 flash与CPU连接及flash属性描述文件 136
10.3.3 简易JTAG烧写程序的执行逻辑和流程 138
第2部分 Linux内核开发初步
第11章 Bootloader 142
本章根据笔者的工作经验介绍了流行的几种Bootloader、Bootloader应该具备的基本功能以及Bootloader的裁剪与移植。
11.1 Bootloader的任务和作用 142
11.2 各种各样的Bootloader 143
11.3 Bootloader编译环境 144
11.4 Bootloader的移植与裁减 145
11.5 编译Bootloader 145
11.6 烧写Bootloader 146
11.7 Bootloader使用举例 148
11.8 Bootloader修改举例 149
第12章 创建嵌入式Linux开发环境 151
本章介绍了如何创建嵌入式系统Linux内核交叉开发环境,本章和后续3章的内容是嵌入式系统Linux内核开发的基础,必须掌握。
12.1 安装Linux host 151
12.2 在虚拟机中安装Linux host 152
12.3 安装Linux交叉编译环境 157
12.4 在主机上设置TFTP Server 160
12.5 在主机上设置DHCP Server 161
12.6 在主机上设置Telnet server 161
12.7 在开发过程中使用NFS 162
12.8 设置超级终端 163
第13章 编译Linux内核 166
本章介绍了Linux内核的配置和编译方法。
13.1 获取Linux内核源代码 166
13.2 Linux内核目录结构 166
13.3 配置Linux内核 167
13.4 编译Linux内核 168
第14章 创建Linux根文件系统 170
本章介绍了Linux的根文件系统的结构以及创建根文件系统的方法。
14.1 根文件系统概述 170
14.2 根文件系统目录结构 171
14.3 获取根文件系统组件源代码 171
14.4 编译根文件系统源代码 171
14.5 创建一个32MB的RAMDISK根文件系统 173
14.6 在根文件系统中添加驱动模块或者应用程序 173
第15章 固化Linux内核和根文件系统 174
本章介绍了固化(烧写)Linux内核和根文件系统的方法。
第16章 关于Clinux 176
本章简要介绍了Clinux与标准Linux的区别。
16.1 Clinux简介 176
16.2 Clinux源代码目录结构 177
16.3 Clinux与标准Linux的区别 178
16.4 编译Clinux 179
第3部分 Linux 2.6内核原理
第17章 Linux 2.6.10@ARM启动过程 182
本章以start_kernel()和init()函数中调用到的函数说明的方式,介绍了从Linux汇编代码入口到init内核进程最后调用用户空间init命令的Linux整个启动过程。本章内容是笔者第一次阅读Linux内核源代码时对这些函数的注释,仅供读者了解start_kernel()和init()函数中调用到的每个函数的大致功能时使用。
17.1 Linux 2.6.10中与ARM处理器平台硬件相关的结构和全局变量 182
17.1.1 相关数据结构 182
17.1.2 相关全局变量 187
17.2 Linux汇编代码入口 189
17.3 Linux汇编入口处CPU的状态 189
17.4 start_kernel()函数之前的汇编代码执行过程 190
17.5 start_kernel()函数中调用的函数介绍 192
17.5.1 lock_kernel()函数 192
17.5.2 page_address_init()函数 192
17.5.3 printk(linux_banner) 193
17.5.4 setup_arch(&command_line)函数 193
17.5.5 setup_per_cpu_areas()函数 198
17.5.6 smp_prepare_boot_cpu()函数 199
17.5.7 sched_init()函数 199
17.5.8 build_all_zonelists()函数 200
17.5.9 page_alloc_init()函数 200
17.5.10 printk(Kernel command line: %s
, saved_command_line) 201
17.5.11 parse_early_param()函数 201
17.5.12 parse_args()函数 201
17.5.13 sort_main_extable()函数 202
17.5.14 trap_init()函数 202
17.5.15 rcu_init()函数 202
17.5.16 init_IRQ()函数 203
17.5.17 pidhash_init()函数 203
17.5.18 init_timers()函数 203
17.5.19 softirq_init()函数 204
17.5.20 time_init()函数 204
17.5.21 console_init()函数 205
17.5.22 profile_init()函数 206
17.5.23 local_irq_enable()函数 207
17.5.24 vfs_caches_init_early()函数 207
17.5.25 mem_init()函数 208
17.5.26 kmem_cache_init()函数 210
17.5.27 numa_policy_init()函数 225
17.5.28 calibrate_delay()函数 227
17.5.29 pidmap_init()函数 228
17.5.30 pgtable_cache_init()函数 229
17.5.31 prio_tree_init()函数 229
17.5.32 anon_vma_init()函数 229
17.5.33 fork_init(num_physpages)函数 229
17.5.34 proc_caches_init()函数 230
17.5.35 buffer_init()函数 231
17.5.36 unnamed_dev_init()函数 231
17.5.37 security_init()函数 231
17.5.38 vfs_caches_init(num_physpages)函数 232
17.5.39 radix_tree_init()函数 237
17.5.40 signals_init()函数 237
17.5.41 page_writeback_init()函数 237
17.5.42 proc_root_init()函数 238
17.5.43 check_bugs()函数 240
17.5.44 acpi_early_init()函数 244
17.5.45 rest_init()函数 244
17.6 init()进程执行过程 265
17.6.1 smp_prepare_cpus(max_cpus)函数 265
17.6.2 do_pre_smp_initcalls()函数 265
17.6.3 fixup_cpu_present_map()函数 267
17.6.4 smp_init()函数 267
17.6.5 sched_init_smp()函数 268
17.6.6 populate_rootfs()函数 268
17.6.7 do_basic_setup()函数 283
17.6.8 sys_access()函数 292
17.6.9 free_initmem()函数 301
17.6.10 unlock_kernel()函数 301
17.6.11 numa_default_policy()函数 302
17.6.12 sys_p()函数 302
17.6.13 execve()函数 302
第18章 Linux内存管理 305
从本章开始,笔者将带领读者走进神秘的Linux内核世界。笔者在阅读内核源代码以及两本相关参考书(见参考文献)的基础上,以自己的理解和语言总结概括了Linux内核每个组件的原理。笔者对与每个内核组件相关的关键数据结构和全局变量作了尽量详尽的说明,并且对核心函数进行了详细注释,在向读者灌输理论知识的同时引导读者自己去阅读、分析Linux内核源代码。本章讲解了Linux内核第一大核心组件“内存管理”的原理和实现内幕。
18.1 Linux内存管理概述 305
18.1.1 Linux内存管理的一些基本概念 305
18.1.2 内存管理相关数据结构 309
18.1.3 内存管理相关宏和全局变量 330
18.1.4 Linux内存管理的任务 341
18.1.5 Linux中的物理和虚拟存储空间布局 341
18.2 为虚拟(线性地址)存储空间建立页表 345
18.3 设置存储空间的访问控制属性 348
18.4 Linux中的内存分配和释放 350
18.4.1 在系统启动初期申请内存 350
18.4.2 系统启动之后的内存分配与释放 360
第19章 Linux进程管理 480
本章讲解了Linux内核第二大核心组件“进程管理”的原理和实现内幕。
19.1 进程管理概述 480
19.1.1 进程相关概念 480
19.1.2 进程分类 481
19.1.3 0号进程 481
19.1.4 1号进程 481
19.1.5 其他一些内核线程 482
19.1.6 进程描述符(struct task_struct) 482
19.1.7 进程状态 482
19.1.8 进程标识符(PID) 483
19.1.9 current宏定义 484
19.1.10 进程链表 484
19.1.11 PID hash表和链表 485
19.1.12 硬件上下文(Hardware Context) 485
19.1.13 进程资源限制 485
19.1.14 进程管理相关数据结构 486
19.1.15 进程管理相关宏定义 502
19.1.16 进程管理相关全局变量 514
19.2 进程管理相关初始化 520
19.3 进程创建与删除 529
19.4 进程调度 551
19.4.1 进程类型 553
19.4.2 进程调度类型 554
19.4.3 基本时间片计算方法 555
19.4.4 动态优先级算法 556
19.4.5 交互式进程 556
19.4.6 普通进程调度 557
19.4.7 实时进程调度 557
19.4.8 进程调度函数分析 558
19.5 进程切换 576
19.6 用户态进程间通信 581
19.6.1 信号(Signal) 581
19.6.2 管道(pipe)和FIFO(命名管道) 627
19.6.3 进程间通信原语(System V IPC) 641
第20章 Linux文件管理 651
本章讲解了Linux内核第三大核心组件“文件系统”的原理和实现内幕。
20.1 文件系统概述 651
20.1.1 Linux文件管理相关概念 652
20.1.2 Linux文件管理相关数据结构 657
20.1.3 Linux文件管理相关宏定义 682
20.1.4 Linux文件管理相关全局变量 691
20.2 文件管理相关初始化 699
20.3 文件系统类型注册 711
20.4 挂接文件系统 712
20.5 文件系统类型超级块读取 730
20.5.1 get_sb_single()通用超级块读取函数 731
20.5.2 get_sb_nodev()通用超级块读取函数 737
20.5.3 get_sb_bdev()通用超级块读取函数 738
20.5.4 get_sb_pseudo()通用超级块读取函数 740
20.6 路径名查找 747
20.7 访问文件操作 759
20.7.1 打开文件 759
20.7.2 关闭文件 766
20.7.3 读文件 768
20.7.4 写文件 785
20.8 异步I/O系统调用 792
20.9 Linux特殊文件系统 792
20.9.1 rootfs文件系统 793
20.9.2 sysfs文件系统 797
20.9.3 devfs设备文件系统 800
20.9.4 bdev块设备文件系统 803
20.9.5 ramfs文件系统 804
20.9.6 proc文件系统 804
20.10 磁盘文件系统 813
20.10.1 ext2文件系统相关数据结构 813
20.10.2 ext2文件系统磁盘分区格式 819
20.10.3 ext2文件系统的各种文件 820
20.10.4 创建ext2文件系统 821
20.10.5 ext2文件系统的操作方法 822
20.11 关于initramfs 824
20.11.1 initramfs概述 824
20.11.2 initramfs与initrd的区别 824
20.11.3 initramfs相关全局变量 825
20.11.4 initramfs被编译链接的位置 825
20.11.5 initramfs文件的生成过程 825
20.11.6 initramfs二进制文件格式说明(cpio格式) 828
20.11.7 initramfs二进制文件和列表文件对照示例 829
20.11.8 initramfs利弊 830
20.12 关于initrd 830
20.12.1 initrd概述 830
20.12.2 initrd相关全局变量 831
20.13 关于gzip压缩文件 832
第21章 Linux模块设计 834
本章讲解了Linux内核模块程序与应用程序的区别以及如何编写和加载Linux内核模块程序。
21.1 Linux模块设计概述 834
21.2 Linux的内核空间和用户空间 834
21.3 内核模块与应用程序的区别 835
21.4 编译模块 837
21.5 装载和卸载模块 837
21.6 模块层叠 838
21.7 模块版本依赖 839
21.8 模块编程示例 839
第22章 Linux系统异常中断管理 841
本章讲解了Linux内核如何管理系统异常中断以及Linux系统调用的实现内幕。
22.1 Linux异常中断处理 841
22.2 指令预取和数据访问中止异常中断处理 849
22.2.1 指令预取中止异常中断处理 850
22.2.2 数据访问中止异常中断处理 858
22.3 Linux中断处理 863
22.3.1 内核模式下的中断处理 863
22.3.2 用户模式下的中断处理 867
22.4 从中断返回 868
22.5 Linux中断管理 869
22.5.1 Linux中断管理相关数据结构与全局变量 870
22.5.2 Linux中断管理初始化 872
22.5.3 安装和卸载中断处理程序 874
22.5.4 使能和禁止中断 878
22.6 Linux系统调用 880
22.6.1 Linux系统调用内核实现过程 880
22.6.2 从系统调用返回 889
22.6.3 Linux系统调用用户程序接口函数 890
22.6.4 Linux系统调用用户接口函数与内核实现函数之间参数传递 899
第23章 Linux软中断和工作队列 901
本章讲解了Linux内核中的两种延迟处理机制“软中断”和“工作队列”的原理和实现。
23.1 概述 901
23.2 Linux软中断 902
23.2.1 软中断相关数据结构和全局变量 903
23.2.2 软中断初始化 904
23.2.3 软中断的核心操作函数do_softirq() 908
23.2.4 软中断看护进程执行函数ksoftirqd() 912
23.2.5 如何使用软中断 913
23.3 Linux工作队列 918
23.3.1 Linux工作队列相关数据结构和全局变量 918
23.3.2 Linux工作队列初始化 921
23.3.3 将工作加入到工作队列中 924
23.3.4 工作者进程执行函数worker_thread() 928
23.3.5 使用Linux工作队列 931
第24章 Linux并发与竞态 933
本章讲解了Linux内核同步机制,包括几种锁定技术以及免锁算法。
24.1 并发与竞态概述 933
24.1.1 Linux中的并发源 934
24.1.2 竞态可能导致的后果 934
24.1.3 避免竞态的规则 934
24.2 消除竞态的“锁定”技术 935
24.2.1 信号量(semphore)和互斥体(mutual exclusion) 935
24.2.2 读写信号量(rw_semaphore) 938
24.2.3 完成量(completion) 941
24.2.4 自旋锁(spinlock_t) 942
24.2.5 读写自旋锁(rwlock_t) 946
24.2.6 使用“锁定”技术的注意事项 949
24.3 消除竞态的非“锁定”方法 949
24.3.1 免锁算法 949
24.3.2 原子操作 950
24.3.3 位操作 951
24.3.4 顺序锁 952
24.3.5 读-复制-更新(Read-Copy-Update,RCU) 954
第25章 Linux设备驱动程序 958
本章讲解了Linux内核第四大核心组件“设备驱动”的原理和实现内幕。同时还总结归纳了编写各种设备驱动程序的方法和步骤。
25.1 设备驱动程序概述 958
25.1.1 设备驱动程序组成部分 959
25.1.2 设备号 959
25.1.3 设备文件 960
25.1.4 编写设备驱动程序的关键 961
25.2 字符设备驱动程序 961
25.2.1 字符设备相关数据结构 961
25.2.2 字符设备相关全局变量 963
25.2.3 字符设备驱动程序全局初始化 963
25.2.4 为字符设备分配设备号 964
25.2.5 注册字符设备驱动程序 968
25.2.6 字符设备的操作方法 971
25.2.7 用户对字符设备驱动程序的调用过程 972
25.2.8 如何编写字符设备驱动程序 974
25.2.9 关于TTY设备驱动程序 974
25.2.10 控制台设备驱动程序 975
25.3 块设备驱动程序 986
25.3.1 块设备相关数据结构 986
25.3.2 块设备相关宏定义 997
25.3.3 块设备相关全局变量 999
25.3.4 块设备驱动程序全局初始化 1004
25.3.5 为块设备分配主设备号 1006
25.3.6 注册块设备驱动程序 1009
25.3.7 块设备驱动程序的操作方法 1017
25.3.8 调用块设备驱动程序过程 1017
25.3.9 I/O调度 1031
25.3.10 如何编写块设备驱动程序 1032
25.4 网络设备驱动程序 1033
25.4.1 网络设备驱动程序概述 1033
25.4.2 网络设备相关数据结构 1034
25.4.3 网络设备相关宏定义 1044
25.4.4 网络设备相关全局变量 1045
25.4.5 创建net_device结构 1046
25.4.6 注册网络设备 1048
25.4.7 网络设备的操作方法 1050
25.4.8 网络设备中断服务程序 1051
25.4.9 如何编写网络设备驱动程序 1051
25.5 PCI设备驱动程序 1052
25.5.1 PCI接口定义 1053
25.5.2 PCI设备的三个地址空间 1057
25.5.3 PCI总线仲裁 1058
25.5.4 PCI设备编号 1059
25.5.5 如何访问PCI配置空间 1059
25.5.6 如何配置PCI设备 1061
25.5.7 PCI驱动程序相关数据结构 1062
25.5.8 PCI驱动程序相关宏定义 1068
25.5.9 PCI驱动程序相关全局变量 1068
25.5.10 Bootloader和内核做的事 1069
25.5.11 PCI驱动程序注册 1069
25.5.12 PCI驱动程序接口函数 1071
25.5.13 如何编写PCI驱动程序 1072
第4部分 Linux内核开发高级指南
第26章 Linux系统参数设置 1076
从本章开始的后续章节主要讲解了比较高级或者平时较少关注的Linux内核方面的知识,本章讲解了Linux中的4种系统参数格式和设置方法。
26.1 旗语系统参数(tag) 1076
26.1.1 与旗语系统参数相关数据结构和全局变量 1076
26.1.2 旗语系统参数说明 1082
26.1.3 旗语系统参数设置方法 1084
26.2 前期命令行设置的系统参数 1084
26.2.1 与前期命令行系统参数相关数据结构和全局变量 1084
26.2.2 前期命令行设置的系统参数说明 1085
26.2.3 前期命令行系统参数设置方法 1086
26.2.4 如何添加自己的前期命令行设置的系统参数 1087
26.3 老式命令行系统参数 1087
26.3.1 与老式命令行系统参数相关数据结构和全局变量 1087
26.3.2 老式命令行设置的系统参数说明 1088
26.3.3 老式命令行设置的系统参数设置方法 1089
26.3.4 如何添加自己的老式命令行设置的系统参数 1089
26.4 命令行系统参数 1089
26.4.1 与命令行系统参数相关数据结构和全局变量 1089
26.4.2 命令行设置的系统参数说明 1090
26.4.3 命令行设置的系统参数设置方法 1090
第27章 Linux内核调试 1091
本章介绍了Linux内核的调试方法。
27.1 打开Linux内核及其各模块自带的调试开关 1091
27.2 内核剖析(Profiling) 1093
27.3 通过打印调试(printk) 1095
27.3.1 关于printk() 1095
27.3.2 内核信息级别 1096
27.3.3 打印速度限制 1097
27.3.4 控制台重定向 1098
27.4 使用proc文件系统调试 1098
27.5 oops消息 1098
27.6 通过跟踪命令strace调试 1099
27.7 使用gdb、kdb、kgdb调试 1099
第28章 Linux内核移植 1101
本章介绍了Linux内核的移植方法。
第29章 Linux内核优化 1104
本章介绍了Linux内核的优化方法。
29.1 编译优化 1104
29.2 根据CPU特性进行优化 1105
29.3 对内核进行裁减 1105
29.4 优化系统内存配置 1106
29.5 优化系统启动过程以缩减系统启动时间 1106
29.6 内存映射优化 1107
29.7 工具软件辅助优化 1107
第30章 Linux定时器 1109
本章介绍了Linux内核的软件定时器。
30.1 定时器相关数据结构 1109
30.2 定时器相关宏定义 1111
30.3 定时器相关全局变量 1112
30.4 定时器和时钟初始化 1113
30.5 获取系统时间 1114
30.6 延迟函数 1115
30.7 与定时器相关系统调用 1115
30.8 使用定时器方法 1116
第31章 杂项 1117
本章介绍了PER_CPU变量以及Linux中的数据类型定义。
31.1 per_cpu变量 1117
31.2 Linux中的数据类型定义 1118
第32章 编译链接文件说明 1119
本章注释了ARM处理器系统中Linux内核的链接文件,以帮助读者了解编译出来的Linux内核各区段在内存中的存放位置。
参考文献 1125
6. 解决Apache Tomcat Default Files的Nessus中危漏洞
【问题描述】
Nessus扫描出的Tomcat默认文件相关的中危漏洞,如下:
12085 - Apache Tomcat Default Files -
Synopsis
The remote web server contains default files.
Description
The default error page, default index page, example JSPs, and/or example servlets are installed on the remote Apache Tomcat server. These files should be removed as they may help an attacker uncover information about the remote Tomcat install or host itself.
See Also
https://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q6
https://www.owasp.org/index.php/Securing_tomcat
Solution
Delete the default index page and remove the example JSP and servlets. Follow the Tomcat or OWASP instructions to replace or modify the default error page.
Risk Factor
Medium
CVSS v3.0 Base Score
7.3 (CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L)
CVSS Base Score
6.8 (CVSS2#AV:N/AC:M/Au:N/C:P/I:P/A:P)
References
XREF CWE:20
XREF CWE:74
XREF CWE:79
XREF CWE:442
XREF CWE:629
XREF CWE:711
XREF CWE:712
XREF CWE:722
XREF CWE:725
XREF CWE:750
XREF CWE:751
XREF CWE:800
XREF CWE:801
XREF CWE:809
XREF CWE:811
XREF CWE:864
XREF CWE:900
XREF CWE:928
XREF CWE:931
XREF CWE:990
Plugin Information:
Published: 2004/03/02, Modified: 2018/01/30
Plugin Output
tcp/8983
The following default files were found :
/nessus-check/default-404-error-page.html
【问题分析】
原因是tomcat默认的404页面带了tomcat的版本号,被Nessus扫描工具认定为中危漏洞。只需将该页面的tomcat版本号去除即可。
【解决方法】
参照 https://blog.csdn.net/damaolly/article/details/73927938
替换404页面为自定义的404页面,去除tomcat版本号即可。
1、在web.xml中增加error-page的配置
2、自定义solr_error_page.html页面,页面中不要存放tomcat版本号。
(2019-06-12 更新)由于Nessus扫描库升级,规则变更,导致该自定义页面solr_error_page.html又被扫描出来了,因此干脆将该页面修改为最简模式,如下:
3、将自定义solr_error_page.html页面放置在如下web应用目录和ROOT下。
4、重启tomcat服务方可生效。