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进程相关推荐

  1. 深入理解 linux swapper 进程

    转载博文: http://blog.csdn.net/bengda/article/details/7681327 LINUX进程小结 id为0的进程通常是调度进程,常常被称为交换进程(swapper ...

  2. Linux swapper进程 init进程

    进程0 :  所有进程的祖先叫做进程0 ,idle 进程或因为历史的原因叫做swapper 进程.它是在 linux 的初始化阶段从无到有的创建的一个内核线程.这个祖先进程使用静态分配的数据结构. 在 ...

  3. linux 的 swapper 进程不能sleep,Linux进程管理与调度.ppt

    Linux进程管理与调度 关于进程与线程Linux进程实现Linux进程调度策略Linux进程调度实现 1Linux进程与线程 Linux进程Linux线程 进程作为资源分配的基本单位而存在 线程作为 ...

  4. linux ps 进程组,linux进程管理(2)---进程的组织结构

    一.目的 linux为了不同的进程管理目的,使用了不同的方法组织进程之间的关系,为了体现父子关系,使用了"树形"图:为了对同一信号量统一处理,使用了进程组:为了快速查找某个进程,使 ...

  5. swapper进程【转】

    转自:https://blog.csdn.net/qq_27357145/article/details/80462292 LINUX进程小结 id为0的进程通常是调度进程,常常被称为交换进程(swa ...

  6. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  7. Linux守护进程实现

    Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...

  8. linux进程状态d状态,Linux下进程的状态

    如下信息来自于命令man ps Here are the different values that the s, stat and state output specifiers (header & ...

  9. Linux查看进程线程个数

    1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...

最新文章

  1. python开发的比较知名的游戏-游戏排行榜-Python实现
  2. 计算机配置里面没有网络选项,主编教您win10网络设置中没有wlan选项怎么办
  3. sql注入 1-1_基于报错的注入
  4. awk按ip统计日志数
  5. sublime自定义主题-修改行号的颜色
  6. Linux学习第八篇之文件搜索命令find、locate、which、whereis、grep
  7. 【MATLAB】从文件读取:xlsread、load
  8. 如何把软件Origin切换变成中文显示?
  9. linux 取消u盘写保护,如何关闭u盘写保护?u盘写保护怎么去掉?
  10. 微信小程序的动态显示字体颜色
  11. 正则表达式在线生成工具
  12. C++——素数(质数)专题训练
  13. 企业管理者谦虚_为什么谦虚是优秀开发者最重要的特征
  14. C# DataGridView行列转换
  15. 字节跳动-数据分析-实习面经
  16. Android 高德地图 自己位置的显示与点地图上任意一点的坐标
  17. 【OCM】Oracle 10g OCA-OCP-OCM 证书体系展示,纪念2012
  18. 马士兵—JVM—内存溢出—1.线上OOM(内存溢出)问题排查——亲测
  19. 自主可控!搭载龙芯二号,飞凌嵌入式FET-2K0500-C核心板发布
  20. jpa分组分页查询 返回总数错误解决

热门文章

  1. java求最值_java中六种求最值的方式
  2. python目录名称无效怎么处理_python目录名无效错误怎么解决?
  3. 安卓夜神模拟器配合ADB及drozer进行app渗透测试
  4. 驾照还没考完,驾校倒闭了学员该怎么办
  5. echats的基础知识及使用
  6. python奇淫巧技
  7. 应用型本科如何找好工作
  8. c语言200例 016 水池注水问题
  9. 为何现在响应式编程在业务开发微服务开发不普及
  10. codevs1007