Linux0.11main函数启动初始化(二)

如题所述

在Linux0.11的初始化过程中,main函数起到关键的启动作用。首先,sti指令被调用,这表示中断功能的开启,模块初始化工作至此完成。

接着,move_to_user_mode()函数被执行,这标志着程序从内核模式切换至用户模式,即执行任务0,并通过iret指令实现切换。iret指令前,数据被压入堆栈,执行后,数据根据标志位被弹入相应的寄存器。这里需要理解GDT、LDT、GDTR、LDTR和保护模式寻址方式,具体可以参考相关教程。

在切换到用户模式后,所有的进程ss0寄存器被初始化为0x10,esp0则设置为PAGE_SIZE+(long)p。理解这一操作对后续学习至关重要。而cs选择子则分别为0x17和0x0f,分别对应ss和cs寄存器的初始化。cs选择子从ldt的第1项开始,即进程0的代码段。

进程0主要由ldt段表示,包括代码段的展开与详细内容分析。该段基址为地址0,段限长为636kb,DPL为3,说明优先级为用户。

接下来,进程0回到main函数。fork函数执行后,进程0回到main函数中。

init函数在main()中已经进行系统初始化,包括内存管理和硬件设备驱动程序等。init()函数运行在任务0第一次创建的子进程中,对bin/sh程序的环境进行初始化。

setup系统调用在目录kernel/blk_drv/hd.c中实现,对应函数为sys_setup()。此函数主要设置硬盘分区结构、RAMDISK,并挂载安装文件系统。

在执行/bin/sh后,shell程序启动,至此,Linux0.11的初始化过程完成。用户可通过控制台输入命令与内核交互。printf函数产生格式化信息并输出至标准输出设备stdout,即屏幕显示。接下来,将详细分析进程管理。
温馨提示:内容为网友见解,仅供参考
无其他回答

Linux0.11main函数启动初始化(二)
在Linux0.11的初始化过程中,main函数起到关键的启动作用。首先,sti指令被调用,这表示中断功能的开启,模块初始化工作至此完成。接着,move_to_user_mode()函数被执行,这标志着程序从内核模式切换至用户模式,即执行任务0,并通过iret指令实现切换。iret指令前,数据被压入堆栈,执行后,数据根据标志...

linux0.11源码分析-fork进程
在操作系统中,Linux0.11源码中的fork函数执行流程分为启动和系统调用两个阶段。启动阶段首先在init\/main.c中执行init用于启动shell,让用户执行命令。在include\/unistd.h中定义了宏,表示将__NR_fork的值复制给eax寄存器,并将_res与eax绑定。使用int 0x80中断后,系统调用函数system_call被调用,从sys...

linux0.11版本中,关于函数do_timer的疑问
next_timer = next_timer->next;(fn)();...} 这个函数中的函数指针是在函数void add_timer(long jiffies, void (*fn)(void))中添加的。这个函数是供内核使用的,用户空间的函数是不能调用add_timer的,也就是说 do_timer (long cpl)函数中的函数指针只会指向内核里面的函数。(我去看了lin...

通过do_execve源码分析程序的执行(上)(基于linux0.11)
本文仅探讨编译后的二进制文件。解析流程如下:首先验证文件可执行性和当前进程权限,通过后,仅加载头部数据,具体代码在真正运行时通过缺页中断加载。然后,申请物理内存并存储环境变量和参数,该步骤在copy_string函数中实现。

linux系统调用之write源码解析(基于linux0.11)
Linux系统的write函数在底层操作上与read函数有相似之处。本文主要关注一般文件的写操作,我们首先从入口函数开始解析。进入file_write函数,它的核心逻辑是根据文件inode中的信息,确定要写入的硬盘位置,即块号。如果目标块已存在,就直接返回块号;若不存在,则需要创建新的块。这个过程涉及到bmap函数,它...

linux内核0.11 获取第一个空闲物理内存页的函数 get_free_page函数 问题...
1、std:方向位DF置位,即DI进行自减操作。2、repne; scasb 这两条组合指令实现循环比较。ecx初值为15*1024,al=0,di初值为&mem_map[15*1024-1],即从数组mem_map的最后一项开始,依次与al(=0)进行比较。假设数组第i项mem_map[i]==0,则结束循环,此时ecx=i, edi=&mem_map[i-1](...

什么是根文件系统
在0.11内核代码中,从mount_root(void)中的注释可知,该函数会被“系统调用函数”sys_setup()调用,而在系统开机初始化设置时函数sys_setup()会被调用。为什么不会调用sys_mount()呢?那我们又何时使用sys_mount()函数呢?其实 sys_mount()函数也是“系统调用函数”。我们在linux系统中,当你在某个shell的命令行中输...

在linux0.11中谁能 告诉我RAMDISK哪来的
mkdir \/tmp\/ramdisk0 create a filesystem:mke2fs \/dev\/ram0 # or :mkfs -t ext2 \/dev\/ram0 mount the ramdisk:mount \/dev\/ram0 \/tmp\/ramdisk0 如果对ramdisk的格式化失败,那就是你的内核不支持ramdisk。其内核配置选项是 CONFIG_BLK_DEV_RAM .执行df -k \/dev\/ram0 你实际用了多少...

如何在Linux内核里增加一个系统调用?
一、Linux0.11下添加系统调用:我在bochs2.2.1中对linux0.11内核添加了一个新的系统调用,步骤如下: 1.\/usr\/src\/linux\/include\/unistd.h中添加:#define __NR_mytest 87 然后在下面声明函数原型:int mytest(); 2.\/usr\/src\/linux\/include\/linux\/sys.h中添加:extern int sys_mytest(); 然后在sys_call_table...

怎么用gdb和bochs调试内核
(1).启动X window系统后打开两个终端窗口;(mPN(2).在一个窗口中,把工作目录切换进linux-gdb-rh9\/目录中,并运行程序“.\/run”,此时该窗口中会显示一条等待gdb来连接的信息:“Wait for gdb connection on localhost:1234”,并且系统会创建一个Bochs主窗口(此时无内容);1P=VI<(3).在另一个窗口中,我们把...

相似回答
大家正在搜