- 博客(7)
- 收藏
- 关注
原创 Lab4 分析 time/gettimeofday 系统调用在 ARM64 Linux 中的执行过程
首先在窗口左下角的断点设置处新增断点 __arm64_sys_gettimeofday(32 位 ARM 下是 sys_gettimeofday,注意不要搞错了),然后在终端中执行 test 命令,就可以看到调试器成功在对应的内核函数处停下来。例如,在 ARM64 架构中,gettimeofday 的系统调用号为 96。el0_svc会调用el0_svc_handler和el0_svc_common函数,将存放在X8寄存器(regs->regs[8])中的系统调用号传递给invoke_syscall函数。
2023-05-24 17:36:30 143 1
原创 lab3:基于VS Code的Linux内核调试环境搭建及start_kernel跟踪分析
电脑加电启动首先由bootloader加载内核,内核紧接着需要挂载内存根文件系统,其中包含必要的设备驱动和工具,bootloader加载根文件系统到内存中,内核会将其挂载到根目录/下,然后运行根文件系统中init脚本执行一些启动任务,最后才挂载真正的磁盘根文件系统。进程的创建过程大致是这样的:父进程通过fork系统调用进入内核_do_fork函数,复制进程描述符及相关进程资源(采用写时复制技术),分配子进程的内核堆栈,并对内核堆栈和进程的关键上下文进行初始化,最后将子进程放入就绪队列。
2023-05-23 11:03:11 127 1
原创 Linux课程总结报告
设置环境和内核初始化:在startup_32或startup_64中,内核会设置一些硬件环境(比如分段和分页),然后调用start_kernel()(在init/main.c中)开始内核的主要初始化过程。在start_kernel()中,会按照一定的顺序调用各个子系统的初始化函数,例如设置中断,初始化内存管理,启动调度器等。当我们谈论Linux系统的执行过程时,我们通常是指从引导加载器(比如GRUB)启动内核,然后内核初始化并启动系统进程,然后系统进程开启用户空间应用程序的过程。Linux内核开始执行。
2023-05-15 19:33:22 237 1
原创 lab5:深入理解进程切换
使用_shedule完成进程调度,确定调入进程,然后使用context_switch完成进程上下文切换,其中通过在swtich_to函数中调用 __switch_to_asm函数完成prev到next进程的内存堆栈切换,最后跳转到_switch_to()函数,待_switch_to()函数返回后,即切换到nex进程的内核堆栈。最后通过jmp指令跳转到_switch_to()函数,在_switch_to()函数的结尾调用return返回,_switch_to()返回后,将回到next进程的内核堆栈。
2023-04-25 22:50:00 77 1
原创 Linux内核分析 源码阅读、编译调试和启动过程
下载并解压busybox。注意,如果busybox版本太低的话,在高版本Linux系统中静态编译会报错,所以本次实验选择busybox-1.36.0版本。start_kernel()进行初始化工作。最后会调用reset_init(),并陷入该函数中的无限循环中。准备init脚本文件放在根文件系统跟目录下(rootfs/init),添加如下内容到init文件。执行下列命令,其中-S意思是Stopped,-s为gdb提供一个调试端口tcp:1234。测试挂载根文件系统,看内核启动完成后是否执行init脚本。
2023-03-24 09:07:53 320
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人