實驗:
以readdir為例
#include<sys/types.h>
#include<dirent.h>
#include<unistd.h>
main()
{
DIR * dir;
struct dirent * ptr;
int i;
dir =opendir(“/etc/rc.d”);
while((ptr = readdir(dir))!=NULL)
{
printf(“d_name: %s\n”,ptr->d_name);
}
closedir(dir);
}
//readdir()返回參數dir目錄流的下個目錄進入點。
結構dirent定義如下
struct dirent
{
ino_t d_ino;
ff_t d_off;
signed short int d_reclen;
unsigned char d_type;
har d_name[256;
};
d_ino 此目錄進入點的inode
d_off 目錄文件開頭至此目錄進入點的位移
d_reclen _name的長度,不包含NULL字符
d_type d_name 所指的文件類型
d_name 文件名
成功則返回下個目錄進入點。有錯誤發生或讀取到目錄文件尾則返回NULL。
總結:
庫函數封裝系統函數
區分用戶態和內核態
中斷處理是從用戶態進入內核態的主要方式
系統調用是一種特殊的中斷
從用戶態切換內核態時,要保存用戶態寄存器上下文
中斷int指令會在堆棧上保存寄存器當前的值
中斷發生后第一件事是保存現場
保護現場進入中斷程序保存需要用到的寄存器的數據
恢復現場退出中斷程序恢復保存在寄存器的數據
中斷處理的過程:
interrupt(ex:int 0x80) -save調用中斷指令
cs:eip/ss:esp/eflags(current) to kernel stack 保存擱寄存器數據入棧
then load cs:eip(entry of a specific ISR) 調出中斷服務地址指令入口
and ss:esp(point to kernel stack) 加載堆棧段
SAVE_ALL
//開始內核代碼,完成中斷服務,發生進程調度
RESTORE_ALL
iret - pop cs:eip/ss:esp/eflags from kernel stack 調出站內寄存器數據恢復現場
系統調用概述
系統調用為用戶態進程與硬件設備進行交互提供接口
API和系統調用不同:
API只是一個函數定義
系統調用通過軟中斷想內核發出明確請求
Libc庫封裝系統調用例程
系統調用三層皮
xyz
system_call
sys_xyz
中斷向量0x80與system_call綁定起來
系統調用號將xyz和sys_xyz關聯起來
系統調用參數傳遞
入棧
fork()封裝例程
王瀟洋
原創作品轉載請注明出處
《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000