- 博客(6)
- 收藏
- 关注
原创 linux0.12内核---关于内存寻址与4k边界对齐
以4G大小的物理内存为例,其可以存储4G(4,294,967,296)个字节(每个字节8bit(位)),每个字节在内存中可以看做是按照数组样式向下排列,因此要想对所有字节进行寻址,那么就需要对每个字节进行编址,类似于数组的下标,通过下标来对内存的每个字节进行访问,这就是寻址。由于2^32=4,294,967,296,所以想要寻址4G的内存,就需要一个32位的二进制数来对内存就行寻址,通常用16进制数来表示地址,1位十六进制数需要4位二进制数表示,因此32位的二进制数就可以转化为8位的十六进制来表示,也即.
2020-10-14 10:15:39
1495
原创 linux0.12内核---内存分页与线性地址到物理内存的转换
记录一下自己对于内存分页机制的理解,基于linux0.12内核,机制简单,更加有助于初学者理解。内存分段机制将逻辑地址转化为线性地址,由于分页机制,线性地址到物理地址并不是直接对应的,linux0.12内核中采用了两级页表的方式实现了对4G内存的映射。两级页表的第一级是页目录,其中每一项存储的是页表在物理内存中的存放基址。第二级是页表,其中每一项存放的是该线性地址对应的实际物理内存页的地址。如上图,线性地址划分为三个部分,分别用来寻找也目录表中的某一个页目录项,页表中的某一个页表项,以及在实际物理内
2020-10-13 15:49:34
237
原创 linux0.12内核---fork.c子进程创建理解
阅读了fork.c中程序的内容,大概总结了一下linux创建一个子进程的过程。**0.**找到当前任务数组中空闲的项task【nr】,将其标号作为子进程任务的pid号。**1.**创建任务结构体指针p,分配一页新的内存,内存顶端设为内核栈的栈顶ss0、sp0。**2.**将任务指针加入到任务数组task【nr】中。**3.**复制当前进程的任务结构内容到子进程。**4.**对复制过来的子进程的任务结构进行修改,如pid,priority等。**4.**将子进程任务的LDT描述符的选择符
2020-09-10 16:46:24
327
原创 linux0.12内核---关于GDT、LDT、GDTR、LDTR以及分段机制的个人理解
最近学习linux内核,看到描述符表这一章时,感觉理顺起来比较麻烦,就做了下面的图来帮助自己理解linux的分段、描述符表等的运行机制。GDT和LDT类似于一个数组,里面存放的元素就是一个个的描述符,描述符中含有想要查找的段的基地址,以此来定位段的位置。linux为了方便内存管理与寻址采用了全局描述符表GDT,局部描述符表LDT来进行段寻址,同时为了找到这些表在内存中的位置,又设置了GDTR全局描述符表寄存器,为了找到LDT在内存中的位置设置了LDTR局部描述符表寄存器,为了 找到GDT和LDT中描述符
2020-09-09 09:49:40
523
2
原创 linux高性能服务器编程阅读笔记/socket地址API
@linux高性能服务器编程阅读笔记/socket地址API一、字节序问题1字节=8位二进制,也就是两位的16进制,例如 11111111B=0xFFH 计算机中一个内存地址可以存放8位1个字节的数据,以一个16位的2字节整形数据,在存取这2个字节时,由于大端字节序和小端字节序的不同,我们就需要考虑4个字节取出的顺序。其中大端把高位字节存放内存低地址处,小端把高位字节放在内存高地址处。,例如采取小端存储时,对于0x0F1F的一个数据,低位字节1F存放在内存低地址处,高位字节0F存放在内存高
2020-09-06 23:16:07
138
原创 linux0.12内核---关于signal.c信号机制的一些理解
signal.c中包含进程信号处理的相关函数0.进程接收到信号后有三种处理:1)忽略该信号,但是有两种信号无法忽略 2)捕获该信号,执行自定义操作函数 3)执行系统默认的操作,一般就是结束进程。1.linux定义了一个32位的信号位图,目前只有22个有效信号,每个信号有自己的一个处理函数,进程在系统调用结束返回之前会检测有没有收到信号,并执行与信号相关的处理函数,最后才会返回到进行系统调用的地方。2.信号位图就是一个数组,数组的下标代表不同的信号,数组的元素则是对应信号的状态(未决、阻塞)。3.
2020-09-06 14:21:05
282
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人