
Linux内核
文章平均质量分 68
冰水比水冰
我是码农,却假装是程序员。
展开
-
Linux内核学习第4天
保护模式内存管理分页机制(支持虚拟存储技术) (1)虚拟存储:是一种内存管理技术,“虚拟化”线性地址空间的方法 (2)使用分页将段划分成页面(通常为4K),页面存储于物理内存或硬盘上,操作系统通过维护页表或页目录来管理,当程序访问线性地址空间的一个地址位置时,处理器会使用页目录和页表来转换为物理地址。如果访问的页面不在物理内存上,处理器会产生一个中断原创 2014-04-30 22:11:31 · 2746 阅读 · 3 评论 -
完成一个简单的时间片轮转多道程序内核代码(二)
完成一个简单的时间片轮转多道程序内核代码重要汇编代码分析 asm volatile( "movl %1,%%esp\n\t" "pushl %1\n\t" "pushl %0\n\t" "ret\n\t" "popl %%ebp\n\t" : : "c" (task[pid]原创 2015-07-10 10:29:37 · 3312 阅读 · 0 评论 -
反汇编一个简单的C程序并分析
反汇编一个简单的C程序并分析C 源码:int g(int x){ return x+1;}int f(int x){ return g(x);}int main(void){ return f(2) + 3;}汇编源码:1 g:2 pushl %ebp3 movl %esp, %ebp4 movl 8(%ebp), %eax5原创 2015-07-03 22:23:58 · 5169 阅读 · 0 评论 -
几种基本汇编指令详解
几种基本汇编指令详解常见寄存器 寄存器 16位 32位 64位 累加寄存器 AX EAX RAX 基址寄存器 BX EBX RBX 计数寄存器 CX ECX RCX 数据寄存器 DX EDX RDX 堆栈基指针 BP EBP RBP 变址寄存器 SI ESI RSI 堆栈顶指针 SP原创 2015-07-07 11:02:09 · 44616 阅读 · 3 评论 -
浅析 Linux 系统调用
浅析 Linux 系统调用用户态、内核态以及中断具有高执行级别的程序可以执行特权指令intel X86 CPU 具有4种级别:0 ~ 3Linux 只用了0和3(0表示内核态,3表示用户态)特权级的表示:使用 CS 寄存器的低2位内核态逻辑地址空间:0xc0000000以上 用户态逻辑地址空间:0x00000000 ~ 0xbfffffff中断是从用户态到内核态的一种方式,即通过系统调原创 2015-07-11 21:46:20 · 2905 阅读 · 0 评论 -
分析Linux内核创建一个新进程的过程
分析Linux内核创建一个新进程的过程进程描述进程描述符(task_struct)用来描述进程的数据结构,可以理解为进程的属性。比如进程的状态、进程的标识(PID)等,都被封装在了进程描述符这个数据结构中,该数据结构被定义为task_struct进程控制块(PCB)是操作系统核心中一种数据结构,主要表示进程状态。进程状态fork()fork()在父、子进程各返回一次。在父进程中返回子进程的 p原创 2015-07-29 12:45:40 · 2634 阅读 · 2 评论 -
分析Linux内核创建一个新进程的过程
新进程的执行源于以下前提:- dup_task_struct中为其分配了新的堆栈- 调用了sched_fork,将其置为TASK_RUNNING- copy_thread中将父进程的寄存器上下文复制给子进程,保证了父子进程的堆栈信息是一致的- 将ret_from_fork的地址设置为eip寄存器的值最终子进程从ret_from_fork开始执行原创 2015-07-29 12:43:09 · 3872 阅读 · 3 评论 -
分析system_call中断处理过程
分析system_call中断处理过程使用gdb跟踪分析一个系统调用内核函数(以 sys_chmod为例)启动调试内核qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -Sgdb 调试另开 shellgdb(gdb) file linux-3.18.6/vmlinux #在 gdb 界面中 targ原创 2015-07-19 09:40:52 · 3109 阅读 · 0 评论 -
技术干货分享
这篇文章中的大部分书籍、网站、博客等曾经在我的学习中给了我很大的帮助,因此把他们分享出来,希望能给更多的人以帮助,也希望大家能够继续补充,可以在后边的评论区进行补充,我会时刻进行更新。0x00 关于 C++书籍(难度递增)《C++ primer plus》《C++程序设计原理与实践 》《Effective C++ 》《C++编程规范》《C++模板元编程》《Advanced C++ Me原创 2016-03-27 14:19:00 · 7020 阅读 · 5 评论 -
PART 2: 使 Shell 能读取命令
这篇文章是《动手写 Shell》系列文章的第 <2> 篇。上篇文章中,我们已经完成了我们动手 Shell 的第一步:Shell 的提示符。在这篇文章中,我们开始使得我们的 Shell 能够开始读取命令,并且做简单的分词,将命令与参数分开。原创 2016-04-23 16:08:20 · 6395 阅读 · 0 评论 -
I 位向量的实现与应用
这篇文章是《读厚<编程珠玑>》系列博客的第一篇,我们在《编程珠玑》的第一章 - 开篇中就了解了位向量是什么,《编程珠玑》的作者使用位向量来解决了一个海量数据排序问题,这篇文章我们来深入的了解一下位向量的实现与应用。0x00 位向量是什么?位向量,也叫位图,是一个我们经常可以用到的数据结构,在使用小空间来处理大量数据方面有着得天独厚的优势。位向量,顾名思义就是「位构成的向量」,我们通常使用0来表示原创 2016-05-15 22:30:47 · 7547 阅读 · 0 评论 -
读薄《Linux 内核设计与实现》(3) - 系统调用
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 III 篇,本文主要讲了以下问题:系统调用的概念、系统调用的实现原理与过程以及如何在 Linux 中增加一个系统调用。0x00 系统调用的概念系统调用是为了和用户空间上的进程进行交互,内核提供的一组界面。应用程序通过这组界面访问硬件和其他操作系统资源完成对硬件和资源的访问控制硬件设备的抽象(提供设备的独立性)0x01 系统调用简原创 2016-06-25 10:33:49 · 6140 阅读 · 0 评论 -
读薄「Linux 内核设计与实现」(1) - 从内核出发
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第一篇,本文主要讲了两个问题:内核编程的特点以及 GNU C 在内核开发中的特点。0x00 内核编程特点无 libc 库,不能访问标准 C 文件使用 GNU C无内存保护机制慎用浮点数计算注意同步和并发可移植性考虑:保持字节顺序、64位对齐、不假定字长和页面长度0x01 GNU C内联函数:将函数展开至调用位置,省却函数调用原创 2016-06-07 02:28:16 · 6790 阅读 · 0 评论 -
读薄《Linux 内核设计与实现》(4) - 中断与同步
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 IV 篇,本文主要讲了以下问题:中断和中断处理程序的概念与实现原理、Linux 中的下半部以及内核同步方法。0x00 中断和中断处理程序I 中断中断是一种特殊的电信号,由硬件发向处理器,处理器接收到中断时,会马上箱操作系统反映,由操作系统进行处理。中断随时可以产生,因此,内核随时可能因为新到来的中断而被打断。不同的设备对应的中断不同原创 2016-06-30 22:14:22 · 5989 阅读 · 0 评论 -
读薄「Linux 内核设计与实现」(2) - 进程管理和调度
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 II 篇,本文主要讲了以下问题:进程管理的任务、进程管理与其他模块的依赖关系、进程描述符和任务队列、进程的创建、线程的实现、进程的终止、进程调度。原创 2016-06-23 02:07:01 · 5999 阅读 · 1 评论 -
读薄《Linux 内核设计与实现》(5) - 定时器、时间管理和内存管理
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 V 篇,本文主要讲了以下问题:Linux 内核中的时间概念和时间表示,硬件时钟和定时器以及时间中断和内存管理的相关知识。原创 2016-10-23 14:00:40 · 4156 阅读 · 0 评论 -
完成一个简单的时间片轮转多道程序内核代码(一)
完成一个简单的时间片轮转多道程序内核代码先上代码:myPCB.h/* * linux/mykernel/mypcb.h * * describe PCB * * by Yuanhang Luo * */ #define MAX_TASK_NUM 4#define KERNEL_STACK_SIZE 1024*8struct Thread{ unsigned lon原创 2015-07-07 23:26:47 · 2989 阅读 · 0 评论 -
跟踪分析Linux内核的启动过程
跟踪分析Linux内核的启动过程使用 gdb 跟踪调试内核使用 qemuqemu -kernel linux-3.18.6 /arch/x86/boot/bzImage -initrd rootfs.img -s -S参数:-s:在初始化时冻结 CPU-S: 为 gdb 分配1234端口gdb 调试另开 shellgdb(gdb) file linux-3.18.6/vmlinux #在原创 2015-07-10 16:18:32 · 3089 阅读 · 0 评论 -
Linux-中断和中断处理
1.中断#中断使得硬件得以发出通知给处理器,本质上是一种电信号#中断随时可以产生,内核随时会被打断#不同设备的中断不同,每个中断都通过一个唯一的数字标识,称为IRQ(中断请求)2.中断处理程序#响应中断的时候,内核会执行一个函数(中断处理程序或中断服务例程)#在Linux中,中断程序为普通的C函数3.上半部和下半部原创 2015-06-26 08:18:24 · 3238 阅读 · 0 评论 -
Linux内核学习第1天
内核编程语言和环境1. as86汇编器 语法: as[option] –o objfile srcfile.表示编译过程中的位置计数器Objfile分为三个段(区):正文段(.text):程序的执行代码和只读数据数据段(.data):可读/写的数据未初始化数据段(.bss) 2. GNU as汇编格式:as [option]原创 2014-04-22 21:14:33 · 3011 阅读 · 0 评论 -
Linux内核学习第5天
3.段选择符:是段的一个16位标识符 *段选择符结构: 请求特权级RPL(Requested Privilege Level):提供了段保护信息 表指示标志TI(Table Index):用来指出包含指定段描述符的段原创 2014-05-10 23:03:26 · 2671 阅读 · 0 评论 -
Linux内核学习第2天
80X86保护模式及其编程1. 标志寄存器:标志用于控制I/o访问、可屏蔽硬件中断、调试、任务切换、虚拟8086模式 2. 内存管理寄存器GDTR:全局描述符表寄存器IDTR:终端描述符表寄存器LDTR:局部描述符表寄存器TR:任务寄存器 3. 控制寄存器CR0:用于控制和确定处理器的操作模式以及当前执行任务的特性原创 2014-04-25 14:18:31 · 2706 阅读 · 0 评论 -
Linux内核学习第3天
保护模式内存管理内存寻址:对存储在内存中的某个数据对象的地址进行定位 80X86CPU中,一条操作由操作码和操作数组成段:一种内存寻址技术把内存分为一个或多个线性区域(段) 80X86有6个存放段选择符的段寄存器:CS、DS、ES、SS、FS、GS CS:总是用于寻址代码段,由CS 寻址代码段称为当前代码段 SS:原创 2014-04-27 15:45:48 · 2791 阅读 · 0 评论 -
Linux内核学习第6天
5.代码和数据段描述符类型 *当段描述符中S标志被置位(1),则该描述符用于代码或数据段。(位11决定是数据段还是代码段的描述符) A(Accessed)用于表示已访问 W(Write-Enable)可写 E(Expansion-direction)扩展方向原创 2014-05-13 20:58:16 · 2652 阅读 · 0 评论 -
Linux内核学习第7天
分页机制*它是80X86内存管理机制的第二部分,它在分段的基础上完成虚拟(逻辑)地址到物理地址转换的过程 *通过设置控制寄存器CR0的PG位启用分页机制 (PG=0,禁用;PG=1,启用) 固定页面大小:4K(4GB线性地址空间划分为2^20原创 2014-05-14 10:01:41 · 2561 阅读 · 0 评论 -
Linux内核学习第8天
保护 保护机制是可靠地多任务运行环境所必须的,用于各个任务之间免受干扰。 可以用于分段和分页机制 *处理器寄存器的2个比特位定义了当前执行程序的特权级(CPL) *设置控制寄存器CR0的PE标志(位0)开启分段保护机制 设置控制寄存器CR0的PG标志(位31)开启分页保护机制 段级保护 分类:原创 2014-05-27 21:29:40 · 2626 阅读 · 0 评论 -
int 0x13中断的参数传递
int 0x13中断向量所指向的中断服务程序实质上就是磁盘服务程序。用途:将指定扇区的代码加载到内存的指定位置。因此,在使用int 0x13中断时要将参数传递给服务程序:例如:将指定扇区和加载的内存位置传递给服务程序传递参数的方式:通过几个通用寄存器实现示例代码:load_setup: mov dx,#0x0000 ! drive原创 2014-07-08 21:53:57 · 3781 阅读 · 1 评论 -
16位/32位中断机制比较
16位/32位中断机制比较原理:16位中断机制:使用中断向量表32位中断机制:使用中段描述符表IDT位置:中断向量表的位置是固定的,位于内存的开始0x00000中断向量符表位置不固定,由系统设计者安排,由IDTR(IDT基地址寄存器)锁定其位置。原创 2014-07-09 00:20:57 · 3657 阅读 · 0 评论 -
Linux-进程控制中的函数
1.几个创建进程函数的对比 #fork(): 源码:#include#include#include#includeint main(){ pid_t pid; if((pid=fork())<0) { printf ("fork error!\n"); exit(1); } el原创 2014-11-07 21:33:54 · 3156 阅读 · 0 评论 -
Linux内核-进程调度
Linux内核-进程调度1.多任务#抢占式多任务:由调度程序来决定什么时间停止一个进程的运行#进程的时间片:分配给每个可运行进程的处理器时间段2.Linux的进程调度#O(1)调度程序#反转楼梯最后期限调度算法(RSDL)#完全公平调度算法(CFS)3.策略#I/O消耗型和处理器消耗型进程:原创 2014-10-24 17:00:40 · 3091 阅读 · 0 评论 -
Linux内核-系统调用
Linux内核-系统调用1.与内核通信#系统调用在用户空间进程和硬件设备之间增加了一个中间层 作用:1.为用户空间提供了一种硬件的抽象接口 2.系统调用保证了系统的稳定和安全 3.出于每个进程都运行在虚拟系统中的考虑#系统调用是用户空间访问内核的唯一手段原创 2014-10-28 10:01:28 · 2806 阅读 · 0 评论 -
Linux内核-进程管理
Linux内核-进程管理1.进程#内核调度的对象是线程,不是进程#对Linux而言,线程只是特殊的进程#进程提供两种虚拟机制:虚拟处理器、虚拟内存#创建进程通过fork()来从父进程复制创建进程2.进程描述符#任务队列:双向链表(每一项都是task_struct--->进程描述符)#Linux通过slab分配器原创 2014-10-19 13:45:11 · 3031 阅读 · 0 评论 -
写给Linux内核新手-关于Linux内核学习的误区
写给Linux内核新手-关于Linux内核学习的误区 先说句正经的:其实我没资格写这篇文章,因为自己也就一两个月以来才开始有所领悟的。因此,这里与其说是关于Linux内核学习的经验,不如说是自己的教训吧,希望不要扔鸡蛋砸我^_^ 常常有人问:我想学习内核,需要什么基础吗?Linus Torvalds本人是这样回答的:你必须使用过Linux。 这个……还是有点太泛了吧,我想转载 2014-10-19 13:34:08 · 2562 阅读 · 0 评论 -
读薄《Linux 内核设计与实现》(6) - 虚拟文件系统
这篇文章是《读薄「Linux 内核设计与实现」》系列文章的第 VI 篇,本文主要讲了以下问题:Linux 虚拟文件系统的概念、相关接口等内容。0x00 虚拟文件系统概念虚拟文件系统(VFS)为用户空间提供了文件系统接口VFS 协同不同文件系统的工作0x01 通用文件接口VFS 使得用户可以直接使用 open(), read(), write()这样的系统调用而无需考虑具体文件系统和实际物理原创 2016-11-07 21:24:03 · 4543 阅读 · 0 评论