Linux盘符漂移 在Linux系统中,若存在多块硬盘,通常内核分配盘符的顺序是/dev/sda、/dev/sdb、/dev/sdc … …。在系统启动过程中,内核会按照扫描到硬盘的顺序分配盘符。在系统启动后,热插拔硬盘硬盘,系统会顺序分配盘符。在同一个硬盘槽位,每次插入硬盘后,在系统中的盘符都可能不一致。第一次插入时,盘符可能为/dev/sdb,将硬盘拔除后,再次插入硬盘,盘符可能变为/dev/sde,出现盘符漂移。 假设机器上有6个硬盘槽位,槽位号分别为0~5。其中1、2、5槽位有硬盘,则Linux系统后 x 0 √ 2 x 4 √ 1 x 3 √ 5 所得到的系统盘符对应关系为:1槽位的硬盘盘符为/dev/sdb,2槽位的硬盘盘符为/dev/sdb,3槽位的硬盘盘符为/dev/sdc。 x 0 sdb 2 x 4 sda 1 x 3 sdc 5 系统启动后,我们热插拔硬盘,将一块硬盘插入3槽位,则该硬盘的盘符为/dev/sdd。 x 0 sdb 2 x 4 sda 1 sdd 3 sdc 5 再分别在0和4槽位插入硬盘,则系统盘符为: sde 0 sdb 2 sdf 4 sda 1 sdd 3 sdc […]
READ MORE »Linux内核死机与栈信息理解
在Linux内核死机或内核打印异常栈信息时,这些打印的含义是什么?下面作一个简单解释。 Oops: 0002 [1] SMP CPU 3 Pid: 19394, comm: stress Tainted: GF U (2.6.5-7.244-smp SLES9_SP3_BRANCH-200512121832250000) RIP: 0010:[<ffffffff8016e5ad>] <ffffffff8016e5ad>{free_block+237} Oops:表示当前内核故障类型 002:页面错误码,表示内核试图写一个不存在的页面 [1]:死机计数器,记录册从上次系统重启以来的死机次数 CPU:表示系统运行故障时所在的CPU Pid:系统故障时,运行的进程 RIP:系统故障时,执行的指令位置
READ MORE »x86/x86_64 CPU中逻辑地址、线性地址与物理地址
在学习Linux内存管理过程中,会遇到逻辑地址、线性地址和物理地址三个概念。 下面的示例代码分别是在i686和x86_64系统上运行的。那么打印出的变量tmp地址和指针p指向的内存块地址分别是什么地址?物理地址?线性地址?逻辑地址? 逻辑地址(Logical address) 在机器语言指令中,来说明操作数或指令的地址。在x86架构中,每个逻辑地址包括两部分:段(Segment)和偏移量(Offset)。 线性地址(Linear address) 也称为虚拟地址。在32位CPU中,它是32位的无符号整型,最大可以达到4G。在x86_64 CPU中目前最大可使用40位地址线,即最大可寻址1TB。 物理地址(Physical address) 物理内存的实际地址,由BIOS统一编址。 这三种地址关系为,逻辑地址经过段式映射(Segmentation Translation)到线性地址。线性地址经过页面映射(Page Translation)后,得到物理地址。 x86 CPU中段机制(Segmentation)可以将程序的代码(Code)、数据(Data)、栈(Stack)分开,这样多个程序(或进程)就可以在同一个CPU上运行,而相互不会干扰。 页机制(Paging)用来实现传统的以页面为需求的虚拟内存系统,只有程序需要时,才真正给进程分配物理内存。页机制也可以用来隔离多个任务。
READ MORE »Linux内核I/O系统报错日志与硬盘故障对应关系
日志信息 故障现象描述 与硬盘关系 scsi1: ERROR on channel 0, id 7, lun 0, CDB: Read (10) 00 73 fc 62 bf 00 00 80 00 Info fld=0x73fc6326, Current sdi: sense key Medium Error Additional sense: Unrecovered read error SMART规范定义“Medium Error”错误是一种不可恢复的错误,可能由于介质的缺陷或记录的数据错误。该错误有别于“Hardware Error”。 出现Medium Error的主要原因是硬盘坏,或者硬盘的数据无法读写。 (1)硬盘扇区坏 或(2)硬盘与磁盘控制器连接信号质量不稳定,导致数据出现异常 mptbase: ioc1: IOCStatus=804b LogInfo=31080000 Originator={PL}, Code={SATA NCQ Fail All Commands After […]
READ MORE »Linux CPU利用率计算原理及内核实现
我们经常使用top命令来查看CPU利用率,如 root@ubuntu:~# top top – 09:16:29 up 6 min, 4 users, load average: 0.01, 0.22, 0.17 Tasks: 149 total, 1 running, 147 sleeping, 0 stopped, 1 zombie Cpu(s): 2.8%us, 6.7%sy, 0.2%ni, 89.9%id, 0.3%wa, 0.0%hi, 0.1%si, 0.0%st Mem: 508000k total, 404092k used, 103908k free, 47764k buffers Swap: 522236k total, 0k used, 522236k free, 184992k cached PID […]
READ MORE »x86服务器MCE(Machine Check Exception)问题
MCE现象 Intel在Pentium 4、Xenon和P6系列处理器中实现了机器检查(Machinecheck)架构,提供能够检测和报告硬件(机器)的错误机制,如系统总线错误、ECC错误、奇偶校验错误、缓存错误、TLB错误等。它包括一直MSR(Model-Specific Registers)寄存器,用来设置机器检查和额外的bank MSR记录错误。 当机器检查到不可纠正的machine-check错误时,就触发一个machine-check异常。machine-check架构不允许在出现MCE后处理器重启,但MCE处理程序可以从MSR寄存器收集相关信息。 CPU 7: Machine Check Exception: 5 Bank 0: b200004010000400 RIP !INEXACT! 10:<ffffffff8010f16e> {mwait_idle+0x5e/0x90} TSC 1952dbeebcc8 Kernel panic: Machine check Reconfiguring memory bank information…. This may take a while…. done waiting: 3 cpus not responding Warning: Non-empty request queue I/O requests in flight at dump time CPU 7: Machine […]
READ MORE »Linux文本终端/字符界面屏保取消
在我们日常使用Linux过程中,经常遇到使用屏幕终端一段时间后,显示器关闭,屏幕上没有任何显示。一段时间后,屏幕就会关闭,无任何显示。 若此时系统死机或僵死,而且屏幕上有输出。当遇到屏幕保护时,则无法看到任何信息。此时我们就 需要关闭屏幕保护。 取消文本终端的屏幕保护命令是: #setterm –blank 0 –powersave off –powerdown 0 若我们想再次开启文本终端屏保,使用以下参数: #setterm –blank 1 –powersave on –powerdown 5 注意: 以上命令必须在屏幕终端上执行才能生效,通过SSH无法更改屏幕终端属性。 命令可以以非root身份执行。
READ MORE »Linux内核地址空间划分
x86内核地址空间划分 在x86(32位CPU)系统中,Linux内核地址空间可以划分为1G内核空间,3G用户空间。 在x86中,Linux内核地址空间也可以划分为4G/4G。 x86_64内核地址空间划分 根据内核版本不同,可支持512G/512G、1T/1T、2T/2T的划分。 per process virtual address space limit of 512 Gigabytes top of userspace stack located at address 0x0000007fffffffff PAGE_OFFSET = 0xffff800000000000 start of the kernel = 0xffffffff800000000 global RAM per system 2^64-PAGE_OFFSET-sizeof(kernel) = 128 Terabytes – 2 Gigabytes no need of any […]
READ MORE »Linux读写CPU MSR寄存器命令rdmsr/wrmsr
在Linux内核源码中提供了读写CPU MSR寄存器模块,使可以在用户空间直接读写MSR寄存器。 开源社区提供msr寄存器读写工具msrtools,其中有两个命令,rdmsr/wrmsr。要使rdmsr/wrmsr命令真正可以读写msr寄存器,系统中必须有msr模块,或将msr模块编译进内核,下面是从内核配置选项中选取的内容。 Processor type and features —> <M> /dev/cpu/*/msr – Model-specific register support 实例: root@ubuntu:~/linux-2.6.32.36-0.5# rdmsr 0x1a0 0 root@ubuntu:~/linux-2.6.32.36-0.5# rdmsr和wrmsr命令格式如下: root@ubuntu:~# rdmsr Usage: rdmsr [options] regno –help -h Print this help –version -V Print current version –hexadecimal -x Hexadecimal output (lower case) –capital-hex -X Hexadecimal output (upper case) –decimal -d Signed decimal output –unsigned […]
READ MORE »