![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
读书笔记-linux内核完全剖析--基于0.12内核
DIY-GEEKER
若有恒,何必三更眠五更起;最无益,莫过一日曝十日寒
展开
-
代码的一致性
之所以出现这个定义是因为系统要安全:内核要和用户程序分开.内核一定要安全.不能被用户程序干涉.但是有时候用户程序也需要读取内核的某些数据,怎么办呢?于是os将内核程序开辟一些可以供用用户程序访问的段.但是不允许用户程序写入数据.1.内核不用知道用户程序的数据.内核不用调用用户程序的数据.内核不用转移到用户程序中来.2.用户程序只能访问到内核的某些共享的段.我们称这些段为一致代码段转载 2013-12-29 11:55:13 · 1793 阅读 · 0 评论 -
数据缓冲区高速缓冲区学习总结1
转载:http://blog.chinaunix.net/uid-20729583-id-1884567.html下面所分析是linux早期内核的缓冲区结构,这里仅仅是为了用来了解缓冲区的基本应用,对于目前的2.6内核有着很大的区别,但是,从这里可以逐步地对linux内核进行深入学习。这里仅仅是一个简单的介绍。 一个缓冲头结构中标志了对应缓冲块的相关性质,采用缓冲头结构组来对转载 2014-02-08 10:12:07 · 2101 阅读 · 2 评论 -
linux内核0.12之MINIX文件系统初探
春节期间确实懒了,博客没有怎么更新。这节日快过了,心里却很不踏实,最近没学习啊。今天果断看点文件系统的知识。minix文件系统现在是很少用了,但是基本的东西还是不变的。本着占了茅坑就一定要拉的责任感,还是把看的东西写一写吧。基本上,一个硬盘可以如下分区:当然并非所有的硬盘都具有主引导扇区,这个要视情况而定(未必所有硬盘都具有引导功能)而minix操作系统的组成如下所示: 位原创 2014-02-04 21:56:13 · 1785 阅读 · 1 评论 -
backtrace函数的原理
大家可以看到,被调用函数当前帧指针指向调用函数的帧指针的值,而帧指针的上一个地址(ebp+4)正好是被调用函数的返回地址,依次往上找,就可以找出对应进程的调用关系。原创 2013-12-22 17:36:06 · 2793 阅读 · 0 评论 -
嵌入汇编
在嵌入式C语言中,涉及到底层的代码经常需要使用嵌入汇编。嵌入汇编的基本格式:asm("汇编语句"::输出寄存器:输入寄存器:会被改变的寄存器)原创 2013-12-21 12:00:17 · 1066 阅读 · 1 评论 -
内核阶段学习总结
其实之前就已经认真的读过《深入理解计算机系统》,尽管这本书已经写得非常的实用详细,但是一切总归是理论。没有代码,一切都如空中楼阁,不切实际。只有到最近阅读赵炯来时的《linux内核完全解析》,书中对代码的注释非常详细,对操作系统才有了质的的理解。于是有深深的感悟到,没有阅读源代码的学习是痛苦而没有成效的。于是有非常渴望看《linux内核源代码情景分析》。 不过这个不能急,毕竟软件是时间性非常强原创 2014-01-03 22:09:28 · 842 阅读 · 1 评论 -
x86系统执行的第一条指令
当计算机系统上电开机或者按了机箱上的复位按钮时,CPU会自动把代码段寄存器CS设置为0XF000,其段基址被设置为0XFFFF0000,段长度设置为64KB。而IP被设置为0FFF0,因此此时CPU代码指针指向0XFFFFFFF0处,即4GB空间最后一个64KB的最后16字节处。--赵炯的《Linux内核完全剖析》,18页。看到这里,很多人都会有这样一个疑问:在系统上电开机时,CPU应该工原创 2013-12-18 22:30:09 · 2186 阅读 · 0 评论 -
.globl伪操作符
.globl伪操作符用于定义随后的标号标识符是外部的或全局的,并且即使不使用也强制引入。那么,什么叫做即使不使用也强制引入?不解! 强制加入,那么又强制加入了什么符号呢?是最基本的.text,.data,.bss吗?原创 2014-01-02 10:19:40 · 852 阅读 · 0 评论 -
一个简单的多任务内核实例
其实赵炯老师的这个实例就是linux 0.00。麻雀虽小五脏俱全。 推荐学习内核的同学可以先看看这个。然后再搞更复杂的。原创 2014-01-01 11:37:02 · 1123 阅读 · 0 评论 -
boot.s 段限长设置
01 ! boot.s 程序02 ! 首先利用BIOS中断把内核代码(head代码)加载到内存0x10000处,然后移动到内存0处。03 ! 最后进入保护模式,并跳转到内存0(head代码)开始处继续运行。04 BOOTSEG = 0x07c0 ! 引导扇区(本程序)被BIOS加载到内存0x7c00处。05 SYSSEG = 0x1000 ! 内核(head)先加载到0x10000处,然后原创 2013-12-31 16:15:57 · 921 阅读 · 0 评论 -
进程最大可访问的虚拟内存空间
在linux0.12中,进程最大可访问的虚拟内存空间是64M.这是明确写了的。但是cpu并没有提供这种机制来定义一个进程的虚拟地址空间啊。那么是如何实现对进程虚拟地址空间的定义的? cpu至于定义段的基地址以及段限长。因此我认为内核肯定是将一个任务的放到一个段中,这种段的基地址必然是64M对齐的,而且段的长度 不能超过64M。 这只是我的个人猜测,内核的源代码还原创 2014-01-01 16:01:29 · 1446 阅读 · 0 评论 -
特权级0的代码到特权级3代码的转移之IRET指令
由 于处于特权级0的代码不能直接把控制权转移到特权级3的代码中执行,但中断返回操作是可以的,因此当初始化GDT、IDT和定时芯片结束后,我们就利用中 断返回指令IRET来启动第1个任务。具体实现方法是在初始堆栈init_stack中人工设置一个返回环境,即把任务0的TSS段选择符加载到任务寄存 器LTR中、LDT段选择符加载到LDTR中以后,把任务0的用户栈指针(0x17:init_stack)和原创 2013-12-31 22:11:13 · 2043 阅读 · 0 评论 -
对 LSS init_stack,%esp 语句的分析
转自http://blog.csdn.net/tonutu/article/details/3268321LSS init_stack,%esp . . . .file 128,4,0init_stack:转载 2013-12-31 17:16:59 · 1175 阅读 · 0 评论 -
管道文件初探
这个就是管道缓冲区文件,指针部分的成员是I节点的结构成员,按道理说,这些成员适用于指明文件在硬盘(软盘)中的位置的,怎么到这里编程内存指针了呢?且看下面一段描述:“管道分为无名管道和有名管道,其中无名管道不属于任何文件系统,只存在于内存中,它是无名无形的,但是可以把它看作一种特殊的文件,通过使用普通文件的read(),write()函数对管道进行操作, 有名管道是有名有形的,为了使用原创 2014-02-09 19:06:10 · 989 阅读 · 0 评论