550W Document
550W, a high-end OS
file.h
浏览该文件的文档.
1 #pragma once
2 
3 #include <common/types.h>
4 #include <lib/list.h>
5 #include <lib/string.h>
6 #include <os/lock.h>
7 #include <os/mm.h>
8 // #include <os/errno.h>
9 
10 // flags
11 #define O_RDONLY 0x00
12 #define O_WRONLY 0x01
13 #define O_RDWR 0x02 // 可读可写
14 // #define O_CREATE 0x200
15 #define O_CREATE 0x40
16 #define O_DIRECTORY 0x0200000
17 
18 #define AT_FDCWD -100
19 #define AT_REMOVEDIR 0x200 /* Remove directory instead of unlinking file. */
20 
21 #define MAX_NAME_LEN 256
22 
23 typedef uint32_t fd_num_t;
24 typedef uint32_t pipe_num_t;
25 typedef uint64_t dev_t;
26 typedef uint64_t ino_t;
27 typedef uint32_t mode_t;
28 typedef uint32_t nlink_t;
29 typedef uint32_t uid_t;
30 typedef uint32_t gid_t;
31 typedef int64_t off_t;
32 
33 typedef struct fd {
34  // file or dir?
35  uint8_t file;
36  /* file or dir name */
38  /* dev number */
39  uint8_t dev;
40  /* first clus number */
41  uint32_t first_cluster;
42  /* file mode */
43  uint32_t mode;
44  /* open flags */
45  uint32_t flags;
46  /* position */
47  uint64_t pos;
48  uint32_t cur_clus_num;
49  /* length */
50  uint32_t size;
51  /* dir_pos */
52  // dir_pos_t dir_pos;
53 
54  /* fd number */
55  /* default: its index in fd-array*/
57 
58  /* used */
60  /* redirect */
63 
64  /* pipes[pip_num] is the pipe */
68  /* socket */
70  /*mmap*/
71  struct {
72  int used;
73  void *start;
74  size_t len;
75  int prot;
76  int flags;
78  } mmap;
79  /* fcntl */
80  // flock_t flock;
81  /* links */
83 
84  // /* status */
87 
89 
90  // blksize_t blksize;
91 
92  long atime_sec;
93  long atime_nsec;
94  long mtime_sec;
95  long mtime_nsec;
96  long ctime_sec;
97  long ctime_nsec;
98 
99  int mailbox;
100 
101  // share fd
102  // struct fd* share_fd;
103  // int share_num;
104  // long version;
106 
107 // fd func
108 #define MAX_FD 200
109 extern fd_t fd_table[MAX_FD];
110 
111 extern int fd_table_init();
112 extern int fd_alloc();
113 fd_t *fd_alloc_spec(int fd);
114 extern int fd_free(int fd);
115 extern fd_t *get_fd(int fd);
116 
117 #define RING_BUFFER_SIZE 4095
118 #pragma pack(8)
119 struct ring_buffer {
120  spin_lock_t lock; /* FOR NOW no use */
121  size_t size; // for future use
122  int32_t head; // read from head
123  int32_t tail; // write from tail
124  // char buf[RING_BUFFER_SIZE + 1]; // left 1 byte
125  uint8_t *buf;
126 };
127 #pragma pack()
128 
129 typedef struct pipe {
130  // mutex_lock_t lock;
131  int mailbox;
132  pid_t pid; // parent id
138 #define PIPE_NUM 200
139 extern pipe_t pipe_table[PIPE_NUM];
140 extern int pipe_alloc(int *fd);
141 
142 void ring_buffer_init(struct ring_buffer *rbuf);
143 // static inline void ring_buffer_init(struct ring_buffer *rbuf) {
144 // // there is always one byte which should not be read or written
145 // k_memset(rbuf, 0, sizeof(struct ring_buffer)); /* head = tail = 0 */
146 // rbuf->size = RING_BUFFER_SIZE;
147 // rbuf->buf = k_mm_malloc(PAGE_SIZE);
148 // k_memset(rbuf->buf, 0, PAGE_SIZE);
149 // // TODO INIT LOCK
150 // k_spin_lock_init(&rbuf->lock);
151 // return;
152 // }
153 
154 static inline int ring_buffer_used(struct ring_buffer *rbuf) {
155  return (rbuf->tail - rbuf->head + rbuf->size) % (rbuf->size);
156 }
157 
158 static inline int ring_buffer_free(struct ring_buffer *rbuf) {
159  // let 1 byte to distinguish empty buffer and full buffer
160  return rbuf->size - ring_buffer_used(rbuf) - 1;
161 }
162 
163 static inline int ring_buffer_empty(struct ring_buffer *rbuf) {
164  return ring_buffer_used(rbuf) == 0;
165 }
166 
167 static inline int ring_buffer_full(struct ring_buffer *rbuf) {
168  return ring_buffer_free(rbuf) == 0;
169 }
170 
171 #ifndef min
172 #define min(x, y) ((x) < (y) ? (x) : (y))
173 #endif
174 
175 size_t read_ring_buffer(struct ring_buffer *rbuf, uint8_t *buf, size_t size);
176 // static inline size_t read_ring_buffer(struct ring_buffer *rbuf, uint8_t *buf, size_t size) {
177 // // TODO pcb and lock
178 // k_spin_lock_acquire(&rbuf->lock);
179 // int32_t len = min(ring_buffer_used(rbuf), size);
180 // if (len > 0) {
181 // if (rbuf->head + len > rbuf->size) {
182 // int32_t right = rbuf->size - rbuf->head, left = len - right;
183 // k_memcpy(buf, rbuf->buf + rbuf->head, right);
184 // k_memcpy(buf + right, rbuf->buf, left);
185 // } else {
186 // k_memcpy(buf, rbuf->buf + rbuf->head, len);
187 // }
188 
189 // rbuf->head = (rbuf->head + len) % (rbuf->size);
190 // }
191 // k_spin_lock_release(&rbuf->lock);
192 // return len;
193 // }
194 
195 // rbuf should have enough space for buf
196 size_t write_ring_buffer(struct ring_buffer *rbuf, uint8_t *buf, size_t size);
197 // static inline size_t write_ring_buffer(struct ring_buffer *rbuf, uint8_t *buf, size_t size) {
198 // // TODO SYNC BY LOCK
199 // k_spin_lock_acquire(&rbuf->lock);
200 // int32_t len = min(ring_buffer_free(rbuf), size);
201 // if (len > 0) {
202 // if (rbuf->tail + len > rbuf->size) {
203 // int32_t right = rbuf->size - rbuf->tail, left = len - right;
204 // k_memcpy(rbuf->buf + rbuf->tail, buf, right);
205 // if (left > 0) {
206 // k_memcpy(rbuf->buf, buf + right, left);
207 // }
208 // } else {
209 // k_memcpy(rbuf->buf + rbuf->tail, buf, len);
210 // }
211 
212 // rbuf->tail = (rbuf->tail + len) % (rbuf->size);
213 // }
214 // k_spin_lock_release(&rbuf->lock);
215 // return len;
216 // }
int64_t off_t
Definition: file.h:31
uint64_t ino_t
Definition: file.h:26
int fd_alloc()
Definition: fd.c:26
fd_t * get_fd(int fd)
Definition: fd.c:90
uint64_t dev_t
Definition: file.h:25
uint32_t pipe_num_t
Definition: file.h:24
int pipe_alloc(int *fd)
Definition: fd.c:38
fd_t fd_table[MAX_FD]
Definition: fd.c:7
void ring_buffer_init(struct ring_buffer *rbuf)
Definition: fd.c:97
int fd_table_init()
Definition: fd.c:11
struct pipe pipe_t
pipe_t pipe_table[PIPE_NUM]
Definition: fd.c:8
fd_t * fd_alloc_spec(int fd)
Definition: fd.c:70
uint32_t nlink_t
Definition: file.h:28
#define PIPE_NUM
Definition: file.h:138
uint32_t gid_t
Definition: file.h:30
uint32_t fd_num_t
Definition: file.h:23
int fd_free(int fd)
Definition: fd.c:78
size_t write_ring_buffer(struct ring_buffer *rbuf, uint8_t *buf, size_t size)
Definition: fd.c:126
struct fd fd_t
#define MAX_FD
Definition: file.h:108
size_t read_ring_buffer(struct ring_buffer *rbuf, uint8_t *buf, size_t size)
Definition: fd.c:108
uint32_t uid_t
Definition: file.h:29
uint32_t mode_t
Definition: file.h:27
#define MAX_NAME_LEN
Definition: file.h:21
Definition: virtio.h:78
Definition: file.h:33
uint32_t size
Definition: file.h:50
void * start
Definition: file.h:73
uint32_t mode
Definition: file.h:43
uint8_t file
Definition: file.h:35
uint8 redirected_fd_index
Definition: file.h:62
long ctime_sec
Definition: file.h:96
long atime_sec
Definition: file.h:92
uint32_t flags
Definition: file.h:45
int flags
Definition: file.h:76
int mailbox
Definition: file.h:99
struct fd::@3 mmap
long mtime_sec
Definition: file.h:94
dev_t rdev
Definition: file.h:88
uint8 nlink
Definition: file.h:82
uint8 used
Definition: file.h:59
uint32_t cur_clus_num
Definition: file.h:48
uint8 is_pipe_read
Definition: file.h:66
uint8 redirected
Definition: file.h:61
off_t off
Definition: file.h:77
int prot
Definition: file.h:75
size_t len
Definition: file.h:74
uint8 is_pipe_write
Definition: file.h:67
long mtime_nsec
Definition: file.h:95
int used
Definition: file.h:72
pipe_num_t pip_num
Definition: file.h:65
char name[MAX_NAME_LEN]
Definition: file.h:37
uint8_t dev
Definition: file.h:39
gid_t gid
Definition: file.h:86
uid_t uid
Definition: file.h:85
long ctime_nsec
Definition: file.h:97
uint32_t first_cluster
Definition: file.h:41
long atime_nsec
Definition: file.h:93
uint64_t pos
Definition: file.h:47
fd_num_t fd_num
Definition: file.h:56
uint8 sock_num
Definition: file.h:69
Definition: list.h:7
Definition: file.h:129
int mailbox
Definition: file.h:131
uint8 w_valid
Definition: file.h:136
list_head w_list
Definition: file.h:134
list_head r_list
Definition: file.h:133
pid_t pid
Definition: file.h:132
uint8 r_valid
Definition: file.h:135
Definition: file.h:119
int32_t tail
Definition: file.h:123
int32_t head
Definition: file.h:122
size_t size
Definition: file.h:121
spin_lock_t lock
Definition: file.h:120
uint8_t * buf
Definition: file.h:125
Definition: lock.h:17
int pid_t
Definition: types.h:42
unsigned char uint8
Definition: types.h:33