使用自旋锁的各种HOOK

使用自旋锁的各种HOOK
使用自旋锁的各种HOOK

#include

#define MEM_TAG 'TMEM'

typedef struct _THREAD_BASIC_INFORMA TION

{

NTSTATUS ExitStatus;

PVOID TebBaseAddress;

CLIENT_ID ClientId;

KAFFINITY AffinityMask;

KPRIORITY Priority;

KPRIORITY BasePriority;

}THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMA TION; typedef BOOL (*NTUSERPOSTTHREADMESSAGE)

(

DWORD idThread,

UINT Msg,

WPARAM wParam,

LPARAM lParam

);

typedef NTSTATUS (*NTOPENPROCESS)

(

OUT PHANDLE ProcessHandle,

IN ACCESS_MASK AccessMask,

IN POBJECT_A TTRIBUTES ObjectAttributes,

IN PCLIENT_ID ClientId

);

typedef NTSTATUS (*NTOPENTHREAD)

(

OUT PHANDLE ThreadHandle,

IN ACCESS_MASK DesiredAccess,

IN POBJECT_A TTRIBUTES ObjectAttributes,

IN PCLIENT_ID ClientId

);

typedef NTSTATUS (*NTDUPLICATEOBJECT)

(

IN HANDLE SourceProcessHandle,

IN HANDLE SourceHandle,

IN HANDLE TargetProcessHandle,

OUT PHANDLE TargetHandle OPTIONAL,

IN ACCESS_MASK DesiredAccess,

IN ULONG Attributes,

IN ULONG Options

);

NTKERNELAPI KeAddSystemServiceTable(PVOID, PVOID, PVOID, PVOID, PVOID); NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(IN HANDLE ProcessId,OUT PEPROCESS *Process);

NTKERNELAPI NTSTATUS PsLookupThreadByThreadId(IN HANDLE ThreadId,OUT PETHREAD *Thread);

NTKERNELAPI PEPROCESS IoThreadToProcess(IN PETHREAD Thread);

NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess

(

IN HANDLE ProcessHandle,

IN ULONG ProcessInformationClass,

OUT PVOID ProcessInformation,

IN ULONG ProcessInformationLength,

OUT PULONG ReturnLength OPTIONAL

);

NTSYSAPI NTSTATUS NTAPI ZwQueryInformationThread

(

IN HANDLE ThreadHandle,

IN ULONG ThreadInformationClass,

OUT PVOID ThreadInformation,

IN ULONG ThreadInformationLength,

OUT PULONG ReturnLength OPTIONAL

);

ULONG idPTM=476; //XP HARD CODE

BYTE JmpCode[5]={0xE9,0x00,0x00,0x00,0x00};

BYTE OrgCode[5]={0x8B,0x3F,0x8B,0x1C,0x87};

BYTE PushRetCode[6]={0x68,0x00,0x00,0x00,0x00,0xc3};

KIRQL f_oldirql;

KSPIN_LOCK f_spinlock;

NTOPENTHREAD OldNtOpenThread;

NTOPENPROCESS OldNtOpenProcess;

NTDUPLICATEOBJECT OldNtDuplicateObject;

NTUSERPOSTTHREADMESSAGE OldNtUserPostThreadMessage;

ULONG uKiFastCallEntryAddr=0;

ULONG HookAddr=0;

ULONG JMPRet=0;

ULONG PushRetMem=0;

ULONG ppid=0;

PEPROCESS ppep=NULL;

PSYSTEM_SERVICE_TABLE KeServiceDescriptorTableShadow;

extern PSYSTEM_SERVICE_TABLE KeServiceDescriptorTable;

ULONG GetShadowTableAddress()

{

ULONG dwordatbyte,i;

PUCHAR p = (PUCHAR) KeAddSystemServiceTable;

for(i = 0; i < PAGE_SIZE; i++, p++)// 往下找一页指针递增1

{

__try

{

dwordatbyte = *(PULONG)p;

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

return FALSE;

}

if(MmIsAddressValid((PVOID)dwordatbyte))

{

if(memcmp((PVOID)dwordatbyte, KeServiceDescriptorTable, 16) == 0)//对比前16字节相同则找到

{

if((PVOID)dwordatbyte == KeServiceDescriptorTable)//排除自己

{

continue;

}

return dwordatbyte;

}

}

}

return FALSE;

}

ULONG GetSSDTCurAddr(IN ULONG Index,BOOL IsShadow)

{

ULONG ServiceCount,BaseAddr;

if (KeServiceDescriptorTableShadow!=NULL)

{

ServiceCount=KeServiceDescriptorTableShadow[IsShadow?1:0].NumberOfServices;

BaseAddr = (ULONG)KeServiceDescriptorTableShadow[IsShadow?1:0].ServiceTableBase;

if (Index>=ServiceCount) return FALSE;

return *(PULONG)(BaseAddr+Index * 4);

}

return FALSE;

}

NTSTATUS MyNtOpenThread(OUT PHANDLE ThreadHandle,

IN ACCESS_MASK DesiredAccess,

IN POBJECT_ATTRIBUTES ObjectAttributes,

IN PCLIENT_ID ClientId)

{

PETHREAD tcmp;

PEPROCESS pcmp;

NTSTATUS st,ntotst;

if(MmIsAddressValid(ClientId)==TRUE)

{

st=PsLookupThreadByThreadId((HANDLE)ClientId->UniqueThread,&tcmp);

if (!NT_SUCCESS(st))

{

ntotst=STATUS_ACCESS_DENIED;

}

else

{

pcmp=IoThreadToProcess(tcmp);

if(pcmp==ppep)

ntotst=STATUS_ACCESS_DENIED;

else

ntotst=OldNtOpenThread(ThreadHandle,DesiredAccess,ObjectAttributes,ClientId);

}

}

else

{

ntotst=STATUS_ACCESS_DENIED;

}

return ntotst;

}

NTSTATUS MyNtOpenProcess(OUT PHANDLE ProcessHandle,

IN ACCESS_MASK AccessMase,

IN POBJECT_A TTRIBUTES ObjectAttributes,

IN PCLIENT_ID ClientId)

{

PEPROCESS pcmp;

NTSTATUS st,ntopst;

if(MmIsAddressValid(ClientId)==TRUE)

{

st=PsLookupProcessByProcessId((HANDLE)ClientId->UniqueProcess,&pcmp);

if (!NT_SUCCESS(st))

{

ntopst=STA TUS_ACCESS_DENIED;

}

else

{

if(pcmp==ppep)

ntopst=STA TUS_ACCESS_DENIED;

else

ntopst=OldNtOpenProcess(ProcessHandle,AccessMase,ObjectAttributes,ClientId);

}

}

else

{

ntopst=STA TUS_ACCESS_DENIED;

}

return ntopst;

}

NTSTATUS MyNtDuplicateObject(IN HANDLE SourceProcessHandle,

IN HANDLE SourceHandle,

IN HANDLE TargetProcessHandle,

OUT PHANDLE TargetHandle OPTIONAL,

IN ACCESS_MASK DesiredAccess,

IN ULONG Attributes,

IN ULONG Options)

{

NTSTATUS ntStatus,Tmp;

PROCESS_BASIC_INFORMATION PBI;

THREAD_BASIC_INFORMATION TBI;

ULONG NowPid;

ntStatus=OldNtDuplicateObject(SourceProcessHandle,SourceHandle,TargetProcessHandle,T argetHandle,DesiredAccess,Attributes,Options);

if (NT_SUCCESS(ntStatus) )

{

Tmp=ZwQueryInformationProcess(*TargetHandle,0,&PBI,sizeof(PBI),NULL);

if (NT_SUCCESS(Tmp))

{

NowPid=PBI.UniqueProcessId;

if (NowPid==ppid || NowPid==ppid+1 || NowPid==ppid+2 || NowPid==ppid+3)

{

ZwClose(*TargetHandle);

*TargetHandle=0;

ntStatus= STATUS_UNSUCCESSFUL;

}

}

Tmp=ZwQueryInformationThread(*TargetHandle,0,&TBI,sizeof(TBI),NULL);

if (NT_SUCCESS(Tmp))

{

NowPid=(ULONG)TBI.ClientId.UniqueProcess;

if (NowPid==ppid || NowPid==ppid+1 || NowPid==ppid+2 || NowPid==ppid+3)

{

ZwClose(*TargetHandle);

*TargetHandle=0;

ntStatus= STATUS_UNSUCCESSFUL;

}

}

}

return ntStatus;

}

BOOL MyNtUserPostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam)

{

PEPROCESS pcmp=NULL;

PETHREAD tcmp=NULL;

NTSTATUS st=STATUS_UNSUCCESSFUL;

BOOL rt=FALSE;

st=PsLookupThreadByThreadId((HANDLE)idThread,&tcmp);

if (NT_SUCCESS(st))

{

pcmp=IoThreadToProcess(tcmp);

if(pcmp==ppep)

rt=FALSE;

else

rt=OldNtUserPostThreadMessage(idThread,Msg,wParam,lParam);

}

else

{

rt=FALSE;

}

return rt;

}

//HOOK KiFastCallEntry过滤函数

__declspec(naked)void FakeKiFastCallEntry()

{

_asm

{

pushfd

pushad

mov edi,dword ptr [edi]

mov ebx,dword ptr [edi+eax*4]

cmp OldNtOpenProcess,ebx; //比较是否为NtOpenProcess

je Label1

cmp OldNtDuplicateObject,ebx; //比较是否为NtDuplicateObject

je Label2

cmp OldNtOpenThread,ebx; //比较是否为NtOpenThread

je Label3

cmp OldNtUserPostThreadMessage,ebx; //比较是否为NtOpenThread

je Label4

popad

popfd

mov edi,dword ptr [edi]

mov ebx,dword ptr [edi+eax*4]

jmp [JMPRet];

Label1:

popad

popfd

mov ebx,MyNtOpenProcess //修改NtOpenProcess为我们的代理函数

jmp [JMPRet];

Label2:

popad

popfd

mov ebx,MyNtDuplicateObject //修改NtDuplicateObject为我们的代理函数

jmp [JMPRet];

Label3:

popad

popfd

mov ebx,MyNtOpenThread //修改NtOpenThread为我们的代理函数

jmp [JMPRet];

Label4:

popad

popfd

mov ebx,MyNtUserPostThreadMessage //修改NtUserPostThreadMessage为我们的代理函数

jmp [JMPRet];

}

}

NTSTATUS LoadKiHooker()

{

NTSTATUS status = STATUS_UNSUCCESSFUL;

KIRQL oldIrql;

PMDL pMdl = NULL;

UNICODE_STRING ustrFunctionName,ustrFunctionName2;

//获得“阴影表”的地址

KeServiceDescriptorTableShadow=(PSYSTEM_SERVICE_TABLE)GetShadowTableAddres s();

if (!KeServiceDescriptorTableShadow)

{

DbgPrint("Find SSSDT Error!");

return STATUS_UNSUCCESSFUL;

}

//获取NtUserPostThreadMessage地址

OldNtUserPostThreadMessage=(NTUSERPOSTTHREADMESSAGE)GetSSDTCurAddr(id PTM,TRUE);

DbgPrint("NtUserPostThreadMessaged=0x%08X",OldNtUserPostThreadMessage);

//获取NtOpenProcess地址

RtlInitUnicodeString(&ustrFunctionName, L"NtOpenProcess");

OldNtOpenProcess=(NTOPENPROCESS)MmGetSystemRoutineAddress( &ustrFunctionNa me);

DbgPrint("NtOpenProcess=0x%08X",OldNtOpenProcess);

//获取NtDuplicateObject地址

RtlInitUnicodeString(&ustrFunctionName2, L"NtDuplicateObject");

OldNtDuplicateObject=(NTDUPLICATEOBJECT)MmGetSystemRoutineAddress(&ustrFun ctionName2);

DbgPrint("NtDuplicateObject=0x%08X",OldNtDuplicateObject);

//获取NtOpenThread地址

OldNtOpenThread=(NTOPENTHREAD)GetSSDTRealAddr(GetSysCallIndex("NtOpenThre ad"));

DbgPrint("NtOpenThread=0x%08X",OldNtOpenThread);

//系统调用管理器的地址保存在MSR寄存器里面,标识ID为0x176是SYSENTER_EIP_MSR寄存器,存放着KiFastCallEntry地址!所以在这里用rdmsr读取KiFastCallEntry地址;

__asm

{

pushfd

pushad

mov ecx,0x176

rdmsr

mov uKiFastCallEntryAddr,eax //获取KiFastCallEntry地址

xor ecx,ecx

Label1:

cmp ecx,0x100

je Label3

mov edx,DWORD ptr [eax]

cmp edx,0x1C8B3F8B //搜索特征码,获取要Hook的位置

je Label2

inc eax

inc ecx

jmp Label1

Label2:

mov HookAddr,eax

Label3:

popad

popfd

}

if (HookAddr==0)

{

return status;

}

//申请分配二级跳转内存

PushRetMem=(ULONG)ExAllocatePoolWithTag(NonPagedPool,6,MEM_TAG);

if ((PVOID)PushRetMem==NULL)

{

return status;

}

DbgPrint("PushRetMem=0x%08X",PushRetMem);

//一级跳转地址

*(ULONG*)&JmpCode[1]=(ULONG)(PushRetMem)-(HookAddr+5);

//二级跳转地址

*(ULONG*)&PushRetCode[1]=(ULONG)FakeKiFastCallEntry;

//HOOK返回地址

JMPRet=HookAddr+5;

//申请MDL

pMdl = IoAllocateMdl((PBYTE)HookAddr, 5, FALSE, FALSE, NULL);

if (pMdl)

{

//锁定内存页面

__try

{

MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess);

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

IoFreeMdl(pMdl);

return status;

}

//申请并使用自旋锁

KeInitializeSpinLock(&f_spinlock);

KeAcquireSpinLock(&f_spinlock,&f_oldirql);

//提升中断请求级

oldIrql = KeRaiseIrqlToDpcLevel();

//关闭中断

_asm

{

CLI

MOV EAX, CR0

AND EAX, NOT 10000H

MOV CR0, EAX

}

//进行HOOK操作

RtlCopyMemory((PVOID)PushRetMem,PushRetCode,6);

RtlCopyMemory((PVOID)HookAddr,JmpCode,5);

//开启中断

_asm

{

MOV EAX, CR0

OR EAX, 10000H

MOV CR0, EAX

STI

}

//恢复先前中断请求级

KeLowerIrql(oldIrql);

//释放自旋锁

KeReleaseSpinLock(&f_spinlock, f_oldirql);

DbgPrint("KiFastCallEntry=0x%08X",uKiFastCallEntryAddr);

DbgPrint("HookAddr=0x%08X",HookAddr);

status=STATUS_SUCCESS;

}

return status;

}

VOID UnloadKiHooker()

{

PMDL pMdl = NULL;

KIRQL oldIrql;

if (HookAddr!=0)

{

pMdl = IoAllocateMdl((PBYTE)HookAddr, 5, FALSE, FALSE, NULL);

if (pMdl)

{

//锁定内存页面

__try

{

MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess);

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

IoFreeMdl(pMdl);

return;

}

//申请并使用自旋锁

KeInitializeSpinLock(&f_spinlock);

KeAcquireSpinLock(&f_spinlock,&f_oldirql);

//提升中断请求级

oldIrql = KeRaiseIrqlToDpcLevel();

//关闭中断

_asm

{

CLI

MOV EAX, CR0

AND EAX, NOT 10000H

MOV CR0, EAX

}

//进行还原HOOK操作

RtlCopyMemory((PVOID)HookAddr,OrgCode,5);

_asm

{

MOV EAX, CR0

OR EAX, 10000H

MOV CR0, EAX

STI

}

//恢复先前中断请求级

KeLowerIrql(oldIrql);

//释放自旋锁

KeReleaseSpinLock(&f_spinlock, f_oldirql);

//释放内存

ExFreePool((PVOID)PushRetMem);

}

}

}

linux线程控制编程自学心得体会

linux线程控制编程自学心得体会 篇一:Linux学习心得 Linux学习心得总结 第二事业部 Linux简介: Linux是一套免费使用和自由传播的类Unix开源操作系统,是自由软件和开源代码的经典范例,由世界各地的成千上万的程序员设计和实现的。具有开放性、多用户、多任务、出色的速度性能、良好的用户界面、丰富的网络功能、可靠的系统安全、良好的可移植性、标准兼容性等特点,在服务器,嵌入式,工控等方面都有广泛的应用。目前风靡全球的Android智能系统也是基于Linux内核开发的。 第一次接触Linux是在上大二的时候,一位给我们上课的老师在课间闲聊时用教训的语气给我们说,计算机专业的学生应该去好好学Linux,你要不会Linux都不好意思说自己是计算机科班毕业的(当然这有点夸张了,这位老师一直是研究Linux的,对Linux比较狂热),总之他说了一大堆Linux的好处,比如开源啊,稳定性强,支持平台多等等。其实之前早就对Linux有所耳闻,但觉得这是专业人士才搞的东西,很高深,我离那一步还早着呢,所以当时也没听懂多少,听完过后只觉得Linux是个开源免费的操作系统,在Linux上面开发是比较有档次的,有前途的。于是,一兴奋,

回去就找了个师兄借了张Red Hat (Linux一个比较稳定的商业发行版本)的光盘,在自己电脑上装了个Linux系统,在上面装上了QQ,音视频播放器,练了练Linux的命令,编译运行了"hello world"之类的入门程序,玩了几天后,我发现了一个比较严重的问题,在Linux上没法玩魔兽和CS,兴奋劲一过,我的第一个Linux系统就在我的电脑分区下长眠了。 到后来,学校开了些以Linux为实验平台的课程,于是又把Linux系统拿出来,在上面做老师布置的作业,对Linux也更了解了,自己也能勉强在那上面做些简单的应用开发,学会了更多的命令,了解了何为gcc,makefile,vi,gdb,知道了怎样调试自己的程序,仅此而已。大三暑假找了个实习的工作,工作环境也是Linux方面的应用程序开发,实习了两个多月,跟着公司的老员工打杂,逐渐对Linux的应用开发也有了比较深入的了解,真正的产生了兴趣,自己也在Linux下做了些小东西,用socket+GTK完成了一个类似于QQ 的局域网聊天工具等,当时高兴了好几天。 毕业后的第一份工作也是Linux相关的开发工作,到后来来XX也做Linux,毕业快四年了,真正在Linux上做开发也有四年多,从应用开发到驱动开发,再到研究内核。做了这么多年来,不敢说有所成,但多少也有所得,有所感悟,

自旋电子学简介

自旋电子学简介 今天,我们一起去听了王博士关于《自旋电子学简介》的讲座,通过这次的讲座,我对自旋电子学有了更加深刻的认识。 在传统的微电子学中,一般是利用电子的荷电性由电场来控制电子的输运过程的,而对电子的自旋状态是不予考虑的.为了能够进一步提高信息处理速度和存储密度,就必须对电子的自旋加以利用,由此发展出一门新的学科———自旋电子学。 自旋电子学(Spintronics or spin electronics),亦称磁电子学(Magneto—electronics),是一门结合磁学与微电子学的交叉学科。它是利用电子的自旋属性进行工作的电子学。早在19世纪末,英国科学家汤姆逊发现电子之后,人们就知道电子有一个重要特性,就是每一个电子都携带一定的电量,即基本电荷(e=1.60219x10-19库仑)。到20世纪20年代中期,量子力学诞生又告诉人们,电子除携带电荷之外还有另一个重要属性,就是自旋。电子的自旋角动量有两个数值,即±h/2。其中正负号分别表示“自旋朝上”和“自旋朝下”,h是量子物理中经常要遇到的基本物理常数,称为普朗克常数。 通过对电子电荷和电子自旋性质的研究,最近在电子学和信息技术领域出现了明显的进展。这个进展的重要标志之一就是诞生了自旋电子学。在传统的电子学中,数据处理集成电路所用的是半导体中电子的电荷,但并不是说电子的自旋自由度以前从没有用过,例如传统的数据存储介质,如磁盘,用的就是磁性材料中电子的自旋。 事实上,半导体中有很多类型的自旋极化现象,如载流子的自旋,半导体材料中引入的磁性原子的自旋和组成晶体的原子的核自旋等等。从某种意义上说,已有的技术如以巨磁电阻(GMR)为基础的存储器和自旋阀都是自旋起作用的自旋电子学最基本的应用。但是,其中自旋的作用是被动的,它们的工作由局域磁场来控制。这里所指的自旋电子学则要走出被动自旋器件的范畴,成为基于自旋动力学的主动控制的应用。因为自旋动力学的主动控制预计可以导致新的量子力学器件,如自旋晶体管、自旋过滤器和调制器、新的存储器件、量子信息处理器和量子计算。从这个意义上说,自旋电子学是在电子材料,如半导体中,主动控制载流子自旋动力学和自旋输运的一个新兴领域。已经证明,通过注入、输运和控制这些自旋态,可以执行新的功能。这就是半导体自旋电子学新领域所包含的内容,它涉及自旋态在半导体中的利用。 对于目前的自旋电子学,令人感兴趣的两个重要的物理学原理是:自旋作为一个动力学变数,它有量子力学固有的量子特性,这些特性将导致新的自旋电子学量子器件而不是传统的以电子电荷为基础的电子学。另一个是与自旋态有关的长驰豫时间或相干时间。在磁性半导体中,自旋朝上的载流子浓度往往多于自旋朝下的载流子,这些载流子运动会产生所谓自旋极化电流。自旋极化电流的大小、存在的时间长短取决于许多因素,如材料的特性、界面、外场及温度等等。事实上,半导体中的载流子自旋可以通过局域磁场,或通器件的栅极改变外加电场,甚至通过偏振光地进行操作。这一事实,是开发自旋电子学应用的一个重要的物理基础。 半导体自旋电子学器件的目的之一是利电子自旋和核自旋很长的相干时间,并基于半导体器件来执行量子信息处理。用半导体实现量子计算机有很多优点,不仅仅因为它是固体材料,可适合于大规模集成,而且通过量子约束可以自由控制其维度,并允许用外场,如光、电或磁场改变其特性。本节将简介利用半导体中的自旋如何构造固体量子计算机的基本原理。 半导体自旋电子学(spintronics)作为半导体物理发展的新分支,目前主要在两个方面着重展开研究:半导体磁电子学和半导体量子自旋电子学。前者希望在最近的将来会有实际的结果,后者则已成为21世纪的重要研究论题。半导体自旋电子学作为信息处理

linux内核定时器详解及实例

Linux内核定时器详解 80X86体系结构上,常用的定时器电路 实时时钟(RTC) RTC内核通过IRQ8上发出周期性的中断,频率在2-8192HZ之间,掉电后依然工作,内核通过访问0x70和0x71 I/O端口访问RTC。 时间戳计时器(TSC) 利用CLK输入引线,接收外部振荡器的时钟信号,该计算器是利用64位的时间戳计时器寄存器来实现额,与可编程间隔定时器传递来的时间测量相比,更为精确。 可编程间隔定时器(PIT) PIT的作用类似于微波炉的闹钟,PIT永远以内核确定的固定频率发出中断,但频率不算高。 CPU本地定时器 利用PIC或者APIC总线的时钟计算。 高精度时间定时器(HPET) 功能比较强大,家机很少用,也不去记了。 ACPI电源管理定时器 它的时钟信号拥有大约为3.58MHZ的固定频率,该设备实际上是一个简单的计数器,为了读取计算器的值,内核需要访问某个I/O端口,需要初始化 定时器的数据结构 利用timer_opts描述定时器 Timer_opts的数据结构 Name :标志定时器员的一个字符串 Mark_offset :记录上一个节拍开始所经过的时间,由时钟中断处理程序调用 Get_offset 返回自上一个节拍开始所经过的时间

Monotonic_clock :返回自内核初始化开始所经过的纳秒数 Delay:等待制定数目的“循环” 定时插补 就好像我们要为1小时35分34秒进行定时,我们不可能用秒表去统计,肯定先使用计算时的表,再用计算分的,最后才用秒表,在80x86架构的定时器也会使用各种定时器去进行定时插补,我们可以通过cur_timer指针来实现。 单处理器系统上的计时体系结构 所有与定时有关的活动都是由IRQ线0上的可编程间隔定时器的中断触发。 初始化阶段 1. 初始化间,time_init()函数被调用来建立计时体系结构 2. 初始化xtime变量(xtime变量存放当前时间和日期,它是一个timespec 类型的数据结构) 3. 初始化wall_to_monotonic变量,它跟xtime是同一类型的,但它存放将加在xtime上的描述和纳秒数,这样即使突发改变xtime也不会受到影响。 4. 看是否支持高精度计时器HPET 5. 调用select_timer()挑选系统中可利用的最好的定时资源,并让 cur_timer变量指向该定时器 6. 调用setup_irq(0,&irq0)来创建与IRQ相应的中断门。 时钟中断处理程序 1. 在xtime_lock顺序锁产生一个write_seqlock()来保护与定时相关的内核变量,这样防止中断让该进程被阻止。 2. 执行cur_timer定时器对象的mark_offset方法(记录上一个节拍开始所经过的时间,由时钟中断处理程序调用) 3. 调用do_timer_interrupt函数,步骤为 a) 使jiffies_64值增1 b) 调用updata_times()函数来更新系统日期和时间。

Linux运维从入门到高级全套案例v3

Linux运维入门到高级 目录 1. Linux入门篇 (3) 1. 1 Linux操作系统简介 (3) 1. 2 Linux发展趋势 (4) 1. 3 Linux系统安装 (4) 1. 4 Linux学习技巧 (19) 2. Linux系统篇 (20) 2.1 Linux系统管理 (20) 2.1. 1 Linux目录初识 (20) 2.1. 2 Linux常用命令 (21) 2.1. 3 Linux用户权限 (22) 2.1. 4 Linux网络配置 (23) 3. Linux服务篇 (25) 3.1 Linux服务部署 (25) 3.1. 1 构建NTP时间服务器 (25) 3.1. 2 构建DHCP服务器 (27) 3.1. 3 搭建Samba服务器 (29) 3.1. 4 搭建NFS服务器 (32) 3.1. 5 搭建FTP服务器 (33) 3.1. 6 构建Apache WEB服务器 (35) 3.1. 7 构建MySQL服务器 (38) 3.1. 8 LAMP架构网站搭建 (42) 3.1. 9 Cacti监控平台搭建 (46) 3.1. 10 Nagios监控平台搭建 (50) 3.1. 11 Kickstart自动化安装平台 (56) 4. Linux编程篇 (60) 4.1 Linux Shell编程 (60) 4.1. 1 Shell编程简介 (60) 4.1. 2 Shell变量设置 (61) 4.1. 3 Shell流程控制语句 (62) 4.1. 4 Shell脚本案例 (67) 4.1. 5 Shell数组编程 (71) 5. Linux深入篇 (72) 5. 1 构建Nginx WEB服务器 (72) 5.1. 1 Nginx WEB安装 (73)

自旋电子学与自旋电子器件简述

自旋电子学与自旋电子器件简述 陈闽江,邱彩玉,孙连峰 (国家纳米科学中心 器件研究室 北京 100190) 一、引言 2007年10月,瑞典皇家科学院宣布,将该年度诺贝尔物理学奖授予在 1988年分别独立发现纳米多层膜中巨磁电阻效应的法国Albert Fert 教授和德国Peter Grunberg 教授。其随后的应用不啻为革命性的,因为它使得计算机硬盘的容量从几十兆、几百兆,一跃而提高了几百倍,达到几十G 乃至上百G 。越来越多的人开始了解这个工作及其对我们生活的影响,并意识到这个工作方向的重要意义。 1988年在磁性多层膜中发现巨磁电阻效应(Giant Magnetoresistance ,GMR),1993年和1994年在钙钛矿锰氧化物中发现庞磁电阻效应(Colossal Magnetoresistance ,CMR),特别是1995年在铁磁性隧道结材料中发现了室温高隧穿磁电阻效应(Tunneling Magnetoresistance ,TMR)以及后续形成的稀磁半导体等研究热潮,这些具有里程碑意义的人工合成磁性材料的成功制备和深入研究,不仅迅速推动了近20年凝聚态物理新兴学科——自旋电子学(spintronics)的形成与快速发展,也极大地促进了与自旋极化电子输运相关的磁电阻材料和新型自旋电子学器件的研制和应用。中国科学院物理研究所朱涛研究员表示:“Albert Fert 和Peter Grunberg 种下了一粒种子,随着20世纪90年代应用的突破,这粒种子长成了一棵小苗——自旋电子学,这是一个成长很快、前景广阔的磁学分支。” 二、电子自旋与自旋电子学 要阐明自旋电子学,就不得不先简述一下电子自旋这一概念。电子自旋不是电子的机械自转,电子自旋及磁矩是电子本身的内禀属性,所以也被称为内禀角动量和内禀磁矩。它们的存在标志电子还有一个新的内禀自由度。所以电子状态的完全描述不但包括空间三个自由度的坐标(r ),还必须考虑其自旋状态。更确切地说,要考虑自旋在某给定方向(例如z 轴方向)的投影的两个可能取值的波幅,即波函数中还应该包含自旋投影这个变量(习惯上取为),Z S 从而记为。与连续变量r 不同,只能取两个离散值。 (,)Z r s ψZ S 2± 接下来,认识电的和磁的相互作用在强度上的差异和不同的特点,可以了解自旋电子学的潜力。电荷周围存在电场,通过静电力和其他电荷发生相互作用,这种相互作用是强的和长程的。在常见的半导体中,两个相距5的元电A 荷间的相互作用能可达0.2eV ,它正比于距离的倒数。1V 的电压可使载流子1r 改变1eV 的能量。然而距离为5的一对电子自旋之间的磁偶极耦合能却只有A

《深入理解LINUX内存管理》学习笔记.

引子 为什么要写这个笔记: 1,这本书的中文版翻译了太垃圾,没法阅读。阅读英文原版,可以很好的理解作者的思路。作此笔记备忘 2,一直以来学习LINUX kernel的知识缺乏系统化,借对这本书的学习,系统化的学习一下LINUX kernel。 3,自己一直在做一个too small,too simple的单进程,特权模式,64bit保护模式的称不上OS的OS,已经做完了bootloader, 构思kernel的实现的时候,困惑在内存管理的实现上,阅读这本书,希望能有利于自己的OS的编写。 4,克服惰性,多读书,希望一天能阅读5页,争取半年内阅读完这本原版700多页的巨著。 不足: 我不可能完全理解LINUX 内存管理的精髓,肯定有很多地方理解错误。希望大家能够指正,以便提高,谢谢。 学习方法: 可能您第一次阅读的时候很多地方都不理解,不用担心。那您可能需要阅读一些文件系统的知识。 或者阅读全部笔记后,再回头阅读,有些地方您就理解了。 言归正传: 一、概要 可用工具 CodeViz: 生成代码调用关系图的工具,这个工具我现在还没有去使用,有兴趣的可以自己试试去建立调用关系图。 http://www.csn.ul.ie/~mel/projects/codeviz/ Linux cross reference (LXR): 以web的方式阅读和查找LINUX内核源代码的工具。这个工具安装相当麻烦,我建议直接到它的官方网站直接读代码。 http://lxr.linux.no/linux+v2.6.24/ 模块 LINUX内存管理代码模块主要分为4个部分: 1.Out of memory 代码在mm/oom_kill.c 貌似用于杀进程的时候对内存的操作 2.虚拟内存的分配代码在mm/vmalloc.c

高性能自旋锁 MCS Spinlock 的设计与实现

高性能自旋锁MCS Spinlock 的设计与实现 林昊翔,计算机科学硕士,毕业于清华大学计算机系,Linux 内核爱好者 秦君(qinjun@https://www.360docs.net/doc/5514702678.html,), 软件工程师, IBM 简介:自旋锁(Spinlock)是一种在Linux 内核中广泛运用的底层同步机制。排队自旋锁(FIFO Ticket Spinlock)是Linux 内核2.6.25 版本中引入的一种新型自旋锁,它解决了传统自旋锁由于无序竞争导致的“公平性”问题。但是由于排队自旋锁在一个共享变量上“自旋”,因此在锁竞争激烈的多核或NUMA 系统上导致性能低下。MCS Spinlock 是一种基于链表的高性能、可扩展的自旋锁,本文详细剖析它的原理与具体实现。 发布日期: 2008 年10 月30 日 一、引言 自旋锁(Spinlock)是一种在Linux 内核中广泛运用的底层同步机制,长期以来,人们总是关注于自旋锁的安全和高效,而忽视了自旋锁的“公平”性。排队自旋锁(FIFO Ticket Spinlock)是内核开发者Nick Piggin 在Linux Kernel 2.6.25[1] 版本中引入的一种新型自旋锁,它通过保存执行线程申请锁的顺序信息解决了传统自旋锁的“不公平”问题[4]。 排队自旋锁仍然使用原有的raw_spinlock_t 数据结构,但是赋予slock 域新的含义。为了保存顺序信息,slock 域被分成两部分,低位部分保存锁持有者的票据序号(Ticket Number),高位部分则保存未来锁申请者的票据序号。只有Next 域与Owner 域相等时,才表明锁处于未使用状态(此时也无执行线程申请该

自旋电子学研究与进展_詹文山

评述 自旋电子学研究与进展 3 詹 文 山 (中国科学院物理研究所 磁学国家重点实验室 北京 100080) 摘 要 自旋电子学是最近几年在凝聚态物理中发展起来的新学科分支,它研究在固体中自旋自由度的有效控制和操纵,在金属和半导体中自旋极化、自旋动力学、自旋极化的输运和自旋电子检测.由于它在信息存储方面的重大应用前景,受到学术界和工业界的高度重视.文章扼要地介绍了自旋电子学发展的历程和发展中的最重要的发现.最近几年,最奇特的发现和最重要的应用莫过于巨磁电阻,薄膜领域纳米技术的迅速发展使巨磁电阻的应用变成可能.作为磁记录头它已使硬磁盘的记录密度提高到170Gbit/in 2.动态随机存储器MRAM 的研究已实现16Mbit 的存储密度. 关键词 自旋电子学,巨磁电阻,磁隧道结,自旋阀 Recent progress i n spi n tron i cs ZHAN W en 2Shan (S tate Key L aboratory forM agnetis m ,Institute of Physics,Chinese acade m y of Sciences,B eijing 100080,China ) Abstract Sp intr onics is a new branch of condensed matter physics devoted t o studies on the manipulation of the s p in degree of freedo m in solids .It involves sp in polarization,s p in dynam ics,s p in trans port,and the detec 2tion of s p in polarized electr ons in metals and sem iconduct ors .Sp intr onics has attracted great attention fr om scien 2tists and manufacturers because of its potential app licati on in infor mati on st orage .A brief review of the develop 2ment of s p intr onics and its most i mportant discoveries will be given .The most exciting event in recent years may be the discovery of the giant magnetoresistance effect in metallic multilayer fil m s and the successful app lication of this effect to infor mation storage .Based on this effect,the magnetic recording density has been increased to 170Gbit /in 2 .A magnet oresistive random access memory of 16Mbit st orage density has als o been developed .These re 2sults clearly demonstrate the i m portance of sp intr onics for infor mati on technology .Keywords Sp intr onics,giant magnet oresistance,magnetic tunnel junctions,s p in valve 3 国家重点基础研究发展计划(批准号:2001CB610600),国家自 然科学基金(批准号:59731010)资助项目 2006-04-04收到初稿,2006-06-02修回  Email:wszhan@aphy .i phy .ac .cn 1 自旋电子学研究的历史回顾 电子具有电荷和自旋两种属性是人所共知的. 电子在电场中运动由于带有电荷而形成电流.导体在磁场中做切割磁力线的运动时,导体中产生电流.反过来,在磁场中的通电导体将产生垂直磁场的运动.从而发明电动机和发电机,成就了一个世纪的文明.在半导体中由于导带中的电子和价带中失去电子形成空穴的输运特性,构成P N 结,1947年发明半 导体晶体管,开创半导体电子学,打开了当代通信和数据处理技术发展的大门,奠定了现代信息社会的基础.所有这些都是基于电子具有电荷的属性.电子在完整晶体的周期性势场中运动是不受阻碍的,因而称为透明的.但是由热引起晶格振动或晶体中的各种缺陷,对电子散射而形成了阻碍.电子不受到散射的平均路程称为平均自由程.在低温下,金属的电

自旋检测

分子束外延技术(MBE) 10cm-3 自旋检测 光学检测和电学检测是自旋检测的两种方法。光学检测方法应用较早且比较成熟。Fiederling[1]和Ohno[2]分别于1999年和2000年在实验上对自旋极化的光学检测进行了研究。Fiederling利用自旋极化的发光二极管对自旋极化的光学检测进行了研究,Ohno则是利用EL谱测量光的偏振度,进而确定电子的自旋极化率。光学方法可以避免其他电学效应的影响。电学检测是利用半导体/铁磁界面的自旋相关输运性质。欧姆接触作为集电极在实验上已经实现,为了有效的探测电子的自旋总数,要求从半导体到铁磁体的接触是球形或隧道的[3]。非平衡自旋总数的化学势的电势测量也是自旋探测技术的一种[4]。 目前,自旋极化电子的高效注入、自旋霍尔效应和自旋流的产生与探测成为自旋电子学中热门的研究专题。最近实验得出,自旋极化电子从铁磁金属注入到半导体能够获得较高的极化率。如今,自旋霍尔效应为自旋流的产生与探测提供了新的途径与方法,因其逆自旋霍尔效应能够将自旋流转化为电流,从而使得难以测量的自旋流可以直接用电学方法测量[5]。利用自旋霍尔效应在半导体中产生自旋流的方法也可以实现自旋电子的注入自旋电子从铁磁物质注入金属也可获得较高的极化率[6]。在半导体量子结构中,还有自旋产生与注入的其他方式,圆偏振光所激发的自旋转移;铁磁材料向半导体的自旋极化注入;自旋filter效应所导致的自旋极化等等。 [1] FIEDERLING R,REUSCHER G,OSSAU W,et al.Injection and detection of a spin-polarized current in a light-emitting diode[J].Nature,1999,402:787 [2]OHNO Y,YOUNG D K,BESCHOTEN B,et al. Electrical spin injection in a ferromagnetic semiconductor heterostructure[J].Nature,2000,402:790 [3] Rashba E I.Theory of electrical spin injection: Tunnel contacts as a solution of the conductivity mismatch problem.Phys Rev B,2000,62:R16267 [4] Hammar P R,Johnson M.Potentiometric measurements of the spin-split subbands in a two-dimensional electron gas.Phys Rev B,2000,61:7207 [5]鲁楠,刘之景.自旋电子学研究的最新进展. 2010年微纳电子技术第47卷第1期11 [6] HANBICKI A T,KIOSEOGLOU G,HOLUB M A,et a1.Electrical spin injection

自旋锁与信号量的区别

自旋锁与信号量的区别 2012-07-12 13:56:57| 分类:笔试/C | 标签:信号量自旋锁区别|字号大中小订阅 信号量和自旋锁区别 自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁,"自旋"就是"在原地打转"。而信号量则引起调用者睡眠,它把进程从运行队列上拖出去,除非获得锁。 ------------------------------------------------------ 虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则: 如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。 自旋锁对信号量 ------------------------------------------------------ 需求建议的加锁方法 低开销加锁优先使用自旋锁 短期锁定优先使用自旋锁 中断上下文中加锁使用自旋锁 长期加锁优先使用信号量 持有锁是需要睡眠、调度使用信号量———————————————————————————————— 自旋锁 ------------------------------------------------------ 自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。 自旋锁的基本形式如下: spin_lock(&mr_lock); //临界区 spin_unlock(&mr_lock);

Linux_C_同步_内核原子_自旋锁_互斥锁

Linux 同步方法剖析内核原子,自旋锁和互斥锁 你也许接触过并发(concurrency)、临界段(critical section)和锁定,不过怎么在内核中使用这些概念呢?本文讨论了 2.6 版内核中可用的锁定机制,包括原子运算符(atomic operator)、自旋锁(spinlock)、读/写锁(reader/writer lock)和内核信号量(kernel semaphore)。本文还探讨了每种机制最适合应用到哪些地方,以构建安全高效的内核代码。 本文讨论了 Linux 内核中可用的大量同步或锁定机制。这些机制为 2.6.23 版内核的许多可用方法提供了应用程式接口(API)。不过在深入学习 API 之前,首先需要明白将要解决的问题。 并发和锁定 当存在并发特性时,必须使用同步方法。当在同一时间段出现两个或更多进程并且这些进程彼此交互(例如,共享相同的资源)时,就存在并发现象。 在单处理器(uniprocessor,UP)主机上可能发生并发,在这种主机中多个线程共享同一个 CPU 并且抢占(preemption)创建竞态条件。抢占通过临时中断一个线程以执行另一个线程的方式来实现 CPU 共享。竞态条件发生在两个或更多线程操纵一个共享数据项时,其结果取决于执行的时间。在多处理器(MP)计算机中也存在并发,其中每个处理器中共享相同数据的线程同时执行。注意在 MP 情况下存在真正的并行(parallelism),因为线程是同时执行的。而在 UP 情形中,并行是通过抢占创建的。两种模式中实现并发都较为困难。 Linux 内核在两种模式中都支持并发。内核本身是动态的,而且有许多创建竞态条件的方法。Linux 内核也支持多处理(multiprocessing),称为对称多处理(SMP)。 临界段概念是为解决竞态条件问题而产生的。一个临界段是一段不允许多路访问的受保护的代码。这段代码能操纵共享数据或共享服务(例如硬件外围设备)。临界段操作时坚持互斥锁(mutual exclusion)原则(当一个线程处于临界段中时,其他所有线程都不能进入临界段)。 临界段中需要解决的一个问题是死锁条件。考虑两个独立的临界段,各自保护不同的资源。每个资源拥有一个锁,在本例中称为 A 和 B。假设有两个线程需要访问这些资源,线程 X 获取了锁 A,线程 Y 获取了锁 B。当这些锁都被持有时,每个线程都试图占有其他线程当前持有的锁(线程 X 想要锁 B,线程 Y 想要锁 A)。这时候线程就被死锁了,因为他们都持有一个锁而且还想要其他锁。一个简单的解决方案就是总是按相同次序获取锁,从而使其中一个线程得以完成。还需要其他解决方案检测这种情形。表 1 定义了此处用到的一些重要的并发术语。 表 1. 并发中的重要定义 Linux 同步方法 如果你了解了一些基本理论并且明白了需要解决的问题,接下来将学习 Linux 支持并发和互斥锁的各种方法。在以前,互斥锁是通过禁用中断来提供的,不过这种形式的锁定效率比较低(目前在内核中仍然存在这种用法)。这种方法也不能进行扩展,而且不能确保其他处理器上的互斥锁。 在以下关于锁定机制的讨论中,我们首先看一下原子运算符,他能保护简单变量(计数器和位掩码

基于Linux内核定制X86平台的微操作系统(很完整详尽文章)

基于Linux内核定制X86平台的微操作系统摘要:1 0 前言2 0.1 Linux系统简介2 0.2 Linux的基本思想2 0.3 Linux内核2 0.4 Linux内核版本命名3 0.5 Linux文件系统3 0.6Linux内核引导4 0.7Linux系统组成4 1 平台的搭建4 1.1 硬件平台4 1.2 软件平台4 1.2.1 Ubuntu系统的下载4 1.2.2 Ubuntu系统的安装4 1.2.3 Ubuntu系统的配置4 2 Linux内核的编译5 2.1 内核的下载5 2.2 内核的定制5 2.3 内核的编译5 2.4 内核的制作6 3 BusyBox的编译6 3.1 BusyBox的下载6 3.2 BusyBox的配置6 3.3 BusyBox的编译7 4 Linux文件系统的制作7 4.1 文件系统的制作7 4.2 文件系统的配置9 4.3 文件系统的压缩7 5 Linux引导程序配置10 5.1 ISOLINUX的下载10 5.2 ISOLINUX的配置10 6 LinuxCD-ROM的制作10 7 Linux定制系统的运行11 7.1 VirtualBox下的运行11 7.2 U盘引导在X86平台下的运行12 8定制系统过程中的问题12 8.1 平台搭建中的问题12 8.2 内核编译中的问题12

8.3 BusyBox编译中的问题12 8.4 文件系统制作中的问题12 8.5 引导程序制作中的问题12 8.6 CD-ROM制作中的问题13 8.7 定制系统运行的问题13 参考13 基于Linux内核定制X86平台的微操作系统 王林强 (河南大学物理与电子学院通信专业,河南开封,475004) 摘要: Linux是一种自由和开放,用C语言和汇编语言写成,并符合POSIX标准的类Unix操作系统。并且由于其可定制、可裁剪的特性,不仅在桌面操作系统中有重要的地位,而且在手机、平板电脑、路由器和视频游戏控制台等嵌入式设备有其巨大的优势。 为了更好、更深入的了解及掌握Linux系统。本文详细的讲述并实践,如何从Linux内核源码,经过定制、裁剪、编译、制作文件系统、内核引导,iso光盘制作到最终完整的基于Linux内核定制的微操作系统。 通过基于Linux内核定制的微操作系统的制作,深入的理解Linux内核的工作原理、文件系统结构、内核引导等,从而精通嵌入式开发。 关键词: Linux;定制;嵌入式;微系统 An implementation of micro-operating system based on the x86 platform Linux kernel customization Wang Lin-qiang (School of Physics and Electronics, Henan University, Henan Kaifeng 475004, China) Abstract: Linux is a free and open, and POSIX-compliant Unix-like operating system written in C and assembly language. And can be cut because of its customizable features, not only in the desktop o perating system in an important position, and its huge advantage in the embedded devices, mobile phones, tablet PCs, routers, and video game consoles. In order to better and deeper understanding of and master Linux system. This article tells in d etail and practice, from the Linux kernel source code has been customized, cutting, compiling, pro

学习嵌入式linux的某位大虾的经历,很有用

我们应该怎么学习嵌入式linux呢?? 这是我的一点点个人愚见,望见谅!!!!! 1、学习linux 根据我在论坛的了解,我选择学习嵌入式linux,刚好我们学校也重视嵌入式linux,从实验室到课程安排都是关于嵌入式linux方面,天时地利!这里我把学习linux的经验和教训说说。 可以这样说,在论坛里说道学习linux差不多就学习linux内核。于是我电脑里安装了linux就开始看linux内核方面的书了。我记得来学校以前就买到一本陈莉君的讲linux内核的第一版,现在有第二版了。我就开始看那本说,大家说linux 内核情景分析不错,我就买了上下册,后来又买了《深入理解linux内核》,最后也买了毛德操的《嵌入式系统》也是分析linux内核代码的,主要讲arm相关的。 看内核期间是个非常痛苦的过程,看情景分析有种在森林中找出路,其间我组织了一些同学学习内核,几乎没有几个能

坚持下来的。我认为我是坚持下来了。情景分析在看第一、第二遍是几乎没有摸到门道,我分析有三个方面的原因:1、自己的基础差,这是最关键的。2、内核本身很难。3、没有交流和高人指点。到了第三遍时我才摸到门,才差不多知道个linux的大概脉络,很多细节也是稀里糊涂。 学习linux总结,这里声明一下,我指的嵌入式主要是偏向软件的嵌入式。学习嵌入式的重点和难点关键在操作系统,如果没有掌握操作系统,我认为很难把握一个嵌入式系统。即使在做嵌入式开发中,作应有层的开发几乎可以不知道操作系统也可以开发,我认为那是浮在表面的。很难深入和提高自己的层次。声明:一孔之见!不可深究! 在学习linux内核过程中犯了一个极其严重路线错误:对linux几乎不懂就开始学习内核。我个人推荐一个学习路线是:使用linux—〉linxu系统编程开发---〉驱动开发和分析linux内核。而我差不多相反,实际上你不会使用linux也可以学习内核,但是如果你懂了这些东西学习更有效率。 关于要不要学习内核的问题,我的回答如下:不一定。如果你是喜欢钻研的那你进入内核会满足你的欲望。同时对你以后的嵌入式系统的开发有很好的影响。如果你想从事嵌入式

自旋电子学(汇编)

自旋电子学 一、什么是自旋电子学? 自旋电子学是电子学的一个新兴领域,其英文名称为Spintronics,它是由Spin和Electronics两词合并创造出来的新名词。顾名思义,它是利用电子的自旋属性进行工作的电子学。早在19世纪末,英国科学家汤姆逊发现电子之后,人们就知道电子有一个重要特性,就是每一个电子都携带一定的电量,即基本电荷(e=1.60219x10-19库仑)。到20世纪20年代中期,量子力学诞生又告诉人们,电子除携带电荷之外还有另一个重要属性,就是自旋。电子的自旋角动量有两个数值,即±h/2。其中正负号分别表示“自旋朝上”和“自旋朝下”,h 是量子物理中经常要遇到的基本物理常数,称为普朗克常数。 通过对电子电荷和电子自旋性质的研究,最近在电子学和信息技术领域出现了明显的进展。这个进展的重要标志之一就是诞生了自旋电子学。在传统的电子学中,数据处理集成电路所用的是半导体中电子的电荷,但并不是说电子的自旋自由度以前从没有用过,例如传统的数据存储介质,如磁盘,用的就是磁性材料中电子的自旋。 事实上,半导体中有很多类型的自旋极化现象,如载流子的自旋,半导体材料中引入的磁性原子的自旋和组成晶体的原子的核自旋等等。从某种意义上说,已有的技术如以巨磁电阻(GMR)为基础的存储器和自旋阀都是自旋起作用的自旋电子学最基本的应用。但是,其中自旋的作用是被动的,它们的工作由局域磁场来控制。这里所指的自旋电子学则要走出被动自旋器件的范畴,成为基于自旋动力学的主动控制的应用。因为自旋动力学的主动控制预计可以导致新的量子力学器件,如自旋晶体管、自旋过滤器和调制器、新的存储器件、量子信息处理器和量子计算。从这个意义上说,自旋电子学是在电子材料,如半导体中,主动控制载流子自旋动力学和自旋输运的一个新兴领域。已经证明,通过注入、输运和控制这些自旋态,可以执行新的功能。这就是半导体自旋电子学新领域所包含的内容,它涉及自旋态在半导体中的利用。 二、自旋电子学的物理学原理和挑战 对于目前的自旋电子学,令人感兴趣的两个重要的物理学原理是:自旋作为一个动力学变数,它有量子力学固有的量子特性,这些特性将导致新的自旋电子学量子器件而不是传统的以电子电荷为基础的电子学。另一个是与自旋态有关的长驰豫时间或相干时间。在磁性半导体中,自旋朝上的载流子浓度往往多于自旋朝下的载流子,这些载流子运动会产生所谓自旋极化电流。自旋极化电流的大小、存在的时间长短取决于许多因素,如材料的特性、界面、外场及温度等等。事实上,半导体中的载流子自旋可以通过局域磁场,或通器件的栅极改变外加电场,甚至通过偏振光地进行操作。这一事实,是开发自旋电子学应用的一个重要的物理基础。 尽管对自旋电子学的基本原理和概念的研究非常令人感兴趣,但在人们能够制造出自旋电子学应用器件之前,还有许多障碍需要克服。例如,自旋电子学的一个基本要求是在电子材料中产生和保持大的自旋极化电流到很长的时间。要实现这一点尚需继续努力才能完成。事实上,把足够大的自旋极化电流引入半导体材料也是一个问题。以此类似,对于量子计算,人们要求精密的控制自旋纠缠及利用局域磁场操纵单一自旋。对此,虽然已经提出许多设计方案,但至今尚没有特别好的想法。很清楚的是,对于一个崭新的领域,总是机会与挑战并存。在自旋电子学的应用变成现实之前,确实有大量的基本物理问题需要研究。有关自旋电子学的物理学基础和应用问题的研究现状,有兴趣的读者可以参看最近刚刚发表的一篇极好的评述文章:Zutic′, Fabian, and Das Sarma: Spintronics: Fundamen- tals and applications,Rev. Mod. Phys., 76, 323-410,April 2004。

深入理解Linux软件配置、编译及安装

深入理解Linux软件配置、编译及安 装 从源代码安装过软件的朋友一定对./configure&&make&&make install安 装三步曲非常熟悉了。然而究竟这个过程中的每一步幕后都发生了些什么呢?本文将带领你一探究竟。深入理解这个过程将有助于你在LFS的基础上玩出自己 的花样来。不过需要说明的是本文对Makefile和make的讲解是相当近视和粗 浅的,但是对于理解安装过程来说足够了。用一句话来解释这个过程就是:根 据源码包中Makefile.in文件的指示,configure脚本检查当前的系统环境和 配置选项,在当前目录中生成Makefile文件(还有其它本文无需关心的文件),然后make程序就按照当前目录中的Makefile文件的指示将源代码编译为二进 制文件,最后将这些二进制文件移动(即安装)到指定的地方(仍然按照 Makefile文件的指示)。由此可见Makefile文件是幕后的核心。要深入理解安 装过程,必须首先对Makefile文件有充分的了解。本文将首先讲述Makefile 与make,然后再讲述configure脚本。并且在讲述这两部分内容时,提供了尽 可能详细的、可以运用于实践的参考资料。Makefile与make用一句话来概括Makefile与make的关系就是:Makefile包含了所有的规则和目标,而make则是为了完成目标而去解释Makefile规则的工具。make语法首先看看make的命 令行语法:make[options][targets][VAR=VALUE].[options]是命令行选项,可以用make--help命令查看全部,[VAR=VALUE]是在命令行上指定环境变量,这 两个大家都很熟悉,将在稍后详细讲解。而[targets]是什么呢?字面的意思是"目标",也就是希望本次make命令所完成的任务。凭经验猜测,这个[targets]大概可以用"ckeck","install"之类(也就是常见的测试和安装命令)。但是它到底是个啥玩意儿?没有任何参数的make命令是什么意思?为什么在安装LFS工具链中的Perl-5.8.8软件包时会出现"make perl utilities"这样怪异的命令?要回答这些问题必须首先理解Makefile文件中的"规则"。Makefile规则 Makefile规则包含了文件之间的依赖关系和更新此规则目标所需要的命令。一 个简单的Makefile规则是这样写的:TARGET:PREREQUISITES COMMAND TARGET 规则的目标。也就是可以被make使用的"目标"。有些目标可以没有依赖而只有动作(命令行),比如"clean",通常仅仅定义一系列删除中间文件的命令。同样,

相关文档
最新文档