![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux内核研究
daiguoliangfirst
一个用理智压制自己的感情的人
展开
-
AT&T汇编格式
因为在linux的内核中,很多跟底层硬件接触的都使用汇编语言,但是Linux不仅使用一种汇编语言,除了Intel的汇编语言之外,还是用AT&T的汇编语言,因此可以说这两个是一个基础,Intel的汇编相信很多学计算机的人都学习过,但是AT&T的就不一定了,个人认为他们的思想都是一样的,只不过是语法不同,初级学习可以看如下的文章(文章转自http://blog.chinaunix.net/u1/59572/showart_1148334.html)一、AT&T 格式Linux 汇编语法格式 在 AT&T 汇编原创 2010-08-07 23:56:00 · 386 阅读 · 0 评论 -
Linux 1.1的出错编号个人注释
<br /><br />#ifndef _ERRNO_H<br />#define _ERRNO_H<br /> <br />/*<br /> * ok, as I hadn't got any other source of information about<br /> * possible error numbers, I was forced to use the same numbers<br /> * as minix.<br /> * Hopefully these are posix or原创 2010-08-14 15:22:00 · 211 阅读 · 0 评论 -
Linux0.11中的head.s代码分析
<br />本文转载自:http://aoqingy.spaces.live.com/blog/cns!153C2D72AF27EB1C!153.entry?ppud=4&wa=wsignin1.0&sa=513325281head.s程序被编译后,会被连接成system模块的最前面位置,它被setup.s加载到内存绝对地址0处开始的地方,并执行。此时Linux内核已经完全在保护模式下运行。head.s的主要功能包括:<br />1. 设置内核堆栈;<br />2. 设置中断描述符表idt;<br />3.转载 2010-08-13 23:39:00 · 409 阅读 · 0 评论 -
Linxu进程信号
SIGHUP 终止进程 终端线路挂断SIGINT 终止进程 中断进程SIGQUIT 建立CORE文件终止进程,并且生成core文件SIGILL 建立CORE文件 非法指令SIGTRAP 建立CORE文件 跟踪自陷SIGBUS 建立CORE文件 总线错误SIGSEGV 建立CORE文件 段非法错误SIGFPE 建立CORE文件 浮点异常SIGIOT 建立CORE文件 执行I/O自陷SIGKILL 终止进程 杀死进程SIGPIPE 终止进程 向一个没有读进程的管道写数据SIGALARM 终止进程 计时器到时SI转载 2010-08-14 18:44:00 · 266 阅读 · 0 评论 -
内核中关于进程(任务)的一些调度函数(1)
<br />在1.1版本中,内核调度主要是/kernel/sched.c文件<br />1 show_task函数,主要用来显示任务的pid,state和内核堆栈空闲字节数<br /><br />void show_task(int nr,struct task_struct * p)<br />{<br />int i,j = 4096-sizeof(struct task_struct);//4096这个数字的来源在于在intel保护模式下面,每页的大小是2^12,也就是4096<br /> <br /原创 2010-08-15 21:23:00 · 318 阅读 · 0 评论 -
任务(也可以理解为进程)数据结构
<br /> 注意:内核版本1.1struct task_struct {<br />long state; // 任务的运行状态(-1不可运行,0可运行(就绪),>0已停止)。<br />long counter; // 任务运行时间计数(递减)(滴答数),运行时间片。<br />long priority; // 优先数。任务开始运行时counter=priority,越大运行越长。<br />long signa原创 2010-08-15 19:58:00 · 172 阅读 · 0 评论 -
中断描述符表
<br /><br />3.1.4中断描述符表<br />在实地址模式中,CPU把内存中从0开始的1K字节作为一个中断向量表。表中的每个表项占四个字节,由两个字节的段地址和两个字节的偏移量组成,这样构成的地址便是相应中断处理程序的入口地址。但是,在保护模式下,由四字节的表项构成的中断向量表显然满足不了要求。这是因为,除了两个字节的段描述符,偏移量必用四字节来表示;‚要有反映模式切换的信息。因此,在保护模式下,中断向量表中的表项由8个字节组成,如图3.2所示,中断向量表也改叫做中断描述符表IDT(Inter转载 2010-08-10 17:23:00 · 393 阅读 · 0 评论 -
intel的分页单元(保护模式)
注:这篇文章翻译自Intel的manual,Intel Overview Of the Protected Mode.pdf,中的Paging Unit部分.Intel架构中分页机制的引入使Intel增强了他的虚拟内存管理,并且支持了多线程,多任务.使用intel的CPU并不一定要使用他的分页机制.1.分页机制的是怎么工作的当开启了CR0寄存器的PG位的时候分页机制就开启了,如果PG位开启的话,段生成的地址将会通过分页单元,分页单元最终生成实际地址,如果PG位没有开启的话,段寄存器最终生成的地址也就是最终的原创 2010-08-10 15:03:00 · 600 阅读 · 0 评论 -
Intel CPU的内存地址定位(保护模式)
在Intel的机构中(忽略模式)中,内存的地址被表示成基地址+偏移地址,基地址,保存在段寄存器当中,叫选择器(selector),段寄存器CS,SS,DS,ES,FS,GS分别对应于不同的段,比如代码段,数据段,栈,代码段表明当前段中的数据是可执行的代码,EIP始终指向下一条要执行的指令的偏移地址.一些指令可以更改这个地址在实模式中,选择器指向的是20位中的高16位地址,而在保护模式下,selector指向的是表中的索引,成为描述符,描述符不仅拥有32位地址,还有指向的地址的一些属性,如下图如果分页单元没有原创 2010-08-10 16:34:00 · 547 阅读 · 0 评论 -
trap_init函数
<br />对于Linux的trap,我一直认为他跟windows操作系统的钩子差不多,主要用来处理硬件异常处理中断向量<br />他的源代码如下<br /><br />void trap_init(void)<br />{<br />int i;<br /> <br />set_trap_gate(0,÷_error);<br />set_trap_gate(1,&debug);<br />set_trap_gate(2,&nmi);<br />set_system_gate(3,&int3)原创 2010-08-10 12:04:00 · 364 阅读 · 0 评论 -
linux虚拟盘初始化rd_init
<br />主要看函数<br /><br />/*<br /> * Returns amount of memory which needs to be reserved.<br /> */<br />long rd_init(long mem_start, int length)<br />{<br />inti;<br />char*cp;<br /> <br />blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;<br />rd_start = (char *原创 2010-08-10 11:26:00 · 473 阅读 · 0 评论 -
trap_init函数
<br />对于Linux的trap,我一直认为他跟windows操作系统的钩子差不多,主要用来处理硬件异常处理中断向量<br />他的源代码如下<br /><br />void trap_init(void)<br />{<br />int i;<br /> <br />set_trap_gate(0,÷_error);<br />set_trap_gate(1,&debug);<br />set_trap_gate(2,&nmi);<br />set_system_gate(3,&int3)原创 2010-08-10 12:04:00 · 1020 阅读 · 0 评论 -
mem_init函数
<br />从main.c中的main函数读取下来,在上一篇已经读到了<br /><br />#ifdef RAMDISK<br />main_memory_start += rd_init(main_memory_start, RAMDISK*1024);<br />#endif<br />这一个函数已经专门写了一篇文章,那么接下去呢?<br />mem_init(main_memory_start,memory_end);<br />查看其源代码,如下<br /><br />void mem_init(原创 2010-08-10 11:43:00 · 1764 阅读 · 1 评论 -
ramdisk初始化(虚拟盘)1
在前一篇文章从main.c程序中已经执行到了虚拟盘的初始化也就是#ifdef RAMDISKmain_memory_start += rd_init(main_memory_start, RAMDISK*1024);#endif那么虚拟盘的初始化代码是怎么样的呢?可以看虚拟盘的初始化代码如下/* * Returns amount of memory which needs to be reserved. */ long rd_init(long mem_start, int length) {原创 2010-08-08 13:06:00 · 464 阅读 · 0 评论 -
1
当电脑加电之后,先进入BIOS,执行BIOS程序之后进入MBR,然后开始引导操作系统,这一过程有一些特定的地址,比如说加电之后执行0XFFFF0的地址,而这个地址一般就是BIOS地址,当然这仅仅只是一个简单的描述过程,如果想知道详细一点的,可以网上找相应的资料,赵炯博士的一些书籍跟文章都有这一方面的,大家可以找出来看看,进入操作系统之后,Linux只要先执行三个用汇编写的程序,分别在boot文件夹下,分别是bootset.s,head.s,还有setup.s对于这三个我不想写介绍,只是简单扼要的说下他们的主原创 2010-08-08 02:13:00 · 289 阅读 · 0 评论 -
Linux进程-进程的创建
<br />今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的。下面对其作一下简单的总结。<br />一、Linux进程在内存中的相关资源<br /> 很容易理解,Linux进程的创建过程就是内存中进程相关资源产生的过程,那么Linux进程在内存中有哪些相关资源呢?<br /> 1)task数组中的一项:一个指针指向进程的task_struct<br /> 2)一页内存:task_struct(Linux进程控制块)和内核态堆栈<br /> 3)页表:线型地址到物理地址的映射转载 2010-08-17 16:30:00 · 441 阅读 · 0 评论