标签:编程 $0 运行 volatile 破坏 分析 lin cal 中断向量
实验操作:
选择的64位系统调用函数是第41号的socket。
函数原型为 int socket(int domain, int type, int protocol); 用来创建套接字,常用于网络编程中
函数参数:
domain 协议族,常用的协议族有AF_INET、AF_INET6、AF_LOCAL,分别用来创建ipv4的套接字、ipv6的套接字、本地进程通信套接字
type 套接字类型,常见的有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW,分别用于创建流式套接字、数据报套接字、原始套接字
protocol 协议,常见的由IPPROTO_TCP、IPPTOTO_UDP,分别表示采用TCP协议,UDP协议
实验程序代码为:
1 #include <sys/types.h> 2 #include <sys/socket.h> 4 int main() 5 {
int temp; 6 //socket(AF_INET,SOCK_RAW,0);
temp=socket(2,3,0);
7 printf("return temp %d\n",temp); 8 return 0; 9 }
查找AF_INET定义:
查找SOCK_RAW定义:
实验操作为:
上述结果表示缺少头文件#include<stdio.h>,添加后无警告。
使用嵌入汇编代码实现程序,代码为:
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> int main(){ int temp; asm volatile( "int $0x80" :"=a"(temp) :"a"(41),"b"(2),"c"(3),"d"(0) //eax中放中断号,ebx中放参数2,ecx放参数3,edx中放参数0 );
printf("return temp %d\n",temp); return 0; }
运行截图为:
学习笔记:
内核态:在高执行级别下,代码可以执行特权指令,访问任意物理地址,此时CPU执行级别对应内核态
用户态:低级别状态下,代码的掌控范围受限,只能在对应级别允许的范围内活动
执行级别0最高表示内核态,数字越大级别越低
保护现场:进入中断程序,保存需要用到的寄存器的数据
恢复现场:退出终端程序,恢复保存寄存器的数据
系统调用:操作系统为用户态进程与硬件设备进行交互提供令一组接口
API:应用程序编程接口
API与系统调用的区别:API只是一个函数定义;系统调用通过软中断向内核发出一个明确的请求
中断向量:中断服务程序的入口地址
系统调用:由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口
寄存器传递参数限制:参数的长度不能超过寄存器长度即不能超过32位;在系统调用号(eax)之外参数不能超过6个(ebx,ecx,edx,esi,edi,ebp)
C语言内嵌汇编语法:
__asm__volatile__(
汇编语句模板;
输出部分;
输入部分;
破坏描述部分);
volatile意为不让编译器优化代码,可以不写
eg.
#include<stdio.h>
{
/*val1+val2=vla3*/
unsigned int val1=1;
unsigned int val2=2;
unsigned int val3=0;
printf("val1:%d,val2:%d,val3:%d\n",val1,val2,vla3);
asm volatile(
"movl $0,%%eax\n\t" //clear eax to 0
"addl %1,%%eax\n\t" //eax+=vla1
"addl %2,%%eax\n\t" //eax+=vla2
"movl %%eax,%0\n\t" //val2=eax
:"=m"(vla3) //输出部分。=m 意为写道内存当中去
:"c"(val1),"d"(val2) //输入部分。c 表示ecx,d 表示edx,即用ecx存储val1,用edx存储val2
);
printf("val1:%d+val2:%d=vla3:%d\n",val1,val2,val3);
return 0;
}
2017-2018-1 20179219《Linux内核原理与分析》第五周作业
标签:编程 $0 运行 volatile 破坏 分析 lin cal 中断向量
原文地址:http://www.cnblogs.com/ghost00011011/p/7751503.html