纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

技术文章C语言与操作系统的内存布局

7月27日 望北海投稿
  C语言之所以适合写操作系统,就在于它的内存布局简单:
  1,所有的全局变量都被常量初始化,
  2,不需要运行时的状态,
  3,也不需要在main()函数之前运行额外的初始化代码。
  操作系统的初始化是很复杂的。
  在C语言写成的内核main()函数运行之前,操作系统要运行一段很复杂的汇编代码,以完成内核的内存初始化。
  这段汇编代码包含着很多重要的内核全局数据,它是由内核作者精心定制的,没法由编译器自动生成。
  对于内核程序员来说,编译器做的事越少越好,但是又不能像汇编器那么少〔捂脸〕
  C语言适合写操作系统,我觉得跟丹尼斯里奇发明它的目的就是为了写Unix有关:不好用的地方已经被优化过了。
  1970年,丹尼斯里奇怎么一边改unix系统的代码、一边改cc编译器的代码的咱就不回忆了。
  这里说说C语言和操作系统的内存布局。
  1,C语言的内存布局,
  C语言编译连接之后的可执行文件,分为:
  1)代码段(。text),
  2)只读数据段(。rodata),
  3)数据段(。data),
  4)堆(heap),
  5)栈(stack),
  其中需要存储在文件里的只有前3个,
  后2个在进程运行期间是动态变化的临时数据,并不需要存储在文件里。
  代码段的权限是只读可执行,
  只读数据段的权限是只读,
  数据段、堆、栈的权限都是可读可写的,但不能运行。
  如果系统内核发现了进程的内存权限是错误的,那么就是段错误:信号是SIGSEGV。
  (hello)1;
  这种代码肯定是段错误的,因为常量字符串位于只读数据段,它的内容是不可写的。
  通过缓冲区溢出来覆盖栈的返回地址的黑客代码,也会被系统内核发现运行地址不在代码段,所以也是段错误。
  2,内核的内存布局,
  内核的内存布局,包含这几个重要的全局数据:
  1)内核页表,
  它是内核的虚拟内存与物理内存的映射。
  在开启分页机制之前,就要设置好内核页表的前几页:
  至少要把内核代码所在的内存空间映射到页表里,否则开启分页机制时就直接出错了。
  在32位机上,它是由页目录页表构成的2级数组:
  页目录里的每一项记录每个页表的物理地址,页表里的每一项记录每个内存页的物理地址。
  在64位机上页表的结构更为复杂,intel手册上有:我没仔细看过,有兴趣的可以看看。
  1个内存页是4096字节,所以物理地址的最低12位全是0,用来记录每个页的读写权限。
  页目录里每项的最低12位,用于记录它对应的整个页表的读写权限。
  1个页表记录1024个页,每个页4096字节,所以1个页表管理4M的物理内存。
  2)中断向量表,
  它存放各种硬件中断、以及int0x80软件中断的处理函数,也叫中断服务例程(irq)。
  int0x80软件中断,就是Linux系统调用的中断号。
  当然,在64位机上,直接使用syscall汇编指令就行。
  syscall的软件中断机制,是intel在64位上又新造的一种进入CPUring0特权级的指令,使用方式跟之前的int指令不大一样。
  我怀疑intel的CPU研发也是有KPI的,怪不得Linus大牛也经常吐槽intel的CPU设计。
  一个版本加一个新的指令,纯属给系统软件的开发者找难题〔捂脸〕
  中断向量表,也是个256项的数组,每项都是某个中断的函数指针。
  在中断被触发之后,CPU就是靠这个数组去查找对应的中断处理函数的。
  3)全局描述符表,
  它描述的是内核的内存布局,每项8个字节,共256项。
  但实际上,只需要使用前5项就行:
  0x0,不使用,
  0x8,内核代码段,
  0x10,内核数据段,内核堆栈段,它们2个的权限一样,可以共用一项。
  0x20,任务门的描述项,
  0x28,局部描述符表的描述项。
  siska内核demo的内存布局
  因为每项都是8字节,所以地址都是8的倍数。
  4)局部描述符表,
  它是用于进程的,进程因为跟内核的权限不同,所以进程的段选择符都在局部描述符表里:
  内核的段选择符是0x8,进程的是0xf。
  段寄存器CS、DS、SS,到了保护模式下都成了段选择符,真正的内存地址在GDT表里。
  在16位的实模式下,它们才存储真正的段的内存地址。
  5)任务门,
  CPU把每个进程看做一个任务,所以要切换进程时需要任务门的描述结构。
  它是104个字节。
  但是,Linux系统的进程切换是软切换:任务门的描述结构只在系统初始化时加载一次,具体的进程切换时只切换页表和内核栈,然后就可以骗过CPU了〔呲牙〕
  重新加载任务门的时间消耗比较大,而软切换的时间消耗比较小。
  intel的这个设计,也是不受Linus大牛待见的设计之一〔捂脸〕
  6)系统调用表,
  它也是一个大数组,它的每一项也是函数指针。
  系统调用的入口是int0x80软件中断(64位机上是syscall指令)。
  进入内核之后,每个号码对应一个系统调用。
  open()、close()、write()、read(),这些系统调用都有各自的号码,这些号码就是系统调用表的数组索引。
  如果open()的系统调用号码是i,那么open()在内核里实际运行的就是这行代码:
  syscalltable〔i〕();
  7)物理内存的管理数组,
  物理内存的管理结构,是一个很大的一维数组。
  假设物理内存有4G,1个内存页是4K,那么这个数组的元素个数就是1024x1024,1M。
  数组的每一项,记录1个物理内存页的状态。
  如果每项是4个字节的话,那么管理效率就是:(40964)4096。
  管理数据所占的字节数越多,对物理内存的浪费越大。
  getfreepages()函数,就是通过查看这个数组来分配物理内存页的。
  因为内核是一个高并发环境,这个管理结构里必须要有自旋锁,以控制多个CPU的并发访问。
  自旋锁引用计数就至少8字节,所以这个数组也是非常浪费内存的。
  如果多个线程之间要共享内存,那么只要把同一个物理内存页映射到这几个线程的页表里,然后增加物理内存页的引用计数就行:
  这就是共享内存在内核里的本质。
  8)进程的页表和内核栈,
  进程的页表和内核栈,不属于内核的全局数据,而是附属于进程的局部数据。
  内核在调度某个进程的时候,就把页目录基地址寄存器cr3和栈寄存器rsp切换成这个进程的页表和内核栈。
  不同的进程之间,之所以有各自的虚拟内存空间,互相不干扰,就是因为每个进程的页表不一样。
  要在进程之间共享内存,也跟线程之间共享内存一样,把同一个物理内存页映射到它们各自的页表就行。
投诉 评论

聊聊保险行业自入行(2016年)参加的第一次创业说明会,就听到保险行业是朝阳行业的说法儿。直至今日(2022年),保险真的是朝阳行业嘛?鄙人不敢苟同,朝阳行业应该是大众认可的,发展前景巨大……2W单声道音频功率放大器FM8002A8002AAIP800提供FM8002A8002AAIP8002中文资料价格PDF数据手册引脚图及功能应用说明产品描述FM8002A8002AAIP8002是一款单声道桥式驱动的音频功率放大器……技术文章C语言与操作系统的内存布局C语言之所以适合写操作系统,就在于它的内存布局简单:1,所有的全局变量都被常量初始化,2,不需要运行时的状态,3,也不需要在main()函数之前运行额外的初始……王者荣耀年限皮肤全员曝光,貂蝉喜提荣耀典藏,澜FMVP终于官随着兔年的即将到来,按照惯例《王者荣耀》策划开始着手制作兔年限定皮肤,如今这五款兔年限定皮肤人选已经确定,其中部分英雄的建模与特效已经被提前曝光。从玩家们曝光的皮肤细节上来看,……那些因为发胖导致大面积脱粉的艺人,都有谁?王一博该注意啦文紫依前几天有个热词脱粉,是哪个明星被顶上那个热搜了呢?居然是如今的顶流王一博。为什么呢?原来啊,他参加湖南卫视跨年晚会,首次表演了新歌《廿》。新……60岁何超琼穿红色U领刺绣裙秀曲线,风韵犹存,不愧是何家掌门在娱乐圈中,很多明星艺人想要出名,想要地位,之后也渴望能够获得一些名门望族的青睐,一举进入豪门,嫁入豪门者比比皆是,入赘豪门的男明星也不在少数。但是有些人出生在豪门,生在……深海迷航一款让人代入感极强的深海模拟器《深海迷航》是一款让人代入感极强的深海模拟器,尤其是在发现新的生态体系时更是让人兴奋。玩法就是以海底为背景的生存类游戏,收集资源,建造基地与物品,种田养鱼自给自足,最后慢慢的跟……恐龙也会互殴,科学家在史上最大三角龙化石发现证据我们都知道三角龙会用头顶上三根巨大的角状物来捍卫领地、战斗与防御,而现在科学家更通过化石痕迹,找到三角龙互殴的证据。三角龙是种植食性恐龙,全长大约有7到10米,重达6到1……我国关节炎患者超1亿!专家各年龄段都可能发病据统计,全世界关节炎患者有3。55亿人,在亚洲地区,每六个人中就有一人在一生的某个阶段会患上关节炎。关节炎在我国的发病率约为13,保守估计患者超过1亿。关节炎是最常见的慢……奇特LPL战队TES新赞助是家医院,平时照顾选手,比赛照顾粉引子:随着LPL赛区发展,各大战队也有了许多的赞助。其中最成功的应该是EDG了,这次全明星,他们拿到LPL本赛季的最佳品牌案例,这个赞助是家电品牌,跟电竞还是有很大关系的。打游……詹姆斯和皮蓬,谁更有资格号称NBA第一小前锋?麦迪伯德有资格一直以来在小前锋这个位置上,谁是历史第一人,是一个很有争议的话题,但是无非就是两个人是最适合的,一个是詹姆斯,一个是皮蓬。但是麦迪却有自己的看法,他认为,真正的NBA第一小前锋……瀚米欧迪尔等品牌智能锁被检出不合格新京报讯(记者张洁)3月20日,上海市市场监督管理局发布的2022年上海市产品质量监督抽查结果(第十一批)显示,瀚米、欧迪尔等品牌智能锁被检出不合格。不合格名单显示,标称……
6年出车祸100多次真相背后是策划好的目瞪口呆6年出车祸100多次事件真相背后曝光。6年里,一户人家出了100多次交通事故。听起来是不是觉得运气挺背的?在苏州有这么一名男子,就遇上了这样的事情。不过,不是他们家倒霉,这一切……梦华录恋爱脑宋引章承受最大的骂声,她的成长之路值得借鉴文紫依2022年腾空而出的一部《梦华录》,犹如一颗深水炸弹,毫无预料地投放到这个稀松平凡的日子里,又毫无征兆地引发了一阵关于内娱古偶的巨大浪潮。网友说这是内娱古偶的……7。37秒干下一大杯啤酒!美网赛场上一名女球迷意外走红2021年美国网球公开赛男单第三轮,罗伯托阿古特对阵阿利亚西姆的比赛进行时,直播镜头拍到了一位名叫摩根的女球迷。这名女球迷意识到镜头正在拍她时,她立刻从男友手中拿起一杯啤酒,站……如果你是单身那就养个小动物吧猫拨911救了主人命如果你是单身那就养个小动物吧:猫拨911救了主人命如果你是单身一个人那就养只小动物吧,其实新闻上总会有很多报道说小动物救了主人的命,令我们惊叹的是那些小动物们总是那么敏锐……狗狗名字10大小型犬可爱小巧玲珑的狗狗简介狗狗名字10大小型犬:可爱小巧玲珑的狗狗简介小巧玲珑萌翻人,你最喜欢哪一只?地球上10大小型犬:1、迷你雪纳瑞:迷你雪纳瑞是唯一在梗犬类中不含英国血统的品种。其名字……style是什么意思深入了解style是什么style是什么意思:深入了解style是什么style是英语中一个很常用的单词,在平时的考试乃至英语四六级考试也经常出现,那么,style什么意思style是什么?你了……我的第一双高跟在上学期间,都是穿运动鞋,除去配运动袜,偶尔也会穿SW。我的学生装,请允许那时候的像素不好但是出国留学后的第一份兼职工作,就遇到公司必须穿高跟和SW,在接到要求后的……中世纪开放世界mmorpg!龙之灵域邀你成为龙骑士mmorpg游戏常有,可以中世纪作为题材的还真不多。那个面朝黑暗,背向光明的年代,值得探寻。作为网易在chinajoy上唯一曝光的新游大作《龙之灵域》,就能满足你的所有期待西方……2TBSSD明年售价可能跌破100美元目前SSD和NAND价格已经呈现明显的下降,但分析师认为这种下降趋势仍看不到尽头。最新预测显示,消费者明年能以不到100美元的价格购买到2TB的SSD。SSD近期出现了大幅降价……中药黄连不传之秘黄连,始载于《神农本草经》,为毛茛科植物黄连、三角叶黄连或云连的干燥根茎。以上三种分别习称味连、雅连、云连。临床具有清热燥湿,泻火解毒之效。那么,黄连在临床上主要适用于哪些病证……为什么有钱有势的女婿要叫金龟婿15个历史为什么为什么有钱有势的女婿要叫金龟婿:15个历史为什么金龟婿是什么意思?为什么有钱有势的女婿要叫金龟婿?很多事情我们习以为常,但却不知来源,比如为什么男装纽扣在右而女装在左?为……葬爱家族为什么解散了曾经的非主流现在都怎么样了葬爱家族为什么解散了:曾经的非主流现在都怎么样了相信大家会常常在网络上看到葬爱家族这个名字,那么葬爱家族是什么梗?葬爱对于80后和90后来说,在网络上是伤感,颓废的意思。……

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形