自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 linux 2.6源代码情景分析笔记之中断与异常6

每个中断向量都有自己的irq_desc_t描述符,所有的这些描述符组织在一起形成irq_desc数组。typedef struct irq_desc {        hw_irq_controller *handler;指向pic对象(hw_irq_controller描述符),服务于irq线        void *handler_data;指向pic方法所使用的数据  

2009-12-31 10:51:00 743

原创 linux 2.6源代码情景分析笔记之中断与异常4

IDT的初步初始化在实模式时,idt被初始化并由bios例程使用。一旦linux接管,idt就被移到ram的另一个区域,并进行第二次初始化,因为linux没有利用任何bios例程。IDT存放在idt_table表中,有256个表项。6字节的idt_descr变量指定了idt的大小和它的地址,只有当内核用lidt汇编指令初始化idtr寄存器时才用到这个变量。在内核初始化过程中,setup

2009-12-31 10:50:00 526

原创 linux 2.6源代码情景分析笔记之中断与异常5

中断处理依赖于中断类型,有三种主要的中断类型:i/o中断:某些i/设备需要关注;相应的中断处理程序必须查询设备以确定适当的操作过程。时钟中断:某种时钟(或者是一个本地apic时钟,或者是一个外部时钟)产生一个中断;这种中断告诉内核一个固定的时间间隔已经过去。这些中断大部分是作为i/o中断来处理的。处理器间中断:多处理器系统中一个cpu对另一个cpu发出的一个中断。I/O中断处理

2009-12-31 10:50:00 565

原创 linux 2.6源代码情景分析笔记之中断与异常2

高级可编程控制器如果系统只有一个cpu,主pic输出线以直截了当的方式连接到cpu的intr引脚。如果系统中包含两个或多个cpu,就需要更加复杂的pic.intel从p3开始引入i/o高级可变成控制器(APIC)组件。80x86微处理器当前所有的cpu都含有一个本地apic。每个本地apic都有32位寄存器,一个内部时钟,一个本地定是设备以及为本地apic中断保留的两条额外的irq线l

2009-12-31 10:49:00 852

原创 linux 2.6源代码情景分析笔记之中断与异常3

初始化中断描述符表内核启用中断以前,必须把idt表的初始地址装到idtr寄存器,并初始化表中的每一项。这项工作是在初始化系统时完成。int指令允许用户态进程发出一个中断信号,其值可以是0-255的任意一个向量。因此。为了防止用户通过int指令模拟非法的中断和异常,idt的初始化必须非常小心。这可以通过把中断或者陷阱门描述符的dpl字段设置成0来实现。如果进程试图发出其中的一个中断信号,

2009-12-31 10:49:00 670

原创 linux 2.6源代码情景分析笔记之中断与异常1

中断(interrupt)通常被定义为一个事件,该事件改变处理器执行的指令顺序。这样的事件与cpu芯片内外部硬件电路产生的电信号相对应。中断通常分为同步(synchronous)中断和异步(asynchronous)中断:1.同步中断是当指令执行时由cpu控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后cpu才会发出中断。2.异步中断是由其他硬件设备依照cpu始终信号随机

2009-12-31 10:48:00 720

原创 linux 2.6源代码情景分析笔记之进程11

下函数,创建进程描述符以及子进程执行所需要的所有其他数据结构。参数与do_fork()的参数相同,外加子进程的pid。static task_t *copy_process(unsigned long clone_flags,unsigned long stack_start,struct pt_regs *regs,unsigned long stack_size,int __user *p

2009-12-29 13:13:00 695

原创 linux 2.6源代码情景分析笔记之进程10

几点注意:1.写时复制技术允许父子进程读相同的物理页。只要两者中有一个试图写一个物理页,内核就把这个页的内容拷贝到一个新的物理页,并把这个新的物理页分配给正在写的进程。2.轻量级进程允许父子进程共享每进程在内核的很多数据结构。3.vfork()系统调用创建的进程能共享其父进程的内存地址空间。为了防止父进程重写子进程需要的数据,阻塞父进程的执行,一直到子进程退出或执行一个新的程序为止。

2009-12-29 09:23:00 652

原创 linux 2.6源代码情景分析笔记之进程9

intel在他的微处理器中引入一个新的汇编指令集,叫做MMX指令,用来加速多媒体应用程序的执行。mmx指令作用于fpu的浮点寄存器。80x86微处理器并不在tss中自动保存fpu,mmx,xmm寄存器。他们包含某种硬件支持,能在需要时保存这些寄存器的数值,硬件支持由cr0寄存器中的一个ts标志组成。遵循以下规则:每当执行硬件上下文切换时,设置ts标志。每当ts标志被设置时执行ESCAP

2009-12-29 06:40:00 710

原创 linux 2.6源代码情景分析笔记之进程8

内核分两部执行一个进程切换1.切换页全局目录以安装一个新的地址空间;2.切换内核态堆栈和硬件上下文,因为硬件上下文提供了内核执行新进程所需要的所有信息,包含cpu寄存器。切换内核堆栈的硬件上下文是由宏switch_to完成的,此与硬件联系紧密#define switch_to(prev,next,last) do {                               

2009-12-29 02:01:00 616

原创 linux 2.6源代码情景分析笔记之进程7

为了控制进程执行,内核必须有能力挂起正在cpu上运行的进程,并恢复以前挂起的某个进程的执行(进程切换、任务切换、上下文切换)。每个进程可以拥有自己的地址空间,但所有进程必须共享cpu寄存器。在恢复一个进程的执行之前,内核必须确保每个寄存器装入了挂起进程时的数值。进程恢复执行前必须装入寄存器的一组数据成为硬件上下文(hardware context)。硬件上下文是进程可执行上下文的一个子集,

2009-12-29 00:42:00 790

原创 linux 2.6源代码情景分析笔记之进程6

每个进程都有一组相关的资源限制(resource limit),限制了指定进程能使用的系统资源数量。对当前进程的资源限制存放在current->signal->rlim字段,进程的信号描述符的一个字段。该字段类型为rlimit结构的数组,每个资源限制对应一个元素。struct rlimit {        unsigned long   rlim_cur;        unsi

2009-12-28 07:53:00 849

原创 linux 2.6源代码情景分析笔记之进程5

等待队列在内核中很多用途,尤其用在中断处理、进程同步及定时。等待队列实现了在事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权。因此,等待队列表示一组睡眠的进程,当某一条件变为真时,由内核唤醒它们。等待队列由双向链表实现,其元素包括指向进程描述符的指针。每个队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构。struc

2009-12-28 07:22:00 682

原创 linux 2.6源代码情景分析笔记之进程4

散列(hash)函数并不总能确保pid与表索引一一对应。两个不同的pid散列到相同的表索引称为冲突(colliding),linux利用链表来处理冲突的pid,每一个表项是由冲突的进程描述符组成的双向链表。pid散列表的数据结构解决了所有这些难题,他们可以为包含在一个散列表中的任何pid号定义进程链表。最主要的数据结构是四个pid结构的数组,它在进程描述符的pid字段中。struc

2009-12-28 06:26:00 1058

原创 linux 2.6源代码情景分析笔记之进程3

为内核寻找新进程在cpu上运行时,必须只考虑可运行进程(TASK_RUNNING)。提高调度程序运行速度的诀窍是建立多个可运行进程链表,每种进程优先权对应一个不同的链表。每个task_struct描述符包含一个list_head类型的字段run_list。如果进程的优先权等于k(0-139),run_list字段把该进程链入优先权为k的可运行进程的链表中。内核必须为系统中每个运行队列保存大

2009-12-28 05:54:00 1411

原创 linux 2.6源代码情景分析笔记之进程2

能被独立调度的每个执行上下文都必须拥有自己的进程描述符。进程和进程描述符之间有严格的对应关系,使用32位进程描述符地址标识,进程描述符指针指向这些地址,内核对进程的大部分引用是通过进程描述符指针进行的。可以使用pid(进程标识符)来标记进程,存放在字段pid中,PID被顺序编号,新创建的进程PID通常是前一个进程的PID加一。#define PID_MAX_DEFAULT 0x8000

2009-12-25 02:55:00 862

原创 linux 2.6源代码情景分析笔记之进程1

进程是程序执行时的一个实例,是充分描述程序已经执行到何种程度的数据结构的汇集。在linux中,常将进程称为任务(task)或者线程(thread)。进程的目的就是承担分配系统资源的实体。当一个进程创建时,几乎与父进程相同。接受父进程地址空间的一个逻辑拷贝,并从进程创建系统调用的下一条指令开始执行与父进程相同的代码。尽管父子进程可以共享含有程序代码的页,但是它们各自有独立的数据拷贝(栈和堆),因

2009-12-25 01:59:00 609

原创 linux 2.6源代码情景分析笔记之系统启动2

linux/arch/i386/boot/compressed/head.S在setup()结束后,此函数就被移动到物理地址0x00100000处或者0x00001000处,这取决于内核映像是被高装载到ram中还是低装载到ram中。解读函数:startup_32:        cld        cli        movl $(__BOOT_DS),%eax

2009-12-24 22:03:00 631

原创 linux 2.6源代码情景分析笔记之系统启动1

最开始时,ram芯片中包含的是随机数据。当开始启动时,cpu的一个引脚上会产生一个reset逻辑值。此后处理器的一些寄存器设置成固定的数值,并执行在物理地址0xfffffff0处找到的代码。硬件把这个地址映射到某个只读、持久的存储芯片中,该芯片通常称为rom(read-only memory只读内存)。rom所存放的程序集在80x86体系中通常叫做基本输入输出系统(basic input/outp

2009-12-24 21:26:00 781

原创 linux 2.6源代码情景分析笔记之内存6

当ram小于896mb时的最终内核页表由内核页表所提供的最终映射必须把从0xc0000000开始的线性地址转化为从0开始的物理地址。#define __pa(x)   ((unsigned long)(x)-PAGE_OFFSET)将从page_offset开始的线性地址转换成相应的物理地址。#define __va(x)   ((void *)((unsigned long)(x

2009-12-23 06:47:00 1671

原创 linux 2.6源代码情景分析笔记之内存5

在内存启动最开始时,bios的起主导作用,内核通过它来了解物理内存的情况。同时调用bios过程建立一组物理地址范围和其对应的内存类型。通过函数machine_specific_memory_setup()函数来建立物理地址映射。此表可以获取,是内核在bios列表的基础上构建的;否则内核按照保守的缺省设置构建这张表:从0x9f(lowmemsize())到0x100(high_memory)号的

2009-12-23 04:59:00 1544

原创 linux 2.6源代码情景分析笔记之内存4

--------------------------------------------------几个宏:PGDIR_SHIFT:确定页全局目录项能映射的区域大小的对数。此宏用于计算页全局目录中一个单独表项所能映射区域的大小。PGDIR_MASK用于屏蔽offset table,middle air,upper dir.字段的所有位。#define PGDIR_SHIFT     2

2009-12-23 03:45:00 677

原创 linux 2.6源代码情景分析笔记之内存3

关于e820   e820是BIOS的(int 0x15)中断关联的。在使用此中断时,ax中必须是e820(ireg.ax=0xe820;)。通过此中断可以得到内存的系统布局。通过do循环,每次得到一段。/linux32/arch/x86/include/asm/e820.h宏E820_MAP是struct e820entry数据结构的指针,存放在参数块中位移为0x2d0的地方

2009-12-23 03:31:00 998

原创 linux 2.6源代码情景分析笔记之内存2

linux中的段机制:在linux中,逻辑地址到物理地址,是经过分段单元->分页单元这两个部分的转换来完成的。其中逻辑地址由段标识符和指定段内相对地址的偏移量。前者16位长的字段(段选择符segment selector),后者是32位长的字段。段选择符的构成:15-3(index)指定了放在GDT或者LDT中的相应段描述符的入口2(TL-table indicator)标志:指明

2009-12-21 03:49:00 1176

原创 linux 2.6源代码情景分析笔记之内存1

linux简化了分段,在把虚拟空间的4G分成了内核和用户两个部分,每个用户都可以通过系统进入内核。这样从用户的角度看,他拥有整个虚拟内存。也就是用户自身的3G+内核的1G.内核的1G是所有用户共有的,而用户3G则是自己的私有财产,这也保证用户在处理问题的时候数据安全,使得用户与用户之间隔离。(从0xc0000000-0xfffffff的1G此段供内核使用)和用户(0x0000000-0xbffff

2009-12-14 16:10:00 1271

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除