본문 바로가기

system/material

iretq, fops, tty, tty_ops struct

iretq, fops, tty, tty_ops struct

iretq


struct trap_frame {
     size_t user_rip ;        // instruction pointer
     size_t user_cs ;       // code segment
     size_t user_rflags ;       // CPU flags
     size_t user_rsp ;        // stack pointer
     size_t user_ss ;       // stack segment
};

fops


struct file_operations {
   struct module *owner;
   loff_t (*llseek) (struct file *, loff_t, int);
   ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
   ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
   ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
   ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
   int (*iterate) (struct file *, struct dir_context *);
   unsigned int (*poll) (struct file *, struct poll_table_struct *);
   long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
   long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
   int (*mmap) (struct file *, struct vm_area_struct *);
   int (*open) (struct inode *, struct file *);
   int (*flush) (struct file *, fl_owner_t id);
   int (*release) (struct inode *, struct file *);
   int (*fsync) (struct file *, loff_t, loff_t, int datasync);
   int (*aio_fsync) (struct kiocb *, int datasync);
   int (*fasync) (int, struct file *, int);
   int (*lock) (struct file *, int, struct file_lock *);
   ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
   unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
   int (*check_flags)(int);
   int (*flock) (struct file *, int, struct file_lock *);
   ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
   ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
   int (*setlease)(struct file *, long, struct file_lock **, void **);
   long (*fallocate)(struct file *file, int mode, loff_t offset,
             loff_t len);
   void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMU
   unsigned (*mmap_capabilities)(struct file *);
#endif
};

https://elixir.bootlin.com/linux/v4.4/source/include/linux/fs.h#L1600

tty


struct tty_struct {
   int magic;
   struct kref kref;
   struct device *dev;
   struct tty_driver *driver;
   const struct tty_operations *ops;
   int index;

   /* Protects ldisc changes: Lock tty not pty */
   struct ld_semaphore ldisc_sem;
   struct tty_ldisc *ldisc;

   struct mutex atomic_write_lock;
   struct mutex legacy_mutex;
   struct mutex throttle_mutex;
   struct rw_semaphore termios_rwsem;
   struct mutex winsize_mutex;
   spinlock_t ctrl_lock;
   spinlock_t flow_lock;
   /* Termios values are protected by the termios rwsem */
   struct ktermios termios, termios_locked;
   struct termiox *termiox;    /* May be NULL for unsupported */
   char name[64];
   struct pid *pgrp;       /* Protected by ctrl lock */
   struct pid *session;
   unsigned long flags;
   int count;
   struct winsize winsize;     /* winsize_mutex */
   unsigned long stopped:1,    /* flow_lock */
             flow_stopped:1,
             unused:BITS_PER_LONG - 2;
   int hw_stopped;
   unsigned long ctrl_status:8,    /* ctrl_lock */
             packet:1,
             unused_ctrl:BITS_PER_LONG - 9;
   unsigned int receive_room;  /* Bytes free for queue */
   int flow_change;

   struct tty_struct *link;
   struct fasync_struct *fasync;
   int alt_speed;      /* For magic substitution of 38400 bps */
   wait_queue_head_t write_wait;
   wait_queue_head_t read_wait;
   struct work_struct hangup_work;
   void *disc_data;
   void *driver_data;
   struct list_head tty_files;

#define N_TTY_BUF_SIZE 4096

   int closing;
   unsigned char *write_buf;
   int write_cnt;
   /* If the tty has a pending do_SAK, queue it here - akpm */
   struct work_struct SAK_work;
   struct tty_port *port;
};

https://elixir.bootlin.com/linux/v4.4/source/include/linux/tty.h#L259

0x2e0

tty_ops


struct tty_operations {
struct tty_struct * (*lookup)(struct tty_driver *driver,
struct inode *inode, int idx);
int (*install)(struct tty_driver *driver, struct tty_struct *tty);
void (*remove)(struct tty_driver *driver, struct tty_struct *tty);
int (*open)(struct tty_struct * tty, struct file * filp);
void (*close)(struct tty_struct * tty, struct file * filp);
void (*shutdown)(struct tty_struct *tty);
void (*cleanup)(struct tty_struct *tty);
int (*write)(struct tty_struct * tty,
     const unsigned char *buf, int count);
int (*put_char)(struct tty_struct *tty, unsigned char ch);
void (*flush_chars)(struct tty_struct *tty);
int (*write_room)(struct tty_struct *tty);
int (*chars_in_buffer)(struct tty_struct *tty);
int (*ioctl)(struct tty_struct *tty,
   unsigned int cmd, unsigned long arg);
long (*compat_ioctl)(struct tty_struct *tty,
    unsigned int cmd, unsigned long arg);
void (*set_termios)(struct tty_struct *tty, struct ktermios * old);
void (*throttle)(struct tty_struct * tty);
void (*unthrottle)(struct tty_struct * tty);
void (*stop)(struct tty_struct *tty);
void (*start)(struct tty_struct *tty);
void (*hangup)(struct tty_struct *tty);
int (*break_ctl)(struct tty_struct *tty, int state);
void (*flush_buffer)(struct tty_struct *tty);
void (*set_ldisc)(struct tty_struct *tty);
void (*wait_until_sent)(struct tty_struct *tty, int timeout);
void (*send_xchar)(struct tty_struct *tty, char ch);
int (*tiocmget)(struct tty_struct *tty);
int (*tiocmset)(struct tty_struct *tty,
unsigned int set, unsigned int clear);
int (*resize)(struct tty_struct *tty, struct winsize *ws);
int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew);
int (*get_icount)(struct tty_struct *tty,
struct serial_icounter_struct *icount);
#ifdef CONFIG_CONSOLE_POLL
int (*poll_init)(struct tty_driver *driver, int line, char *options);
int (*poll_get_char)(struct tty_driver *driver, int line);
void (*poll_put_char)(struct tty_driver *driver, int line, char ch);
#endif
const struct file_operations *proc_fops;
};

https://elixir.bootlin.com/linux/v4.4/source/include/linux/tty_driver.h#L251


'system > material' 카테고리의 다른 글

seccomp_bypass_trick  (0) 2019.12.26
linux file vtable check bypass  (0) 2019.12.24
kernel debugging with vmware  (0) 2019.11.17
peda special instruction  (0) 2019.11.11
linux kernel module 작성해보기  (0) 2019.11.11