09 2013 档案

摘要:在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table)。为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型:在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的Base Address,一个Segment的最大长度是64 KB,这是16-bit系统所能表示的最大长度。而Offset则是相对于此Segment Base Address的偏移量。Base Address+Offset就是一个内存绝对地址。由此,我们可以看出,一个段具备两个因素 阅读全文
posted @ 2013-09-30 09:26 jeremyatchina 阅读(404) 评论(1) 推荐(1)
摘要:How to Add a System CallKernel : 2.6.18編譯環境 : Fedora Core 6假設要加的system call為 sys_project, 有一個int的輸入參數一、在linux source code的部份(以linux代表source code的根目錄)linux/arch/i386/kernel/syscall_table.S的最後面加上要新增的system call名稱如果syscall_table.S的最後面長得像這樣...long sys_tee/* 315 */.long sys_vmsplice.long sys_move_pages那麼 阅读全文
posted @ 2013-09-20 21:36 jeremyatchina 阅读(378) 评论(0) 推荐(0)
摘要:4月14日很多硬件的功能,物尽其用却未必好过软实现,Linux出于可移植性及其它原因,常常选择不去过分使用硬件特性。比如Linux只使用四个segment,分别是__USER_CS、__USER_DS、__KERNEL_CS、__KERNEL_DS,因为Paging可以完成segmentation的工作,而且可以完成的更好。而且这样简化了很多,统一了逻辑地址和线性地址。而TSS存在每CPU一个的GDT中,虽然每个process的TSS不同,但Linux2.6却不利用其中的hardwarecontextswitch(虽然低版本使用)以一个farjmp来实现任务转换,而用一系列的mov指令来实现。 阅读全文
posted @ 2013-09-20 14:48 jeremyatchina 阅读(549) 评论(0) 推荐(0)
摘要:关于CR0.WP我们知道CR0的WP位可以关闭内核写保护。他和页表的R/W位有关。Intel手册中的描述绕来绕去似乎一直没有说到重点。When the processor is in supervisor mode and the WP flag in register CR0 is clear (itsstate following reset initialization), all pages are both readable and writable (write-protection is ignored). When the processor is in user mode, 阅读全文
posted @ 2013-09-18 13:03 jeremyatchina 阅读(1003) 评论(0) 推荐(0)
摘要:Reverse a singly linked listhttp://angelonotes.blogspot.tw/2011/08/reverse-singly-linked-list.htmlSource123456789101112131415161718192021222324252627282930313233343536373839#include typedef struct Node { char data; struct Node* next;} Node;void print_list(Node* root) { while (root) { printf("%c 阅读全文
posted @ 2013-09-11 09:11 jeremyatchina 阅读(185) 评论(0) 推荐(0)