囫囵C语言--续集

leetoo_1977 2015-10-19 08:38:12
加精
写在前面的话。

前几年写了几篇囫囵C语言,后来因为有事情也没坚持下去,好多年过去了,最近呢又心血来潮,想把当时没做完的事儿继续做完,这次写完,我估计我离退休又近了一步。已经有10多年没摸过底层技术了,目前手上也没有开发环境,资料也随着搬家,换新机器而大量流失。如果有些细节出错,在所难免,请大家海涵。

因为这些年不断有人问我一些最基本的概念,我发现,网上的很多都不对,甚至大学老师教的也都支离破碎的,或者概念混乱。受党教育这么多年,觉得趁着没老年痴呆把自己知道的,说一说,万一有人想学学底层呢,或者将来真的有机会中国人做自己的操作系统呢。

我知道希望很渺茫,就当完成一个自己的多年以来的心愿吧。
...全文
1826 95 打赏 收藏 转发到动态 举报
写回复
用AI写文章
95 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 94 楼 zhao4zhong1 的回复:
C&P大法的关键不在于会C和P;而在于从哪里C!依本C&Per看。
精辟而不是屁精!
赵4老师 2015-10-29
  • 打赏
  • 举报
回复
C&P大法的关键不在于会C和P;而在于从哪里C!依本C&Per看。
赵4老师 2015-10-29
  • 打赏
  • 举报
回复
《30天自制操作系统》
  • 打赏
  • 举报
回复
楼主就一二五眼老中医,你听他的就被带沟里去了。 嵌入式操作系统也没他瞎编的那些概念,什么: “C++可执行文件的格式和C不一样,需要操作系统支持才行” “中断:由硬件电平引起,恢复后 CPU 执行下一条指令 ” “异常:由软件指令引起,恢复后 CPU 重新执行该条指令 ” “由 int 指令引起的叫 trap” “中断又会引起线程调度” ... 诸如此类的。 他确实有“两下子”,一下子是故弄玄虚,时不时瞎喷几句显得自己高深莫测,但是绝对不敢细谈;另一下子就是东拉西扯,一旦被人指出破绽,就来“我记不清了”、“我多年不接触了”、"我记得是..."、“也可能吧”... 这一套,要不就转移话题:你知道1234567吗、ABCDEFG、呱呱呱呱呱呱呱、!·#¥¥%…………—*
ByPerseverance 2015-10-28
  • 打赏
  • 举报
回复
我大致看了一下,以我半吊子水平的人来看,楼主的本意其实非常好,想由浅入深的讲一下软件跟操作系统之间的联系,最后还是变成了战场一样。后面几位仁兄想得太复杂了,操作系统发展了这么久,特别是windows,它在概念上,技术上都已经跟其它操作系统有了很多的区别。我记得就多线程的实现方式光linux和windows的差别就得研究半天,而且C++11在windows上面对线程管理还有一套自己的机制,如果非要细致的讲解问题,这真的是非常非常难的一件事情。楼主讲的很多东东确实适应于大部分嵌入式操作系统,也适应于一般的学习者。需要钻得深还是得靠自己努力总结,包括搜集各方面的知识,因为很多书上的知识都已经过时了。
1992llx 2015-10-27
  • 打赏
  • 举报
回复
支持楼主!!
yfyuan2008 2015-10-26
  • 打赏
  • 举报
回复
值得好好看看
shiter 2015-10-24
  • 打赏
  • 举报
回复
www_adintr_com 2015-10-24
  • 打赏
  • 举报
回复
引用 60 楼 liutao_1977 的回复:
我最怕什么呢,就是谁也没读过 windows 内核源代码,却都认为书上说的关于 windows 的东西都是对的。而且世界上只有一种叫windows的操作系统。 为什么我不讲 windows 呢,很简单,因为不我会,我没读过源代码。所以我只能讲我读过源代码的操作系统和我实现过的操作系统的例子。可是即使我读过的两个主要操作系统之间,他们的架构,进程切换,中断管理,驱动模型也都大相径庭。我是先入为主的觉得一个是对的,一个是错的。还是认为两个都对,只是设计思路不一样呢。
Windows 内核的绝大部分源代码是已经公开了的,搜索 WRK 很容易就能下到 即使在没有源代码的时候,大家通过逆向工程也已经获得了很多东西了 而且,有些书本来就是微软的开发团队,或是在开发团队协助下完成的,并不是一拍脑袋觉得怎样可以就怎样写的,可信度还是很高的。 总之,说 Windows 没有源代码而不能讨论是无法成立的。 如果你要避开 Windows,一开始就声明下,自己是针对什么架构,什么样的系统来写的。否则,你要写成一个总结各种系统的文章,只要和任何一个系统有冲突,就说明你是错的了。
leetoo_1977 2015-10-22
  • 打赏
  • 举报
回复
引用 65 楼 sand6174 的回复:
1. a++, a-- 等 是不是某些 cpu 上会翻译成多条汇编指令完成? 不是cpu翻译是编译器 楼主说的情况是这样的 mov eax,[ptr]; inc eax;; 在这里产时钟中断后会丢数据 mov [ptr],eax
丢失倒是不会,因为中断处理程序会保存你的现场。什么都不会丢失的。比如内存单元上存的数是 5 如果程序 被 在第一条 mov 指令 或者 inc 指令之后切换到另外一个线程,另外一个线程也要操作这个数据,那么无论另外的线程把这个数据计算成什么 ,当这个线程被切换回来以后 eax 寄存器里面的数字都是 6, 最后一条指令就把这个 6 存回去了。另外一个线程就白忙和了。
sand6174 2015-10-22
  • 打赏
  • 举报
回复
1. a++, a-- 等 是不是某些 cpu 上会翻译成多条汇编指令完成? 不是cpu翻译是编译器 楼主说的情况是这样的 mov eax,[ptr]; inc eax;; 在这里产时钟中断后会丢数据 mov [ptr],eax
sand6174 2015-10-22
  • 打赏
  • 举报
回复
引用 62 楼 liutao_1977 的回复:
[quote=引用 61 楼 sand6174 的回复:] 我 [quote=引用 59 楼 liutao_1977 的回复:] [quote=引用 57 楼 DelphiGuy 的回复:] [quote=引用 53 楼 liutao_1977 的回复:] 哥们儿,你先搞搞清楚,什么是同步,什么是互斥吧,至于生产者消费者问题,你去好好看看书,我那个例子是不是生产者消费者。另外 但是线程调度并非在时钟中断的ISR内部运行,第一我那句话说线程调度是在 IRS 的上下文中运行了,第二我也没说时钟中断必定会引起线程调度,第三,世界上只有一种叫 windows 的操作系统,而且都读过 windows 的内核。 满意了么?
您本来满谦虚的么,这怎么又开始胡搅蛮缠了。 就你#17的代码,两个线程共享变量,一个++、一个--,我只是推测“(就你的两个线程来看应该就是生产者/消费者问题)”,由于你的代码也没有其他细节,你说不是,那就不是好了,我也不能强求你说是。这不影响我指出你的问题:这是抢先式多任务的切换位置不确定导致的,你非要东拉西扯什么中断,扯到中断你扯对了吗?“因为 a++,a--,可能并不是一条汇编语言,它会被中断打断,而中断又会引起线程调度。”这说的是啥,你还能辩出花来?哪个中断?中断那么多,难道都引起线程调度?“中断又会引起线程调度”这难道不是表达的必然的意思?您是自己语文没学好还是以为别人语文没学好呢? 至于您又扯出什么是同步,什么是互斥,这就匪夷所思了, 我前面说的是“本来你的代码就是说明多线程访问共享数据没做同步导致的一致性问题”,互斥是保证多线程同步的方法,您可以搜一下“线程同步”,看看是什么概念。 [/quote] 首先啊,我还是觉得你不知道什么叫互斥什么是同步。这个实在不理解呢,你自己去读一下操作系统内核关于 mutex 和 semaphore 的实现,本来我想后面讲这个东西操作系统怎么实现的。 第二啊,我说了好几遍了,我在说一个地方的时候先假设附近的情况尽可能简单,所以呢我说中断会引起线程调度,而且确实会有中断引起线程调度。再说一遍,windows我没读过内核的代码,但是呢,1. 我读过的操作系统呢是的;2.我实现过的操作系统也是的。我有点不太明白的是,是不是天底下的操作系统都必须是一种实现方法? 第三呢,进了中断是不是引起线程调度其实不是中断决定的,是由线程调度的算法决定的,本来想下面接着讲。 第四呢,时钟中断来了以后呢,是应该进行线程调度算法的,但是不一定就一定切换成其他线程。 如果呢,您认为我都是胡扯,那么我想请教您两个问题: 1. a++, a-- 等 是不是某些 cpu 上会翻译成多条汇编指令完成? 2. 这中间会不会被打断? 3. 如果会,可能会被什么打断的? 4. 如果会打断,有是怎么进入内核的 5. 进了内核又是怎么转了一圈回到用户态的? 6. 一个实时操作系统,一个优先级很高的中断来了,是不是有必要先唤醒处理这个中断数据的线程来处理这个中断,还是不理,继续傻乎乎做刚才被打断的低优先级线程,我们姑且称为 A ? 7. 这个中断处理完了,进行下一次线程调度的时候,由于线程调度算法的问题,是不是一定要先要调度 A? 最好您能从硬件到软件的给大家或者说主要给我科普一下。 还请赐教? [/quote] 你这还叫写过系统? [/quote] 怎么判断出我没写过的,说说看,让我长长见识呗。[/quote] 1. a++, a-- 等 是不是某些 cpu 上会翻译成多条汇编指令完成? 2. 这中间会不会被打断? 3. 如果会,可能会被什么打断的? 4. 如果会打断,有是怎么进入内核的 5. 进了内核又是怎么转了一圈回到用户态的? 6. 一个实时操作系统,一个优先级很高的中断来了,是不是有必要先唤醒处理这个中断数据的线程来处理这个中断,还是不理,继续傻乎乎做刚才被打断的低优先级线程,我们姑且称为 A ? 7. 这个中断处理完了,进行下一次线程调度的时候,由于线程调度算法的问题,是不是一定要先要调度 A? 我理解错了,菜鸟不会问这么细的!
sand6174 2015-10-22
  • 打赏
  • 举报
回复
引用 60 楼 liutao_1977 的回复:
当然了即使我没读过 windows 操作系统,要是有人跟我说 windows 的 timer 不会引起线程切换,我也还真有点不信。
唯一能确定的是一定会产生时间中断。反正我也没有它的源码。我估计是写现是向它的TCB的msg队列压入一条msg然后在用户态读这条msg,所以说会大部分都是在切换线程,不切换也是有可能的刚好当前线程时间片没结束然后刚好是当前线程产生了msg。楼主一定要注重细节啊! 1. a++, a-- 等 是不是某些 cpu 上会翻译成多条汇编指令完成? 2. 这中间会不会被打断? 3. 如果会,可能会被什么打断的? 4. 如果会打断,有是怎么进入内核的 5. 进了内核又是怎么转了一圈回到用户态的? 6. 一个实时操作系统,一个优先级很高的中断来了,是不是有必要先唤醒处理这个中断数据的线程来处理这个中断,还是不理,继续傻乎乎做刚才被打断的低优先级线程,我们姑且称为 A ? 7. 这个中断处理完了,进行下一次线程调度的时候,由于线程调度算法的问题,是不是一定要先要调度 A? 最好您能从硬件到软件的给大家或者说主要给我科普一下。 这一些问题你写过系统就明白。 楼主已经写得很好了,没看过有人写过这么细,有些地方可能有一点问题,就好像没有 没有bug的程序!
leetoo_1977 2015-10-22
  • 打赏
  • 举报
回复
引用 61 楼 sand6174 的回复:
我 [quote=引用 59 楼 liutao_1977 的回复:] [quote=引用 57 楼 DelphiGuy 的回复:] [quote=引用 53 楼 liutao_1977 的回复:] 哥们儿,你先搞搞清楚,什么是同步,什么是互斥吧,至于生产者消费者问题,你去好好看看书,我那个例子是不是生产者消费者。另外 但是线程调度并非在时钟中断的ISR内部运行,第一我那句话说线程调度是在 IRS 的上下文中运行了,第二我也没说时钟中断必定会引起线程调度,第三,世界上只有一种叫 windows 的操作系统,而且都读过 windows 的内核。 满意了么?
您本来满谦虚的么,这怎么又开始胡搅蛮缠了。 就你#17的代码,两个线程共享变量,一个++、一个--,我只是推测“(就你的两个线程来看应该就是生产者/消费者问题)”,由于你的代码也没有其他细节,你说不是,那就不是好了,我也不能强求你说是。这不影响我指出你的问题:这是抢先式多任务的切换位置不确定导致的,你非要东拉西扯什么中断,扯到中断你扯对了吗?“因为 a++,a--,可能并不是一条汇编语言,它会被中断打断,而中断又会引起线程调度。”这说的是啥,你还能辩出花来?哪个中断?中断那么多,难道都引起线程调度?“中断又会引起线程调度”这难道不是表达的必然的意思?您是自己语文没学好还是以为别人语文没学好呢? 至于您又扯出什么是同步,什么是互斥,这就匪夷所思了, 我前面说的是“本来你的代码就是说明多线程访问共享数据没做同步导致的一致性问题”,互斥是保证多线程同步的方法,您可以搜一下“线程同步”,看看是什么概念。 [/quote] 首先啊,我还是觉得你不知道什么叫互斥什么是同步。这个实在不理解呢,你自己去读一下操作系统内核关于 mutex 和 semaphore 的实现,本来我想后面讲这个东西操作系统怎么实现的。 第二啊,我说了好几遍了,我在说一个地方的时候先假设附近的情况尽可能简单,所以呢我说中断会引起线程调度,而且确实会有中断引起线程调度。再说一遍,windows我没读过内核的代码,但是呢,1. 我读过的操作系统呢是的;2.我实现过的操作系统也是的。我有点不太明白的是,是不是天底下的操作系统都必须是一种实现方法? 第三呢,进了中断是不是引起线程调度其实不是中断决定的,是由线程调度的算法决定的,本来想下面接着讲。 第四呢,时钟中断来了以后呢,是应该进行线程调度算法的,但是不一定就一定切换成其他线程。 如果呢,您认为我都是胡扯,那么我想请教您两个问题: 1. a++, a-- 等 是不是某些 cpu 上会翻译成多条汇编指令完成? 2. 这中间会不会被打断? 3. 如果会,可能会被什么打断的? 4. 如果会打断,有是怎么进入内核的 5. 进了内核又是怎么转了一圈回到用户态的? 6. 一个实时操作系统,一个优先级很高的中断来了,是不是有必要先唤醒处理这个中断数据的线程来处理这个中断,还是不理,继续傻乎乎做刚才被打断的低优先级线程,我们姑且称为 A ? 7. 这个中断处理完了,进行下一次线程调度的时候,由于线程调度算法的问题,是不是一定要先要调度 A? 最好您能从硬件到软件的给大家或者说主要给我科普一下。 还请赐教? [/quote] 你这还叫写过系统? [/quote] 怎么判断出我没写过的,说说看,让我长长见识呗。
sand6174 2015-10-22
  • 打赏
  • 举报
回复
引用 59 楼 liutao_1977 的回复:
[quote=引用 57 楼 DelphiGuy 的回复:] [quote=引用 53 楼 liutao_1977 的回复:] 哥们儿,你先搞搞清楚,什么是同步,什么是互斥吧,至于生产者消费者问题,你去好好看看书,我那个例子是不是生产者消费者。另外 但是线程调度并非在时钟中断的ISR内部运行,第一我那句话说线程调度是在 IRS 的上下文中运行了,第二我也没说时钟中断必定会引起线程调度,第三,世界上只有一种叫 windows 的操作系统,而且都读过 windows 的内核。 满意了么?
您本来满谦虚的么,这怎么又开始胡搅蛮缠了。 就你#17的代码,两个线程共享变量,一个++、一个--,我只是推测“(就你的两个线程来看应该就是生产者/消费者问题)”,由于你的代码也没有其他细节,你说不是,那就不是好了,我也不能强求你说是。这不影响我指出你的问题:这是抢先式多任务的切换位置不确定导致的,你非要东拉西扯什么中断,扯到中断你扯对了吗?“因为 a++,a--,可能并不是一条汇编语言,它会被中断打断,而中断又会引起线程调度。”这说的是啥,你还能辩出花来?哪个中断?中断那么多,难道都引起线程调度?“中断又会引起线程调度”这难道不是表达的必然的意思?您是自己语文没学好还是以为别人语文没学好呢? 至于您又扯出什么是同步,什么是互斥,这就匪夷所思了, 我前面说的是“本来你的代码就是说明多线程访问共享数据没做同步导致的一致性问题”,互斥是保证多线程同步的方法,您可以搜一下“线程同步”,看看是什么概念。 [/quote] 首先啊,我还是觉得你不知道什么叫互斥什么是同步。这个实在不理解呢,你自己去读一下操作系统内核关于 mutex 和 semaphore 的实现,本来我想后面讲这个东西操作系统怎么实现的。 第二啊,我说了好几遍了,我在说一个地方的时候先假设附近的情况尽可能简单,所以呢我说中断会引起线程调度,而且确实会有中断引起线程调度。再说一遍,windows我没读过内核的代码,但是呢,1. 我读过的操作系统呢是的;2.我实现过的操作系统也是的。我有点不太明白的是,是不是天底下的操作系统都必须是一种实现方法? 第三呢,进了中断是不是引起线程调度其实不是中断决定的,是由线程调度的算法决定的,本来想下面接着讲。 第四呢,时钟中断来了以后呢,是应该进行线程调度算法的,但是不一定就一定切换成其他线程。 如果呢,您认为我都是胡扯,那么我想请教您两个问题: 1. a++, a-- 等 是不是某些 cpu 上会翻译成多条汇编指令完成? 2. 这中间会不会被打断? 3. 如果会,可能会被什么打断的? 4. 如果会打断,有是怎么进入内核的 5. 进了内核又是怎么转了一圈回到用户态的? 6. 一个实时操作系统,一个优先级很高的中断来了,是不是有必要先唤醒处理这个中断数据的线程来处理这个中断,还是不理,继续傻乎乎做刚才被打断的低优先级线程,我们姑且称为 A ? 7. 这个中断处理完了,进行下一次线程调度的时候,由于线程调度算法的问题,是不是一定要先要调度 A? 最好您能从硬件到软件的给大家或者说主要给我科普一下。 还请赐教? [/quote] 你这还叫写过系统?
sand6174 2015-10-22
  • 打赏
  • 举报
回复
引用 85 楼 sand6174 的回复:
[quote=引用 84 楼 DelphiGuy 的回复:] [quote=引用 83 楼 zhao4zhong1 的回复:] 《The Intel 64 and IA-32 Architectures Software Developer's Manual》
就40分,也值得您动用C&P大法。 [/quote] 这么引用来引用去好容易回答乱掉[/quote] 我本来只想水一下贴~
sand6174 2015-10-22
  • 打赏
  • 举报
回复
引用 84 楼 DelphiGuy 的回复:
[quote=引用 83 楼 zhao4zhong1 的回复:] 《The Intel 64 and IA-32 Architectures Software Developer's Manual》
就40分,也值得您动用C&P大法。 [/quote] 这么引用来引用去好容易回答乱掉
  • 打赏
  • 举报
回复
引用 83 楼 zhao4zhong1 的回复:
《The Intel 64 and IA-32 Architectures Software Developer's Manual》
就40分,也值得您动用C&P大法。
赵4老师 2015-10-22
  • 打赏
  • 举报
回复
《The Intel 64 and IA-32 Architectures Software Developer's Manual》
sand6174 2015-10-22
  • 打赏
  • 举报
回复
引用 80 楼 DelphiGuy 的回复:
[quote=引用 79 楼 sand6174 的回复:] [quote=引用 78 楼 DelphiGuy 的回复:] [quote=引用 75 楼 liutao_1977 的回复:] [quote=引用 73 楼 sand6174 的回复:] [quote=引用 71 楼 DelphiGuy 的回复:] [quote=引用 68 楼 liutao_1977 的回复:] 一个技术问题的争论,没事儿老往人上扯,难道谁片儿汤话说的好,谁说的就对? 一个技术问题,何必口出恶言?换句话说我可曾说过对您有不敬之言? 这个问题就算你说的对好了,因为我实在没有和缺乏教养的人讨论问题的习惯。既然您百度用的那么好,先百度一下什么叫教养吧。 拜拜
那意思还是您说的“中断又会引起线程调度”对喽?您东拉西扯、不着边际、转移话题、顾左右而言他,这属于有教养、有敬之言? 另外奉送您两句: 一、那不是百度来的。 二、您那表现,三个帖子一过,彻底露馅,四个字评价:黔驴技穷,再加八个字:人品极差,虚伪得很。 [/quote] 还有你拿这些问题来问倒别人来显示自己的NB么?这就是情商有问题![/quote] 他那个问题我回答过了,呵呵,他非说我左顾而言他,我也没辙啊。 [/quote] 您的回答就是整出“我还是觉得你不知道什么叫互斥什么是同步”、1234567,来显示自己NB,#59还在那摆着呐,没说错您吧。 对于您的“中断又会引起线程调度”的伟大理论,您又回答了什么?我一直问您:中断那么多,难道都引起线程调度?按个键就引起线程调度了?动一下鼠标就引起线程调度了?... 您在哪回答了? [/quote] 我那里写错了我认了。[/quote] 哎,那不是你说的呀,难道你是liutao_1977? [/quote] 1. a++, a-- 等 是不是某些 cpu 上会翻译成多条汇编指令完成? 不是cpu翻译是编译器 楼主说的情况是这样的 mov eax,[ptr]; inc eax;; 在这里产时钟中断后会丢数据 mov [ptr],eax 这里本来就应该写子线程切换的,不懂的人真的会有点误解。
加载更多回复(75)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧