E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
linux0.11
Linux 内核--硬件中断初始化及中断描述符表
本文分析基于
Linux0.11
内核,转载请标明出处http://blog.csdn.net/yming0221/archive/2011/06/01/6459119.aspx以下是硬件初始化函数voidtrap_init
thecloud
·
2011-05-29 22:00
linux
什么时候动手写代码才合适?
结果我选择去重读
linux0.11
文件系统代码,结果发现其实现的不是很难理解,但是此时我已经丧失去动手写的动力了:怕是重新劳作,并且感觉
chobit_s
·
2011-05-20 22:00
linux
OS
Linux0.11
内核--启动代码分析setup.s 建立页目录和页表
head.s开始 pg_dir .... .... .... .... .org 0x1000 pg0: .org 0x2000 pg1: .org 0x3000 pg2: .org 0x4000 pg3: .org 0x5000 后面是setup_paging代码 setup_paging: movl $1024*5,%ecx /*
thecloud
·
2011-05-19 22:00
linux
Linux0.11
内核--启动代码分析setup.s 建立页目录和页表
head.s开始pg_dir.................org0x1000pg0: .org0x2000pg1: .org0x3000pg2: .org0x4000pg3: .org0x5000 后面是setup_paging代码 setup_paging:movl$1024*5,%ecx/*5pages-pg_dir+4pagetables*/xorl%eax,%eaxxorl%edi
yming0221
·
2011-05-19 22:00
linux
user
代码分析
Linux0.11
内核--启动代码分析setup.s 建立页目录和页表
head.s开始 pg_dir .... .... .... .... .org 0x1000 pg0: .org 0x2000 pg1: .org 0x3000 pg2: .org 0x4000 pg3: .org 0x5000 后面是setup_paging代码 setup_paging: movl $1024*5,%ecx /*
soboer
·
2011-05-19 22:00
linux
Linux0.11
内核--idt(中断描述符表的初始化)head.s分析
head.s被编译成system模块的最前面部分,故而称为头部。这段程序处于地址的绝对0处,首先是加载各个数据段寄存器,重新设置中断描述符表idt,共256项,并使各个表项均指向一个只报错误的哑中断程序。然后重新设置全局描述符表gdt。接着使用物理地址0与1M开始处的内容相比较的方法,检测A20地址线是否已真的开启(如果没有开启,则在访问高于1Mb物理内存地址时CPU实际只会访问(IPMOD,如果
thecloud
·
2011-05-17 23:00
linux
Linux0.11
内核--idt(中断描述符表的初始化)head.s分析
head.s被编译成system模块的最前面部分,故而称为头部。这段程序处于地址的绝对0处,首先是加载各个数据段寄存器,重新设置中断描述符表idt,共256项,并使各个表项均指向一个只报错误的哑中断程序。然后重新设置全局描述符表gdt。接着使用物理地址0与1M开始处的内容相比较的方法,检测A20地址线是否已真的开启(如果没有开启,则在访问高于1Mb物理内存地址时CPU实际只会访问(IPMOD,如果
soboer
·
2011-05-17 23:00
linux
Linux0.11
内核--启动引导代码分析setup.s
setup的整体作用:首先利用BIOS中断读取机器的数据,将其保存在地址0x9000:0x0000处,覆盖了原来bootsect.s代码所在的位置,由于bootsetc模块的代码运行完毕,已经没有其他的用处了,所以可以将其覆盖掉。然后关闭中断,setup将system模块整体移动至内存起始处,原来位于0x1000:0x0000,由于movsb和movsw指令的功能是移动一个字节或者一个字,源地址由
thecloud
·
2011-05-17 23:00
linux
Linux0.11
内核--idt(中断描述符表的初始化)head.s分析
head.s被编译成system模块的最前面部分,故而称为头部。这段程序处于地址的绝对0处,首先是加载各个数据段寄存器,重新设置中断描述符表idt,共256项,并使各个表项均指向一个只报错误的哑中断程序。然后重新设置全局描述符表gdt。接着使用物理地址0与1M开始处的内容相比较的方法,检测A20地址线是否已真的开启(如果没有开启,则在访问高于1Mb物理内存地址时CPU实际只会访问(IPMOD,如果
yming0221
·
2011-05-17 23:00
linux
测试
System
X86
Linux0.11
内核--A20地址线
1981年8月,IBM公司最初推出的个人计算机IBMPC使用的CPU是Intel8088。在该微机中地址线只有20根(A0–A19)。在当时内存RAM只有几百KB或不到1MB时,20根地址线已足够用来寻址这些内存。其所能寻址的最高地址是0xffff:0xffff,也即0x10ffef。对于超出0x100000(1MB)的寻址地址将默认地环绕到0x0ffef。当IBM公司于1985年引入AT机时,使
yming0221
·
2011-05-16 12:00
linux
工作
IBM
Linux0.11
内核--A20地址线
1981 年 8 月,IBM 公司最初推出的个人计算机 IBM PC 使用的 CPU 是 Intel 8088。在该微机中地址 线只有 20 根(A0 – A19)。在当时内存 RAM 只有几百 KB 或不到 1MB 时,20 根地址线已足够用来寻址 这些内存。其所能寻址的最高地址是 0xffff:0xffff,也即 0x10ffef。对于超出 0x100000(1MB)的寻址地址 将
soboer
·
2011-05-16 12:00
linux
Linux0.11
内核--A20地址线
1981 年 8 月,IBM 公司最初推出的个人计算机 IBM PC 使用的 CPU 是 Intel 8088。在该微机中地址 线只有 20 根(A0 – A19)。在当时内存 RAM 只有几百 KB 或不到 1MB 时,20 根地址线已足够用来寻址 这些内存。其所能寻址的最高地址是 0xffff:0xffff,也即 0x10ffef。对于超出 0x100000(1MB)的寻址地址 将
thecloud
·
2011-05-16 12:00
linux
Linux0.11
内核--启动引导代码分析setup.s
setup的整体作用:首先利用BIOS中断读取机器的数据,将其保存在地址0x9000:0x0000处,覆盖了原来bootsect.s代码所在的位置,由于bootsetc模块的代码运行完毕,已经没有其他的用处了,所以可以将其覆盖掉。然后关闭中断,setup将system模块整体移动至内存起始处,原来位于0x1000:0x0000,由于movsb和movsw指令的功能是移动一个字节或者一个字,源地址由
soboer
·
2011-05-14 19:00
linux
Linux0.11
内核--启动引导代码分析setup.s
setup的整体作用:首先利用BIOS中断读取机器的数据,将其保存在地址0x9000:0x0000处,覆盖了原来bootsect.s代码所在的位置,由于bootsetc模块的代码运行完毕,已经没有其他的用处了,所以可以将其覆盖掉。然后关闭中断,setup将system模块整体移动至内存起始处,原来位于0x1000:0x0000,由于movsb和movsw指令的功能是移动一个字节或者一个字,源地址由
yming0221
·
2011-05-14 19:00
linux
buffer
input
output
代码分析
initialization
Linux0.11
内核--32位保护模式GDT(全局描述符表)
在ProtectedMode下,一个重要的必不可少的数据结构就是GDT(GlobalDescriptorTable)。为什么要有GDT?我们首先考虑一下在RealMode下的编程模型:在RealMode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的BaseAddress,一个Segment的最大长度是64KB,这是16-bit系统所能表示
thecloud
·
2011-05-12 17:00
linux
Linux0.11
内核--32位保护模式GDT(全局描述符表)
在ProtectedMode下,一个重要的必不可少的数据结构就是GDT(GlobalDescriptorTable)。为什么要有GDT?我们首先考虑一下在RealMode下的编程模型:在RealMode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的BaseAddress,一个Segment的最大长度是64KB,这是16-bit系统所能表示
soboer
·
2011-05-12 17:00
linux
Linux0.11
内核--32位保护模式GDT(全局描述符表)
在ProtectedMode下,一个重要的必不可少的数据结构就是GDT(GlobalDescriptorTable)。为什么要有GDT?我们首先考虑一下在RealMode下的编程模型:在RealMode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的BaseAddress,一个Segment的最大长度是64KB,这是16-bit系统所能表示
yming0221
·
2011-05-12 17:00
数据结构
linux
table
Access
任务
Descriptor
Linux0.11
启动过程
1. 从系统加电起所执行程式的顺序为: ROM BIOS bootsect.S setup.S head.S main.c2. ROM BIOS当PC机加电后,80x86结构的CPU将自动进入实模式,并从地址0xFFFF0开始自动执行某些系统的检测。并在物理地址0处开始初始化中断向量。此后,他将可启动设备的第一个扇区(磁盘引导扇区512字节)读入内存绝对地址0x7C00处,并跳到这个地方去执行(
thecloud
·
2011-05-10 22:00
linux
Linux0.11
启动过程
1. 从系统加电起所执行程式的顺序为: ROM BIOS bootsect.S setup.S head.S main.c2. ROM BIOS当PC机加电后,80x86结构的CPU将自动进入实模式,并从地址0xFFFF0开始自动执行某些系统的检测。并在物理地址0处开始初始化中断向量。此后,他将可启动设备的第一个扇区(磁盘引导扇区512字节)读入内存绝对地址0x7C00处,并跳到这个地方去执行(
soboer
·
2011-05-10 22:00
linux
Linux0.11
启动过程
1. 从系统加电起所执行程式的顺序为:ROMBIOSbootsect.Ssetup.Shead.Smain.c2. ROMBIOS当PC机加电后,80x86结构的CPU将自动进入实模式,并从地址0xFFFF0开始自动执行某些系统的检测。并在物理地址0处开始初始化中断向量。此后,他将可启动设备的第一个扇区(磁盘引导扇区512字节)读入内存绝对地址0x7C00处,并跳到这个
yming0221
·
2011-05-10 22:00
Linux0.11
内核--启动引导代码分析bootsect.s
Linux内核中的系统启动引导代码位于/boot目录下但是,由于。Linus当时是在MINIX系统上开发Linux的,最初MINIX系统上还没有移植gas程序,因此Linus就使用了MINIX系统上的as86。bootsect需要是16位的实模式程序。目前gas汇编器也支持16位的编译。所以现在也可以直接用as编译器直接编译。下面是用at&t格式改写的bootsect.s代码.code16 #r
thecloud
·
2011-05-09 22:00
linux
Linux0.11
内核--启动引导代码分析bootsect.s
Linux内核中的系统启动引导代码位于/boot目录下但是,由于。Linus当时是在MINIX系统上开发Linux的,最初MINIX系统上还没有移植gas程序,因此Linus就使用了MINIX系统上的as86。bootsect需要是16位的实模式程序。目前gas汇编器也支持16位的编译。所以现在也可以直接用as编译器直接编译。下面是用at&t格式改写的bootsect.s代码.code16 #r
soboer
·
2011-05-09 22:00
linux
Linux0.11
内核--启动引导代码分析bootsect.s
Linux内核中的系统启动引导代码位于/boot目录下但是,由于。Linus当时是在MINIX系统上开发Linux的,最初MINIX系统上还没有移植gas程序,因此Linus就使用了MINIX系统上的as86。bootsect需要是16位的实模式程序。目前gas汇编器也支持16位的编译。所以现在也可以直接用as编译器直接编译。下面是用at&t格式改写的bootsect.s代码.code16#rew
yming0221
·
2011-05-09 22:00
linux
System
Parameters
代码分析
磁盘
linux内核
Linux0.11
内核--8086中的实模式
8086/8088CPU中寄存器为16位,16位子长的机器可以访问的最大存储地址空间为64K,但是8086/8088CPU的地址线有20根, 能够寻址1M的地址空间。为了解决这种冲突,采用存储器分段的办法,实际地址=段地址左移4位+偏移地址。 按照这样计算,每个段的大小最大可达64K,如果所有的段都按这个大小,那么可以划分16个段;每个段的起始地址必须是每个小段的起 始地址,即00000H
thecloud
·
2011-05-06 20:00
linux
Linux0.11
内核--8086中的实模式
8086/8088CPU中寄存器为16位,16位子长的机器可以访问的最大存储地址空间为64K,但是8086/8088CPU的地址线有20根,能够寻址1M的地址空间。为了解决这种冲突,采用存储器分段的办法,实际地址=段地址左移4位+偏移地址。按照这样计算,每个段的大小最大可达64K,如果所有的段都按这个大小,那么可以划分16个段;每个段的起始地址必须是每个小段的起始地址,即00000H-FFFF0
yming0221
·
2011-05-06 20:00
linux
存储
Linux0.11
内核--8086中的实模式
8086/8088CPU中寄存器为16位,16位子长的机器可以访问的最大存储地址空间为64K,但是8086/8088CPU的地址线有20根, 能够寻址1M的地址空间。为了解决这种冲突,采用存储器分段的办法,实际地址=段地址左移4位+偏移地址。 按照这样计算,每个段的大小最大可达64K,如果所有的段都按这个大小,那么可以划分16个段;每个段的起始地址必须是每个小段的起 始地址,即00000H
soboer
·
2011-05-06 20:00
linux
[置顶] Linux 内核学习(2)
(注:转载请表明出处:http://blog.csdn.net/yming0221)持续更新中......
Linux0.11
内核--8086中的实模式
Linux0.11
内核--启动引导代码分析bootsect.sLinux0.11
yming0221
·
2011-05-06 20:00
linux
struct
user
任务
代码分析
linux内核
Linux 内核学习(2)
Linux0.11
内核--8086中的实模式
Linux0.11
内核--启动引导代码分析bootsect.s
Linux0.11
内核--32位保护模式GDT(全局描述符表)
Linux0.11
thecloud
·
2011-05-06 20:00
linux
Linux 内核学习(2)
Linux0.11
内核--8086中的实模式
Linux0.11
内核--启动引导代码分析bootsect.s
Linux0.11
内核--32位保护模式GDT(全局描述符表)
Linux0.11
thecloud
·
2011-05-06 20:00
linux
Linux 内核学习(2)
Linux0.11
内核--8086中的实模式
Linux0.11
内核--启动引导代码分析bootsect.s
Linux0.11
内核--32位保护模式GDT(全局描述符表)
Linux0.11
soboer
·
2011-05-06 20:00
linux
Linux 内核学习(2)
Linux0.11
内核--8086中的实模式
Linux0.11
内核--启动引导代码分析bootsect.s
Linux0.11
内核--32位保护模式GDT(全局描述符表)
Linux0.11
soboer
·
2011-05-06 20:00
linux
Linux0.11
内核--系统中断处理程序int 0x80实现原理
系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。这个中断的设置在kernel/sched.c中441行函数中voidsched_init(void) { inti; structdesc_struct*p; if(sizeof(structsigaction)!=16) panic("StructsigactionMUSTbe16bytes")
yming0221
·
2011-05-05 22:00
linux
struct
table
System
任务
Signal
Linux0.11
内核--系统中断处理程序int 0x80实现原理
系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。 这个中断的设置在kernel/sched.c中441行函数中 void sched_init(void) { int i; struct desc_struct * p; if (sizeof(struct sigaction) != 16) panic("Struc
thecloud
·
2011-05-05 22:00
linux
Linux0.11
内核--系统中断处理程序int 0x80实现原理
系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。通过int 0x80,就可使用内核资源。不过,通常应用程序都是使用具有标准接口定义的C函数库间接的使用内核的系统调用,即应用程序调用C函数库中的函数,C函数库中再通过int 0x80进行系统调用。所以,系统调用过程是这样的:应用程序调用libc中的函数->libc中的函数引用系统调用宏->
soboer
·
2011-05-05 22:00
linux
Linux0.11
内核--进程的调度(运行态(就绪态)和睡眠态之间的转换)
Linux0.11
中进入可中断睡眠状态的方法有3中调用in
soboer
·
2011-05-04 13:00
linux
Linux0.11
内核--进程的调度(运行态(就绪态)和睡眠态之间的转换)
Linux0.11
中进入可中断睡眠状态的方法有3中调用in
thecloud
·
2011-05-04 13:00
linux
Linux0.11
内核--进程的调度(运行态(就绪态)和睡眠态之间的转换)
Linux0.11
中进入可中断睡眠状态的方法有3中调用in
yming0221
·
2011-05-04 13:00
数据结构
linux
struct
buffer
UP
任务
Linux0.11
内核--进程的调度(就绪态和运行态之间的转换)
进程的调度linux系统中,一个进程有5种可能状态,在sched.c第19行处定义了状态的标识:#defineTASK_RUNNING0//正在运行或可被运行状态#defineTASK_INTERRUPTIBLE1//可被中断睡眠状态#defineTASK_UNINTERRUPTIBLE2//不可中断睡眠状态#defineTASK_ZOMBIE3//僵死状态#defineTASK_STOPPED4
soboer
·
2011-04-29 09:00
linux
Linux0.11
内核--进程的调度(就绪态和运行态之间的转换)
进程的调度linux系统中,一个进程有5种可能状态,在sched.c第19行处定义了状态的标识:#defineTASK_RUNNING0//正在运行或可被运行状态#defineTASK_INTERRUPTIBLE1//可被中断睡眠状态#defineTASK_UNINTERRUPTIBLE2//不可中断睡眠状态#defineTASK_ZOMBIE3//僵死状态#defineTASK_STOPPED4
yming0221
·
2011-04-29 09:00
c
timer
linux
struct
任务
Signal
Linux0.11
内核--进程的调度(就绪态和运行态之间的转换)
进程的调度linux系统中,一个进程有5种可能状态,在sched.c第19行处定义了状态的标识:#defineTASK_RUNNING0//正在运行或可被运行状态#defineTASK_INTERRUPTIBLE1//可被中断睡眠状态#defineTASK_UNINTERRUPTIBLE2//不可中断睡眠状态#defineTASK_ZOMBIE3//僵死状态#defineTASK_STOPPED4
thecloud
·
2011-04-29 09:00
linux
任务0的内核堆栈,用户堆栈
描述任务0的内核堆栈和用户堆栈是如何产生的: 1,
linux0.11
系统共使用了4种堆栈:系统初始化时临时使用的堆栈;供内核程序自己使用的堆栈(内核堆栈),只有一个,位于系统
roma823
·
2011-04-28 11:00
Math
数据结构
struct
user
null
任务
Linux0.11
内核--指针的指针 任务结构体
在linux内核进程调度函数schedule()中定义了structtask_struct**p,它是指向指针的指针,由于linux内核中task数组定义如下: structtask_struct*task[NR_TASKS]={&(init_task.task),};/* *'schedule()'istheschedulerfunction.ThisisGOODCODE!There
yming0221
·
2011-04-26 17:00
c
linux
struct
任务
Signal
linux内核
Linux0.11
内核--指针的指针 任务结构体
在linux内核进程调度函数schedule()中定义了struct task_struct **p,它是指向指针的指针,由于linux内核中task数组定义如下: struct task_struct *task[NR_TASKS] = { &(init_task.task), }; /* * 'schedule()' is the scheduler function
soboer
·
2011-04-26 17:00
linux
Linux0.11
内核--指针的指针 任务结构体
在linux内核进程调度函数schedule()中定义了struct task_struct **p,它是指向指针的指针,由于linux内核中task数组定义如下: struct task_struct *task[NR_TASKS] = { &(init_task.task), }; /* * 'schedule()' is the scheduler function
thecloud
·
2011-04-26 17:00
linux
Linux0.11
内核--进程的结束
进程的结束结束一个进程,就是要释放该进程所有的结构和资源,让系统从此之后再也感觉不到它的存在。如前面所说的,一个进程的结构包括:task[]数组中一项,指向了该进程的task_struct和内核堆栈所在页面;GDT中两项,一项是TSS描述符,一项是LDT描述符;若干页目录项和若干页表。一个进程拥有的资源包括:进程拥有的所有物理页面(包括页表和task_struct所占页面);进程打开的所有文件。G
soboer
·
2011-04-19 22:00
linux
Linux0.11
内核--进程的结束
进程的结束结束一个进程,就是要释放该进程所有的结构和资源,让系统从此之后再也感觉不到它的存在。如前面所说的,一个进程的结构包括:task[]数组中一项,指向了该进程的task_struct和内核堆栈所在页面;GDT中两项,一项是TSS描述符,一项是LDT描述符;若干页目录项和若干页表。一个进程拥有的资源包括:进程拥有的所有物理页面(包括页表和task_struct所占页面);进程打开的所有文件。G
yming0221
·
2011-04-19 22:00
linux
工作
shell
struct
代码分析
Warnings
Linux0.11
内核--进程的结束
进程的结束结束一个进程,就是要释放该进程所有的结构和资源,让系统从此之后再也感觉不到它的存在。如前面所说的,一个进程的结构包括:task[]数组中一项,指向了该进程的task_struct和内核堆栈所在页面;GDT中两项,一项是TSS描述符,一项是LDT描述符;若干页目录项和若干页表。一个进程拥有的资源包括:进程拥有的所有物理页面(包括页表和task_struct所占页面);进程打开的所有文件。G
thecloud
·
2011-04-19 22:00
linux
linux0.11
引导启动程序目录boot/分析
boot/包含三个汇编文件:bootsect.s,setup.s,head.s。bootsect.s程序是磁盘引导块程序,编译后会驻留在磁盘的第一个扇区中(引导扇区,0磁道,0磁头,第一个扇区),在PC加电ROM-BIOS自检后,将被BIOS加载到内存0X7C00处执行。setup.s程序主要用于读取机器的硬件配置参数,把内核模块system移动到适当的内存位置处。head.s程序会被编译
roma823
·
2011-04-18 11:00
编程
c
linux
汇编
System
磁盘
Linux0.11
内核--内核态与用户态
内核态与用户态intelx86架构的CPU分Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低。针对不同的级别,有很多的限制,比如说传统的in,out指令,就是端口的输入输出指令,在Ring0级下是可以用的,但在Ring3级下就不能用,你用就产生陷井,告诉你出错了,当然限制还有很多了,不只是这一点。操作系统下是利用这个特点,当操作系统自己的代码运行时,CPU就切成Ring
yming0221
·
2011-04-10 22:00
linux
网络
Linux0.11
内核--内核态与用户态
内核态与用户态intelx86架构的CPU分Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低。针对不同的级别,有很多的限制,比如说传统的in,out指令,就是端口的输入输出指令,在Ring0级下是可以用的,但在Ring3级下就不能用,你用就产生陷井,告诉你出错了,当然限制还有很多了,不只是这一点。操作系统下是利用这个特点,当操作系统自己的代码运行时,CPU就切成Ring
soboer
·
2011-04-10 22:00
linux
上一页
5
6
7
8
9
10
11
12
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他