网上搜索了一圈,才觉得查看GDT、IDT、TSS这些应该是属于内核调试的。...表之间的关系……我用的是他下面提到的另一种查看方式:即先使用!...,那既然查看GDT是这样,那查看IDT、TSS不是也可以dd后面加它们对应的后面的数字就可以了嘛。...80008954 8003f060 2f40ffff 00009302 80003fff 0000920b 8003f070 700003ffff0092ff 0000ffff 80009a40 查看IDT表:...网上还有很多博客的方法说可以用r idtr来查看idtr寄存器中保存的idt表地址,但是我使用时都出现Bad register error in 'r idtr'。
内核知识第六讲,内核编写规范,以及获取GDT表 一丶内核驱动编写规范 我们都知道,在ring3下,如果我们的程序出错了.那么就崩溃了.但是在ring0下,只要我们的程序崩溃了.那么直接就蓝屏了...四丶设置内核代码运行的CPU在那个核心上跑.并获取出来每个核心的GDT表....nCount & shift);//设置在那个线程跑 __asm { sgdt szGDT } KdPrint(("limit:%p GDT
GDT,LDT,GDTR,LDTR 前言 全局描述符表GDT 局部描述符表LDT 中断描述符表IDT 段选择子 任务寄存器TR 实例 1:访问GDT 2:访问LDT ---- 前言 所谓工作模式,是指CPU...---- 全局描述符表GDT 全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张,GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,...GDTR中存放的是GDT在内存中的基地址和其表长界限。...GDT表在内存中的起始地址,表长度指明GDT表的字节长度值。...我们可以这样理解GDT和LDT:GDT为一级描述符表,LDT为二级描述符表。
二、详解 先说明一下概念 (1)全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,...GDTR中存放的是GDT在内存中的基地址和其表长界限。 基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。...然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址,段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。...我们可以这样理解GDT和LDT:GDT为一级描述符表,LDT为二级描述符表。如图 ? 局部描述符表LDT LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。...它引用GDT表中的一个TSS类型的描述符。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。
一丶段描述符 1.1 GDT与LDT 1.1.1 段描述符之GDT表 与 LDT表的概述 GDT表 查询inter手册可以得知. 当我们在保护模式下. 进行内存访问的时候 所有的内存访问....以上就是对GDT表或者 LDT表的描述 总结来说 GDT或者LDT 就是一块内存. 也可以看成一个数组....来表示 GDT表中的8192个描述符的某一项. 由此可以得知.GDT表不会超过 8192项 索引值 * 8 来索引 段描述符 由此可以得知....占用了8个字节大小 是GDT表或者LDT表中的一个数据结构 其实上面也说了当进行内存访问的时候,段选择子 当索引 查询GDT表.来得出段描述符表. 段描述符表示了 段基地址 段的大小 访问权限....总结与实验 总结1 GDT的操作 1.1 获取GDT数组表.输出所有段描述符 遍历获取GDT表 只是获取GDT表的首地址.
从2.2 版开始,Linux 让所有的进程(或叫任务)都使用相同的逻辑地址空间,因此就 没有必要使用局部描述符表LDT。...linux的GDT Linux 在启动的过程中设置了段寄存器的值和全局描述符表GDT 的内容,段的定义在include/asm-i386/segment.h 中: #define __KERNEL_CS...因为没有使用LDT,因此,TI=0,并把这4 个段都放在GDT 中, index 就是某个段在GDT 表中的下标。...全局描述符表的定义在arch/i386/kernel/head.S 中: ENTRY(gdt_table) .quad 0x0000000000000000 /* NULL descriptor...按Intel 的规定,每个进程有一个任务状态段(TSS)和局部描述符表LDT,但Linux 也 没有完全遵循Intel 的设计思路。
Intel设计的本意是,一些全局的段描述符,就放在“全局段描述符表(GDT)”中,一些局部的,例如每个进程自己的,就放在所谓的“局部段描述符表(LDT)”中。...另一方面,其它某些硬件平台,没有二次转换的概念,Linux也需要提供一个高层抽像,来提供一个统一的界面。所以,Linux的段式管理,事实上只是“哄骗”了一下硬件而已。...按照Intel的本意,全局的用GDT,每个进程自己的用LDT——不过Linux则对所有的进程都使用了相同的段来对指令和数据寻址。即用户数据段,用户代码段,对应的,内核中的是内核数据段和内核代码段。...——不过Linux并没有完全享受这种福利,它的页表目录和与已分配页面相关的页表都是常驻内存的。...——不过Linux并没有完全享受这种福利,它的页表目录和与已分配页面相关的页表都是常驻内存的。
路由表用于决定数据包从哪个网口发出,其主要判断依据是目标IP地址 Linux路由表其实有2个主要概念:按顺序走路由策略,在路由策略对应的路由表中匹配规则 路由策略(rule) 路由表(table) ?...查看所有的路由策略,32766那个策略最有用,对应的main路由表也是默认展示的路由表 ip rule list 0: from all lookup local 32766: from...all lookup main 32767: from all lookup default 查看main路由表 ip route list table main default via 10.105.0.1
1.全局描述符表(GDT) 全局描述符表GDT(Global Descriptor Table),除了任务门,中断门和陷阱门描述符外,包含着系统中所有任务都共用的那些段的描述符。...Linux 在启动的过程中设置了段寄存器的值和全局描述符表GDT 的内容,段寄存器的定义在include/asm-i386/segment.h 中: #define __KERNEL_CS 0x10 /...因为没有使用LDT,因此,TI=0,并把这4 个段描述符都放在GDT中, index 就是某个段描述符在GDT 表中的下标。...TSS 描述符存放在GDT 中,它是GDT 中的一个表项,由中断描述符表(IDT)中的任务门(存放TSS段的选择符)装入TR来进行索引。...Linux 采用三级分页模式而不是两级。如图2.28 所示为三级分页模式,为此,Linux定义了3 种类型的表。
是一个表格中表项的号码,这个表,有可能是全局描述符表GDT,也有可能是局部描述符表LDT。 那到底是哪个表?是由段选择子从低到高的第三位来决定的,如果这一位是0,则是GDT,否则就是LDT。...:GDT 特权级:Ring3 十六进制:0023 二进制:0000000000100 0 11 段序号:4 表类型:GDT 特权级:Ring3 也就是说,cs段指向的是GDT中的第3个表项,其他三个寄存器指向的是...以上是Windows的情况,我们再来看一下Linux情况呢。...:GDT 特权级:Ring3 十六进制:002B 二进制:0000000000101 0 11 段序号:5 表类型:GDT 特权级:Ring3 Linux下我没有找到可以直接用什么命令或者工具查看GDT...Windows和Linux都选择了通过这种方式架空了CPU的分段内存管理机制。
例如:在保护模式下的段选择器,我们一直都只把它看做一个段描述符的"索引号",用来在 GDT (全局描述描述符表) 中查找一个段描述符,例如: 图中:代码段寄存器中的索引号是 4 ,GDT 中每一个表项占用...因此,我们需要纠正之前的错误:段寄存器中,不仅仅有段的索引号,还有另外两个属性:TI 和 RPL,如下图所示: TI 标志位:表示到哪个表中(GDT or LDT)查找描述符; TI = 0: 到...LDT:局部描述符表 在上一篇文章中,操作系统把应用程序从硬盘读取到内存中之后,为应用程序创建了三个段描述符,这三个段描述符都放在了 GDT 表中,这是不合理的。...在 Linux 应用层,我们会严格的区分进程、线程,但是在系统的底层,这样的区分界限已经比较模糊了,用任务 task 来称呼更通用些。...,映射的都是操作系统的内存空间,按照 Linux 中的做法,3G ~ 4G 空间被操作系统使用。
然后 OS 利用这个段索引号,去查找 GDT 表,从而找到每一个段的基地址以及其他一些保护信息。...这个准备工作中,最重要的就是:建立 GDT 这个表,并且把 GDT 的开始地址,存储到寄存器 GDTR 中。...确定 GDT 的地址 在创建段描述符之前,需要先确定: 把 GDT 表放在内存中的什么位置? 暂且就把它放在 0x0001_0000 这个地址吧,距离零地址 64K 的位置。...想象一下:每执行一条指令,都会从逻辑地址中,获取到段索引号,然后去查找 GDT 表,从而定位到段的基地址。 大家都知道程序有个“局部性”原理,也就是连续执行的代码,都是集中在一段连续的程序空间中的。...如果把之前的这几篇文章都理解了,再去看 Linux 内核的相关书籍,就不会那么吃力了。 Linux 虽然很复杂,但是它也是建立在处理器所提供的基本功能上的。
---- 我们希望自己的操作系统内核至少应该在Linux下用GCC编译链接。 Loader要做的事有两件:加载内核入内存、跳入保护模式。...---- 在Linux下用汇编写程序 示例: ;hello.asm [section .data] ; 数据在此 strHello db "Hello, world!"...0 mov eax, 1 ; sys_exit int 0x80 ; 系统调用 编译链接方法: (ld 的‘-s’选项意为“strip all”) 去掉符号表等内容...现在的内存分布式这样的:0x90000开始的63KB留给了Loader.bin,0x80000开始的64KB留给了Kernel.bin,0x30000开始的320KB留给了整理后的内核,而页目录和页表被放置在了...在start.c中,我们成功的把gdt_ptr的值修改了,让它的基地址字段等于在start.c中定义的gdt数组变量。 memcpy把在loader.asm中定义的GDT表复制给gdt数组了。
本文以linux0.11版本为基础,分析进程的内存布局,现代版本已经发生比较大的变化,都是很多原理都是类似的。...设置线性地址到ldt的描述符中 set_base(p->ldt[1],new_code_base); set_base(p->ldt[2],new_data_base); // 把父进程的页目录项和页表复制到子进程...有自己独立的页表,和父进程共享物理地址。那么当这个进程被调度的时候,他会发生什么。...结构体数组,然后根据当前段的属性,比如代码段,则从cs中取得选择子,系统从ldt表中取得进程线性空间的首地址、限长、权限等信息。...用线性地址的首地址加上ip中的偏移,得到线性地址,然后再通过页目录和页表得到物理地址,物理地址还没有分配则进行缺页异常等处理。
公众号:【IOT物联网小镇】,专注于:C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】,获取 Linux、嵌入式领域经典书籍。...bootloader 跳转到操作系统 在上一篇文章中,讨论了 bootloader 在进入保护模式之后,在地址 0x0001_0000 处创建了全局描述符表(GDT),表中创建了 3 个段描述符:...我们可以联想一下: 现代 Linux 系统中 ELF 文件的格式,在文件头部中记录了每一个段的长度,具体解析请参考这篇文章:Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索...PS: 在现代操作系统中,应用程序都会有一个自己私有的局部描述符表 LDT,专门存储应用程序自己的段描述符。 还记得之前讨论过的下面这张图吗?...此时的 GDT 就是下面这样: 从这张图中已经可以看出一个问题了: 如果所有应用程序的段描述符都放在全局的 GDT 中,当应用程序结束之后,还得去更新 GDT,势必给操作系统的代码带来很多麻烦。
这个数据结构就是GDT(全局符号表), 其中的表项叫做描述符(Descriptor),另外有一个指向描述符的指针叫做选择子(Selector)。...这样CPU就能知道GDT这张表了,之后的内存寻址就会根据这张表的指示去找了。 ; 加载 GDTR lgdt [GdtPtr] 3、实模式下的善后工作和保护模式下的初始化工作。...LABEL_SEG_CODE32: mov ax, SelectorVideo ;... ---- LDT(Local Descriptor Table) LDT跟GDT类似,都是描述表...Linux内核中并没有用到调用门。 门调用过程: ? 通过调用门进行控制转移的特权级检查: ?...分段和分页操作都使用驻留在内存中的表来指定它们各自的变换信息。这些表只能由操作系统访问,以防止应用程序擅自修改。
[root@aoi ~]# cat 99 #!/bin/bash for i in `seq 1 9` do for n in `seq 1 9` do ech...
最近看到这个github仓库flash-linux0.11-talk,觉得还算是蛮有意思的,加上网络编程的课程又有抄写一段tcp协议实现代码或者交一篇linux内核源码阅读的笔记,还是比较讨厌这种低效率的抄写的所以就想写篇文章记录一下粗浅阅读源码后的大概了解...进入linux内核前的准备 开机 如果问电脑是如何一步一步开始运行操作系统的,那么第一件事情当然是按下开机键啦。...,所以全局描述符表gdt的内存地址是用0x90200 + gdt描述的。...我们把gdt_48赋值给gdtr寄存器,gdt_48中存储的又恰好是gdt表的地址,那么我们就可以通过gdtr寄存器找到gdt了,现在让我们来看一下gdt标签的内容是啥。...继续看head.s,两个call语句设置了中断描述符表IDT和全局描述符表GDT,然后后面又是重新执行了一遍前面的代码,为什么要重新设置段寄存器的值呢?
Linux下mysql可以通过“ALTER TABLE 旧表名 RENAME [TO] 新表名;”语句来修改表名;还可以通过配置my.cnf文件,修改“lower_case_table_names”选项的值为...“1”来设置表名不区分大小写。...Linux下mysql设置表名 在 MySQL 中,可以使用 ALTER TABLE 语句来实现表名的修改。...,因此修改名称后的表和修改名称前的表的结构是相同的。...用户可以使用 DESC 命令查看修改后的表结构, Linux下Mysql设置表名不区分大小写 Linux下的MySQL默认是区分表名大小写的 通过如下设置,可以让MySQL不区分表名大小写: 1、用root
领取专属 10元无门槛券
手把手带您无忧上云