从一个ELF程序的加载窥探操作系统内核-(3)

从一个ELF程序的加载窥探操作系统内核-(3)

操作系统加载一个ELF程序看似一个EASY的动作,其实下面隐藏了很多很多OS内核的关键实现,让我们一起来解密其中的流程

作者是一个micro kernel的开发者,在设计动态链接器的时候,在此留下一些笔记,重点参考了以下资料文献

  • 《程序员的自我修养》
  • 《深入理解计算机系统》
  • 《现代操作系统-原理与实现》
  • 《深入理解LINUX内核》
  • 《设计模式/JAVA》
进程和线程究竟有何区别

让我们先回到MCU的世界:

  • 由于MCU没有MMU单元,所以在RTOS中没有进程的概念,只有任务的概念,任务调度是基于任务来进行的
  • 也没有内核态用户态之分,RTOS下操作系统和用户程序都处于一种状态(在Armv7-M下为线程模式),所以用户可以修改内核的数据,而且一旦应用程序崩溃,OS内核也会崩溃,因为他们共享了堆栈空间
  • 所有的内存读写都处于实地址模式下,也就是直接操作的是物理地址空间

现在我们有个需求我们需要把内核和应用程序分开,这样用户就不能随意修改我的内核了,在MMU没有出现之前这是没有办法实现的,当然还得要CPU支持两种模式

  • 有了MMU,我们可以把内核和app分别编译到不同的地址空间去,这个由链接脚本指定就可以
  • Armv7-A中支持7种模式,我们使用其中的User和SVC这两种来对应用户态和内核态
  • 在页表的映射中,我们可以指定内核只能在内核态才能资源访问,这样在用户态就无权对内核地址空间做修改了
    if (iskernel) {
             /*
             * 内核页表
             * 内核代码段:只有内核态有RO权限
             * 内核数据段:只有内核态有RW权限
             */
            ap_ro = MAP_AP_KRO_UNA;
            ap_rw = MAP_AP_KRW_UNA;
        } else {
            /*
             * 用户页表
             * 用户代码段:用户和内核态都只有RO权限
             * 用户数据段:用户和内核态都拥有RW权限
             */
            ap_ro = MAP_AP_KRO_URO;
            ap_rw = MAP_AP_KRW_URW;
        }
    
重中之重:页表

无论是内核态用户态的划分,还是多进程的实现,关键就在于页表的映射

  • 当内核启动后,启动第一个用户任务,这个任务的tcb里包含了pagetable的数据结构,在2级映射中,一级页表其实就是一个4096的数组,二级页表是动态分配的。
  • 在1号进程中,对地址空间进行了映射,首先内核的代码和数据,需要进行映射到1号进程的页表中,有小伙伴要问了,1号不是用户进程吗?为什么要映射内核的代码和数据给他呢?
    • 其实这里有一个认识误区:我们区分的是用户态和内核态,不是用户页表与内核页表,对没有内核线程的OS来说,除了idle任务外,其他的任务都是用户任务,我们的任务调度实际上是在用户任务中进行
    • 如果你不把内核资源映射给1号进程,会发生什么?当中断调度发生,此刻会陷入内核态,但是页表还是1号,此刻进入内核态执行的代码全是在内核地址空间,此刻是不是就有问题?所以必须要把内核的代码和数据映射给用户进程的页表
    • 我们只需要设置用户页表里必须进入内核态才能访问访问内核的AP权限就可以了,这才是实现隔离用户空间和内核空间的关键
  • 在linux经典的VMA空间布局中,每个进程的高端内存都是内核地址空间的映射,就是由此而来

理解了这个后,多进程其实就很简单了,多进程就是每个任务有不同的页表,虽然看起来大家都是从同一个虚拟地址(linux下是从0x08040000)开始,但是由于页表不同,最后对应的物理地址空间是不一样的。

线程:轻量级进程

首先,线程是依赖于进程的,一个进程下的多个线程共享了同一个页表而已

进程模型:通常我们称这样为一个进程

int main()
{
    printf("hallo world");
    return 0
}

线程模型:通常我们要先建立一个进程,然后再在这个进程上创建线程

void *hallo(void *pthread)
{
    while(1)
    {
        printf("hallo thread");
        sleep(1);
    }
}

int main()
{
    printf("hallo world");
    pthread_create(hallo_thread);
    return 0
}

在线程模型中,多个线程的TCB中的页表是相同的,都指向进程的页表,这就是轻量级进程的由来,地址空间的创建是消耗很大的

总结一下线程和进程的区别:

  • 进程间的资源是隔离的,页表不同
  • 线程间的资源是共享的,页表相同,可以理解成线程就是MCU下RTOS的任务模型
    在这里插入图片描述

从上图可以看到

  • 对于调度器来说,不管你是进程还是线程,对我来说都是以任务为单元来进行调度的,task1,task2,task3明显就是一个进程内的,他们的页表是相同的,task1是在fork+exec创建的进程,task2,task3是通过pthread_create创建的线程
  • 从资源管理的角度来说,task1,task2,task3统称为一个进程,task4,task5为单独进程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP内核全行业小程序运营管理系统源码 自由DIY布局 一键生成小程序,内附安装说明 无需编程,各行业模版直接套用,一键生成,轻松搭建小程序 界面自由DIY,打造个性小程序 可拖拽式DIY布局,开启自定义功能新征程,无需繁琐操作,轻松拖拽即可实现界面布局;同步实时预览,可视化操作让您所见即所得,随心打造个性小程序。 丰富功能组件,应多种场景需求 多样的功能组件,不受行业框架限制,可自由组合适应当前场景,让您轻松满足客户的定制需求。 大量插件可用,实现多样营销功能 积分签到、积分兑换商城、拼团、店内点餐、手机客服等插件可用,满足各种行业场景营销需求,助力客户小程序营销推广。 无需技术基础,轻松玩转小程序 无需代码编程,无需技术基础,简单的操作页面,清晰的模块分划,详尽的功能组件,让您短时间即可轻松玩转小程序。 垂直研发,深度挖掘行业解决方案 深入行业了解不同行业的痛点和需求,致力于解决实际问题,给客户带来实际价值,深度挖掘不同行业的解决方案。 功能介绍 分销模块:帮助企业快速搭建企业独立在线商城,自由选择分销模式,从多方位,多角度提供服务支持,助力商户实现分销渠道裂变销货,连锁门店线上化高效经营。 消息通知:设置商品状态通知、成团通知、预约预定通知、系统表单通知、会员卡开卡通知等消息模板,配置商家收发消息邮箱实现邮件通知。 万能表单:超强大的自定义表单模块,不同行业和岗位的人员不需要特殊技能,都可以方便的创建出符合业务需求的表单小程序。数据收集,简单方便,客户登记、意见反馈、活动报名等轻松搞定。万能表单自动收集并整理数据,帮助用户节省工作时间,高效率、更便捷的完成工作。 文章管理系统:对文章详细内容、所属栏目、访问量、评论、分享操作、底部菜单、关联文章等进行管理。 预约报名:报名设预约报名期,在期限内预约用户进行报名。预约报名期内,用户通过填写和提交个人信息的方式进行报名,在约定期限内报满为止。 充值管理:对充值优惠规则、积分规则等进行设置和管理。 商品管理:对多规格商品、秒杀商品、预约商品进行设置和管理。 组图管理:对图片、幻灯片进行设置和管理。 小程序管理:对小程序跳转进行管理。 评论管理:对文章、组图、商品等内容下的评论进行审核和管理。 内容库管理:对多种模型的内容(文章、组图、商品)进行快速筛选 会员管理:对会员信息,会员开卡,会员卡折扣,会员卡积分等进行设置和管理。 多商户插件:多商户入驻平台插件 自定义菜单:底部菜单栏DIY,自定义外观、功能。 广告设置:对开屏广告、首页广告、弹窗广告等进行设置和管理。 一键模板:多行业优秀模板可选,一键生成场景适用小程序页面。 积分管理:对分享获取积分、充值获取积分、签到获取积分等多种积分获取形式以及积分兑换进行管理。 手机客服插件:商家为客户提供线上的咨询服务,通过手机客服为客户解决需求问题。 订单管理:对多规格商品、秒杀商品、预约预定商品等订单状态操作。 数据分析:对小程序流量数据、订单数据、交易数据等进行分析,统计活跃用户和热销商品等。 支付宝小程序:支付宝小程序制作与发布,无需编程,一键生成。 百度小程序:百度小程序制作,无需编程,一键生成,百变应用,自由组合。 权限管理:自定义配置用户可使用的功能,分别给予权限。 可拖拽DIY:APP设计制作一站式解决方案,创造出独一无二的专属小程序。无需懂代码,都可以借助DIY官网可视化工具,顷刻间打造自已的个性化移动应用。 多门店:多门店共享数据,可切换不同城市显示,搜索门店并显示门店详情。 付费视频系统:付费视频是为了维护视频版权,促进用户知识付费的一种手段。 多规格商城:多规格商城是指在商城中能够选取规格、多规格匹配。点击购买弹出弹框,用来选择规格和选择购买数量,并和库存匹配。 积分兑换商城:用户获得积分后可以在积分商城中兑换优惠券、礼品卡或商家指定商品等。 多栏目管理:对所有内容模型的栏目进行管理。 积分签到插件:用户登陆商家小程序进行每日签到,获取相应积分。 代理商管理:拥有底层源码系统,发展自己的代理商,列表清晰展示各代理商状态,详细设置对代理商账号信息、创建小程序的个数、系统到期时间等进行管理。 店内点餐插件:无需呼叫服务员,省去排队等待时间,立即点餐,即点即用。线上线下零距离对接商家厨房最短时间送餐上桌,一键快捷支付,省时省力。每个订单实时对接后台,财务报表、资金流水、客流量盈亏分析随时掌握。 拼团商城插件:参拼团的商品都有单独购买价格和拼团价格,在规定时间内达到相应的标准人数购买,则拼团成功。 优惠券:优惠券是一种相对成熟的营销工具,可在后台添优惠券 付费预约:通过付费缴纳定金的方式进行预约,用户预约成功后在对应时间获得商户指
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对特定设备或特定需求进行自定义开发的软件解决方案。 以下是 Android 项目的一些主要特点和资料介绍: 1. 开放源代码:Android 是基于 Linux 内核的开源操作系统,开发人员可以自由获取、使用和修改源代码。 2. 多样化的硬件设备支持:Android 支持多种硬件设备和屏幕尺寸,可以运行于手机、平板电脑、电视、手表等多种设备上。 3. 灵活的用户界面:Android 提供了丰富的用户界面控件和布局方式,可以实现漂亮、个性化的用户界面。 4. 响应式设计:Android 应用程序可以根据设备类型、屏幕尺寸等因素调整布局和显示方式,以适应不同的设备和用户需求。 5. 多媒体支持:Android 支持常见的音频、视频、图像等多媒体格式,可以实现各种多媒体应用。 6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了集成社交媒体的功能,可以实现与 Facebook、Twitter、Google+ 等社交媒体的交互。 # 注意 1. 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对特定设备或特定需求进行自定义开发的软件解决方案。 以下是 Android 项目的一些主要特点和资料介绍: 1. 开放源代码:Android 是基于 Linux 内核的开源操作系统,开发人员可以自由获取、使用和修改源代码。 2. 多样化的硬件设备支持:Android 支持多种硬件设备和屏幕尺寸,可以运行于手机、平板电脑、电视、手表等多种设备上。 3. 灵活的用户界面:Android 提供了丰富的用户界面控件和布局方式,可以实现漂亮、个性化的用户界面。 4. 响应式设计:Android 应用程序可以根据设备类型、屏幕尺寸等因素调整布局和显示方式,以适应不同的设备和用户需求。 5. 多媒体支持:Android 支持常见的音频、视频、图像等多媒体格式,可以实现各种多媒体应用。 6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了集成社交媒体的功能,可以实现与 Facebook、Twitter、Google+ 等社交媒体的交互。 # 注意 1. 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对特定设备或特定需求进行自定义开发的软件解决方案。 以下是 Android 项目的一些主要特点和资料介绍: 1. 开放源代码:Android 是基于 Linux 内核的开源操作系统,开发人员可以自由获取、使用和修改源代码。 2. 多样化的硬件设备支持:Android 支持多种硬件设备和屏幕尺寸,可以运行于手机、平板电脑、电视、手表等多种设备上。 3. 灵活的用户界面:Android 提供了丰富的用户界面控件和布局方式,可以实现漂亮、个性化的用户界面。 4. 响应式设计:Android 应用程序可以根据设备类型、屏幕尺寸等因素调整布局和显示方式,以适应不同的设备和用户需求。 5. 多媒体支持:Android 支持常见的音频、视频、图像等多媒体格式,可以实现各种多媒体应用。 6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了集成社交媒体的功能,可以实现与 Facebook、Twitter、Google+ 等社交媒体的交互。 # 注意 1. 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值