使用文件:
系統調用
打開 5 打開要訪問的文件並且創建指向該文件的句柄。
讀取 3 使用文件句柄打開文件
寫入 4 使用文件句柄寫入
關閉 6 關閉文件並且刪除文件句柄
打開:
int open(const char* pathname , int flags , mode_t mode);
eax 5
ebx 包含以空字符結尾的文件名字符串的開始位置的內存地址。
ecx 需要文件的訪問;類型的標誌的真數值
edx 如果是創建新文件,則表示包含unix權限的整數值
c常量: 數字值 描述
O_RDONLY 00 打開文件,只讀
O_WRONLY 01 只寫
O_RDWR 02 打開文件,讀寫訪問
O_CREAT 0100 文件不存在則創建
O_EXCL 0200 與O_CREAT一起使用時
O_TRUNC 01000 如果文件存在並且按照只寫,模式打開,則把文件長度截斷爲0.
O_APPEND 02000 把數據追加到文件尾部。
O_NONBLOCK 04000 按照非塊模式打開。
O_SYNC 010000 按照同步模式打開文件(同時只允許一個寫入)
O_ASYNC 020000 按照異步模式打開(同時允許多個寫入操作)
打開文件代碼:
.section .data
filename:
.asciz "output.txt"
..
..
.section .text
..
..
movl $filename , %ebx
movl %esp , %ebp
..
movl 8(%ebp) , %ebx
movl $5 , %eax
movl $filename , %ebx
movl $0102 , %ecx
movl $0644 , %edx
int $0x80
test %eax , %eax
js badfile
錯誤碼:錯誤值:描述
EPERM 1 操作不被允許
ENOENT 2 沒有此文件
EBADF 9 壞文件句柄數字
EACCES 13 權限被拒絕
EFAULT 14 壞文件地址
EBUSY 16 設備或者資源忙
EEXIST 17 文件存在
EISDIR 21 是目錄
EMFILE 24 過多打開文件
EFBIG 27 文件過大
EROFS 30 只讀文件系統
ENAMETOOLONG 36 文件名過長
關閉文件
movl filehandle , %ebx
movl $6 , %eax
int $0x80
read調用 ssize_t read(int fd , void* buf , size_t count);
句柄 緩衝區 字節數量
eax 3 系統調用值
ebx 打開文件的句柄
ecx 緩衝區的內存位置
edx 要讀取字節數量的整數值
操作系統不能在讀文件時寫文件。
void *mmap(void* start,size_t length,int port,int flags,int fd,off_t offset);
內存中起始位置 字節數量 內存保護設置 要創建的映射對象類型 要映射到內存文件的句柄 文件中要複製到內存的數據的起始點
保護名稱:
PORT_NONE 0 不允許數據訪問
PORT_READ 1 允許讀取訪問
PORT_WRITE 2 允許寫入訪問
PORT_EXEC 4 允許執行訪問
flags:
MAP_SHARE 1 和其它進程共享內存映射文件的改動
MAP_PRIVATE 2 保持所有改動對這個進程是私有的
msync 原始文件和內存文件做同步映射
munmap 從內存中刪除內存映射文件並且把所有改動寫入原始文件
int msync(const void* start,size_t length, int flags);
int munmap(void* start,size_t length);
MS_ASYNC 在下一次寫入文件時安排更新,並且系統返回調用
MS_SYNC 系統調用等待,直到做出更新,然後再返回調用程序
系統調用值
mmap 90
munmap 91
msync 144
mmap模板
pushl $0
puhl filehandle
pushl $1
pushl $3
pushl size
pushl $0
movl %esp , %ebp
movl $90 , %eax
int $0x80
addl $24 , %esp
movl %eax , mappedfile
unmap
movl $91 , %eax
movl mappedfile , %ebx
movl size , %ecx
int $0x80
int llseek(unsigned int fd,unsigned long offset_high,unsigned long offset_low ,loff_t *result,unsigned int whence);
stack:
offset
fd
flags
port
length
start ebx
系統調用
打開 5 打開要訪問的文件並且創建指向該文件的句柄。
讀取 3 使用文件句柄打開文件
寫入 4 使用文件句柄寫入
關閉 6 關閉文件並且刪除文件句柄
打開:
int open(const char* pathname , int flags , mode_t mode);
eax 5
ebx 包含以空字符結尾的文件名字符串的開始位置的內存地址。
ecx 需要文件的訪問;類型的標誌的真數值
edx 如果是創建新文件,則表示包含unix權限的整數值
c常量: 數字值 描述
O_RDONLY 00 打開文件,只讀
O_WRONLY 01 只寫
O_RDWR 02 打開文件,讀寫訪問
O_CREAT 0100 文件不存在則創建
O_EXCL 0200 與O_CREAT一起使用時
O_TRUNC 01000 如果文件存在並且按照只寫,模式打開,則把文件長度截斷爲0.
O_APPEND 02000 把數據追加到文件尾部。
O_NONBLOCK 04000 按照非塊模式打開。
O_SYNC 010000 按照同步模式打開文件(同時只允許一個寫入)
O_ASYNC 020000 按照異步模式打開(同時允許多個寫入操作)
打開文件代碼:
.section .data
filename:
.asciz "output.txt"
..
..
.section .text
..
..
movl $filename , %ebx
movl %esp , %ebp
..
movl 8(%ebp) , %ebx
movl $5 , %eax
movl $filename , %ebx
movl $0102 , %ecx
movl $0644 , %edx
int $0x80
test %eax , %eax
js badfile
錯誤碼:錯誤值:描述
EPERM 1 操作不被允許
ENOENT 2 沒有此文件
EBADF 9 壞文件句柄數字
EACCES 13 權限被拒絕
EFAULT 14 壞文件地址
EBUSY 16 設備或者資源忙
EEXIST 17 文件存在
EISDIR 21 是目錄
EMFILE 24 過多打開文件
EFBIG 27 文件過大
EROFS 30 只讀文件系統
ENAMETOOLONG 36 文件名過長
關閉文件
movl filehandle , %ebx
movl $6 , %eax
int $0x80
read調用 ssize_t read(int fd , void* buf , size_t count);
句柄 緩衝區 字節數量
eax 3 系統調用值
ebx 打開文件的句柄
ecx 緩衝區的內存位置
edx 要讀取字節數量的整數值
操作系統不能在讀文件時寫文件。
void *mmap(void* start,size_t length,int port,int flags,int fd,off_t offset);
內存中起始位置 字節數量 內存保護設置 要創建的映射對象類型 要映射到內存文件的句柄 文件中要複製到內存的數據的起始點
保護名稱:
PORT_NONE 0 不允許數據訪問
PORT_READ 1 允許讀取訪問
PORT_WRITE 2 允許寫入訪問
PORT_EXEC 4 允許執行訪問
flags:
MAP_SHARE 1 和其它進程共享內存映射文件的改動
MAP_PRIVATE 2 保持所有改動對這個進程是私有的
msync 原始文件和內存文件做同步映射
munmap 從內存中刪除內存映射文件並且把所有改動寫入原始文件
int msync(const void* start,size_t length, int flags);
int munmap(void* start,size_t length);
MS_ASYNC 在下一次寫入文件時安排更新,並且系統返回調用
MS_SYNC 系統調用等待,直到做出更新,然後再返回調用程序
系統調用值
mmap 90
munmap 91
msync 144
mmap模板
pushl $0
puhl filehandle
pushl $1
pushl $3
pushl size
pushl $0
movl %esp , %ebp
movl $90 , %eax
int $0x80
addl $24 , %esp
movl %eax , mappedfile
unmap
movl $91 , %eax
movl mappedfile , %ebx
movl size , %ecx
int $0x80
int llseek(unsigned int fd,unsigned long offset_high,unsigned long offset_low ,loff_t *result,unsigned int whence);
stack:
offset
fd
flags
port
length
start ebx