linux内核
qweeera
zhankongjian.cn
展开
-
基于x86的Linux启动流程
bootsect加载, setup加载,system加载原创 2022-07-08 08:11:40 · 1529 阅读 · 0 评论 -
linux之 引导扇区(一)
上回说到操作系统上电到引导扇区之间的程序,但是在结尾只是随便用一个测试程序来代替引导程序(就是第一个扇区的程序),今天我们来讲讲真正的引导程序。但是在讲引导程序之前我们需要先学习FAT12文件系统,学了之后才会了解数据是如何存储在硬盘上面的(注意:是硬盘,此时数据还没有加载到内存上面)。所有的文件系统会把磁盘分为若干个层次方便组织和管理,包括 1.扇区:磁盘上最小的数据单元 2.簇:一...原创 2018-03-12 09:56:18 · 1879 阅读 · 0 评论 -
pmtest4.asm
;======================================;pmtest4.asm;编译方法:nasm pmtest4.asm -o pmtest4.bin;======================================%include "pm.inc"; 常量,宏 以及一些说明;org 07c00horg 0100h jmp LABEL_B...原创 2018-02-26 08:08:35 · 419 阅读 · 0 评论 -
特权级概述
IA32的分段机制中,特权级总共有4个,较为核心的代码放在特权级较高的层级中,这种机制避免低特权级的任务在不被允许的情况下访问高特权级的段,如果处理器检测到访问请求不合法,将会产生常规保护错误。内核是level0 服务是level1和level2,应用程序是level3处理器通过识别CPL、DPL、RPL这三种特权级进行特权级检验CPL (current privilege leve...原创 2018-02-26 09:10:12 · 1366 阅读 · 0 评论 -
linux 之 引导扇区(三)
上一节讲到在磁盘中读取属于目录条目的扇区,并在里面查找我们需要的文件名,看是否是自己需要的文件名,这一节讲讲将该文件名找到后,我们将该文件拷贝到内存中。 这里的将文件拷贝到内存和上一节讲到的有点区别,这次拷贝的文件大小不止一个扇区,所以需要用到FAT,代码如下:;-----------------------------------------------------------; 函数...原创 2018-03-18 21:27:56 · 333 阅读 · 0 评论 -
hello.asm
一个操作系统的实现 第五章第一个程序[section .data]strHello db "Hello, world!", 0AhSTRLEN equ $ - strHello[section .text]global _start_start: mov edx, STRLEN mov ecx, strHello mov ebx...原创 2018-03-18 23:02:23 · 748 阅读 · 0 评论 -
一个操作系统的是实现之C语言与汇编互相调用
bar.cvoid myprint(char* msg, int len);int choose(int a, int b){ if(a >= b){ myprint("the 1st ont \n", 13); } else{ myprint("the 2nd one \n", 13); } r...原创 2018-03-19 00:12:39 · 1104 阅读 · 0 评论 -
pmtest9.asm
pmtest9c.asm所写的中断类似与一种call 调用,更像一种异常,就是直接调用这段,而这个始终中断,类似与单片机,只需要使能之后,就可以进入中断 不需要int 80h 这样的调用;======================================;pmtest9_2.asm;编译方法:nasm pmtest9_2.asm -o pmtest9_2.bin;======...原创 2018-03-06 10:59:11 · 613 阅读 · 0 评论 -
保护模式小结
在GDT、LDT以及IDT中,每一个描述符都有自己的界限和属性等内容,是对描述符所描述对象的一种限定和保护分页机制中的PDE和PTE都含有R/W以及U/S位,提供了页级保护 页式存储的使用使应用程序使用的是线性空间而不是物理地址,于是物理内存被保护起来中断不再像是模式下一样使用,也提供特权检验等内容I/O指令不再随便使用,于是端口被保护起来在程序运行过程中,如果遇到不同特权级...原创 2018-03-06 12:49:30 · 140 阅读 · 0 评论 -
重新放置内核
将elf文件中的程序按段重新放置;initKernel ---------------------------------------------------------------------------------; 将 KERNEL.BIN 的内容经过整理对齐后放到新的位置; 遍历每一个 Program Header,根据 Program Header 中的信息来确定把什么放进内存,...原创 2018-03-23 07:26:33 · 247 阅读 · 1 评论 -
linux之 loader
前面几节大概如下流程 将boot.bin写入软驱a.img第一个扇区 dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc 上电之后,rom会自动加载第一个扇区加载到内存中并开始运行这个第一扇区中的内容就是boot.bin,boot的主要功能就是查找loader.bin文件,并加载到内存指定位置,之后跳到loader.bin...原创 2018-03-20 07:50:15 · 1655 阅读 · 0 评论 -
linux之 引导扇区(二)
上一节讲到了引导扇区的结构,这种是基于FAT12文件系统的。但是内部的引导程序却只是用打印字符串来代替,现在来加深一下代码,添加读取磁盘数据到内存的功能这个功能需要用到BIOS中断int 13h,它的用法如下 可以看到 ah = 02h 时,int 13h 可以进行读取磁盘扇区功能。在这里需要先了解一下磁盘的一些基础知识磁盘由N个盘片组成,每个盘片一般有两面,一面一个磁头(hea...原创 2018-03-13 23:23:34 · 847 阅读 · 0 评论 -
内核(一)
上节已经写到跳到内核程序入口地址,接着来看看内核中的代码#include "type.h"#include "const.h"#include "protect.h"PUBLIC void* memcpy(void* pDst, void* pSrc, int iSize);PUBLIC void disp_str(char * pszInfo);PUBL...原创 2018-03-24 08:08:22 · 213 阅读 · 0 评论 -
一份比较全的Makefile
#Makefile for boot#programs , flags, etcENTRYPOINT = 0x30400ENTRYOFFSET = 0X400ASM = nasmDASM = ndisasmCC = gccLD = ldASMBFLAGS = -I boot/include/ASMKFLAGS = -I...原创 2018-03-24 08:10:47 · 260 阅读 · 0 评论 -
linux之跳入保护模式+启动分页机制
以前的代码需要一段初始化SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT ;初始化16位的代码段描述符 xor eax, eax mov ax, cs shl eax, 4 add eax, LABEL_SEG_CODE16 mov word [LABEL_DESC_COD...原创 2018-03-21 08:11:18 · 628 阅读 · 0 评论 -
Linux之进程(一)
进程切换 本质:任务中断时将堆栈指针指向另外一个堆栈B,该堆栈中保存有B进程运行时,cpu 各类寄存器状态,当利用iretd返回时,CPU的寄存器值会被堆栈B中的状态填充,变成了进程B的状态,sp指针也指向任务B,此时任务跳到了B中,完成了任务切换今天讲述的是一个比较简陋的进程切换,步骤如下 1.进程表初始化 2.调用restart()函数。int kernel_main(){...原创 2018-04-21 14:12:40 · 211 阅读 · 0 评论 -
pmtest9c.asm
8259A的初始化 中断向量表的建立;======================================;pmtest9c.asm;编译方法:nasm pmtest9c.asm -o pmtest9c.bin;======================================%include "pm.inc"; 常量,宏 以及一些说明;org 07c00h...原创 2018-03-03 21:43:51 · 259 阅读 · 0 评论 -
pmtest8.asm 笔记
pmtest8.asm的功能,先执行某个线性地址处的模块,然后通过改变cr3来转换地址映射关系,再执行同一个线性地址处的模块,由于地址映射已经改变,所以两次得到的应该是不同的输出LABEL_DESC_FLAT_C: Descriptor 0, 0fffffh,DA_CR|DA_32|DA_LIMIT_4K ;0-4G LABEL_DESC_FLAT_RW: ...原创 2018-03-03 12:52:19 · 570 阅读 · 0 评论 -
unix绝对路径与相对路径
Unix的每个进程都有一个当前工作目录,它属于进程执行上下文,标识出进程所用的当前目录。为了标识一个特定的文件,进程使用路径名,路径名由斜杠及一系列指向文件的目录名交替组成。如果路径名的第一个字符是斜杠,那么这个路径是所谓的绝对路径,因为他的起点是根目录。否则,如果第一项死目录名或文件名,那么这个路径就是所谓的相对路径,因为他的起点是进程的当前目录。当标识文件名时,也用符号原创 2016-08-31 20:24:23 · 3364 阅读 · 0 评论 -
逻辑地址、线性地址、物理地址区别
本文转自http://blog.csdn.net/erazy0/article/details/6457626一、逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。我们写个最简单的hello world程序,用gcc编译,再反汇编后会看到以下指令:mov 0x80495b0, %eax...转载 2016-08-31 22:56:03 · 11711 阅读 · 1 评论 -
Linux 0.11系统环境搭建(windows下)
1. 下载boch 2.4 https://sourceforge.net/projects/bochs/files/bochs/下载linux-0.11内核 http://www.oldlinux.org/Linux.old/Linux-0.11/sources/system/ http://www.oldlinux.org/Linux.old/images/ http://www原创 2018-01-31 18:48:58 · 647 阅读 · 0 评论 -
install Bochs in ubuntu
bochs虚拟机终于花了一天时间安装好了 由于跟着《一个操作系统的实现》来安装的,所以开始的时候是安装的bochs-2.3.5版本,但是在configure的时候,一直卡死在 ERROR: X windows gui was selected, but X windows libraries were not found.无论按照网上的怎么安装org-dev 还是libx11-de原创 2018-02-01 15:11:14 · 228 阅读 · 0 评论 -
linux之 电脑上电到引导扇区之间流程
程序在上电之后,内存中什么都没有,Intel将所有CPU的硬件都设计为加电即进入16位实模式状态运行,同时将CPU的硬件逻辑设计为加电瞬间强行将CS的值置为0xf000,IP的值置为0xfff0,这样CS:IP就指向0xFFFF0这个地址,这个地址就是BIOS的入口地址 程序自动从这里开始执行,内存在刚上电时,里面是没有东西的,程序怎么能运行呢?这个地址究竟指向什么呢?指向RomBIOS...原创 2018-02-02 09:30:56 · 220 阅读 · 0 评论 -
一个操作系统的实现----不同特权级之间的转移
程序转移的发生,可以由指令jmp call ret sysenter sysexit int n 或 iret引起,也可以由中断和异常机制引起,这个arm单片机有区别,arm单片机的任务切换的实质就是中断。jmp和call指令可以实现下列4种转移 1.目标操作数包含目标代码段的段选择子 2.目标操作数指向一个包含目标代码段选择子的调用门描述符 3.目标操作数指向一个包含目标代...原创 2018-02-26 09:58:55 · 334 阅读 · 0 评论 -
sudo mount -o loop pm.img /mnt/floppy
最近在学《一个操作系统的实现》,由于这本书比较老了,所以有一些对于软盘的操作指令现在用会出现一些错误,当我进行虚拟软盘的挂载时 sudo mount -o loop pm.img /mnt/floppy会出现了错误 mount point /mnt/floppy does not exist我用mkdir指令在mnt目录下生成一个floppy 也不行,最后看到了一篇帖子原创 2018-02-06 08:18:57 · 3529 阅读 · 1 评论 -
pmtest5a.asm
此代码用作从高特权级0跳到低特权级3,通过ret指令实现,在ret指令执行前,堆栈中应该已经准备好了目标代码的cs eip ss 以及 esp 这是通过push 指令来实现;======================================;pmtest5.asm;编译方法:nasm pmtest5.asm -o pmtest5.bin;==============...原创 2018-02-26 13:21:51 · 311 阅读 · 0 评论 -
实模式到保护模式的转变
;======================================;pmtest1.asm;编译方法:nasm pmtest1.asm -o pmtest1.bin;======================================%include "pm.inc"; 常量,宏 以及一些说明;org 07c00horg 0100h jmp LABEL_B原创 2018-02-06 11:28:07 · 276 阅读 · 0 评论 -
pmtest5.asm
从0特权级跳到3特权级 这个在pmtest5a.asm就已经实现了,通过压栈cs eip ss 以及 esp 然后ret直接跳转到特权级3的代码段 LABEL_DESC_CODE_RING3 打印3从特权级3调用门 此时需要保证门的DPL为3 ,特权级3才能访问到,此时跳到门的代码段中 LABEL_CALL_GATE_TEST 中 这个门指向SelectorCodeDest选择子...原创 2018-02-27 10:18:04 · 355 阅读 · 0 评论 -
pmtest2.asm
最近在学一个操作系统的实现,由于是电子书,没有完整的源代码,只能自己慢慢解决bug构建还原,这个是书中pmtest2.asm可实现的完整版;======================================;pmtest2.asm;编译方法:nasm pmtest2.asm -o pmtest2.bin;=====================================...原创 2018-02-16 16:51:06 · 682 阅读 · 0 评论 -
pmtest6.asm
这个代码的功能是写了一个分页机制,还有书中的一个bug 解决pmtest6.asm不能返回到实模式的问题;======================================;pmtest6.asm;编译方法:nasm pmtest6.asm -o pmtest6.bin;======================================%include "pm.i...原创 2018-02-28 14:33:02 · 418 阅读 · 0 评论 -
pmtest3.asm
本段代码的用意是让我们了解一下LDT(局部描述符表),与GDT差不多,只不过选择子TI位必须置为1,运用他时,需要先用lldt指令加载ldtr,lldt操作数是gdt中用来描述ldt的描述符,这个例子只是在ldt中添加一个代码段LABEL_CODE_A,若是添加数据段和堆栈段,可以将一个单独的任务封装在一个LDT中,这个就是多任务处理器的雏形保护模式下的分段机制 我们可以看到实模式(16位)...原创 2018-02-20 10:26:09 · 339 阅读 · 0 评论 -
pmtest7.asm
1.如何由内存推出页表数量 假设内存空间为32MB, 由于每个页是4KB, 则我们需要8K个页表,而每个页表实际占4个字节,所以一共是页表所占内存为32KB分配内存依然是从零开始的,但是里面有一些内存是不能用的,我们只能说自己线性地址指向的内存有部分可用,可用的最大值的地址是01FF0000h, 所以说可以用的内存都被指向到了;====================...原创 2018-03-02 17:02:34 · 504 阅读 · 1 评论 -
pmtest8.asm
有个bug 找了半天,以前的代码都是 LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C| DA_32; 现在的代码却是 LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_CR| DA_32; 非一致代码段就因为这个原因导致程序出...原创 2018-03-03 12:49:21 · 593 阅读 · 1 评论 -
linux内核_目录介绍(1)
linux目录是源代码的主目录,在该主目录下包括所有的14个子目录,还有唯一的一个Makefile文件。目录结构如下图这个Makefile文件是编译辅助工具软件make的参数配置文件。make工具软件的主要用途是通过识别哪些文件已被修改,从而自动的决定在一个含有多个源程序的文件的程序系统中哪些文件需要被重新编译。因此make工具软件是程序项目的管理软件。接下来进原创 2016-08-28 21:51:29 · 349 阅读 · 0 评论