Bionic libc & ucore 沈彤 2008012108 张超 2008012100. Bionic libc 编译 前期:只下载 bionic libc 的源码 – 修改 bionic libc 使之能编译通过,东拼西凑,费 力不讨好 – 隐患:很多宏不知道是否应该定义,可能对代 码造成较大影响.

Slides:



Advertisements
Similar presentations
Linux 操作系统分析 中国科学技术大学计算机系 陈香兰( 0512 - ) Autumn 2010.
Advertisements

高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
嵌入式操作系统 陈香兰 Spring 2006 中国科学技术大学计算机系.
嵌入式操作系统 陈香兰 Spring 2007 中国科学技术大学计算机系.
Oracle数据库 Oracle 子程序.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
OpenMP简介和开发教程 广州创龙电子科技有限公司
第二讲 搭建Java Web开发环境 主讲人:孙娜
学习前的准备工作 讲师:burning.
辅导课程六.
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
SDL2 配置 (Windows + Visual Studio)
按键驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
以ISI平台为例,为您演示一下如何在Endnote文献中查看该文献的References
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
如何生成设备节点 广州创龙电子科技有限公司
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
供应商登录CJLR SRM系统入口 CJLR供应商仅可以在互联网上访问SRM系统,无法在CJLR内网登录SRM系统.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Gzip编译及调试 曹益华
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
SOA – Experiment 2: Query Classification Web Service
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
Drupal Dev 我想知道:什么时候、什么变化.
_18静态库与动态链接库 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
姚金宇 MIT SCHEME 使用说明 姚金宇
实验七 安全FTP服务器实验 2019/4/28.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
信号量(Semaphore).
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
iSIGHT 基本培训 使用 Excel的栅栏问题
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
本节内容 模块隐藏 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
_07多连接之select模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2009
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 导出表 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 如何调试驱动程序? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
<编程达人入门课程> 本节内容 有符号数与无符号数 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
培训课件 AB 变频器的接线、操作及参数的备份 设备动力科.
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
百万行、千万行数据查询教程 老黄牛.
Presentation transcript:

Bionic libc & ucore 沈彤 张超

Bionic libc 编译 前期:只下载 bionic libc 的源码 – 修改 bionic libc 使之能编译通过,东拼西凑,费 力不讨好 – 隐患:很多宏不知道是否应该定义,可能对代 码造成较大影响 后期:使用 Android-x86 项目 – 无需再手动修改 bionic libc – Android-x86 项目已经实现了 Android 在部分 x86 机型上的运行,正确性把握较大

syscall 连接 将 ucore 中原有的 syscall 调用全部改为 int 0x81 ,将 bionic libc 使用的 syscall 调用设置为 int 0x80 好处:两套 syscall 机制不会互相干扰, ucore 原有的机制不会被破坏;同时 bionic libc 的 syscall 方便单独进行调试 坏处:有不少几乎完全相同的 syscall ,需要 重复写一次

syscall 实现 多数 syscall 可以直接利用 ucore 已有的 syscall 。 部分可以用 ucore 有,但没有用到过的函数, 比如利用 vfs_readlink() 完成 readlink() 系统调 用。 此外还有一些需要改变接口,如 brk, mmap 的参数、返回值不一样。 剩下的就是需要我们自己实现的,比如 signal 。

signal data struct sigset_t 信号集合 用 uint64_t 替代 uint32_t[2] sigpending, sigqueue 挂起队列 sigaction 信号处理函数 signal_struct 信号描述符 sighand_struct 信号处理描述符 sigframe 神奇的结构

signal syscalls kill() 和 tkill() 产生并发送信号 sigaction() 设置信号处理函数 sigprocmask() 设置或解除阻塞信号 sigpending() 获取挂起的阻塞信号 sigsuspend() 等待一些信号 sigaltstack() 设置信号处理函数栈地址

产生信号 一个进程 do_tkill() 得到进程描述符,关中断、获取 信号锁,调用 specific_send_sig_info() ,释放 锁、开中断。 specific_send_sig_info() 检查信号是否会被 忽略,检查信号是否是非实时的,调用 send_signal() 将信号加入进程的私有等待队 列中。对非阻塞信号,调用 signal_wakeup() 将进程唤醒。

产生信号 线程组 do_kill() 调用 group_send_sig_info() group_send_sig_info() 检查信号是否需要被 产生,调用 send_signal() 将其加入进程的共 享等待队列中。 handle_stop_signal() 实现信号的相互屏蔽。 group_complete_signal() 从线程组中选择一 个合适的进程,并用 signal_wakeup() 唤醒它。

默认的处理 中断结束时调用 do_signal() do_signal() 不断的调用 dequeue_signal() 获 取下一个信号。 对每个信号,如果是 SIGKILL 或 SIGSTOP 则直 接终止或停止该进程所在线程组,否则如 果处理方式是 SIG_IGN 则忽略 SIG_DFL 判断信号的类型,有些信号的默认 操作有忽略、停止线程组、终止线程组。

用户指定的处理函数 sigframe 保存 trapframe 阻塞信号 参数和返回地址 神奇的数字 movl $400, %eax; int $0x80 修改 eip esp sigreturn 系统调用 恢复

test1 产生信号给一个进程 测试 sigaction() sigprocmask() tkill() 信号处理函数的调用(包括在自定义信号 处理函数中使用系统调用) SIGKILL 终止进程

test2 产生信号给一个线程组 测试 sigsuspend() kill_bionic() SIGSTOP 停止线程组 SIGKILL 终止线程组

动态链接 —— 原理 内核态准备工作: – 通过可执行文件是否包含 PT_INTERP“ 段 ” ,判断 其为动态链接或静态链接 – 将可执行文件的 PT_LOAD 的 “ 段 ” 都载入内存 – 若为动态链接,可执行文件必包含 PT_INTERP“ 段 ” ,该 “ 段 ” 的内容为动态链接器的 路径。将动态链接器的 PT_LOAD“ 段 ” 都载入内存 – 动态链接器和可执行程序本身的装载地址就是 链接地址,无需重定位

动态链接 —— 原理 内核态准备工作: – 若为动态链接,将 eip 置为动态链接器的入口; 否则,将 eip 置为可执行文件的入口 – 设置初始堆栈。若为动态链接,堆栈中需要有 一些动态链接器需要的信息。 Android 的动态链 接器叫做 linker ,其源码中体现出只需要三项: AT_PHDR : program header 在内存中的地址 AT_PHNUM : program header 个数 AT_ENTRY :可执行文件的入口 – glibc 需要的更多此类信息

动态链接 —— 原理 用户态: – 若为动态链接,先执行的将是动态链接器。 – 动态链接器根据内核在堆栈中放置的辅助信息, 找到 PT_DYNAMIC“ 段 ” 。这个段中存放着动态链 接器需要的一切信息 – 例如,该段中类型为 DT_NEED 的项表示该可执 行程序依赖的动态链接库的名称在 strtab 段中的 序号,由此动态链接器可以得到需要加载的动 态链接库的名称

动态链接 —— 原理 用户态: – 动态链接库的链接地址一般从 0x0 开始,由动态 链接器选择可用地址作为基地址后加载。 – 加载完动态链接库之后,需要对动态链接库的 每一个重定位项(包括变量和函数)进行重定 位,具体机制可参见《程序员的自我修养 —— 链接、装载与库》

mmap file 动态链接器加载动态链接库是通过 mmap 文 件的方法,而 ucore 的 mmap 是在文件系统出 现以前就有的,从而没有 mmap 文件的功能 我们的做法:如果 mmap 传进了 fd 参数,就 在 mmap 的末尾把文件相应的部分直接读入 内存,并在 vma 中存储文件的相关信息;在 munmap 时把内存写回文件。

mmap file 失败的尝试 我们尝试如下实现 mmap 文件: – mmap 文件时,给相应 vma 加入文件信息( struct file 指针),不立即载入内存 – 发生缺页中断时,检查 vma 是否是 mmap 文件的 vma 。 如果是,将文件读取一页载入相应内存 更进一步地,实现共享文件的映射: – 在 struct file 中,加入被 mmap 的信息,包括:被 mmap 起始偏移、长度、起始物理内存地址 – 第一次缺页时,新申请一页空间,将文件内容载入 页中,并将 mmap 信息设置好 – 以后再缺页时,如果是同一块被 mmap 的区域,直 接将页表项改为已被 mmap 到的物理地址

mmap anonymous 另外,动态链接器还有 mmap 带有标志 MAP_ANONYMOUS 的行为 我们对它的理解:它用来预留一块虚存地 址空间,以后可以在这块预留空间上进一 步 mmap ,这是其他 mmap 不允许的 因此,给 vma 加上 ANONYMOUS 标志位。如 果碰到这样的情况,先分配 vma ;进一步分 配时,将这个 vma 分裂即可。

Dalvikvm 失败的尝试 第九周、第十周精力主要在尝试运行 dalvikvm 上 成功的在 Android 的 ARM 模拟器上运行 dalvikvm ,并跑出 Hello world 程序 未能在 x86 Linux 上运行成功。初期加载动 态链接库等阶段都已完成,是在 dalvikvm 开 始初始化的时候出错的。错误信息是无法 加载某个国际化语言模块。 Google 很久,无 果。

glibc 失败的尝试 一度 bionic libc 动态链接不能成功,尝试跑出 glibc 的动态链接(现在看来很荒谬)。 成功编译出 glibc ,在 Linux 上用编译出的 glibc 替 代本机的 glibc ,能够正常运行。 在 ucore 上始终提示 assert failed ,想修改 glibc 源码使之多输出一些调试信息(例如 __FILE__, __LINE__ ),竟然未能成功。 glibc 比 bionic libc 复杂得多需要更多的 syscall , 更多的动态链接信息,还有很多不太了解的编 译参数,最终作罢。