linux0.11专题

Linux0.11 中全局描述符表(GDT)

在Linux内核中,全局描述符表(Global Descriptor Table,简称GDT)是一个关键的数据结构,主要用于管理处理器的内存段和相关的权限与属性。它属于x86架构中的保护模式特性,允许操作系统对内存访问进行更精细的控制。 以下是GDT在Linux内核中的主要用途: 内存段管理:GDT定义了各种内存段,如代码段、数据段、栈段等。每个段在GDT中都有一个描述符,该描述符

通过do_execve源码分析程序的执行(下)(基于linux0.11)

上篇讲了程序的加载。然后设置了eip,这一篇分析一下开始执行第一条指令的时候。会发生什么。 我们先看一下这时候的内存布局。 当cpu通过cs:eip执行第一条指令的时候。首先通过cs的值,在ldt中找到代码段的基地址,然后加上eip,得到线性地址,然后通过线性地址到页目录和页表项里找是否已经映射到物理地址了。这时候发现,还没有对应的物理地址,然后就触发缺页中断。 我们看一下缺页中断的处理。 /

通过do_execve源码分析程序的执行(上)(基于linux0.11)

execve函数是操作系统非常重要的一个函数,他使得程序变成进程成为可能。下面我们通过do_execve的实现,了解一下程序变成进程的过程。首先do_execve是一个系统调用。之前分析过系统调用的过程。这里就不详细说了。直接从sys_execve函数开始。 _sys_execve:lea EIP(%esp),%eaxpushl %eaxcall _do_execveaddl $4,%espre

linux缺页中断源码分析(基于linux0.11)

缺页中断发生在系统对虚拟地址转换成物理地址的过程中。如果对应的页目录或者页表项没有对应有效的物理内存,则会发生缺页中断。 系统在初始化的时候注册了缺页中断的处理函数。中断号是14。 // 缺页和写保护异常处理函数set_trap_gate(14,&page_fault); page_fault是汇编实现的。 _page_fault:// 交换两个寄存器的值,esp指向的位置保存了错误码x

linux copy on write源码分析(基于linux0.11)

写时复制是有一块内存,由多个进程共享,属性是只读的,当有一个进程对这块内存进行写的时候,系统会先申请一块新的内存给他写。比如进程fork的时候,父子进程对应的物理地址都一样,这时候会在页表项中记录该物理地址是只读的,有一个进程写的时候,就会触发写保护异常。执行写时复制。 在触发写保护异常的时候,处理器会给系统提供两个信息。一个在系统栈中的错误码,一个在cr2寄存器中保存的引起异常的线性地址。错误

linux信号处理源码分析(基于linux0.11)

linux的信号处理时机在系统调用结束、时钟中断处理后,硬件中断处理后,等等。这里以fork系统调用函数为例子讲解这个过程。下面是fork函数的定义。 _syscall0(int,fork) 宏展开 #define _syscall0(type,name) \type name(void) \{ \long __res; \__asm__ volatile ("int $0x80"

操作系统定时器原理分析(基于linux0.11)

操作系统的定时器原理是,操作系统维护了一个定时器节点的链表,新增一个定时器节点时,设置一个jiffies值,这是触发定时中断的频率。linux0.11版本里是1秒触发100次,即10毫秒一次。加入新增一个定时器的jiffies值是2,那经过两次定时中断后就会被执行。jiffies值在每次定时中断时会加一。 _timer_interrupt:push %ds # save ds,es and p

从linux0.11看一个进程的诞生

系统有一个GDT表。该表保存了系统和所有进程的tss和ldt描述符信息。tss就是我们平时说的进程上下文。每个进程有一个ldt数组,里面保存了代码段和数据段的描述符信息。 首先,从一个进程的诞生说起。我们知道,通过fork可以创建一个进程。下面我们来看一下fork的过程都做了什么事情。先通过find_empty_process获取一个可用的进程id和pcb。pid是进程id。pcb是管理进程的结构

linux0.11 源码阅读 head.s setup.s bootsect.s加载位置

从github上下载linux0.11源码 linux0.11源码 将0x10000处的代码往下复制到0开始的地址处。 移动后的内存布局如下 setup中存在gdt和idt的相关数据。此时需要用gdtr和idtr寄存器指向对应的数据。 实模式下,访问内存方式。最多访问1M内存。 分页模式下,计算物理地址。 开启分页后,将页目录项,页表项都设置好后,开始执行ma

linux0.11调试教程,task3概述

通过/etc/rc和/etc/update文件的运行过程,可以很好的理解sys_pause的作用和机理。 以及可以理解信号的通信机制和sys_alarm系统调用是如何起作用的。 update 会设置update所在任务的信号值SIGHUP和SIGTERM的处理句柄为SIG_IGN(忽略)。 linux-0.11调试教程,task3(01),/etc/rc文件 linux-0.11

理解linux0.11加载过程

阅读linux0.11源码Boot部分很多次了,每次看着看着就晕了,主要是因为对X86芯片和汇编不熟悉;虽然赵炯博士的<<Linux内核完全注释>>讲的非常详细,网上资料也很多,但毕竟不是自己的东西,只有用自己的思维理解了才会记忆深刻。我就试着用自己的思路,也小结一下。 0. 加载步骤: Bois->bootsect.s->setup.s->(head.s->main.c)。(head.s->m

linux0.11实验楼,哈工大oslab Linux-0.11 实验一 熟悉实验环境 实验报告

实验一 熟悉实验环境 实验报告 一、实验目标 认识实验平台和实验工具; 认识实验环境的目录结构; 掌握编译、运行、调试、文件交换等操作命令。 二、实验内容和结果 0. 了解实验平台和工具 \quad 本实验采用的环境为实验楼虚拟机平台, 主要软件环境如下: GCC 编译器。 GDB 调试器。 Ubuntu。 Bochs :一个 IA-32 (X86) 架构PC机模拟器,可以模拟出多种操作系统的环

Linux0.11内核源码解析-string待更新

sting.h头文件包含了所有的字符串操作函数 strcpy字符串拷贝函数 cld 指令用于设置方向标志位,确保字符串复制是从前向后进行。 lodsb 指令用于将 src 指针指向的字符加载到 AL 寄存器中,并将 src 指针递增。 stosb 指令用于将 AL 寄存器中的字符存储到 dest 指针指向的位置,并将 dest 指针递增。 testb %%al,%%al 指令用于将

Linux0.11内核源码解析-malloc

malloc介绍 Linux内核版本0.11中的`malloc.c`文件实现了内存分配的功能。在这个版本的Linux内核中,`malloc.c`文件包含了内核级别的内存分配函数,用于分配和释放内核中的内存。这些函数可以帮助内核管理可用的内存,并允许内核动态地分配和释放内存,以便在运行时满足不同模块或进程的内存需求。基本上,它实现了类似C标准库中的`malloc()`和`free()`函数的功能,

github linux内核代码下载,GitHub - dunjin/Linux-0.11code: 这是Linux0.11内核源代码

Linux0.11 “RTFSC – Read The Fucking Source Code :)!” –Linus Benedict Torvalds Linux系统目前发展的如火如荼不管是在嵌入式领域,还是服务器,甚至个人PC都有广泛使用,由此引无数英雄好汉相继加入学习Linux的行列,而这其中定有人想一探Linux内核的究竟。 但是现在Linux内核版本已经5.3.5的版本了,内核相当

给 Linux0.11 添加网络通信功能 (Day3: 完成 MIT6.S081 最终实验 网卡驱动(1. 安装工具链和依赖))

url: https://pdos.csail.mit.edu/6.S081/2020/labs/net.html 首先看 tools章节:https://pdos.csail.mit.edu/6.S081/2020/tools.html 浏览了一下,就是要我们安装依赖 执行以下命令 sudo apt-get install git build-essential gdb-multiarch

给 Linux0.11 添加网络通信功能 (Day4: 完成 MIT6.S081 最终实验 网卡驱动(2. 启动 xv6 net 分支))

url: https://pdos.csail.mit.edu/6.S081/2020/labs/guidance.html lab guidance 介绍了调试技巧。 这种玩意儿可得好好看看啊!!!!!!!! 我们先把 xv6 跑起来吧,待会儿再专门出个番外了解调试技巧 看 https://pdos.csail.mit.edu/6.S081/2020/labs/util.html 执行

给 Linux0.11 添加网络通信功能 (Day1: 确认 qemu-system-i386 提供了虚拟网卡)

感觉单纯读闪客的文章,以及读 Linux0.11 源码,而不亲自动手做点什么,很难学会,还是得写代码 定个大目标:给 Linux0.11 添加网络通信功能 今日的小目标:先确认 qemu-system-i386 提供了网卡功能 here we go !!! 尝试: 首先询问 chatgpt: 如何知道自己的 qemu 版本是否提供了虚拟网卡?\ 可以看到,未来要统治世界的物种给我们提