微视linux swapper进程
swapper是linux第一个线程,也就是0号线程。很多书里面都有详细介绍。
为什么linux启动之后,swapper线程就开始运行了呢?
我认为主要有两点:
第一点:静态部分。
swapper线程通过静态初始化,设置的地址空间是内核高1G的空间。也就是说其使用的正文段,数据段和linux使用的正文段和数据段是完全一致的。
第二点:动态部分。
堆栈寄存器等寄存器在内核启动阶段通过汇编语句设置。堆栈寄存器等寄存器在内核启动阶段通过汇编语句设置。
其中,最重要的是堆栈,定义好的堆栈部分不会被别的模块非法访问;另外一点就是,可以调用别的函数,建立栈帧,在函数返回时可以正常返回。
以powerpc为例:
start_here:/* ptr to current */lis r2,init_task@hori r2,r2,init_task@l //根据E500 ABI,r2保存当前进程的进程描述符地址/* Set up for using our exception vectors *//* ptr to phys current thread */tophys(r4,r2)addi r4,r4,THREAD /* init task's THREAD */CLR_TOP32(r4)mtspr SPRN_SPRG_THREAD,r4 //SPRN_SPRG_THREAD在E500系列是SPRG3,保存thread的虚拟地址li r3,0mtspr SPRN_SPRG_RTAS,r3 /* 0 => not in RTAS *//* stack */lis r1,init_thread_union@haaddi r1,r1,init_thread_union@lli r0,0stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1) //根据E500 ABI,r1指向栈底-16.16代表预留一个最小栈帧
以x86为例:
.data
ENTRY(stack_start).long init_thread_union+THREAD_SIZE.long __BOOT_DSready: .byte 0--------------------
/** Enable paging*/movl $pa(swapper_pg_dir),%eaxmovl %eax,%cr3 /* set the page table pointer.. */movl %cr0,%eaxorl $X86_CR0_PG,%eaxmovl %eax,%cr0 /* ..and set paging (PG) bit */ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */
1:/* Set up the stack pointer */lss stack_start,%esp //esp寄存器指向栈底, SS寄存器指向__BOOT_DS/** Initialize eflags. Some BIOS's leave bits like NT set. This would* confuse the debugger if this code is traced.* XXX - best to initialize before switching to protected mode.*/pushl $0popfl#ifdef CONFIG_SMPcmpb $0, readyjz 1f /* Initial CPU cleans BSS */jmp checkCPUtype
1:
#endif /* CONFIG_SMP *//** start system 32-bit setup. We need to re-do some of the things done* in 16-bit mode for the "real" operations.*/call setup_idt
linux源码分析(三)-start_kernel
https://www.cnblogs.com/yjf512/p/5999532.html
linux调度器源码分析 - 初始化(二)
https://www.cnblogs.com/tolimit/p/4311404.html
深入理解Linux启动过程 && 0号进程,1号进程
https://blog.csdn.net/ZAhqc_IT/article/details/81702067
微视linux swapper进程相关推荐
- 深入理解 linux swapper 进程
转载博文: http://blog.csdn.net/bengda/article/details/7681327 LINUX进程小结 id为0的进程通常是调度进程,常常被称为交换进程(swapper ...
- Linux swapper进程 init进程
进程0 : 所有进程的祖先叫做进程0 ,idle 进程或因为历史的原因叫做swapper 进程.它是在 linux 的初始化阶段从无到有的创建的一个内核线程.这个祖先进程使用静态分配的数据结构. 在 ...
- linux 的 swapper 进程不能sleep,Linux进程管理与调度.ppt
Linux进程管理与调度 关于进程与线程Linux进程实现Linux进程调度策略Linux进程调度实现 1Linux进程与线程 Linux进程Linux线程 进程作为资源分配的基本单位而存在 线程作为 ...
- linux ps 进程组,linux进程管理(2)---进程的组织结构
一.目的 linux为了不同的进程管理目的,使用了不同的方法组织进程之间的关系,为了体现父子关系,使用了"树形"图:为了对同一信号量统一处理,使用了进程组:为了快速查找某个进程,使 ...
- swapper进程【转】
转自:https://blog.csdn.net/qq_27357145/article/details/80462292 LINUX进程小结 id为0的进程通常是调度进程,常常被称为交换进程(swa ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
- Linux守护进程实现
Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...
- linux进程状态d状态,Linux下进程的状态
如下信息来自于命令man ps Here are the different values that the s, stat and state output specifiers (header & ...
- Linux查看进程线程个数
1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...
最新文章
- python开发的比较知名的游戏-游戏排行榜-Python实现
- 计算机配置里面没有网络选项,主编教您win10网络设置中没有wlan选项怎么办
- sql注入 1-1_基于报错的注入
- awk按ip统计日志数
- sublime自定义主题-修改行号的颜色
- Linux学习第八篇之文件搜索命令find、locate、which、whereis、grep
- 【MATLAB】从文件读取:xlsread、load
- 如何把软件Origin切换变成中文显示?
- linux 取消u盘写保护,如何关闭u盘写保护?u盘写保护怎么去掉?
- 微信小程序的动态显示字体颜色
- 正则表达式在线生成工具
- C++——素数(质数)专题训练
- 企业管理者谦虚_为什么谦虚是优秀开发者最重要的特征
- C# DataGridView行列转换
- 字节跳动-数据分析-实习面经
- Android 高德地图 自己位置的显示与点地图上任意一点的坐标
- 【OCM】Oracle 10g OCA-OCP-OCM 证书体系展示,纪念2012
- 马士兵—JVM—内存溢出—1.线上OOM(内存溢出)问题排查——亲测
- 自主可控!搭载龙芯二号,飞凌嵌入式FET-2K0500-C核心板发布
- jpa分组分页查询 返回总数错误解决