操作系统
文章平均质量分 90
linux+xv6
L7256
这个作者很懒,什么都没留下…
展开
-
xv6---Lab4 traps
0x00000064用字符串打出来,发现解释的方向是64 00 00 00 即r\0\0\0 而不是 \0\0\0r这就是小端。当printf执行完成后,会让pc=寄存器ra的值,然后程序会执行main函数中的0x38这行的代码。Q:在main的程序集代码中,函数f的调用在哪里?A:查看asm文件,发现没有对f,g的调用,g被内联f函数,f函数被内联到main函数。Q:main中,jalr跳转到printf之后,ra的值是多少?A:ra的值是0x38, 对应的0x34的下一条指令。原创 2022-12-20 15:00:15 · 1198 阅读 · 1 评论 -
xv6---Lab3: page tables
程序在系统上执行,操作的是虚拟内存地址,而虚拟内存到物理内存的映射需要一个函数f(var1, var2);其中var1是页表,而var2是偏移量,于是当需要操作一个变量的时候,操作系统可通过函数f(var1, var2);的实现(kernel/exec.c),系统调用exec将存储在文件系统上的,新的用户程序装载进内存里,然后执行它。系统之上的内存分配叫虚拟内存,通过内核的MMU单元去管理并映射到物理内存。,然后我们将物理内存看成是定长槽块的阵列,这些槽块大小与页相同,每个槽块叫做。原创 2022-12-07 23:59:02 · 2004 阅读 · 1 评论 -
内存管理---分页机制
这一样的实现是 physical_addr = flash[virtual_addr];综上:可通过32位的虚拟地址,通过二级页表访问4GB的物理内存,原创 2022-12-02 12:33:21 · 1114 阅读 · 0 评论 -
xv6---Lab2: system calls
执行syscall函数的时候,会将num赋值为寄存器a7的值,并通过num找到syscalls中的系统调用号对应的函数指针。至此可以去调用sys_trace函数了,这里需要关注:trace如何拿到传入的参数。而执行trace系统调用(li a7 22 和 ecall之后,),程序会跳转到syscall.c的void syscall(void)函数,这里就可理解为什么要把a7赋值为22了。具体实现如下:argint用于拿到系统调用传递的参数,0-5的参数,对应寄存器a0-a5。原创 2022-11-29 16:27:29 · 2455 阅读 · 0 评论 -
xv6---Lab1: Xv6 and Unix utilities
sleep.c中的sleep--->/user/usys.S的调用--->调用/kernel/syscall.c的syscall函数--->调用到/kernel/sysproc.c的sys_sleep函数。(0)通过int pipe(int fd[2])创建管道,fd参数返回两个文件描述符,fd[0]指向管道的读端,fd[1] 指向管道的写端。/user/usys.S文件为sleep函数的实现,调用了/kernel/定义在user/user.h的int sleep(int);原创 2022-11-15 18:36:24 · 1479 阅读 · 0 评论 -
xv6---spinlock自旋锁
release一次就减1,直到为0才恢复中断(不一定会打开,需要根据,int old = intr_get()的值判断,old == 1代表acquires spinlock之前中断是打开的,反之用完了锁不打开)。可知:如果在release的时候打开了中断,那么其他cpu会立刻拿到spinlock, 且这个时候已经关闭过了中断,然后中断又被打开了,这肯定不行!进程A:键盘打字---产生中断---acquired 等待spinlock----写入数据。避免编译优化改变代码执行顺序。------>产生死锁。原创 2022-11-04 00:40:00 · 534 阅读 · 0 评论 -
printf是如何打印到终端
打开了控制台的设备: /dev/consloe,并通过int fd = open ("/dev/consloe")往这个设备写数据,通过内核的调用栈:ttycore层--->ldisc层--->和设备匹配上的驱动的write方法。原创 2022-10-16 18:46:29 · 902 阅读 · 0 评论 -
vscode在ubuntu调试
【代码】vscode在ubuntu调试。原创 2022-09-15 21:00:50 · 1327 阅读 · 0 评论 -
qemu 内核调试环境搭建
kernel /path/to/kernel/dir/arch/arm/boot/zImage 告诉qemu单板运行内核镜像路径。用的版本是ubuntu 18.04 ,qemu是6.0 ,按照下面的步骤做完了,提示-kernerl参数不对,不知怎么解决。安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。生成的内核镱像位于arch/arm/boot/zImage, 后续qemu启动时需要使用该镜像。-nographic 不使用图形化界面,只使用串口。原创 2022-09-15 15:22:27 · 1272 阅读 · 0 评论 -
OOM机制
当系统可用内存(不包含buffer和cache)小于这个值的时候,系统会启动内核线程kswapd来对内存进行回收。而还是触发了oomkiller,则表明内存真的不够用了或者在内存回收前或者回收中直接触发了oomkiller。内核中sysctl_panic_on_oom变量是和/proc/sys/vm/panic_on_oom对应的,可通过如下命令查看。系统所保留空闲内存的最低限/proc/sys/vm/min_free_kbytes参数。(1)谁触发了OOM就干掉谁。(2)谁最“坏”就干掉谁。.......原创 2022-07-20 10:31:59 · 1557 阅读 · 0 评论 -
交叉编译及运行的理解
I参数可指定编译依赖的头文件路径可通过export命令去设置环境变量:比如即可设置头文件搜索路径默认的路径去搜索头文件可以通过:命令来查找 【加粗的是交叉工具链gcc的位置】可以看到交叉工具链的默认搜索路径是如图的样子比如就可让搜索的默认路径改为如下的方式。...............原创 2022-08-13 20:33:53 · 4090 阅读 · 0 评论 -
Linux应用程序的启动流程
_libc_start_main函数的运行的顺序为:__libc_csu_init->main->__libc_csu_fini,__libc_csu_init叫构造函数,__libc_csu_fini叫析构函数,在代码中可通过__attribute__ ((constructor))标记构造函数,__attribute__ ((destructor))来标记析构函数 有这样的例子。在main.s文件找到地址为0x540的代码。看到一篇好文:摘抄记录--原创 2022-09-14 11:22:55 · 1449 阅读 · 0 评论 -
从零开始使用Vscode调试XV6
针对makefile: 安装compiledb【git clone https://github.com/nickdiego/compiledb.git】来自动生成compile_commands.json。注意:由于有 "miDebuggerServerAddress": "127.0.0.1:26000", //所以需要吧.gdbinit 中 target remote xxxx:xx改为。一天时间的教训---系统要ubuntu20.04的 ,用ubuntu18.04的搞了一天。原创 2022-09-18 10:24:57 · 2599 阅读 · 0 评论