一:常见的知识点回顾
系统调用的流程如下:
二:Linux中系统调用
系统调用使得操作系统从用户态进入了内核态,从而使用了内核中的一些功能,linux x86-64系统通过int 80
调用syscall中断来进入内核态。在使用socket编程中,系统先通过中断进入内核态,再调用底层功能来使得可以与网络通信协议产生连接。
x86-64Linux系统启动时依次调用以下过程:start_kernel --> trap_init --> cpu_init --> syscall_init
,而syscall_init
函数实现了系统调用的初始化将中断向量与服务例程进行绑定。除此之外,还要进行系统调用表的初始化。
简单的验证一下:
进入menu目录,打开menuos
make rootfs
2.进入linux-5.0.1目录,打开一个新中断,执行以下命令
gdb
file vmlinux
target remote:1234 #用其和menuos连接
b start_kernel
b trap_init
b cpu_init
b syscall_init
设置断点后,验证了其系统调用初始化的过程
意外的是我执行b syscall_init告诉我该函数没有定义
CPU为不同的中断设置了不同的中断号,以Intel i386为例,它共有256种中断,每个中断都用一个0~255之间的数来表示,Intel将前32个中断号(0~31)已经固定设定好或者保留未用。中断号32~255分配给操作系统和应用程序使用,Linux将系统调用设为中断号128,即0x80。
初始化流程为:start_kernel --> trap_init --> idt_setup_traps --> 0x80绑定entry_INT80_32
在idt.c源文件我们可找到上面的的绑定的系统中断处理函数
SYSG(IA32_SYSCALL_VECTOR,entry_INT80_32);
我们用一个例子来展示一个简单的系统调用的流程:
三、Socket调用初步分析
gdb
file vmlinux
target remote:1234
b __sys_socket
b __sys_bind
b __sys_listen
b __sys_connect
b __sys_accept4
b __sys_shutdown
在实验之前,首先要修改上次的menu/Makefile文件
cd LinuxKernel/linux-5.0.1/menu
gedit Makefile
#修改内容
make rootfs
原文:https://www.cnblogs.com/kttme/p/12070741.html